Commit d503e2fd authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen

scsi: aacraid: Added sa firmware support

sa_firmware adds the capability to differentiate the new SmartIOC family
of adapters from the series 8 and below.
Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Signed-off-by: default avatarDave Carroll <David.Carroll@microsemi.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent d1ef4da8
...@@ -1130,6 +1130,7 @@ struct aac_bus_info_response { ...@@ -1130,6 +1130,7 @@ struct aac_bus_info_response {
#define AAC_OPT_SUPPLEMENT_ADAPTER_INFO cpu_to_le32(1<<16) #define AAC_OPT_SUPPLEMENT_ADAPTER_INFO cpu_to_le32(1<<16)
#define AAC_OPT_NEW_COMM cpu_to_le32(1<<17) #define AAC_OPT_NEW_COMM cpu_to_le32(1<<17)
#define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18) #define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18)
#define AAC_OPT_EXTENDED cpu_to_le32(1<<23)
#define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28) #define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28)
#define AAC_OPT_NEW_COMM_TYPE2 cpu_to_le32(1<<29) #define AAC_OPT_NEW_COMM_TYPE2 cpu_to_le32(1<<29)
#define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30) #define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30)
...@@ -1141,6 +1142,8 @@ struct aac_bus_info_response { ...@@ -1141,6 +1142,8 @@ struct aac_bus_info_response {
#define AAC_COMM_MESSAGE_TYPE2 4 #define AAC_COMM_MESSAGE_TYPE2 4
#define AAC_COMM_MESSAGE_TYPE3 5 #define AAC_COMM_MESSAGE_TYPE3 5
#define AAC_EXTOPT_SA_FIRMWARE cpu_to_le32(1<<1)
/* MSIX context */ /* MSIX context */
struct aac_msix_ctx { struct aac_msix_ctx {
int vector_no; int vector_no;
...@@ -1272,6 +1275,7 @@ struct aac_dev ...@@ -1272,6 +1275,7 @@ struct aac_dev
u8 printf_enabled; u8 printf_enabled;
u8 in_reset; u8 in_reset;
u8 msi; u8 msi;
u8 sa_firmware;
int management_fib_count; int management_fib_count;
spinlock_t manage_lock; spinlock_t manage_lock;
spinlock_t sync_lock; spinlock_t sync_lock;
......
...@@ -75,14 +75,22 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co ...@@ -75,14 +75,22 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) || if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) ||
(dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) || (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) ||
(dev->comm_interface == AAC_COMM_MESSAGE_TYPE3)) (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 &&
!dev->sa_firmware)) {
host_rrq_size = host_rrq_size =
(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)
* sizeof(u32); * sizeof(u32);
else aac_init_size = sizeof(union aac_init);
} else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 &&
dev->sa_firmware) {
host_rrq_size = (dev->scsi_host_ptr->can_queue
+ AAC_NUM_MGT_FIB) * sizeof(u32) * AAC_MAX_MSIX;
aac_init_size = sizeof(union aac_init) +
(AAC_MAX_HRRQ - 1) * sizeof(struct _rrq);
} else {
host_rrq_size = 0; host_rrq_size = 0;
aac_init_size = sizeof(union aac_init);
aac_init_size = sizeof(union aac_init); }
size = fibsize + aac_init_size + commsize + commalign + size = fibsize + aac_init_size + commsize + commalign +
printfbufsiz + host_rrq_size; printfbufsiz + host_rrq_size;
...@@ -466,9 +474,13 @@ void aac_define_int_mode(struct aac_dev *dev) ...@@ -466,9 +474,13 @@ void aac_define_int_mode(struct aac_dev *dev)
if (dev->max_msix > msi_count) if (dev->max_msix > msi_count)
dev->max_msix = msi_count; dev->max_msix = msi_count;
} }
dev->vector_cap = if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE3 && dev->sa_firmware)
(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) / dev->vector_cap = dev->scsi_host_ptr->can_queue +
msi_count; AAC_NUM_MGT_FIB;
else
dev->vector_cap = (dev->scsi_host_ptr->can_queue +
AAC_NUM_MGT_FIB) / msi_count;
} }
struct aac_dev *aac_init_adapter(struct aac_dev *dev) struct aac_dev *aac_init_adapter(struct aac_dev *dev)
{ {
...@@ -527,6 +539,12 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) ...@@ -527,6 +539,12 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
dev->sync_mode = 1; dev->sync_mode = 1;
} }
} }
if ((status[1] & le32_to_cpu(AAC_OPT_EXTENDED)) &&
(status[4] & le32_to_cpu(AAC_EXTOPT_SA_FIRMWARE)))
dev->sa_firmware = 1;
else
dev->sa_firmware = 0;
if ((dev->comm_interface == AAC_COMM_MESSAGE) && if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
(status[2] > dev->base_size)) { (status[2] > dev->base_size)) {
aac_adapter_ioremap(dev, 0); aac_adapter_ioremap(dev, 0);
...@@ -563,61 +581,25 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) ...@@ -563,61 +581,25 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
dev->sg_tablesize = status[2] & 0xFFFF; dev->sg_tablesize = status[2] & 0xFFFF;
if (dev->pdev->device == PMC_DEVICE_S7 || if (dev->pdev->device == PMC_DEVICE_S7 ||
dev->pdev->device == PMC_DEVICE_S8 || dev->pdev->device == PMC_DEVICE_S8 ||
dev->pdev->device == PMC_DEVICE_S9) dev->pdev->device == PMC_DEVICE_S9) {
host->can_queue = ((status[3] >> 16) ? (status[3] >> 16) : if (host->can_queue > (status[3] >> 16) -
(status[3] & 0xFFFF)) - AAC_NUM_MGT_FIB; AAC_NUM_MGT_FIB)
else host->can_queue = (status[3] >> 16) -
host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB; AAC_NUM_MGT_FIB;
} else if (host->can_queue > (status[3] & 0xFFFF) -
AAC_NUM_MGT_FIB)
host->can_queue = (status[3] & 0xFFFF) -
AAC_NUM_MGT_FIB;
dev->max_num_aif = status[4] & 0xFFFF; dev->max_num_aif = status[4] & 0xFFFF;
/*
* NOTE:
* All these overrides are based on a fixed internal
* knowledge and understanding of existing adapters,
* acbsize should be set with caution.
*/
if (acbsize == 512) {
host->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
dev->max_fib_size = 512;
dev->sg_tablesize = host->sg_tablesize
= (512 - sizeof(struct aac_fibhdr)
- sizeof(struct aac_write) + sizeof(struct sgentry))
/ sizeof(struct sgentry);
host->can_queue = AAC_NUM_IO_FIB;
} else if (acbsize == 2048) {
host->max_sectors = 512;
dev->max_fib_size = 2048;
host->sg_tablesize = 65;
dev->sg_tablesize = 81;
host->can_queue = 512 - AAC_NUM_MGT_FIB;
} else if (acbsize == 4096) {
host->max_sectors = 1024;
dev->max_fib_size = 4096;
host->sg_tablesize = 129;
dev->sg_tablesize = 166;
host->can_queue = 256 - AAC_NUM_MGT_FIB;
} else if (acbsize == 8192) {
host->max_sectors = 2048;
dev->max_fib_size = 8192;
host->sg_tablesize = 257;
dev->sg_tablesize = 337;
host->can_queue = 128 - AAC_NUM_MGT_FIB;
} else if (acbsize > 0) {
printk("Illegal acbsize=%d ignored\n", acbsize);
}
} }
{ if (numacb > 0) {
if (numacb < host->can_queue)
if (numacb > 0) { host->can_queue = numacb;
if (numacb < host->can_queue) else
host->can_queue = numacb; pr_warn("numacb=%d ignored\n", numacb);
else
printk("numacb=%d ignored\n", numacb);
}
} }
if (host->can_queue > AAC_NUM_IO_FIB)
host->can_queue = AAC_NUM_IO_FIB;
if (dev->pdev->device == PMC_DEVICE_S6 || if (dev->pdev->device == PMC_DEVICE_S6 ||
dev->pdev->device == PMC_DEVICE_S7 || dev->pdev->device == PMC_DEVICE_S7 ||
dev->pdev->device == PMC_DEVICE_S8 || dev->pdev->device == PMC_DEVICE_S8 ||
......
...@@ -1285,7 +1285,7 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1285,7 +1285,7 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
else else
shost->this_id = shost->max_id; shost->this_id = shost->max_id;
if (aac_drivers[index].quirks & AAC_QUIRK_SRC) if (!aac->sa_firmware && aac_drivers[index].quirks & AAC_QUIRK_SRC)
aac_intr_normal(aac, 0, 2, 0, NULL); aac_intr_normal(aac, 0, 2, 0, NULL);
/* /*
......
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