diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 10 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 42 |
3 files changed, 50 insertions, 3 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index c4cca9124f45..2f67a8a92599 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -293,6 +293,7 @@ struct lpfc_hba { | |||
293 | uint32_t cfg_link_speed; | 293 | uint32_t cfg_link_speed; |
294 | uint32_t cfg_cr_delay; | 294 | uint32_t cfg_cr_delay; |
295 | uint32_t cfg_cr_count; | 295 | uint32_t cfg_cr_count; |
296 | uint32_t cfg_multi_ring_support; | ||
296 | uint32_t cfg_fdmi_on; | 297 | uint32_t cfg_fdmi_on; |
297 | uint32_t cfg_discovery_threads; | 298 | uint32_t cfg_discovery_threads; |
298 | uint32_t cfg_max_luns; | 299 | uint32_t cfg_max_luns; |
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index ab49379b6abe..2558156f064d 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -671,6 +671,14 @@ LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an " | |||
671 | "interrupt response is generated"); | 671 | "interrupt response is generated"); |
672 | 672 | ||
673 | /* | 673 | /* |
674 | # lpfc_multi_ring_support: Determines how many rings to spread available | ||
675 | # cmd/rsp IOCB entries across. | ||
676 | # Value range is [1,2]. Default value is 1. | ||
677 | */ | ||
678 | LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary " | ||
679 | "SLI rings to spread IOCB entries across"); | ||
680 | |||
681 | /* | ||
674 | # lpfc_fdmi_on: controls FDMI support. | 682 | # lpfc_fdmi_on: controls FDMI support. |
675 | # 0 = no FDMI support | 683 | # 0 = no FDMI support |
676 | # 1 = support FDMI without attribute of hostname | 684 | # 1 = support FDMI without attribute of hostname |
@@ -726,6 +734,7 @@ struct class_device_attribute *lpfc_host_attrs[] = { | |||
726 | &class_device_attr_lpfc_link_speed, | 734 | &class_device_attr_lpfc_link_speed, |
727 | &class_device_attr_lpfc_cr_delay, | 735 | &class_device_attr_lpfc_cr_delay, |
728 | &class_device_attr_lpfc_cr_count, | 736 | &class_device_attr_lpfc_cr_count, |
737 | &class_device_attr_lpfc_multi_ring_support, | ||
729 | &class_device_attr_lpfc_fdmi_on, | 738 | &class_device_attr_lpfc_fdmi_on, |
730 | &class_device_attr_lpfc_max_luns, | 739 | &class_device_attr_lpfc_max_luns, |
731 | &class_device_attr_nport_evt_cnt, | 740 | &class_device_attr_nport_evt_cnt, |
@@ -1440,6 +1449,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) | |||
1440 | lpfc_log_verbose_init(phba, lpfc_log_verbose); | 1449 | lpfc_log_verbose_init(phba, lpfc_log_verbose); |
1441 | lpfc_cr_delay_init(phba, lpfc_cr_delay); | 1450 | lpfc_cr_delay_init(phba, lpfc_cr_delay); |
1442 | lpfc_cr_count_init(phba, lpfc_cr_count); | 1451 | lpfc_cr_count_init(phba, lpfc_cr_count); |
1452 | lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support); | ||
1443 | lpfc_lun_queue_depth_init(phba, lpfc_lun_queue_depth); | 1453 | lpfc_lun_queue_depth_init(phba, lpfc_lun_queue_depth); |
1444 | lpfc_fcp_class_init(phba, lpfc_fcp_class); | 1454 | lpfc_fcp_class_init(phba, lpfc_fcp_class); |
1445 | lpfc_use_adisc_init(phba, lpfc_use_adisc); | 1455 | lpfc_use_adisc_init(phba, lpfc_use_adisc); |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index d6ffe26ae123..d08fd89dd44f 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -766,7 +766,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
766 | } | 766 | } |
767 | /* unSolicited Responses */ | 767 | /* unSolicited Responses */ |
768 | if (pring->prt[0].profile) { | 768 | if (pring->prt[0].profile) { |
769 | (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, saveq); | 769 | if (pring->prt[0].lpfc_sli_rcv_unsol_event) |
770 | (pring->prt[0].lpfc_sli_rcv_unsol_event) (phba, pring, | ||
771 | saveq); | ||
770 | match = 1; | 772 | match = 1; |
771 | } else { | 773 | } else { |
772 | /* We must search, based on rctl / type | 774 | /* We must search, based on rctl / type |
@@ -777,8 +779,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
777 | Rctl) | 779 | Rctl) |
778 | && (pring->prt[i]. | 780 | && (pring->prt[i]. |
779 | type == Type)) { | 781 | type == Type)) { |
780 | (pring->prt[i].lpfc_sli_rcv_unsol_event) | 782 | if (pring->prt[i].lpfc_sli_rcv_unsol_event) |
781 | (phba, pring, saveq); | 783 | (pring->prt[i].lpfc_sli_rcv_unsol_event) |
784 | (phba, pring, saveq); | ||
782 | match = 1; | 785 | match = 1; |
783 | break; | 786 | break; |
784 | } | 787 | } |
@@ -2377,6 +2380,37 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2377 | return IOCB_BUSY; | 2380 | return IOCB_BUSY; |
2378 | } | 2381 | } |
2379 | 2382 | ||
2383 | static int | ||
2384 | lpfc_extra_ring_setup( struct lpfc_hba *phba) | ||
2385 | { | ||
2386 | struct lpfc_sli *psli; | ||
2387 | struct lpfc_sli_ring *pring; | ||
2388 | |||
2389 | psli = &phba->sli; | ||
2390 | |||
2391 | /* Adjust cmd/rsp ring iocb entries more evenly */ | ||
2392 | pring = &psli->ring[psli->fcp_ring]; | ||
2393 | pring->numCiocb -= SLI2_IOCB_CMD_R1XTRA_ENTRIES; | ||
2394 | pring->numRiocb -= SLI2_IOCB_RSP_R1XTRA_ENTRIES; | ||
2395 | pring->numCiocb -= SLI2_IOCB_CMD_R3XTRA_ENTRIES; | ||
2396 | pring->numRiocb -= SLI2_IOCB_RSP_R3XTRA_ENTRIES; | ||
2397 | |||
2398 | pring = &psli->ring[1]; | ||
2399 | pring->numCiocb += SLI2_IOCB_CMD_R1XTRA_ENTRIES; | ||
2400 | pring->numRiocb += SLI2_IOCB_RSP_R1XTRA_ENTRIES; | ||
2401 | pring->numCiocb += SLI2_IOCB_CMD_R3XTRA_ENTRIES; | ||
2402 | pring->numRiocb += SLI2_IOCB_RSP_R3XTRA_ENTRIES; | ||
2403 | |||
2404 | /* Setup default profile for this ring */ | ||
2405 | pring->iotag_max = 4096; | ||
2406 | pring->num_mask = 1; | ||
2407 | pring->prt[0].profile = 0; /* Mask 0 */ | ||
2408 | pring->prt[0].rctl = FC_UNSOL_DATA; | ||
2409 | pring->prt[0].type = 5; | ||
2410 | pring->prt[0].lpfc_sli_rcv_unsol_event = NULL; | ||
2411 | return 0; | ||
2412 | } | ||
2413 | |||
2380 | int | 2414 | int |
2381 | lpfc_sli_setup(struct lpfc_hba *phba) | 2415 | lpfc_sli_setup(struct lpfc_hba *phba) |
2382 | { | 2416 | { |
@@ -2460,6 +2494,8 @@ lpfc_sli_setup(struct lpfc_hba *phba) | |||
2460 | "SLI2 SLIM Data: x%x x%x\n", | 2494 | "SLI2 SLIM Data: x%x x%x\n", |
2461 | phba->brd_no, totiocb, MAX_SLI2_IOCB); | 2495 | phba->brd_no, totiocb, MAX_SLI2_IOCB); |
2462 | } | 2496 | } |
2497 | if (phba->cfg_multi_ring_support == 2) | ||
2498 | lpfc_extra_ring_setup(phba); | ||
2463 | 2499 | ||
2464 | return 0; | 2500 | return 0; |
2465 | } | 2501 | } |