Lines Matching refs:phba

68 	struct beiscsi_hba *phba = iscsi_host_priv(shost); \
70 param_val = phba->attr_##_name;\
72 phba->attr_##_name);\
77 beiscsi_##_name##_change(struct beiscsi_hba *phba, uint32_t val)\
80 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,\
83 phba->attr_##_name, val); \
84 phba->attr_##_name = val;\
87 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, \
101 struct beiscsi_hba *phba = iscsi_host_priv(shost);\
107 if (beiscsi_##_name##_change(phba, param_val) == 0) \
115 beiscsi_##_name##_init(struct beiscsi_hba *phba, uint32_t val) \
118 phba->attr_##_name = val;\
121 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,\
125 phba->attr_##_name = _defval;\
225 struct beiscsi_hba *phba; in beiscsi_eh_abort() local
256 phba = beiscsi_conn->phba; in beiscsi_eh_abort()
260 inv_tbl = phba->inv_tbl; in beiscsi_eh_abort()
265 nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev, in beiscsi_eh_abort()
269 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_EH, in beiscsi_eh_abort()
276 tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate, in beiscsi_eh_abort()
279 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_EH, in beiscsi_eh_abort()
282 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_eh_abort()
288 rc = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd); in beiscsi_eh_abort()
290 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_eh_abort()
302 struct beiscsi_hba *phba; in beiscsi_eh_device_reset() local
320 phba = beiscsi_conn->phba; in beiscsi_eh_device_reset()
322 inv_tbl = phba->inv_tbl; in beiscsi_eh_device_reset()
345 inv_tbl = phba->inv_tbl; in beiscsi_eh_device_reset()
347 nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev, in beiscsi_eh_device_reset()
351 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_EH, in beiscsi_eh_device_reset()
358 tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate, in beiscsi_eh_device_reset()
361 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_EH, in beiscsi_eh_device_reset()
364 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_eh_device_reset()
369 rc = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd); in beiscsi_eh_device_reset()
371 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_eh_device_reset()
378 struct beiscsi_hba *phba = data; in beiscsi_show_boot_tgt_info() local
379 struct mgmt_session_info *boot_sess = &phba->boot_sess; in beiscsi_show_boot_tgt_info()
445 struct beiscsi_hba *phba = data; in beiscsi_show_boot_ini_info() local
451 rc = sprintf(str, "%s\n", phba->boot_sess.initiator_iscsiname); in beiscsi_show_boot_ini_info()
462 struct beiscsi_hba *phba = data; in beiscsi_show_boot_eth_info() local
474 rc = beiscsi_get_macaddr(str, phba); in beiscsi_show_boot_eth_info()
579 struct beiscsi_hba *phba; in beiscsi_hba_alloc() local
582 shost = iscsi_host_alloc(&beiscsi_sht, sizeof(*phba), 0); in beiscsi_hba_alloc()
593 phba = iscsi_host_priv(shost); in beiscsi_hba_alloc()
594 memset(phba, 0, sizeof(*phba)); in beiscsi_hba_alloc()
595 phba->shost = shost; in beiscsi_hba_alloc()
596 phba->pcidev = pci_dev_get(pcidev); in beiscsi_hba_alloc()
597 pci_set_drvdata(pcidev, phba); in beiscsi_hba_alloc()
598 phba->interface_handle = 0xFFFFFFFF; in beiscsi_hba_alloc()
600 return phba; in beiscsi_hba_alloc()
603 static void beiscsi_unmap_pci_function(struct beiscsi_hba *phba) in beiscsi_unmap_pci_function() argument
605 if (phba->csr_va) { in beiscsi_unmap_pci_function()
606 iounmap(phba->csr_va); in beiscsi_unmap_pci_function()
607 phba->csr_va = NULL; in beiscsi_unmap_pci_function()
609 if (phba->db_va) { in beiscsi_unmap_pci_function()
610 iounmap(phba->db_va); in beiscsi_unmap_pci_function()
611 phba->db_va = NULL; in beiscsi_unmap_pci_function()
613 if (phba->pci_va) { in beiscsi_unmap_pci_function()
614 iounmap(phba->pci_va); in beiscsi_unmap_pci_function()
615 phba->pci_va = NULL; in beiscsi_unmap_pci_function()
619 static int beiscsi_map_pci_bars(struct beiscsi_hba *phba, in beiscsi_map_pci_bars() argument
629 phba->ctrl.csr = addr; in beiscsi_map_pci_bars()
630 phba->csr_va = addr; in beiscsi_map_pci_bars()
631 phba->csr_pa.u.a64.address = pci_resource_start(pcidev, 2); in beiscsi_map_pci_bars()
636 phba->ctrl.db = addr; in beiscsi_map_pci_bars()
637 phba->db_va = addr; in beiscsi_map_pci_bars()
638 phba->db_pa.u.a64.address = pci_resource_start(pcidev, 4); in beiscsi_map_pci_bars()
640 if (phba->generation == BE_GEN2) in beiscsi_map_pci_bars()
650 phba->ctrl.pcicfg = addr; in beiscsi_map_pci_bars()
651 phba->pci_va = addr; in beiscsi_map_pci_bars()
652 phba->pci_pa.u.a64.address = pci_resource_start(pcidev, pcicfg_reg); in beiscsi_map_pci_bars()
656 beiscsi_unmap_pci_function(phba); in beiscsi_map_pci_bars()
694 static int be_ctrl_init(struct beiscsi_hba *phba, struct pci_dev *pdev) in be_ctrl_init() argument
696 struct be_ctrl_info *ctrl = &phba->ctrl; in be_ctrl_init()
702 status = beiscsi_map_pci_bars(phba, pdev); in be_ctrl_init()
710 beiscsi_unmap_pci_function(phba); in be_ctrl_init()
719 spin_lock_init(&phba->ctrl.mcc_lock); in be_ctrl_init()
720 spin_lock_init(&phba->ctrl.mcc_cq_lock); in be_ctrl_init()
729 static void beiscsi_get_params(struct beiscsi_hba *phba) in beiscsi_get_params() argument
735 total_cid_count = BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP0) + in beiscsi_get_params()
736 BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP1); in beiscsi_get_params()
745 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_get_params()
746 icd_start = phba->fw_config.iscsi_icd_start[ulp_num]; in beiscsi_get_params()
747 icd_count = phba->fw_config.iscsi_icd_count[ulp_num]; in beiscsi_get_params()
759 phba->fw_config. in beiscsi_get_params()
774 phba->fw_config.iscsi_icd_count[ulp_num] = (icd_count - in beiscsi_get_params()
777 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_get_params()
782 phba->fw_config. in beiscsi_get_params()
784 phba->fw_config. in beiscsi_get_params()
791 total_icd_count = phba->fw_config.iscsi_icd_count[ulp_num]; in beiscsi_get_params()
792 phba->params.ios_per_ctrl = (total_icd_count - in beiscsi_get_params()
795 phba->params.cxns_per_ctrl = total_cid_count; in beiscsi_get_params()
796 phba->params.asyncpdus_per_ctrl = total_cid_count; in beiscsi_get_params()
797 phba->params.icds_per_ctrl = total_icd_count; in beiscsi_get_params()
798 phba->params.num_sge_per_io = BE2_SGE; in beiscsi_get_params()
799 phba->params.defpdu_hdr_sz = BE2_DEFPDU_HDR_SZ; in beiscsi_get_params()
800 phba->params.defpdu_data_sz = BE2_DEFPDU_DATA_SZ; in beiscsi_get_params()
801 phba->params.eq_timer = 64; in beiscsi_get_params()
802 phba->params.num_eq_entries = 1024; in beiscsi_get_params()
803 phba->params.num_cq_entries = 1024; in beiscsi_get_params()
804 phba->params.wrbs_per_cxn = 256; in beiscsi_get_params()
807 static void hwi_ring_eq_db(struct beiscsi_hba *phba, in hwi_ring_eq_db() argument
830 iowrite32(val, phba->db_va + DB_EQ_OFFSET); in hwi_ring_eq_db()
840 struct beiscsi_hba *phba; in be_isr_mcc() local
850 phba = pbe_eq->phba; in be_isr_mcc()
851 mcc = &phba->ctrl.mcc_obj.cq; in be_isr_mcc()
861 spin_lock_irqsave(&phba->isr_lock, flags); in be_isr_mcc()
863 spin_unlock_irqrestore(&phba->isr_lock, flags); in be_isr_mcc()
871 queue_work(phba->wq, &pbe_eq->work_cqs); in be_isr_mcc()
873 hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1); in be_isr_mcc()
885 struct beiscsi_hba *phba; in be_isr_msix() local
897 phba = pbe_eq->phba; in be_isr_msix()
911 hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 0, 1); in be_isr_msix()
923 struct beiscsi_hba *phba; in be_isr() local
935 phba = dev_id; in be_isr()
936 ctrl = &phba->ctrl; in be_isr()
942 phwi_ctrlr = phba->phwi_ctrlr; in be_isr()
947 mcc = &phba->ctrl.mcc_obj.cq; in be_isr()
958 spin_lock_irqsave(&phba->isr_lock, flags); in be_isr()
960 spin_unlock_irqrestore(&phba->isr_lock, flags); in be_isr()
973 queue_work(phba->wq, &pbe_eq->work_cqs); in be_isr()
976 hwi_ring_eq_db(phba, eq->id, 0, in be_isr()
980 hwi_ring_eq_db(phba, eq->id, 0, in be_isr()
989 static int beiscsi_init_irqs(struct beiscsi_hba *phba) in beiscsi_init_irqs() argument
991 struct pci_dev *pcidev = phba->pcidev; in beiscsi_init_irqs()
996 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_init_irqs()
999 if (phba->msix_enabled) { in beiscsi_init_irqs()
1000 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_init_irqs()
1001 phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, in beiscsi_init_irqs()
1003 if (!phba->msi_name[i]) { in beiscsi_init_irqs()
1008 sprintf(phba->msi_name[i], "beiscsi_%02x_%02x", in beiscsi_init_irqs()
1009 phba->shost->host_no, i); in beiscsi_init_irqs()
1010 msix_vec = phba->msix_entries[i].vector; in beiscsi_init_irqs()
1012 phba->msi_name[i], in beiscsi_init_irqs()
1015 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_irqs()
1019 kfree(phba->msi_name[i]); in beiscsi_init_irqs()
1023 phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, GFP_KERNEL); in beiscsi_init_irqs()
1024 if (!phba->msi_name[i]) { in beiscsi_init_irqs()
1028 sprintf(phba->msi_name[i], "beiscsi_mcc_%02x", in beiscsi_init_irqs()
1029 phba->shost->host_no); in beiscsi_init_irqs()
1030 msix_vec = phba->msix_entries[i].vector; in beiscsi_init_irqs()
1031 ret = request_irq(msix_vec, be_isr_mcc, 0, phba->msi_name[i], in beiscsi_init_irqs()
1034 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT , in beiscsi_init_irqs()
1037 kfree(phba->msi_name[i]); in beiscsi_init_irqs()
1043 "beiscsi", phba); in beiscsi_init_irqs()
1045 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_irqs()
1054 kfree(phba->msi_name[j]); in beiscsi_init_irqs()
1055 msix_vec = phba->msix_entries[j].vector; in beiscsi_init_irqs()
1061 void hwi_ring_cq_db(struct beiscsi_hba *phba, in hwi_ring_cq_db() argument
1080 iowrite32(val, phba->db_va + DB_CQ_OFFSET); in hwi_ring_cq_db()
1085 struct beiscsi_hba *phba, in beiscsi_process_async_pdu() argument
1107 beiscsi_log(phba, KERN_ERR, in beiscsi_process_async_pdu()
1119 beiscsi_log(phba, KERN_WARNING, in beiscsi_process_async_pdu()
1134 static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba) in alloc_io_sgl_handle() argument
1138 if (phba->io_sgl_hndl_avbl) { in alloc_io_sgl_handle()
1139 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in alloc_io_sgl_handle()
1142 phba->io_sgl_alloc_index); in alloc_io_sgl_handle()
1144 psgl_handle = phba->io_sgl_hndl_base[phba-> in alloc_io_sgl_handle()
1146 phba->io_sgl_hndl_base[phba->io_sgl_alloc_index] = NULL; in alloc_io_sgl_handle()
1147 phba->io_sgl_hndl_avbl--; in alloc_io_sgl_handle()
1148 if (phba->io_sgl_alloc_index == (phba->params. in alloc_io_sgl_handle()
1150 phba->io_sgl_alloc_index = 0; in alloc_io_sgl_handle()
1152 phba->io_sgl_alloc_index++; in alloc_io_sgl_handle()
1159 free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) in free_io_sgl_handle() argument
1161 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in free_io_sgl_handle()
1163 phba->io_sgl_free_index); in free_io_sgl_handle()
1165 if (phba->io_sgl_hndl_base[phba->io_sgl_free_index]) { in free_io_sgl_handle()
1170 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in free_io_sgl_handle()
1172 "value there=%p\n", phba->io_sgl_free_index, in free_io_sgl_handle()
1173 phba->io_sgl_hndl_base in free_io_sgl_handle()
1174 [phba->io_sgl_free_index]); in free_io_sgl_handle()
1177 phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle; in free_io_sgl_handle()
1178 phba->io_sgl_hndl_avbl++; in free_io_sgl_handle()
1179 if (phba->io_sgl_free_index == (phba->params.ios_per_ctrl - 1)) in free_io_sgl_handle()
1180 phba->io_sgl_free_index = 0; in free_io_sgl_handle()
1182 phba->io_sgl_free_index++; in free_io_sgl_handle()
1192 struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid) in alloc_wrb_handle() argument
1199 phwi_ctrlr = phba->phwi_ctrlr; in alloc_wrb_handle()
1206 (phba->params.wrbs_per_cxn - 1)) in alloc_wrb_handle()
1227 free_wrb_handle(struct beiscsi_hba *phba, struct hwi_wrb_context *pwrb_context, in free_wrb_handle() argument
1232 if (pwrb_context->free_index == (phba->params.wrbs_per_cxn - 1)) in free_wrb_handle()
1237 beiscsi_log(phba, KERN_INFO, in free_wrb_handle()
1245 static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba) in alloc_mgmt_sgl_handle() argument
1249 if (phba->eh_sgl_hndl_avbl) { in alloc_mgmt_sgl_handle()
1250 psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index]; in alloc_mgmt_sgl_handle()
1251 phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL; in alloc_mgmt_sgl_handle()
1252 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG, in alloc_mgmt_sgl_handle()
1254 phba->eh_sgl_alloc_index, in alloc_mgmt_sgl_handle()
1255 phba->eh_sgl_alloc_index); in alloc_mgmt_sgl_handle()
1257 phba->eh_sgl_hndl_avbl--; in alloc_mgmt_sgl_handle()
1258 if (phba->eh_sgl_alloc_index == in alloc_mgmt_sgl_handle()
1259 (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl - in alloc_mgmt_sgl_handle()
1261 phba->eh_sgl_alloc_index = 0; in alloc_mgmt_sgl_handle()
1263 phba->eh_sgl_alloc_index++; in alloc_mgmt_sgl_handle()
1270 free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) in free_mgmt_sgl_handle() argument
1273 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG, in free_mgmt_sgl_handle()
1276 phba->eh_sgl_free_index); in free_mgmt_sgl_handle()
1278 if (phba->eh_sgl_hndl_base[phba->eh_sgl_free_index]) { in free_mgmt_sgl_handle()
1283 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG, in free_mgmt_sgl_handle()
1286 phba->eh_sgl_free_index); in free_mgmt_sgl_handle()
1289 phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle; in free_mgmt_sgl_handle()
1290 phba->eh_sgl_hndl_avbl++; in free_mgmt_sgl_handle()
1291 if (phba->eh_sgl_free_index == in free_mgmt_sgl_handle()
1292 (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl - 1)) in free_mgmt_sgl_handle()
1293 phba->eh_sgl_free_index = 0; in free_mgmt_sgl_handle()
1295 phba->eh_sgl_free_index++; in free_mgmt_sgl_handle()
1414 struct beiscsi_hba *phba, struct sol_cqe *psol) in hwi_complete_drvr_msgs() argument
1423 phwi_ctrlr = phba->phwi_ctrlr; in hwi_complete_drvr_msgs()
1424 if (is_chip_be2_be3r(phba)) { in hwi_complete_drvr_msgs()
1466 static void adapter_get_sol_cqe(struct beiscsi_hba *phba, in adapter_get_sol_cqe() argument
1470 if (is_chip_be2_be3r(phba)) { in adapter_get_sol_cqe()
1521 struct beiscsi_hba *phba, struct sol_cqe *psol) in hwi_complete_cmd() argument
1534 phwi_ctrlr = phba->phwi_ctrlr; in hwi_complete_cmd()
1537 adapter_get_sol_cqe(phba, psol, &csol_cqe); in hwi_complete_cmd()
1568 beiscsi_log(phba, KERN_ERR, in hwi_complete_cmd()
1579 beiscsi_log(phba, KERN_WARNING, in hwi_complete_cmd()
1603 hwi_get_async_handle(struct beiscsi_hba *phba, in hwi_get_async_handle() argument
1614 if (is_chip_be2_be3r(phba)) { in hwi_get_async_handle()
1650 beiscsi_log(phba, KERN_WARNING, in hwi_get_async_handle()
1676 hwi_update_async_writables(struct beiscsi_hba *phba, in hwi_update_async_writables() argument
1715 beiscsi_log(phba, KERN_ERR, in hwi_update_async_writables()
1726 static void hwi_free_async_msg(struct beiscsi_hba *phba, in hwi_free_async_msg() argument
1767 static void hwi_post_async_buffers(struct beiscsi_hba *phba, in hwi_post_async_buffers() argument
1781 phwi_ctrlr = phba->phwi_ctrlr; in hwi_post_async_buffers()
1848 iowrite32(doorbell, phba->db_va + doorbell_offset); in hwi_post_async_buffers()
1852 static void hwi_flush_default_pdu_buffer(struct beiscsi_hba *phba, in hwi_flush_default_pdu_buffer() argument
1863 phwi_ctrlr = phba->phwi_ctrlr; in hwi_flush_default_pdu_buffer()
1868 pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx, in hwi_flush_default_pdu_buffer()
1872 hwi_update_async_writables(phba, pasync_ctx, in hwi_flush_default_pdu_buffer()
1875 hwi_free_async_msg(phba, pasync_ctx, pasync_handle->cri); in hwi_flush_default_pdu_buffer()
1876 hwi_post_async_buffers(phba, pasync_handle->is_header, in hwi_flush_default_pdu_buffer()
1883 struct beiscsi_hba *phba, in hwi_fwd_async_msg() argument
1913 status = beiscsi_process_async_pdu(beiscsi_conn, phba, in hwi_fwd_async_msg()
1917 hwi_free_async_msg(phba, pasync_ctx, cri); in hwi_fwd_async_msg()
1923 struct beiscsi_hba *phba, in hwi_gather_async_pdu() argument
1932 phwi_ctrlr = phba->phwi_ctrlr; in hwi_gather_async_pdu()
1942 hwi_free_async_msg(phba, pasync_ctx, cri); in hwi_gather_async_pdu()
1965 status = hwi_fwd_async_msg(beiscsi_conn, phba, in hwi_gather_async_pdu()
1982 status = hwi_fwd_async_msg(beiscsi_conn, phba, in hwi_gather_async_pdu()
1990 struct beiscsi_hba *phba, in hwi_process_default_pdu_ring() argument
2000 phwi_ctrlr = phba->phwi_ctrlr; in hwi_process_default_pdu_ring()
2005 pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx, in hwi_process_default_pdu_ring()
2009 hwi_update_async_writables(phba, pasync_ctx, in hwi_process_default_pdu_ring()
2012 hwi_gather_async_pdu(beiscsi_conn, phba, pasync_handle); in hwi_process_default_pdu_ring()
2013 hwi_post_async_buffers(phba, pasync_handle->is_header, in hwi_process_default_pdu_ring()
2018 static void beiscsi_process_mcc_isr(struct beiscsi_hba *phba) in beiscsi_process_mcc_isr() argument
2024 mcc_cq = &phba->ctrl.mcc_obj.cq; in beiscsi_process_mcc_isr()
2030 hwi_ring_cq_db(phba, mcc_cq->id, in beiscsi_process_mcc_isr()
2038 beiscsi_async_link_state_process(phba, in beiscsi_process_mcc_isr()
2041 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_MBOX, in beiscsi_process_mcc_isr()
2046 be_mcc_compl_process_isr(&phba->ctrl, mcc_compl); in beiscsi_process_mcc_isr()
2047 atomic_dec(&phba->ctrl.mcc_obj.q.used); in beiscsi_process_mcc_isr()
2058 hwi_ring_cq_db(phba, mcc_cq->id, num_processed, 1, 0); in beiscsi_process_mcc_isr()
2081 struct beiscsi_hba *phba; in beiscsi_process_cq() local
2085 phba = pbe_eq->phba; in beiscsi_process_cq()
2095 if (is_chip_be2_be3r(phba)) { in beiscsi_process_cq()
2110 ep = phba->ep_array[cri_index]; in beiscsi_process_cq()
2116 beiscsi_log(phba, KERN_WARNING, in beiscsi_process_cq()
2127 hwi_ring_cq_db(phba, cq->id, in beiscsi_process_cq()
2135 hwi_complete_cmd(beiscsi_conn, phba, sol); in beiscsi_process_cq()
2138 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2144 hwi_complete_drvr_msgs(beiscsi_conn, phba, sol); in beiscsi_process_cq()
2147 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2152 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2153 hwi_process_default_pdu_ring(beiscsi_conn, phba, in beiscsi_process_cq()
2155 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2158 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2163 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2164 hwi_process_default_pdu_ring(beiscsi_conn, phba, in beiscsi_process_cq()
2166 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2171 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2184 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2190 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2194 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2195 hwi_flush_default_pdu_buffer(phba, beiscsi_conn, in beiscsi_process_cq()
2197 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2215 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2224 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2241 hwi_ring_cq_db(phba, cq->id, num_processed, 1, 0); in beiscsi_process_cq()
2251 struct beiscsi_hba *phba; in beiscsi_process_all_cqs() local
2255 phba = pbe_eq->phba; in beiscsi_process_all_cqs()
2256 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_process_all_cqs()
2260 spin_lock_irqsave(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2262 spin_unlock_irqrestore(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2263 beiscsi_process_mcc_isr(phba); in beiscsi_process_all_cqs()
2267 spin_lock_irqsave(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2269 spin_unlock_irqrestore(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2274 hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1); in beiscsi_process_all_cqs()
2280 struct beiscsi_hba *phba; in be_iopoll() local
2287 phba = pbe_eq->phba; in be_iopoll()
2289 beiscsi_log(phba, KERN_INFO, in be_iopoll()
2293 hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1); in be_iopoll()
2491 struct beiscsi_hba *phba = beiscsi_conn->phba; in hwi_write_buffer() local
2505 if (is_chip_be2_be3r(phba)) in hwi_write_buffer()
2514 io_task->mtask_addr = pci_map_single(phba->pcidev, in hwi_write_buffer()
2568 static void beiscsi_find_mem_req(struct beiscsi_hba *phba) in beiscsi_find_mem_req() argument
2575 num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \ in beiscsi_find_mem_req()
2578 phba->params.hwi_ws_sz = sizeof(struct hwi_controller); in beiscsi_find_mem_req()
2580 phba->mem_req[ISCSI_MEM_GLOBAL_HEADER] = 2 * in beiscsi_find_mem_req()
2582 phba->mem_req[HWI_MEM_ADDN_CONTEXT] = in beiscsi_find_mem_req()
2586 phba->mem_req[HWI_MEM_WRB] = sizeof(struct iscsi_wrb) in beiscsi_find_mem_req()
2587 * (phba->params.wrbs_per_cxn) in beiscsi_find_mem_req()
2588 * phba->params.cxns_per_ctrl; in beiscsi_find_mem_req()
2590 (phba->params.wrbs_per_cxn); in beiscsi_find_mem_req()
2591 phba->mem_req[HWI_MEM_WRBH] = roundup_pow_of_two((wrb_sz_per_cxn) * in beiscsi_find_mem_req()
2592 phba->params.cxns_per_ctrl); in beiscsi_find_mem_req()
2594 phba->mem_req[HWI_MEM_SGLH] = sizeof(struct sgl_handle) * in beiscsi_find_mem_req()
2595 phba->params.icds_per_ctrl; in beiscsi_find_mem_req()
2596 phba->mem_req[HWI_MEM_SGE] = sizeof(struct iscsi_sge) * in beiscsi_find_mem_req()
2597 phba->params.num_sge_per_io * phba->params.icds_per_ctrl; in beiscsi_find_mem_req()
2599 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_find_mem_req()
2603 phba, ulp_num) * in beiscsi_find_mem_req()
2608 phba, ulp_num) * in beiscsi_find_mem_req()
2609 phba->params.defpdu_hdr_sz); in beiscsi_find_mem_req()
2613 phba, ulp_num) * in beiscsi_find_mem_req()
2614 phba->params.defpdu_data_sz); in beiscsi_find_mem_req()
2618 phba, ulp_num) * in beiscsi_find_mem_req()
2623 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2624 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2629 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2635 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2641 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2647 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2653 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2654 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2659 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2660 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2665 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2667 (BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2673 static int beiscsi_alloc_mem(struct beiscsi_hba *phba) in beiscsi_alloc_mem() argument
2681 phba->phwi_ctrlr = kzalloc(phba->params.hwi_ws_sz, GFP_KERNEL); in beiscsi_alloc_mem()
2682 if (!phba->phwi_ctrlr) in beiscsi_alloc_mem()
2686 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_alloc_mem()
2688 phba->params.cxns_per_ctrl, in beiscsi_alloc_mem()
2693 phba->init_mem = kcalloc(SE_MEM_MAX, sizeof(*mem_descr), in beiscsi_alloc_mem()
2695 if (!phba->init_mem) { in beiscsi_alloc_mem()
2697 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2704 kfree(phba->init_mem); in beiscsi_alloc_mem()
2706 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2710 mem_descr = phba->init_mem; in beiscsi_alloc_mem()
2712 if (!phba->mem_req[i]) { in beiscsi_alloc_mem()
2720 alloc_size = phba->mem_req[i]; in beiscsi_alloc_mem()
2726 phba->pcidev, in beiscsi_alloc_mem()
2750 mem_descr->size_in_bytes = phba->mem_req[i]; in beiscsi_alloc_mem()
2766 pci_free_consistent(phba->pcidev, in beiscsi_alloc_mem()
2781 kfree(phba->init_mem); in beiscsi_alloc_mem()
2782 kfree(phba->phwi_ctrlr->wrb_context); in beiscsi_alloc_mem()
2783 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2787 static int beiscsi_get_memory(struct beiscsi_hba *phba) in beiscsi_get_memory() argument
2789 beiscsi_find_mem_req(phba); in beiscsi_get_memory()
2790 return beiscsi_alloc_mem(phba); in beiscsi_get_memory()
2793 static void iscsi_init_global_templates(struct beiscsi_hba *phba) in iscsi_init_global_templates() argument
2799 mem_descr = phba->init_mem; in iscsi_init_global_templates()
2818 static int beiscsi_init_wrb_handle(struct beiscsi_hba *phba) in beiscsi_init_wrb_handle() argument
2829 mem_descr_wrbh = phba->init_mem; in beiscsi_init_wrb_handle()
2832 mem_descr_wrb = phba->init_mem; in beiscsi_init_wrb_handle()
2834 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_init_wrb_handle()
2839 phba->params.cxns_per_ctrl, in beiscsi_init_wrb_handle()
2842 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2847 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in beiscsi_init_wrb_handle()
2851 phba->params.wrbs_per_cxn, GFP_KERNEL); in beiscsi_init_wrb_handle()
2853 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2859 phba->params.wrbs_per_cxn, GFP_KERNEL); in beiscsi_init_wrb_handle()
2861 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2870 phba->params.wrbs_per_cxn)); in beiscsi_init_wrb_handle()
2878 for (j = 0; j < phba->params.wrbs_per_cxn; j++) { in beiscsi_init_wrb_handle()
2890 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in beiscsi_init_wrb_handle()
2896 phba->params.wrbs_per_cxn)); in beiscsi_init_wrb_handle()
2901 for (j = 0; j < phba->params.wrbs_per_cxn; j++) { in beiscsi_init_wrb_handle()
2919 static int hwi_init_async_pdu_ctx(struct beiscsi_hba *phba) in hwi_init_async_pdu_ctx() argument
2923 struct hba_parameters *p = &phba->params; in hwi_init_async_pdu_ctx()
2930 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_async_pdu_ctx()
2932 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2936 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_async_pdu_ctx()
2949 pasync_ctx->num_entries = BEISCSI_GET_CID_COUNT(phba, in hwi_init_async_pdu_ctx()
2953 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2957 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
2964 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
2976 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2980 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
2987 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
2995 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2999 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3006 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
3016 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3020 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3027 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
3035 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3039 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
3056 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3060 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3067 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
3080 phba->params.defpdu_data_sz); in hwi_init_async_pdu_ctx()
3084 (phba, ulp_num); index++) { in hwi_init_async_pdu_ctx()
3126 phba->params.defpdu_data_sz); in hwi_init_async_pdu_ctx()
3184 hwi_build_be_sgl_arr(struct beiscsi_hba *phba, in hwi_build_be_sgl_arr() argument
3196 hwi_build_be_sgl_by_offset(struct beiscsi_hba *phba, in hwi_build_be_sgl_by_offset() argument
3223 static int beiscsi_create_eqs(struct beiscsi_hba *phba, in beiscsi_create_eqs() argument
3233 num_eq_pages = PAGES_REQUIRED(phba->params.num_eq_entries * \ in beiscsi_create_eqs()
3236 if (phba->msix_enabled) in beiscsi_create_eqs()
3240 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in beiscsi_create_eqs()
3243 phwi_context->be_eq[i].phba = phba; in beiscsi_create_eqs()
3244 eq_vaddress = pci_alloc_consistent(phba->pcidev, in beiscsi_create_eqs()
3251 ret = be_fill_queue(eq, phba->params.num_eq_entries, in beiscsi_create_eqs()
3254 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3260 ret = beiscsi_cmd_eq_create(&phba->ctrl, eq, in beiscsi_create_eqs()
3263 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3269 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3275 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in beiscsi_create_eqs()
3279 pci_free_consistent(phba->pcidev, num_eq_pages in beiscsi_create_eqs()
3286 static int beiscsi_create_cqs(struct beiscsi_hba *phba, in beiscsi_create_cqs() argument
3297 num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \ in beiscsi_create_cqs()
3300 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_create_cqs()
3305 pbe_eq->phba = phba; in beiscsi_create_cqs()
3307 cq_vaddress = pci_alloc_consistent(phba->pcidev, in beiscsi_create_cqs()
3312 ret = be_fill_queue(cq, phba->params.num_cq_entries, in beiscsi_create_cqs()
3315 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3322 ret = beiscsi_cmd_cq_create(&phba->ctrl, cq, eq, false, in beiscsi_create_cqs()
3325 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3330 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3337 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_create_cqs()
3341 pci_free_consistent(phba->pcidev, num_cq_pages in beiscsi_create_cqs()
3350 beiscsi_create_def_hdr(struct beiscsi_hba *phba, in beiscsi_create_def_hdr() argument
3366 mem_descr = phba->init_mem; in beiscsi_create_def_hdr()
3374 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3382 ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dq, in beiscsi_create_def_hdr()
3384 phba->params.defpdu_hdr_sz, in beiscsi_create_def_hdr()
3387 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3394 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3398 hwi_post_async_buffers(phba, BEISCSI_DEFQ_HDR, ulp_num); in beiscsi_create_def_hdr()
3403 beiscsi_create_def_data(struct beiscsi_hba *phba, in beiscsi_create_def_data() argument
3419 mem_descr = phba->init_mem; in beiscsi_create_def_data()
3427 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3436 ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dataq, in beiscsi_create_def_data()
3438 phba->params.defpdu_data_sz, in beiscsi_create_def_data()
3441 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3448 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3453 hwi_post_async_buffers(phba, BEISCSI_DEFQ_DATA, ulp_num); in beiscsi_create_def_data()
3454 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3463 beiscsi_post_template_hdr(struct beiscsi_hba *phba) in beiscsi_post_template_hdr() argument
3471 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_post_template_hdr()
3472 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in beiscsi_post_template_hdr()
3477 hwi_build_be_sgl_arr(phba, pm_arr, &sgl); in beiscsi_post_template_hdr()
3479 &phba->ctrl, &sgl); in beiscsi_post_template_hdr()
3482 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_post_template_hdr()
3488 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_post_template_hdr()
3497 beiscsi_post_pages(struct beiscsi_hba *phba) in beiscsi_post_pages() argument
3505 mem_descr = phba->init_mem; in beiscsi_post_pages()
3510 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) in beiscsi_post_pages()
3513 page_offset = (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io * in beiscsi_post_pages()
3514 phba->fw_config.iscsi_icd_start[ulp_num]) / PAGE_SIZE; in beiscsi_post_pages()
3516 hwi_build_be_sgl_arr(phba, pm_arr, &sgl); in beiscsi_post_pages()
3517 status = be_cmd_iscsi_post_sgl_pages(&phba->ctrl, &sgl, in beiscsi_post_pages()
3522 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_post_pages()
3528 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_post_pages()
3533 static void be_queue_free(struct beiscsi_hba *phba, struct be_queue_info *q) in be_queue_free() argument
3537 pci_free_consistent(phba->pcidev, mem->size, in be_queue_free()
3543 static int be_queue_alloc(struct beiscsi_hba *phba, struct be_queue_info *q, in be_queue_alloc() argument
3552 mem->va = pci_zalloc_consistent(phba->pcidev, mem->size, &mem->dma); in be_queue_alloc()
3559 beiscsi_create_wrb_rings(struct beiscsi_hba *phba, in beiscsi_create_wrb_rings() argument
3576 mem_descr = phba->init_mem; in beiscsi_create_wrb_rings()
3578 pwrb_arr = kmalloc(sizeof(*pwrb_arr) * phba->params.cxns_per_ctrl, in beiscsi_create_wrb_rings()
3581 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_wrb_rings()
3588 (phba->params.wrbs_per_cxn * sizeof(struct iscsi_wrb)); in beiscsi_create_wrb_rings()
3590 for (num = 0; num < phba->params.cxns_per_ctrl; num++) { in beiscsi_create_wrb_rings()
3594 pwrb_arr[num].size = phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3605 (phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3610 pwrb_arr[num].size = phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3620 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_create_wrb_rings()
3624 BEISCSI_GET_CID_COUNT(phba, ulp_num); in beiscsi_create_wrb_rings()
3627 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in beiscsi_create_wrb_rings()
3643 hwi_build_be_sgl_by_offset(phba, &pwrb_arr[i], &sgl); in beiscsi_create_wrb_rings()
3644 status = be_cmd_wrbq_create(&phba->ctrl, &sgl, in beiscsi_create_wrb_rings()
3649 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_wrb_rings()
3661 static void free_wrb_handles(struct beiscsi_hba *phba) in free_wrb_handles() argument
3667 phwi_ctrlr = phba->phwi_ctrlr; in free_wrb_handles()
3668 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in free_wrb_handles()
3675 static void be_mcc_queues_destroy(struct beiscsi_hba *phba) in be_mcc_queues_destroy() argument
3678 struct be_ctrl_info *ctrl = &phba->ctrl; in be_mcc_queues_destroy()
3680 q = &phba->ctrl.mcc_obj.q; in be_mcc_queues_destroy()
3683 be_queue_free(phba, q); in be_mcc_queues_destroy()
3685 q = &phba->ctrl.mcc_obj.cq; in be_mcc_queues_destroy()
3688 be_queue_free(phba, q); in be_mcc_queues_destroy()
3691 static void hwi_cleanup(struct beiscsi_hba *phba) in hwi_cleanup() argument
3694 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_cleanup()
3700 phwi_ctrlr = phba->phwi_ctrlr; in hwi_cleanup()
3705 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in hwi_cleanup()
3711 free_wrb_handles(phba); in hwi_cleanup()
3714 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_cleanup()
3730 for (i = 0; i < (phba->num_cpus); i++) { in hwi_cleanup()
3736 be_mcc_queues_destroy(phba); in hwi_cleanup()
3737 if (phba->msix_enabled) in hwi_cleanup()
3741 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in hwi_cleanup()
3749 static int be_mcc_queues_create(struct beiscsi_hba *phba, in be_mcc_queues_create() argument
3753 struct be_ctrl_info *ctrl = &phba->ctrl; in be_mcc_queues_create()
3756 cq = &phba->ctrl.mcc_obj.cq; in be_mcc_queues_create()
3757 if (be_queue_alloc(phba, cq, MCC_CQ_LEN, in be_mcc_queues_create()
3761 if (phba->msix_enabled) { in be_mcc_queues_create()
3763 [phba->num_cpus].q, false, true, 0)) in be_mcc_queues_create()
3772 q = &phba->ctrl.mcc_obj.q; in be_mcc_queues_create()
3773 if (be_queue_alloc(phba, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb))) in be_mcc_queues_create()
3777 if (beiscsi_cmd_mccq_create(phba, q, cq)) in be_mcc_queues_create()
3783 be_queue_free(phba, q); in be_mcc_queues_create()
3787 be_queue_free(phba, cq); in be_mcc_queues_create()
3798 static void find_num_cpus(struct beiscsi_hba *phba) in find_num_cpus() argument
3804 switch (phba->generation) { in find_num_cpus()
3807 phba->num_cpus = (num_cpus > BEISCSI_MAX_NUM_CPUS) ? in find_num_cpus()
3815 if (phba->fw_config.eqid_count == 1) { in find_num_cpus()
3817 phba->num_cpus = 1; in find_num_cpus()
3821 phba->num_cpus = in find_num_cpus()
3822 (num_cpus > (phba->fw_config.eqid_count - 1)) ? in find_num_cpus()
3823 (phba->fw_config.eqid_count - 1) : num_cpus; in find_num_cpus()
3826 phba->num_cpus = 1; in find_num_cpus()
3830 static int hwi_init_port(struct beiscsi_hba *phba) in hwi_init_port() argument
3835 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_init_port()
3838 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_port()
3843 be_cmd_fw_initialize(&phba->ctrl); in hwi_init_port()
3845 status = beiscsi_create_eqs(phba, phwi_context); in hwi_init_port()
3847 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3852 status = be_mcc_queues_create(phba, phwi_context); in hwi_init_port()
3856 status = mgmt_check_supported_fw(ctrl, phba); in hwi_init_port()
3858 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3863 status = beiscsi_create_cqs(phba, phwi_context); in hwi_init_port()
3865 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3871 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_port()
3874 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in hwi_init_port()
3877 status = beiscsi_create_def_hdr(phba, phwi_context, in hwi_init_port()
3882 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3888 status = beiscsi_create_def_data(phba, phwi_context, in hwi_init_port()
3893 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3901 status = beiscsi_post_pages(phba); in hwi_init_port()
3903 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3908 status = beiscsi_post_template_hdr(phba); in hwi_init_port()
3910 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3914 status = beiscsi_create_wrb_rings(phba, phwi_context, phwi_ctrlr); in hwi_init_port()
3916 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3924 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_port()
3931 phba->params.cxns_per_ctrl; cri++) { in hwi_init_port()
3941 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_port()
3946 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3948 hwi_cleanup(phba); in hwi_init_port()
3952 static int hwi_init_controller(struct beiscsi_hba *phba) in hwi_init_controller() argument
3956 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_controller()
3957 if (1 == phba->init_mem[HWI_MEM_ADDN_CONTEXT].num_elements) { in hwi_init_controller()
3958 phwi_ctrlr->phwi_ctxt = (struct hwi_context_memory *)phba-> in hwi_init_controller()
3960 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_controller()
3964 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
3970 iscsi_init_global_templates(phba); in hwi_init_controller()
3971 if (beiscsi_init_wrb_handle(phba)) in hwi_init_controller()
3974 if (hwi_init_async_pdu_ctx(phba)) { in hwi_init_controller()
3975 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
3980 if (hwi_init_port(phba) != 0) { in hwi_init_controller()
3981 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
3989 static void beiscsi_free_mem(struct beiscsi_hba *phba) in beiscsi_free_mem() argument
3994 mem_descr = phba->init_mem; in beiscsi_free_mem()
3999 pci_free_consistent(phba->pcidev, in beiscsi_free_mem()
4009 kfree(phba->init_mem); in beiscsi_free_mem()
4010 kfree(phba->phwi_ctrlr->wrb_context); in beiscsi_free_mem()
4011 kfree(phba->phwi_ctrlr); in beiscsi_free_mem()
4014 static int beiscsi_init_controller(struct beiscsi_hba *phba) in beiscsi_init_controller() argument
4018 ret = beiscsi_get_memory(phba); in beiscsi_init_controller()
4020 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_controller()
4026 ret = hwi_init_controller(phba); in beiscsi_init_controller()
4029 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_controller()
4035 beiscsi_free_mem(phba); in beiscsi_init_controller()
4039 static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba) in beiscsi_init_sgl_handle() argument
4047 phba->io_sgl_hndl_avbl = 0; in beiscsi_init_sgl_handle()
4048 phba->eh_sgl_hndl_avbl = 0; in beiscsi_init_sgl_handle()
4050 mem_descr_sglh = phba->init_mem; in beiscsi_init_sgl_handle()
4053 phba->io_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) * in beiscsi_init_sgl_handle()
4054 phba->params.ios_per_ctrl, in beiscsi_init_sgl_handle()
4056 if (!phba->io_sgl_hndl_base) { in beiscsi_init_sgl_handle()
4057 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4061 phba->eh_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) * in beiscsi_init_sgl_handle()
4062 (phba->params.icds_per_ctrl - in beiscsi_init_sgl_handle()
4063 phba->params.ios_per_ctrl), in beiscsi_init_sgl_handle()
4065 if (!phba->eh_sgl_hndl_base) { in beiscsi_init_sgl_handle()
4066 kfree(phba->io_sgl_hndl_base); in beiscsi_init_sgl_handle()
4067 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4072 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4085 if (arr_index < phba->params.ios_per_ctrl) { in beiscsi_init_sgl_handle()
4086 phba->io_sgl_hndl_base[arr_index] = psgl_handle; in beiscsi_init_sgl_handle()
4087 phba->io_sgl_hndl_avbl++; in beiscsi_init_sgl_handle()
4090 phba->eh_sgl_hndl_base[arr_index - in beiscsi_init_sgl_handle()
4091 phba->params.ios_per_ctrl] = in beiscsi_init_sgl_handle()
4094 phba->eh_sgl_hndl_avbl++; in beiscsi_init_sgl_handle()
4100 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4103 phba->io_sgl_hndl_avbl, in beiscsi_init_sgl_handle()
4104 phba->eh_sgl_hndl_avbl); in beiscsi_init_sgl_handle()
4106 mem_descr_sg = phba->init_mem; in beiscsi_init_sgl_handle()
4108 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4113 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) in beiscsi_init_sgl_handle()
4116 ulp_icd_start = phba->fw_config.iscsi_icd_start[ulp_num]; in beiscsi_init_sgl_handle()
4125 (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io); in beiscsi_init_sgl_handle()
4127 if (arr_index < phba->params.ios_per_ctrl) in beiscsi_init_sgl_handle()
4128 psgl_handle = phba->io_sgl_hndl_base[arr_index]; in beiscsi_init_sgl_handle()
4130 psgl_handle = phba->eh_sgl_hndl_base[arr_index - in beiscsi_init_sgl_handle()
4131 phba->params.ios_per_ctrl]; in beiscsi_init_sgl_handle()
4135 pfrag += phba->params.num_sge_per_io; in beiscsi_init_sgl_handle()
4140 phba->io_sgl_free_index = 0; in beiscsi_init_sgl_handle()
4141 phba->io_sgl_alloc_index = 0; in beiscsi_init_sgl_handle()
4142 phba->eh_sgl_free_index = 0; in beiscsi_init_sgl_handle()
4143 phba->eh_sgl_alloc_index = 0; in beiscsi_init_sgl_handle()
4147 static int hba_setup_cid_tbls(struct beiscsi_hba *phba) in hba_setup_cid_tbls() argument
4154 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4159 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4170 BEISCSI_GET_CID_COUNT(phba, in hba_setup_cid_tbls()
4173 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4184 phba, ulp_num); in hba_setup_cid_tbls()
4187 phba->cid_array_info[ulp_num] = ptr_cid_info; in hba_setup_cid_tbls()
4190 phba->ep_array = kzalloc(sizeof(struct iscsi_endpoint *) * in hba_setup_cid_tbls()
4191 phba->params.cxns_per_ctrl, GFP_KERNEL); in hba_setup_cid_tbls()
4192 if (!phba->ep_array) { in hba_setup_cid_tbls()
4193 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4201 phba->conn_table = kzalloc(sizeof(struct beiscsi_conn *) * in hba_setup_cid_tbls()
4202 phba->params.cxns_per_ctrl, GFP_KERNEL); in hba_setup_cid_tbls()
4203 if (!phba->conn_table) { in hba_setup_cid_tbls()
4204 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4208 kfree(phba->ep_array); in hba_setup_cid_tbls()
4209 phba->ep_array = NULL; in hba_setup_cid_tbls()
4215 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in hba_setup_cid_tbls()
4216 ulp_num = phba->phwi_ctrlr->wrb_context[i].ulp_num; in hba_setup_cid_tbls()
4218 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4220 phba->phwi_ctrlr->wrb_context[i].cid; in hba_setup_cid_tbls()
4225 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4226 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4236 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4237 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4242 phba->cid_array_info[ulp_num] = NULL; in hba_setup_cid_tbls()
4250 static void hwi_enable_intr(struct beiscsi_hba *phba) in hwi_enable_intr() argument
4252 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_enable_intr()
4260 phwi_ctrlr = phba->phwi_ctrlr; in hwi_enable_intr()
4270 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4275 if (!phba->msix_enabled) { in hwi_enable_intr()
4277 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4280 hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); in hwi_enable_intr()
4282 for (i = 0; i <= phba->num_cpus; i++) { in hwi_enable_intr()
4284 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4286 hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); in hwi_enable_intr()
4291 static void hwi_disable_intr(struct beiscsi_hba *phba) in hwi_disable_intr() argument
4293 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_disable_intr()
4303 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in hwi_disable_intr()
4317 static int beiscsi_get_boot_info(struct beiscsi_hba *phba) in beiscsi_get_boot_info() argument
4326 ret = be_mgmt_get_boot_shandle(phba, &s_handle); in beiscsi_get_boot_info()
4328 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4333 nonemb_cmd.va = pci_zalloc_consistent(phba->ctrl.pdev, in beiscsi_get_boot_info()
4337 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4345 tag = mgmt_get_session_info(phba, s_handle, in beiscsi_get_boot_info()
4348 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4356 ret = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd); in beiscsi_get_boot_info()
4358 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4370 memcpy(&phba->boot_sess, &session_resp->session_info, in beiscsi_get_boot_info()
4375 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_get_boot_info()
4382 struct beiscsi_hba *phba = data; in beiscsi_boot_release() local
4384 scsi_host_put(phba->shost); in beiscsi_boot_release()
4387 static int beiscsi_setup_boot_info(struct beiscsi_hba *phba) in beiscsi_setup_boot_info() argument
4392 if (phba->boot_kset) in beiscsi_setup_boot_info()
4396 if (beiscsi_get_boot_info(phba)) in beiscsi_setup_boot_info()
4400 phba->boot_kset = iscsi_boot_create_host_kset(phba->shost->host_no); in beiscsi_setup_boot_info()
4401 if (!phba->boot_kset) in beiscsi_setup_boot_info()
4405 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4407 boot_kobj = iscsi_boot_create_target(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4414 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4416 boot_kobj = iscsi_boot_create_initiator(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4423 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4425 boot_kobj = iscsi_boot_create_ethernet(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4434 scsi_host_put(phba->shost); in beiscsi_setup_boot_info()
4436 iscsi_boot_destroy_kset(phba->boot_kset); in beiscsi_setup_boot_info()
4437 phba->boot_kset = NULL; in beiscsi_setup_boot_info()
4441 static int beiscsi_init_port(struct beiscsi_hba *phba) in beiscsi_init_port() argument
4445 ret = beiscsi_init_controller(phba); in beiscsi_init_port()
4447 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4452 ret = beiscsi_init_sgl_handle(phba); in beiscsi_init_port()
4454 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4460 if (hba_setup_cid_tbls(phba)) { in beiscsi_init_port()
4461 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4463 kfree(phba->io_sgl_hndl_base); in beiscsi_init_port()
4464 kfree(phba->eh_sgl_hndl_base); in beiscsi_init_port()
4471 hwi_cleanup(phba); in beiscsi_init_port()
4475 static void hwi_purge_eq(struct beiscsi_hba *phba) in hwi_purge_eq() argument
4484 phwi_ctrlr = phba->phwi_ctrlr; in hwi_purge_eq()
4486 if (phba->msix_enabled) in hwi_purge_eq()
4491 for (i = 0; i < (phba->num_cpus + eq_msix); i++) { in hwi_purge_eq()
4504 hwi_ring_eq_db(phba, eq->id, 1, num_processed, 1, 1); in hwi_purge_eq()
4508 static void beiscsi_clean_port(struct beiscsi_hba *phba) in beiscsi_clean_port() argument
4514 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in beiscsi_clean_port()
4515 mgmt_status = mgmt_epfw_cleanup(phba, ulp_num); in beiscsi_clean_port()
4517 beiscsi_log(phba, KERN_WARNING, in beiscsi_clean_port()
4524 hwi_purge_eq(phba); in beiscsi_clean_port()
4525 hwi_cleanup(phba); in beiscsi_clean_port()
4526 kfree(phba->io_sgl_hndl_base); in beiscsi_clean_port()
4527 kfree(phba->eh_sgl_hndl_base); in beiscsi_clean_port()
4528 kfree(phba->ep_array); in beiscsi_clean_port()
4529 kfree(phba->conn_table); in beiscsi_clean_port()
4532 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in beiscsi_clean_port()
4533 ptr_cid_info = phba->cid_array_info[ulp_num]; in beiscsi_clean_port()
4538 phba->cid_array_info[ulp_num] = NULL; in beiscsi_clean_port()
4557 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_free_mgmt_task_handles() local
4563 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_free_mgmt_task_handles()
4571 free_wrb_handle(phba, pwrb_context, in beiscsi_free_mgmt_task_handles()
4577 spin_lock_bh(&phba->mgmt_sgl_lock); in beiscsi_free_mgmt_task_handles()
4578 free_mgmt_sgl_handle(phba, in beiscsi_free_mgmt_task_handles()
4581 spin_unlock_bh(&phba->mgmt_sgl_lock); in beiscsi_free_mgmt_task_handles()
4585 pci_unmap_single(phba->pcidev, in beiscsi_free_mgmt_task_handles()
4601 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_cleanup_task() local
4608 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_cleanup_task()
4619 free_wrb_handle(phba, pwrb_context, in beiscsi_cleanup_task()
4625 spin_lock(&phba->io_sgl_lock); in beiscsi_cleanup_task()
4626 free_io_sgl_handle(phba, io_task->psgl_handle); in beiscsi_cleanup_task()
4627 spin_unlock(&phba->io_sgl_lock); in beiscsi_cleanup_task()
4646 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_offload_connection() local
4660 pwrb_handle = alloc_wrb_handle(phba, beiscsi_conn->beiscsi_conn_cid); in beiscsi_offload_connection()
4663 if (is_chip_be2_be3r(phba)) in beiscsi_offload_connection()
4665 phba->init_mem); in beiscsi_offload_connection()
4676 iowrite32(doorbell, phba->db_va + in beiscsi_offload_connection()
4703 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_alloc_pdu() local
4725 spin_lock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4726 io_task->psgl_handle = alloc_io_sgl_handle(phba); in beiscsi_alloc_pdu()
4727 spin_unlock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4729 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4736 io_task->pwrb_handle = alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4739 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4751 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4753 alloc_mgmt_sgl_handle(phba); in beiscsi_alloc_pdu()
4754 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4756 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4770 alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4773 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4792 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4793 io_task->psgl_handle = alloc_mgmt_sgl_handle(phba); in beiscsi_alloc_pdu()
4794 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4796 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4806 alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4809 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4828 spin_lock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4829 free_io_sgl_handle(phba, io_task->psgl_handle); in beiscsi_alloc_pdu()
4830 spin_unlock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4833 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4834 free_mgmt_sgl_handle(phba, io_task->psgl_handle); in beiscsi_alloc_pdu()
4836 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4838 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_alloc_pdu()
4843 free_wrb_handle(phba, pwrb_context, io_task->pwrb_handle); in beiscsi_alloc_pdu()
4858 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_iotask_v2() local
4902 iowrite32(doorbell, phba->db_va + in beiscsi_iotask_v2()
4915 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_iotask() local
4958 iowrite32(doorbell, phba->db_va + in beiscsi_iotask()
4968 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_mtask() local
4978 if (is_chip_be2_be3r(phba)) { in beiscsi_mtask()
5014 if (is_chip_be2_be3r(phba)) in beiscsi_mtask()
5022 if (is_chip_be2_be3r(phba)) in beiscsi_mtask()
5045 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_mtask()
5053 io_task->wrb_type = (is_chip_be2_be3r(phba)) ? in beiscsi_mtask()
5061 iowrite32(doorbell, phba->db_va + in beiscsi_mtask()
5070 struct beiscsi_hba *phba = NULL; in beiscsi_task_xmit() local
5075 phba = ((struct beiscsi_conn *)task->conn->dd_data)->phba; in beiscsi_task_xmit()
5084 struct beiscsi_hba *phba = NULL; in beiscsi_task_xmit() local
5086 phba = ((struct beiscsi_conn *)conn->dd_data)->phba; in beiscsi_task_xmit()
5087 beiscsi_log(phba, KERN_ERR, in beiscsi_task_xmit()
5103 return phba->iotask_fn(task, sg, num_sg, xferlen, writedir); in beiscsi_task_xmit()
5113 struct beiscsi_hba *phba; in beiscsi_bsg_request() local
5123 phba = iscsi_host_priv(shost); in beiscsi_bsg_request()
5127 nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev, in beiscsi_bsg_request()
5131 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5136 tag = mgmt_vendor_specific_fw_cmd(&phba->ctrl, phba, job, in beiscsi_bsg_request()
5139 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5142 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_bsg_request()
5148 phba->ctrl.mcc_wait[tag], in beiscsi_bsg_request()
5149 phba->ctrl.mcc_numtag[tag], in beiscsi_bsg_request()
5152 extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; in beiscsi_bsg_request()
5153 status = phba->ctrl.mcc_numtag[tag] & 0x000000FF; in beiscsi_bsg_request()
5154 free_mcc_tag(&phba->ctrl, tag); in beiscsi_bsg_request()
5164 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_bsg_request()
5167 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5179 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5188 void beiscsi_hba_attrs_init(struct beiscsi_hba *phba) in beiscsi_hba_attrs_init() argument
5191 beiscsi_log_enable_init(phba, beiscsi_log_enable); in beiscsi_hba_attrs_init()
5201 static void beiscsi_quiesce(struct beiscsi_hba *phba, in beiscsi_quiesce() argument
5209 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_quiesce()
5211 hwi_disable_intr(phba); in beiscsi_quiesce()
5212 if (phba->msix_enabled) { in beiscsi_quiesce()
5213 for (i = 0; i <= phba->num_cpus; i++) { in beiscsi_quiesce()
5214 msix_vec = phba->msix_entries[i].vector; in beiscsi_quiesce()
5217 kfree(phba->msi_name[i]); in beiscsi_quiesce()
5220 if (phba->pcidev->irq) { in beiscsi_quiesce()
5221 synchronize_irq(phba->pcidev->irq); in beiscsi_quiesce()
5222 free_irq(phba->pcidev->irq, phba); in beiscsi_quiesce()
5224 pci_disable_msix(phba->pcidev); in beiscsi_quiesce()
5225 cancel_delayed_work_sync(&phba->beiscsi_hw_check_task); in beiscsi_quiesce()
5227 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_quiesce()
5233 destroy_workqueue(phba->wq); in beiscsi_quiesce()
5234 beiscsi_clean_port(phba); in beiscsi_quiesce()
5235 beiscsi_free_mem(phba); in beiscsi_quiesce()
5237 beiscsi_unmap_pci_function(phba); in beiscsi_quiesce()
5238 pci_free_consistent(phba->pcidev, in beiscsi_quiesce()
5239 phba->ctrl.mbox_mem_alloced.size, in beiscsi_quiesce()
5240 phba->ctrl.mbox_mem_alloced.va, in beiscsi_quiesce()
5241 phba->ctrl.mbox_mem_alloced.dma); in beiscsi_quiesce()
5243 hwi_purge_eq(phba); in beiscsi_quiesce()
5244 hwi_cleanup(phba); in beiscsi_quiesce()
5252 struct beiscsi_hba *phba = NULL; in beiscsi_remove() local
5254 phba = pci_get_drvdata(pcidev); in beiscsi_remove()
5255 if (!phba) { in beiscsi_remove()
5260 beiscsi_destroy_def_ifaces(phba); in beiscsi_remove()
5261 beiscsi_quiesce(phba, BEISCSI_CLEAN_UNLOAD); in beiscsi_remove()
5262 iscsi_boot_destroy_kset(phba->boot_kset); in beiscsi_remove()
5263 iscsi_host_remove(phba->shost); in beiscsi_remove()
5264 pci_dev_put(phba->pcidev); in beiscsi_remove()
5265 iscsi_host_free(phba->shost); in beiscsi_remove()
5274 struct beiscsi_hba *phba = NULL; in beiscsi_shutdown() local
5276 phba = (struct beiscsi_hba *)pci_get_drvdata(pcidev); in beiscsi_shutdown()
5277 if (!phba) { in beiscsi_shutdown()
5282 phba->state = BE_ADAPTER_STATE_SHUTDOWN; in beiscsi_shutdown()
5283 iscsi_host_for_each_session(phba->shost, be2iscsi_fail_session); in beiscsi_shutdown()
5284 beiscsi_quiesce(phba, BEISCSI_CLEAN_UNLOAD); in beiscsi_shutdown()
5288 static void beiscsi_msix_enable(struct beiscsi_hba *phba) in beiscsi_msix_enable() argument
5292 for (i = 0; i <= phba->num_cpus; i++) in beiscsi_msix_enable()
5293 phba->msix_entries[i].entry = i; in beiscsi_msix_enable()
5295 status = pci_enable_msix_range(phba->pcidev, phba->msix_entries, in beiscsi_msix_enable()
5296 phba->num_cpus + 1, phba->num_cpus + 1); in beiscsi_msix_enable()
5298 phba->msix_enabled = true; in beiscsi_msix_enable()
5303 static void be_eqd_update(struct beiscsi_hba *phba) in be_eqd_update() argument
5315 phwi_ctrlr = phba->phwi_ctrlr; in be_eqd_update()
5318 for (i = 0; i <= phba->num_cpus; i++) { in be_eqd_update()
5319 aic = &phba->aic_obj[i]; in be_eqd_update()
5348 tag = be_cmd_modify_eq_delay(phba, set_eqd, num); in be_eqd_update()
5350 beiscsi_mccq_compl(phba, tag, NULL, NULL); in be_eqd_update()
5354 static void be_check_boot_session(struct beiscsi_hba *phba) in be_check_boot_session() argument
5356 if (beiscsi_setup_boot_info(phba)) in be_check_boot_session()
5357 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in be_check_boot_session()
5371 struct beiscsi_hba *phba = in beiscsi_hw_health_check() local
5375 be_eqd_update(phba); in beiscsi_hw_health_check()
5377 if (phba->state & BE_ADAPTER_CHECK_BOOT) { in beiscsi_hw_health_check()
5378 phba->state &= ~BE_ADAPTER_CHECK_BOOT; in beiscsi_hw_health_check()
5379 be_check_boot_session(phba); in beiscsi_hw_health_check()
5382 beiscsi_ue_detect(phba); in beiscsi_hw_health_check()
5384 schedule_delayed_work(&phba->beiscsi_hw_check_task, in beiscsi_hw_health_check()
5392 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_err_detected() local
5394 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_err_detected()
5395 phba->state |= BE_ADAPTER_PCI_ERR; in beiscsi_eeh_err_detected()
5397 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_err_detected()
5400 beiscsi_quiesce(phba, BEISCSI_EEH_UNLOAD); in beiscsi_eeh_err_detected()
5403 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_err_detected()
5424 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_reset() local
5427 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_reset()
5429 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5441 status = be_chk_reset_complete(phba); in beiscsi_eeh_reset()
5443 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5446 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5459 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_resume() local
5463 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_resume()
5467 find_num_cpus(phba); in beiscsi_eeh_resume()
5469 phba->num_cpus = 1; in beiscsi_eeh_resume()
5472 beiscsi_msix_enable(phba); in beiscsi_eeh_resume()
5473 if (!phba->msix_enabled) in beiscsi_eeh_resume()
5474 phba->num_cpus = 1; in beiscsi_eeh_resume()
5477 ret = beiscsi_cmd_reset_function(phba); in beiscsi_eeh_resume()
5479 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5484 ret = be_chk_reset_complete(phba); in beiscsi_eeh_resume()
5486 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5491 beiscsi_get_params(phba); in beiscsi_eeh_resume()
5492 phba->shost->max_id = phba->params.cxns_per_ctrl; in beiscsi_eeh_resume()
5493 phba->shost->can_queue = phba->params.ios_per_ctrl; in beiscsi_eeh_resume()
5494 ret = hwi_init_controller(phba); in beiscsi_eeh_resume()
5497 init_waitqueue_head(&phba->ctrl.mcc_wait[i + 1]); in beiscsi_eeh_resume()
5498 phba->ctrl.mcc_tag[i] = i + 1; in beiscsi_eeh_resume()
5499 phba->ctrl.mcc_numtag[i + 1] = 0; in beiscsi_eeh_resume()
5500 phba->ctrl.mcc_tag_available++; in beiscsi_eeh_resume()
5503 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_eeh_resume()
5506 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_eeh_resume()
5513 i = (phba->msix_enabled) ? i : 0; in beiscsi_eeh_resume()
5518 ret = beiscsi_init_irqs(phba); in beiscsi_eeh_resume()
5520 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5526 hwi_enable_intr(phba); in beiscsi_eeh_resume()
5527 phba->state &= ~BE_ADAPTER_PCI_ERR; in beiscsi_eeh_resume()
5531 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5538 struct beiscsi_hba *phba = NULL; in beiscsi_dev_probe() local
5551 phba = beiscsi_hba_alloc(pcidev); in beiscsi_dev_probe()
5552 if (!phba) { in beiscsi_dev_probe()
5561 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5568 beiscsi_hba_attrs_init(phba); in beiscsi_dev_probe()
5570 phba->fw_timeout = false; in beiscsi_dev_probe()
5571 phba->mac_addr_set = false; in beiscsi_dev_probe()
5578 phba->generation = BE_GEN2; in beiscsi_dev_probe()
5579 phba->iotask_fn = beiscsi_iotask; in beiscsi_dev_probe()
5583 phba->generation = BE_GEN3; in beiscsi_dev_probe()
5584 phba->iotask_fn = beiscsi_iotask; in beiscsi_dev_probe()
5587 phba->generation = BE_GEN4; in beiscsi_dev_probe()
5588 phba->iotask_fn = beiscsi_iotask_v2; in beiscsi_dev_probe()
5591 phba->generation = 0; in beiscsi_dev_probe()
5594 ret = be_ctrl_init(phba, pcidev); in beiscsi_dev_probe()
5596 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5602 ret = beiscsi_cmd_reset_function(phba); in beiscsi_dev_probe()
5604 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5608 ret = be_chk_reset_complete(phba); in beiscsi_dev_probe()
5610 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5615 spin_lock_init(&phba->io_sgl_lock); in beiscsi_dev_probe()
5616 spin_lock_init(&phba->mgmt_sgl_lock); in beiscsi_dev_probe()
5617 spin_lock_init(&phba->isr_lock); in beiscsi_dev_probe()
5618 spin_lock_init(&phba->async_pdu_lock); in beiscsi_dev_probe()
5619 ret = mgmt_get_fw_config(&phba->ctrl, phba); in beiscsi_dev_probe()
5621 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5627 find_num_cpus(phba); in beiscsi_dev_probe()
5629 phba->num_cpus = 1; in beiscsi_dev_probe()
5631 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5633 phba->num_cpus); in beiscsi_dev_probe()
5636 beiscsi_msix_enable(phba); in beiscsi_dev_probe()
5637 if (!phba->msix_enabled) in beiscsi_dev_probe()
5638 phba->num_cpus = 1; in beiscsi_dev_probe()
5641 phba->shost->max_id = phba->params.cxns_per_ctrl; in beiscsi_dev_probe()
5642 beiscsi_get_params(phba); in beiscsi_dev_probe()
5643 phba->shost->can_queue = phba->params.ios_per_ctrl; in beiscsi_dev_probe()
5644 ret = beiscsi_init_port(phba); in beiscsi_dev_probe()
5646 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5653 init_waitqueue_head(&phba->ctrl.mcc_wait[i + 1]); in beiscsi_dev_probe()
5654 phba->ctrl.mcc_tag[i] = i + 1; in beiscsi_dev_probe()
5655 phba->ctrl.mcc_numtag[i + 1] = 0; in beiscsi_dev_probe()
5656 phba->ctrl.mcc_tag_available++; in beiscsi_dev_probe()
5657 memset(&phba->ctrl.ptag_state[i].tag_mem_state, 0, in beiscsi_dev_probe()
5661 phba->ctrl.mcc_alloc_index = phba->ctrl.mcc_free_index = 0; in beiscsi_dev_probe()
5663 snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_%02x_wq", in beiscsi_dev_probe()
5664 phba->shost->host_no); in beiscsi_dev_probe()
5665 phba->wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, phba->wq_name); in beiscsi_dev_probe()
5666 if (!phba->wq) { in beiscsi_dev_probe()
5667 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5673 INIT_DELAYED_WORK(&phba->beiscsi_hw_check_task, in beiscsi_dev_probe()
5676 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_dev_probe()
5679 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_dev_probe()
5686 i = (phba->msix_enabled) ? i : 0; in beiscsi_dev_probe()
5691 ret = beiscsi_init_irqs(phba); in beiscsi_dev_probe()
5693 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5698 hwi_enable_intr(phba); in beiscsi_dev_probe()
5700 if (iscsi_host_add(phba->shost, &phba->pcidev->dev)) in beiscsi_dev_probe()
5703 if (beiscsi_setup_boot_info(phba)) in beiscsi_dev_probe()
5708 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5712 beiscsi_create_def_ifaces(phba); in beiscsi_dev_probe()
5713 schedule_delayed_work(&phba->beiscsi_hw_check_task, in beiscsi_dev_probe()
5716 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5721 destroy_workqueue(phba->wq); in beiscsi_dev_probe()
5722 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_dev_probe()
5727 beiscsi_clean_port(phba); in beiscsi_dev_probe()
5728 beiscsi_free_mem(phba); in beiscsi_dev_probe()
5730 pci_free_consistent(phba->pcidev, in beiscsi_dev_probe()
5731 phba->ctrl.mbox_mem_alloced.size, in beiscsi_dev_probe()
5732 phba->ctrl.mbox_mem_alloced.va, in beiscsi_dev_probe()
5733 phba->ctrl.mbox_mem_alloced.dma); in beiscsi_dev_probe()
5734 beiscsi_unmap_pci_function(phba); in beiscsi_dev_probe()
5736 if (phba->msix_enabled) in beiscsi_dev_probe()
5737 pci_disable_msix(phba->pcidev); in beiscsi_dev_probe()
5738 pci_dev_put(phba->pcidev); in beiscsi_dev_probe()
5739 iscsi_host_free(phba->shost); in beiscsi_dev_probe()