Commit 0bb337c9 authored by Suganath Prabu Subramani's avatar Suganath Prabu Subramani Committed by Martin K. Petersen

scsi: mpt3sas: Increased/Additional MSIX support for SAS35 devices.

For SAS35 devices MSIX vectors are inceased to 128 from 96. To support this
Reply post host index register count is increased to 16. Also variable
msix96_vector is replaced with combined_reply_queue and variable
combined_reply_index_count is added to set different values for SAS3 and
SAS35 devices.
Signed-off-by: default avatarChaitra P B <chaitra.basappa@broadcom.com>
Signed-off-by: default avatarSathya Prakash <sathya.prakash@broadcom.com>
Signed-off-by: default avatarSuganath Prabu S <suganath-prabu.subramani@broadcom.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 998f26ae
...@@ -1078,7 +1078,7 @@ _base_interrupt(int irq, void *bus_id) ...@@ -1078,7 +1078,7 @@ _base_interrupt(int irq, void *bus_id)
* new reply host index value in ReplyPostIndex Field and msix_index * new reply host index value in ReplyPostIndex Field and msix_index
* value in MSIxIndex field. * value in MSIxIndex field.
*/ */
if (ioc->msix96_vector) if (ioc->combined_reply_queue)
writel(reply_q->reply_post_host_index | ((msix_index & 7) << writel(reply_q->reply_post_host_index | ((msix_index & 7) <<
MPI2_RPHI_MSIX_INDEX_SHIFT), MPI2_RPHI_MSIX_INDEX_SHIFT),
ioc->replyPostRegisterIndex[msix_index/8]); ioc->replyPostRegisterIndex[msix_index/8]);
...@@ -2052,7 +2052,7 @@ mpt3sas_base_unmap_resources(struct MPT3SAS_ADAPTER *ioc) ...@@ -2052,7 +2052,7 @@ mpt3sas_base_unmap_resources(struct MPT3SAS_ADAPTER *ioc)
_base_free_irq(ioc); _base_free_irq(ioc);
_base_disable_msix(ioc); _base_disable_msix(ioc);
if (ioc->msix96_vector) { if (ioc->combined_reply_queue) {
kfree(ioc->replyPostRegisterIndex); kfree(ioc->replyPostRegisterIndex);
ioc->replyPostRegisterIndex = NULL; ioc->replyPostRegisterIndex = NULL;
} }
...@@ -2162,7 +2162,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc) ...@@ -2162,7 +2162,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc)
/* Use the Combined reply queue feature only for SAS3 C0 & higher /* Use the Combined reply queue feature only for SAS3 C0 & higher
* revision HBAs and also only when reply queue count is greater than 8 * revision HBAs and also only when reply queue count is greater than 8
*/ */
if (ioc->msix96_vector && ioc->reply_queue_count > 8) { if (ioc->combined_reply_queue && ioc->reply_queue_count > 8) {
/* Determine the Supplemental Reply Post Host Index Registers /* Determine the Supplemental Reply Post Host Index Registers
* Addresse. Supplemental Reply Post Host Index Registers * Addresse. Supplemental Reply Post Host Index Registers
* starts at offset MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET and * starts at offset MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET and
...@@ -2170,7 +2170,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc) ...@@ -2170,7 +2170,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc)
* MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET from previous one. * MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET from previous one.
*/ */
ioc->replyPostRegisterIndex = kcalloc( ioc->replyPostRegisterIndex = kcalloc(
MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT, ioc->combined_reply_index_count,
sizeof(resource_size_t *), GFP_KERNEL); sizeof(resource_size_t *), GFP_KERNEL);
if (!ioc->replyPostRegisterIndex) { if (!ioc->replyPostRegisterIndex) {
dfailprintk(ioc, printk(MPT3SAS_FMT dfailprintk(ioc, printk(MPT3SAS_FMT
...@@ -2180,14 +2180,14 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc) ...@@ -2180,14 +2180,14 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc)
goto out_fail; goto out_fail;
} }
for (i = 0; i < MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT; i++) { for (i = 0; i < ioc->combined_reply_index_count; i++) {
ioc->replyPostRegisterIndex[i] = (resource_size_t *) ioc->replyPostRegisterIndex[i] = (resource_size_t *)
((u8 *)&ioc->chip->Doorbell + ((u8 *)&ioc->chip->Doorbell +
MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET + MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET +
(i * MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET)); (i * MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET));
} }
} else } else
ioc->msix96_vector = 0; ioc->combined_reply_queue = 0;
if (ioc->is_warpdrive) { if (ioc->is_warpdrive) {
ioc->reply_post_host_index[0] = (resource_size_t __iomem *) ioc->reply_post_host_index[0] = (resource_size_t __iomem *)
...@@ -5140,7 +5140,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc) ...@@ -5140,7 +5140,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc)
/* initialize reply post host index */ /* initialize reply post host index */
list_for_each_entry(reply_q, &ioc->reply_queue_list, list) { list_for_each_entry(reply_q, &ioc->reply_queue_list, list) {
if (ioc->msix96_vector) if (ioc->combined_reply_queue)
writel((reply_q->msix_index & 7)<< writel((reply_q->msix_index & 7)<<
MPI2_RPHI_MSIX_INDEX_SHIFT, MPI2_RPHI_MSIX_INDEX_SHIFT,
ioc->replyPostRegisterIndex[reply_q->msix_index/8]); ioc->replyPostRegisterIndex[reply_q->msix_index/8]);
......
...@@ -300,7 +300,8 @@ ...@@ -300,7 +300,8 @@
* There are twelve Supplemental Reply Post Host Index Registers * There are twelve Supplemental Reply Post Host Index Registers
* and each register is at offset 0x10 bytes from the previous one. * and each register is at offset 0x10 bytes from the previous one.
*/ */
#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT 12 #define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G3 12
#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G35 16
#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET (0x10) #define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET (0x10)
/* OEM Identifiers */ /* OEM Identifiers */
...@@ -1158,7 +1159,8 @@ struct MPT3SAS_ADAPTER { ...@@ -1158,7 +1159,8 @@ struct MPT3SAS_ADAPTER {
u8 reply_queue_count; u8 reply_queue_count;
struct list_head reply_queue_list; struct list_head reply_queue_list;
u8 msix96_vector; u8 combined_reply_queue;
u8 combined_reply_index_count;
/* reply post register index */ /* reply post register index */
resource_size_t **replyPostRegisterIndex; resource_size_t **replyPostRegisterIndex;
......
...@@ -8748,8 +8748,15 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -8748,8 +8748,15 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
} }
if ((ioc->hba_mpi_version_belonged == MPI25_VERSION && if ((ioc->hba_mpi_version_belonged == MPI25_VERSION &&
pdev->revision >= SAS3_PCI_DEVICE_C0_REVISION) || pdev->revision >= SAS3_PCI_DEVICE_C0_REVISION) ||
(ioc->hba_mpi_version_belonged == MPI26_VERSION)) (ioc->hba_mpi_version_belonged == MPI26_VERSION)) {
ioc->msix96_vector = 1; ioc->combined_reply_queue = 1;
if (ioc->is_gen35_ioc)
ioc->combined_reply_index_count =
MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G35;
else
ioc->combined_reply_index_count =
MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G3;
}
break; break;
default: default:
return -ENODEV; return -ENODEV;
......
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