Commit 8ef22247 authored by Salyzyn, Mark's avatar Salyzyn, Mark Committed by James Bottomley

[SCSI] aacraid: add optional MSI support

Added support for MSI utilizing the aacraid.msi=1 parameter. This
patch adds some localized or like-minded janitor fixes. Since the
default is disabled, there is no impact on the code paths unless the
customer wishes to experiment with the MSI performance.
Signed-off-by: default avatarMark Salyzyn <aacraid@adaptec.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 07df8afa
...@@ -144,51 +144,77 @@ static char *aac_get_status_string(u32 status); ...@@ -144,51 +144,77 @@ static char *aac_get_status_string(u32 status);
*/ */
static int nondasd = -1; static int nondasd = -1;
static int aac_cache = 0; static int aac_cache;
static int dacmode = -1; static int dacmode = -1;
int aac_msi;
int aac_commit = -1; int aac_commit = -1;
int startup_timeout = 180; int startup_timeout = 180;
int aif_timeout = 120; int aif_timeout = 120;
module_param(nondasd, int, S_IRUGO|S_IWUSR); module_param(nondasd, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices."
" 0=off, 1=on");
module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR); module_param_named(cache, aac_cache, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n\tbit 0 - Disable FUA in WRITE SCSI commands\n\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n\tbit 2 - Disable only if Battery not protecting Cache"); MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
"\tbit 0 - Disable FUA in WRITE SCSI commands\n"
"\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
"\tbit 2 - Disable only if Battery not protecting Cache");
module_param(dacmode, int, S_IRUGO|S_IWUSR); module_param(dacmode, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
" 0=off, 1=on");
module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR); module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
" adapter for foreign arrays.\n"
"This is typically needed in systems that do not have a BIOS."
" 0=off, 1=on");
module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(msi, "IRQ handling."
" 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)");
module_param(startup_timeout, int, S_IRUGO|S_IWUSR); module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
" adapter to have it's kernel up and\n"
"running. This is typically adjusted for large systems that do not"
" have a BIOS.");
module_param(aif_timeout, int, S_IRUGO|S_IWUSR); module_param(aif_timeout, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for applications to pick up AIFs before\nderegistering them. This is typically adjusted for heavily burdened systems."); MODULE_PARM_DESC(aif_timeout, "The duration of time in seconds to wait for"
" applications to pick up AIFs before\n"
"deregistering them. This is typically adjusted for heavily burdened"
" systems.");
int numacb = -1; int numacb = -1;
module_param(numacb, int, S_IRUGO|S_IWUSR); module_param(numacb, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid values are 512 and down. Default is to use suggestion from Firmware."); MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control"
" blocks (FIB) allocated. Valid values are 512 and down. Default is"
" to use suggestion from Firmware.");
int acbsize = -1; int acbsize = -1;
module_param(acbsize, int, S_IRUGO|S_IWUSR); module_param(acbsize, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware."); MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB)"
" size. Valid values are 512, 2048, 4096 and 8192. Default is to use"
" suggestion from Firmware.");
int update_interval = 30 * 60; int update_interval = 30 * 60;
module_param(update_interval, int, S_IRUGO|S_IWUSR); module_param(update_interval, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(update_interval, "Interval in seconds between time sync updates issued to adapter."); MODULE_PARM_DESC(update_interval, "Interval in seconds between time sync"
" updates issued to adapter.");
int check_interval = 24 * 60 * 60; int check_interval = 24 * 60 * 60;
module_param(check_interval, int, S_IRUGO|S_IWUSR); module_param(check_interval, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(check_interval, "Interval in seconds between adapter health checks."); MODULE_PARM_DESC(check_interval, "Interval in seconds between adapter health"
" checks.");
int aac_check_reset = 1; int aac_check_reset = 1;
module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR); module_param_named(check_reset, aac_check_reset, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(aac_check_reset, "If adapter fails health check, reset the adapter. a value of -1 forces the reset to adapters programmed to ignore it."); MODULE_PARM_DESC(aac_check_reset, "If adapter fails health check, reset the"
" adapter. a value of -1 forces the reset to adapters programmed to"
" ignore it.");
int expose_physicals = -1; int expose_physicals = -1;
module_param(expose_physicals, int, S_IRUGO|S_IWUSR); module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays."
" -1=protect 0=off, 1=on");
int aac_reset_devices = 0; int aac_reset_devices;
module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR); module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization."); MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
......
...@@ -1026,6 +1026,7 @@ struct aac_dev ...@@ -1026,6 +1026,7 @@ struct aac_dev
u8 raw_io_64; u8 raw_io_64;
u8 printf_enabled; u8 printf_enabled;
u8 in_reset; u8 in_reset;
u8 msi;
}; };
#define aac_adapter_interrupt(dev) \ #define aac_adapter_interrupt(dev) \
...@@ -1881,6 +1882,7 @@ extern int startup_timeout; ...@@ -1881,6 +1882,7 @@ extern int startup_timeout;
extern int aif_timeout; extern int aif_timeout;
extern int expose_physicals; extern int expose_physicals;
extern int aac_reset_devices; extern int aac_reset_devices;
extern int aac_msi;
extern int aac_commit; extern int aac_commit;
extern int update_interval; extern int update_interval;
extern int check_interval; extern int check_interval;
......
...@@ -275,9 +275,9 @@ static const char *aac_info(struct Scsi_Host *shost) ...@@ -275,9 +275,9 @@ static const char *aac_info(struct Scsi_Host *shost)
/** /**
* aac_get_driver_ident * aac_get_driver_ident
* @devtype: index into lookup table * @devtype: index into lookup table
* *
* Returns a pointer to the entry in the driver lookup table. * Returns a pointer to the entry in the driver lookup table.
*/ */
struct aac_driver_ident* aac_get_driver_ident(int devtype) struct aac_driver_ident* aac_get_driver_ident(int devtype)
...@@ -1004,32 +1004,32 @@ static const struct file_operations aac_cfg_fops = { ...@@ -1004,32 +1004,32 @@ static const struct file_operations aac_cfg_fops = {
static struct scsi_host_template aac_driver_template = { static struct scsi_host_template aac_driver_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.name = "AAC", .name = "AAC",
.proc_name = AAC_DRIVERNAME, .proc_name = AAC_DRIVERNAME,
.info = aac_info, .info = aac_info,
.ioctl = aac_ioctl, .ioctl = aac_ioctl,
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_ioctl = aac_compat_ioctl, .compat_ioctl = aac_compat_ioctl,
#endif #endif
.queuecommand = aac_queuecommand, .queuecommand = aac_queuecommand,
.bios_param = aac_biosparm, .bios_param = aac_biosparm,
.shost_attrs = aac_attrs, .shost_attrs = aac_attrs,
.slave_configure = aac_slave_configure, .slave_configure = aac_slave_configure,
.change_queue_depth = aac_change_queue_depth, .change_queue_depth = aac_change_queue_depth,
.sdev_attrs = aac_dev_attrs, .sdev_attrs = aac_dev_attrs,
.eh_abort_handler = aac_eh_abort, .eh_abort_handler = aac_eh_abort,
.eh_host_reset_handler = aac_eh_reset, .eh_host_reset_handler = aac_eh_reset,
.can_queue = AAC_NUM_IO_FIB, .can_queue = AAC_NUM_IO_FIB,
.this_id = MAXIMUM_NUM_CONTAINERS, .this_id = MAXIMUM_NUM_CONTAINERS,
.sg_tablesize = 16, .sg_tablesize = 16,
.max_sectors = 128, .max_sectors = 128,
#if (AAC_NUM_IO_FIB > 256) #if (AAC_NUM_IO_FIB > 256)
.cmd_per_lun = 256, .cmd_per_lun = 256,
#else #else
.cmd_per_lun = AAC_NUM_IO_FIB, .cmd_per_lun = AAC_NUM_IO_FIB,
#endif #endif
.use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING,
.emulated = 1, .emulated = 1,
}; };
static void __aac_shutdown(struct aac_dev * aac) static void __aac_shutdown(struct aac_dev * aac)
...@@ -1039,6 +1039,8 @@ static void __aac_shutdown(struct aac_dev * aac) ...@@ -1039,6 +1039,8 @@ static void __aac_shutdown(struct aac_dev * aac)
aac_send_shutdown(aac); aac_send_shutdown(aac);
aac_adapter_disable_int(aac); aac_adapter_disable_int(aac);
free_irq(aac->pdev->irq, aac); free_irq(aac->pdev->irq, aac);
if (aac->msi)
pci_disable_msi(aac->pdev);
} }
static int __devinit aac_probe_one(struct pci_dev *pdev, static int __devinit aac_probe_one(struct pci_dev *pdev,
...@@ -1254,7 +1256,7 @@ static struct pci_driver aac_pci_driver = { ...@@ -1254,7 +1256,7 @@ static struct pci_driver aac_pci_driver = {
.id_table = aac_pci_tbl, .id_table = aac_pci_tbl,
.probe = aac_probe_one, .probe = aac_probe_one,
.remove = __devexit_p(aac_remove_one), .remove = __devexit_p(aac_remove_one),
.shutdown = aac_shutdown, .shutdown = aac_shutdown,
}; };
static int __init aac_init(void) static int __init aac_init(void)
...@@ -1271,7 +1273,7 @@ static int __init aac_init(void) ...@@ -1271,7 +1273,7 @@ static int __init aac_init(void)
aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops); aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops);
if (aac_cfg_major < 0) { if (aac_cfg_major < 0) {
printk(KERN_WARNING printk(KERN_WARNING
"aacraid: unable to register \"aac\" device.\n"); "aacraid: unable to register \"aac\" device.\n");
} }
return 0; return 0;
......
...@@ -625,8 +625,11 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -625,8 +625,11 @@ int _aac_rx_init(struct aac_dev *dev)
if (aac_init_adapter(dev) == NULL) if (aac_init_adapter(dev) == NULL)
goto error_iounmap; goto error_iounmap;
aac_adapter_comm(dev, dev->comm_interface); aac_adapter_comm(dev, dev->comm_interface);
if (request_irq(dev->scsi_host_ptr->irq, dev->a_ops.adapter_intr, dev->msi = aac_msi && !pci_enable_msi(dev->pdev);
if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) { IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
if (dev->msi)
pci_disable_msi(dev->pdev);
printk(KERN_ERR "%s%d: Interrupt unavailable.\n", printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
name, instance); name, instance);
goto error_iounmap; goto error_iounmap;
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
...@@ -385,7 +386,7 @@ int aac_sa_init(struct aac_dev *dev) ...@@ -385,7 +386,7 @@ int aac_sa_init(struct aac_dev *dev)
if(aac_init_adapter(dev) == NULL) if(aac_init_adapter(dev) == NULL)
goto error_irq; goto error_irq;
if (request_irq(dev->scsi_host_ptr->irq, dev->a_ops.adapter_intr, if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
IRQF_SHARED|IRQF_DISABLED, IRQF_SHARED|IRQF_DISABLED,
"aacraid", (void *)dev ) < 0) { "aacraid", (void *)dev ) < 0) {
printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", printk(KERN_WARNING "%s%d: Interrupt unavailable.\n",
...@@ -403,7 +404,7 @@ int aac_sa_init(struct aac_dev *dev) ...@@ -403,7 +404,7 @@ int aac_sa_init(struct aac_dev *dev)
error_irq: error_irq:
aac_sa_disable_interrupt(dev); aac_sa_disable_interrupt(dev);
free_irq(dev->scsi_host_ptr->irq, (void *)dev); free_irq(dev->pdev->irq, (void *)dev);
error_iounmap: error_iounmap:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment