diff options
author | James Smart <james.smart@emulex.com> | 2014-02-20 09:56:45 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2014-03-15 13:18:56 -0400 |
commit | 1ba981fd3ad1f91b8bb205ce6aac6aad45f2fa7a (patch) | |
tree | c5638d855f177a4be300a2df71d8d621a2cfc0ca /drivers/scsi/lpfc/lpfc_init.c | |
parent | 2a2719d370b2ec31451462f2775986e42cbeb39f (diff) |
[SCSI] lpfc 8.3.45: Incorporated support of a low-latency io path
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 241 |
1 files changed, 235 insertions, 6 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index aa29ea099188..157ad1ceceae 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -80,6 +80,7 @@ static void lpfc_sli4_cq_event_pool_destroy(struct lpfc_hba *); | |||
80 | static void lpfc_sli4_cq_event_release_all(struct lpfc_hba *); | 80 | static void lpfc_sli4_cq_event_release_all(struct lpfc_hba *); |
81 | static void lpfc_sli4_disable_intr(struct lpfc_hba *); | 81 | static void lpfc_sli4_disable_intr(struct lpfc_hba *); |
82 | static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t); | 82 | static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t); |
83 | static void lpfc_sli4_oas_verify(struct lpfc_hba *phba); | ||
83 | 84 | ||
84 | static struct scsi_transport_template *lpfc_transport_template = NULL; | 85 | static struct scsi_transport_template *lpfc_transport_template = NULL; |
85 | static struct scsi_transport_template *lpfc_vport_transport_template = NULL; | 86 | static struct scsi_transport_template *lpfc_vport_transport_template = NULL; |
@@ -4856,6 +4857,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
4856 | uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; | 4857 | uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; |
4857 | struct lpfc_mqe *mqe; | 4858 | struct lpfc_mqe *mqe; |
4858 | int longs; | 4859 | int longs; |
4860 | int fof_vectors = 0; | ||
4859 | 4861 | ||
4860 | /* Get all the module params for configuring this host */ | 4862 | /* Get all the module params for configuring this host */ |
4861 | lpfc_get_cfgparam(phba); | 4863 | lpfc_get_cfgparam(phba); |
@@ -5121,6 +5123,12 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
5121 | } | 5123 | } |
5122 | } | 5124 | } |
5123 | mempool_free(mboxq, phba->mbox_mem_pool); | 5125 | mempool_free(mboxq, phba->mbox_mem_pool); |
5126 | |||
5127 | /* Verify OAS is supported */ | ||
5128 | lpfc_sli4_oas_verify(phba); | ||
5129 | if (phba->cfg_fof) | ||
5130 | fof_vectors = 1; | ||
5131 | |||
5124 | /* Verify all the SLI4 queues */ | 5132 | /* Verify all the SLI4 queues */ |
5125 | rc = lpfc_sli4_queue_verify(phba); | 5133 | rc = lpfc_sli4_queue_verify(phba); |
5126 | if (rc) | 5134 | if (rc) |
@@ -5162,7 +5170,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
5162 | 5170 | ||
5163 | phba->sli4_hba.fcp_eq_hdl = | 5171 | phba->sli4_hba.fcp_eq_hdl = |
5164 | kzalloc((sizeof(struct lpfc_fcp_eq_hdl) * | 5172 | kzalloc((sizeof(struct lpfc_fcp_eq_hdl) * |
5165 | phba->cfg_fcp_io_channel), GFP_KERNEL); | 5173 | (fof_vectors + phba->cfg_fcp_io_channel)), |
5174 | GFP_KERNEL); | ||
5166 | if (!phba->sli4_hba.fcp_eq_hdl) { | 5175 | if (!phba->sli4_hba.fcp_eq_hdl) { |
5167 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 5176 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
5168 | "2572 Failed allocate memory for " | 5177 | "2572 Failed allocate memory for " |
@@ -5172,7 +5181,8 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) | |||
5172 | } | 5181 | } |
5173 | 5182 | ||
5174 | phba->sli4_hba.msix_entries = kzalloc((sizeof(struct msix_entry) * | 5183 | phba->sli4_hba.msix_entries = kzalloc((sizeof(struct msix_entry) * |
5175 | phba->cfg_fcp_io_channel), GFP_KERNEL); | 5184 | (fof_vectors + |
5185 | phba->cfg_fcp_io_channel)), GFP_KERNEL); | ||
5176 | if (!phba->sli4_hba.msix_entries) { | 5186 | if (!phba->sli4_hba.msix_entries) { |
5177 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 5187 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
5178 | "2573 Failed allocate memory for msi-x " | 5188 | "2573 Failed allocate memory for msi-x " |
@@ -5393,6 +5403,10 @@ lpfc_setup_driver_resource_phase1(struct lpfc_hba *phba) | |||
5393 | /* Initialize FCF connection rec list */ | 5403 | /* Initialize FCF connection rec list */ |
5394 | INIT_LIST_HEAD(&phba->fcf_conn_rec_list); | 5404 | INIT_LIST_HEAD(&phba->fcf_conn_rec_list); |
5395 | 5405 | ||
5406 | /* Initialize OAS configuration list */ | ||
5407 | spin_lock_init(&phba->devicelock); | ||
5408 | INIT_LIST_HEAD(&phba->luns); | ||
5409 | |||
5396 | return 0; | 5410 | return 0; |
5397 | } | 5411 | } |
5398 | 5412 | ||
@@ -6819,6 +6833,7 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba) | |||
6819 | int cfg_fcp_io_channel; | 6833 | int cfg_fcp_io_channel; |
6820 | uint32_t cpu; | 6834 | uint32_t cpu; |
6821 | uint32_t i = 0; | 6835 | uint32_t i = 0; |
6836 | int fof_vectors = phba->cfg_fof ? 1 : 0; | ||
6822 | 6837 | ||
6823 | /* | 6838 | /* |
6824 | * Sanity check for configured queue parameters against the run-time | 6839 | * Sanity check for configured queue parameters against the run-time |
@@ -6845,7 +6860,7 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba) | |||
6845 | cfg_fcp_io_channel = i; | 6860 | cfg_fcp_io_channel = i; |
6846 | } | 6861 | } |
6847 | 6862 | ||
6848 | if (cfg_fcp_io_channel > | 6863 | if (cfg_fcp_io_channel + fof_vectors > |
6849 | phba->sli4_hba.max_cfg_param.max_eq) { | 6864 | phba->sli4_hba.max_cfg_param.max_eq) { |
6850 | if (phba->sli4_hba.max_cfg_param.max_eq < | 6865 | if (phba->sli4_hba.max_cfg_param.max_eq < |
6851 | LPFC_FCP_IO_CHAN_MIN) { | 6866 | LPFC_FCP_IO_CHAN_MIN) { |
@@ -6862,7 +6877,8 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba) | |||
6862 | "available EQs: from %d to %d\n", | 6877 | "available EQs: from %d to %d\n", |
6863 | cfg_fcp_io_channel, | 6878 | cfg_fcp_io_channel, |
6864 | phba->sli4_hba.max_cfg_param.max_eq); | 6879 | phba->sli4_hba.max_cfg_param.max_eq); |
6865 | cfg_fcp_io_channel = phba->sli4_hba.max_cfg_param.max_eq; | 6880 | cfg_fcp_io_channel = phba->sli4_hba.max_cfg_param.max_eq - |
6881 | fof_vectors; | ||
6866 | } | 6882 | } |
6867 | 6883 | ||
6868 | /* The actual number of FCP event queues adopted */ | 6884 | /* The actual number of FCP event queues adopted */ |
@@ -7073,6 +7089,9 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba) | |||
7073 | } | 7089 | } |
7074 | phba->sli4_hba.dat_rq = qdesc; | 7090 | phba->sli4_hba.dat_rq = qdesc; |
7075 | 7091 | ||
7092 | /* Create the Queues needed for Flash Optimized Fabric operations */ | ||
7093 | if (phba->cfg_fof) | ||
7094 | lpfc_fof_queue_create(phba); | ||
7076 | return 0; | 7095 | return 0; |
7077 | 7096 | ||
7078 | out_error: | 7097 | out_error: |
@@ -7097,6 +7116,9 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
7097 | { | 7116 | { |
7098 | int idx; | 7117 | int idx; |
7099 | 7118 | ||
7119 | if (phba->cfg_fof) | ||
7120 | lpfc_fof_queue_destroy(phba); | ||
7121 | |||
7100 | if (phba->sli4_hba.hba_eq != NULL) { | 7122 | if (phba->sli4_hba.hba_eq != NULL) { |
7101 | /* Release HBA event queue */ | 7123 | /* Release HBA event queue */ |
7102 | for (idx = 0; idx < phba->cfg_fcp_io_channel; idx++) { | 7124 | for (idx = 0; idx < phba->cfg_fcp_io_channel; idx++) { |
@@ -7481,8 +7503,20 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
7481 | phba->sli4_hba.hdr_rq->queue_id, | 7503 | phba->sli4_hba.hdr_rq->queue_id, |
7482 | phba->sli4_hba.dat_rq->queue_id, | 7504 | phba->sli4_hba.dat_rq->queue_id, |
7483 | phba->sli4_hba.els_cq->queue_id); | 7505 | phba->sli4_hba.els_cq->queue_id); |
7506 | |||
7507 | if (phba->cfg_fof) { | ||
7508 | rc = lpfc_fof_queue_setup(phba); | ||
7509 | if (rc) { | ||
7510 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
7511 | "0549 Failed setup of FOF Queues: " | ||
7512 | "rc = 0x%x\n", rc); | ||
7513 | goto out_destroy_els_rq; | ||
7514 | } | ||
7515 | } | ||
7484 | return 0; | 7516 | return 0; |
7485 | 7517 | ||
7518 | out_destroy_els_rq: | ||
7519 | lpfc_rq_destroy(phba, phba->sli4_hba.hdr_rq, phba->sli4_hba.dat_rq); | ||
7486 | out_destroy_els_wq: | 7520 | out_destroy_els_wq: |
7487 | lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); | 7521 | lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); |
7488 | out_destroy_mbx_wq: | 7522 | out_destroy_mbx_wq: |
@@ -7521,6 +7555,9 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba) | |||
7521 | { | 7555 | { |
7522 | int fcp_qidx; | 7556 | int fcp_qidx; |
7523 | 7557 | ||
7558 | /* Unset the queues created for Flash Optimized Fabric operations */ | ||
7559 | if (phba->cfg_fof) | ||
7560 | lpfc_fof_queue_destroy(phba); | ||
7524 | /* Unset mailbox command work queue */ | 7561 | /* Unset mailbox command work queue */ |
7525 | lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); | 7562 | lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); |
7526 | /* Unset ELS work queue */ | 7563 | /* Unset ELS work queue */ |
@@ -8638,6 +8675,10 @@ lpfc_sli4_enable_msix(struct lpfc_hba *phba) | |||
8638 | 8675 | ||
8639 | /* Configure MSI-X capability structure */ | 8676 | /* Configure MSI-X capability structure */ |
8640 | vectors = phba->cfg_fcp_io_channel; | 8677 | vectors = phba->cfg_fcp_io_channel; |
8678 | if (phba->cfg_fof) { | ||
8679 | phba->sli4_hba.msix_entries[index].entry = index; | ||
8680 | vectors++; | ||
8681 | } | ||
8641 | enable_msix_vectors: | 8682 | enable_msix_vectors: |
8642 | rc = pci_enable_msix(phba->pcidev, phba->sli4_hba.msix_entries, | 8683 | rc = pci_enable_msix(phba->pcidev, phba->sli4_hba.msix_entries, |
8643 | vectors); | 8684 | vectors); |
@@ -8667,7 +8708,15 @@ enable_msix_vectors: | |||
8667 | phba->sli4_hba.fcp_eq_hdl[index].idx = index; | 8708 | phba->sli4_hba.fcp_eq_hdl[index].idx = index; |
8668 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; | 8709 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; |
8669 | atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].fcp_eq_in_use, 1); | 8710 | atomic_set(&phba->sli4_hba.fcp_eq_hdl[index].fcp_eq_in_use, 1); |
8670 | rc = request_irq(phba->sli4_hba.msix_entries[index].vector, | 8711 | if (phba->cfg_fof && (index == (vectors - 1))) |
8712 | rc = request_irq( | ||
8713 | phba->sli4_hba.msix_entries[index].vector, | ||
8714 | &lpfc_sli4_fof_intr_handler, IRQF_SHARED, | ||
8715 | (char *)&phba->sli4_hba.handler_name[index], | ||
8716 | &phba->sli4_hba.fcp_eq_hdl[index]); | ||
8717 | else | ||
8718 | rc = request_irq( | ||
8719 | phba->sli4_hba.msix_entries[index].vector, | ||
8671 | &lpfc_sli4_hba_intr_handler, IRQF_SHARED, | 8720 | &lpfc_sli4_hba_intr_handler, IRQF_SHARED, |
8672 | (char *)&phba->sli4_hba.handler_name[index], | 8721 | (char *)&phba->sli4_hba.handler_name[index], |
8673 | &phba->sli4_hba.fcp_eq_hdl[index]); | 8722 | &phba->sli4_hba.fcp_eq_hdl[index]); |
@@ -8679,6 +8728,9 @@ enable_msix_vectors: | |||
8679 | } | 8728 | } |
8680 | } | 8729 | } |
8681 | 8730 | ||
8731 | if (phba->cfg_fof) | ||
8732 | vectors--; | ||
8733 | |||
8682 | if (vectors != phba->cfg_fcp_io_channel) { | 8734 | if (vectors != phba->cfg_fcp_io_channel) { |
8683 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 8735 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
8684 | "3238 Reducing IO channels to match number of " | 8736 | "3238 Reducing IO channels to match number of " |
@@ -8724,7 +8776,10 @@ lpfc_sli4_disable_msix(struct lpfc_hba *phba) | |||
8724 | free_irq(phba->sli4_hba.msix_entries[index].vector, | 8776 | free_irq(phba->sli4_hba.msix_entries[index].vector, |
8725 | &phba->sli4_hba.fcp_eq_hdl[index]); | 8777 | &phba->sli4_hba.fcp_eq_hdl[index]); |
8726 | } | 8778 | } |
8727 | 8779 | if (phba->cfg_fof) { | |
8780 | free_irq(phba->sli4_hba.msix_entries[index].vector, | ||
8781 | &phba->sli4_hba.fcp_eq_hdl[index]); | ||
8782 | } | ||
8728 | /* Disable MSI-X */ | 8783 | /* Disable MSI-X */ |
8729 | pci_disable_msix(phba->pcidev); | 8784 | pci_disable_msix(phba->pcidev); |
8730 | 8785 | ||
@@ -8774,6 +8829,10 @@ lpfc_sli4_enable_msi(struct lpfc_hba *phba) | |||
8774 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; | 8829 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; |
8775 | } | 8830 | } |
8776 | 8831 | ||
8832 | if (phba->cfg_fof) { | ||
8833 | phba->sli4_hba.fcp_eq_hdl[index].idx = index; | ||
8834 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; | ||
8835 | } | ||
8777 | return 0; | 8836 | return 0; |
8778 | } | 8837 | } |
8779 | 8838 | ||
@@ -8856,6 +8915,12 @@ lpfc_sli4_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode) | |||
8856 | atomic_set(&phba->sli4_hba.fcp_eq_hdl[index]. | 8915 | atomic_set(&phba->sli4_hba.fcp_eq_hdl[index]. |
8857 | fcp_eq_in_use, 1); | 8916 | fcp_eq_in_use, 1); |
8858 | } | 8917 | } |
8918 | if (phba->cfg_fof) { | ||
8919 | phba->sli4_hba.fcp_eq_hdl[index].idx = index; | ||
8920 | phba->sli4_hba.fcp_eq_hdl[index].phba = phba; | ||
8921 | atomic_set(&phba->sli4_hba.fcp_eq_hdl[index]. | ||
8922 | fcp_eq_in_use, 1); | ||
8923 | } | ||
8859 | } | 8924 | } |
8860 | } | 8925 | } |
8861 | return intr_mode; | 8926 | return intr_mode; |
@@ -9166,6 +9231,7 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
9166 | phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED; | 9231 | phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED; |
9167 | sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len; | 9232 | sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len; |
9168 | sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters); | 9233 | sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters); |
9234 | sli4_params->oas_supported = bf_get(cfg_oas, mbx_sli4_parameters); | ||
9169 | sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters); | 9235 | sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters); |
9170 | sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters); | 9236 | sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters); |
9171 | sli4_params->wqv = bf_get(cfg_wqv, mbx_sli4_parameters); | 9237 | sli4_params->wqv = bf_get(cfg_wqv, mbx_sli4_parameters); |
@@ -10799,6 +10865,169 @@ lpfc_io_resume(struct pci_dev *pdev) | |||
10799 | return; | 10865 | return; |
10800 | } | 10866 | } |
10801 | 10867 | ||
10868 | /** | ||
10869 | * lpfc_sli4_oas_verify - Verify OAS is supported by this adapter | ||
10870 | * @phba: pointer to lpfc hba data structure. | ||
10871 | * | ||
10872 | * This routine checks to see if OAS is supported for this adapter. If | ||
10873 | * supported, the configure Flash Optimized Fabric flag is set. Otherwise, | ||
10874 | * the enable oas flag is cleared and the pool created for OAS device data | ||
10875 | * is destroyed. | ||
10876 | * | ||
10877 | **/ | ||
10878 | void | ||
10879 | lpfc_sli4_oas_verify(struct lpfc_hba *phba) | ||
10880 | { | ||
10881 | |||
10882 | if (!phba->cfg_EnableXLane) | ||
10883 | return; | ||
10884 | |||
10885 | if (phba->sli4_hba.pc_sli4_params.oas_supported) { | ||
10886 | phba->cfg_fof = 1; | ||
10887 | } else { | ||
10888 | phba->cfg_EnableXLane = 0; | ||
10889 | if (phba->device_data_mem_pool) | ||
10890 | mempool_destroy(phba->device_data_mem_pool); | ||
10891 | phba->device_data_mem_pool = NULL; | ||
10892 | } | ||
10893 | |||
10894 | return; | ||
10895 | } | ||
10896 | |||
10897 | /** | ||
10898 | * lpfc_fof_queue_setup - Set up all the fof queues | ||
10899 | * @phba: pointer to lpfc hba data structure. | ||
10900 | * | ||
10901 | * This routine is invoked to set up all the fof queues for the FC HBA | ||
10902 | * operation. | ||
10903 | * | ||
10904 | * Return codes | ||
10905 | * 0 - successful | ||
10906 | * -ENOMEM - No available memory | ||
10907 | **/ | ||
10908 | int | ||
10909 | lpfc_fof_queue_setup(struct lpfc_hba *phba) | ||
10910 | { | ||
10911 | struct lpfc_sli *psli = &phba->sli; | ||
10912 | int rc; | ||
10913 | |||
10914 | rc = lpfc_eq_create(phba, phba->sli4_hba.fof_eq, LPFC_MAX_IMAX); | ||
10915 | if (rc) | ||
10916 | return -ENOMEM; | ||
10917 | |||
10918 | if (phba->cfg_EnableXLane) { | ||
10919 | |||
10920 | rc = lpfc_cq_create(phba, phba->sli4_hba.oas_cq, | ||
10921 | phba->sli4_hba.fof_eq, LPFC_WCQ, LPFC_FCP); | ||
10922 | if (rc) | ||
10923 | goto out_oas_cq; | ||
10924 | |||
10925 | rc = lpfc_wq_create(phba, phba->sli4_hba.oas_wq, | ||
10926 | phba->sli4_hba.oas_cq, LPFC_FCP); | ||
10927 | if (rc) | ||
10928 | goto out_oas_wq; | ||
10929 | |||
10930 | phba->sli4_hba.oas_cq->pring = &psli->ring[LPFC_FCP_OAS_RING]; | ||
10931 | phba->sli4_hba.oas_ring = &psli->ring[LPFC_FCP_OAS_RING]; | ||
10932 | } | ||
10933 | |||
10934 | return 0; | ||
10935 | |||
10936 | out_oas_wq: | ||
10937 | if (phba->cfg_EnableXLane) | ||
10938 | lpfc_cq_destroy(phba, phba->sli4_hba.oas_cq); | ||
10939 | out_oas_cq: | ||
10940 | lpfc_eq_destroy(phba, phba->sli4_hba.fof_eq); | ||
10941 | return rc; | ||
10942 | |||
10943 | } | ||
10944 | |||
10945 | /** | ||
10946 | * lpfc_fof_queue_create - Create all the fof queues | ||
10947 | * @phba: pointer to lpfc hba data structure. | ||
10948 | * | ||
10949 | * This routine is invoked to allocate all the fof queues for the FC HBA | ||
10950 | * operation. For each SLI4 queue type, the parameters such as queue entry | ||
10951 | * count (queue depth) shall be taken from the module parameter. For now, | ||
10952 | * we just use some constant number as place holder. | ||
10953 | * | ||
10954 | * Return codes | ||
10955 | * 0 - successful | ||
10956 | * -ENOMEM - No availble memory | ||
10957 | * -EIO - The mailbox failed to complete successfully. | ||
10958 | **/ | ||
10959 | int | ||
10960 | lpfc_fof_queue_create(struct lpfc_hba *phba) | ||
10961 | { | ||
10962 | struct lpfc_queue *qdesc; | ||
10963 | |||
10964 | /* Create FOF EQ */ | ||
10965 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.eq_esize, | ||
10966 | phba->sli4_hba.eq_ecount); | ||
10967 | if (!qdesc) | ||
10968 | goto out_error; | ||
10969 | |||
10970 | phba->sli4_hba.fof_eq = qdesc; | ||
10971 | |||
10972 | if (phba->cfg_EnableXLane) { | ||
10973 | |||
10974 | /* Create OAS CQ */ | ||
10975 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, | ||
10976 | phba->sli4_hba.cq_ecount); | ||
10977 | if (!qdesc) | ||
10978 | goto out_error; | ||
10979 | |||
10980 | phba->sli4_hba.oas_cq = qdesc; | ||
10981 | |||
10982 | /* Create OAS WQ */ | ||
10983 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.wq_esize, | ||
10984 | phba->sli4_hba.wq_ecount); | ||
10985 | if (!qdesc) | ||
10986 | goto out_error; | ||
10987 | |||
10988 | phba->sli4_hba.oas_wq = qdesc; | ||
10989 | |||
10990 | } | ||
10991 | return 0; | ||
10992 | |||
10993 | out_error: | ||
10994 | lpfc_fof_queue_destroy(phba); | ||
10995 | return -ENOMEM; | ||
10996 | } | ||
10997 | |||
10998 | /** | ||
10999 | * lpfc_fof_queue_destroy - Destroy all the fof queues | ||
11000 | * @phba: pointer to lpfc hba data structure. | ||
11001 | * | ||
11002 | * This routine is invoked to release all the SLI4 queues with the FC HBA | ||
11003 | * operation. | ||
11004 | * | ||
11005 | * Return codes | ||
11006 | * 0 - successful | ||
11007 | **/ | ||
11008 | int | ||
11009 | lpfc_fof_queue_destroy(struct lpfc_hba *phba) | ||
11010 | { | ||
11011 | /* Release FOF Event queue */ | ||
11012 | if (phba->sli4_hba.fof_eq != NULL) { | ||
11013 | lpfc_sli4_queue_free(phba->sli4_hba.fof_eq); | ||
11014 | phba->sli4_hba.fof_eq = NULL; | ||
11015 | } | ||
11016 | |||
11017 | /* Release OAS Completion queue */ | ||
11018 | if (phba->sli4_hba.oas_cq != NULL) { | ||
11019 | lpfc_sli4_queue_free(phba->sli4_hba.oas_cq); | ||
11020 | phba->sli4_hba.oas_cq = NULL; | ||
11021 | } | ||
11022 | |||
11023 | /* Release OAS Work queue */ | ||
11024 | if (phba->sli4_hba.oas_wq != NULL) { | ||
11025 | lpfc_sli4_queue_free(phba->sli4_hba.oas_wq); | ||
11026 | phba->sli4_hba.oas_wq = NULL; | ||
11027 | } | ||
11028 | return 0; | ||
11029 | } | ||
11030 | |||
10802 | static struct pci_device_id lpfc_id_table[] = { | 11031 | static struct pci_device_id lpfc_id_table[] = { |
10803 | {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER, | 11032 | {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER, |
10804 | PCI_ANY_ID, PCI_ANY_ID, }, | 11033 | PCI_ANY_ID, PCI_ANY_ID, }, |