Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+41 −15
Original line number Original line Diff line number Diff line
@@ -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.");


+2 −0
Original line number Original line Diff line number Diff line
@@ -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;
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;
+17 −15
Original line number Original line Diff line number Diff line
@@ -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,
+4 −1
Original line number Original line Diff line number Diff line
@@ -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;
+3 −2
Original line number Original line Diff line number Diff line
@@ -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)


	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)


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: