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()
706 static int be_ctrl_init(struct beiscsi_hba *phba, struct pci_dev *pdev) in be_ctrl_init() argument
708 struct be_ctrl_info *ctrl = &phba->ctrl; in be_ctrl_init()
714 status = beiscsi_map_pci_bars(phba, pdev); in be_ctrl_init()
722 beiscsi_unmap_pci_function(phba); in be_ctrl_init()
731 spin_lock_init(&phba->ctrl.mcc_lock); in be_ctrl_init()
732 spin_lock_init(&phba->ctrl.mcc_cq_lock); in be_ctrl_init()
741 static void beiscsi_get_params(struct beiscsi_hba *phba) in beiscsi_get_params() argument
747 total_cid_count = BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP0) + in beiscsi_get_params()
748 BEISCSI_GET_CID_COUNT(phba, BEISCSI_ULP1); in beiscsi_get_params()
757 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_get_params()
758 icd_start = phba->fw_config.iscsi_icd_start[ulp_num]; in beiscsi_get_params()
759 icd_count = phba->fw_config.iscsi_icd_count[ulp_num]; in beiscsi_get_params()
771 phba->fw_config. in beiscsi_get_params()
786 phba->fw_config.iscsi_icd_count[ulp_num] = (icd_count - in beiscsi_get_params()
789 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_get_params()
794 phba->fw_config. in beiscsi_get_params()
796 phba->fw_config. in beiscsi_get_params()
803 total_icd_count = phba->fw_config.iscsi_icd_count[ulp_num]; in beiscsi_get_params()
804 phba->params.ios_per_ctrl = (total_icd_count - in beiscsi_get_params()
807 phba->params.cxns_per_ctrl = total_cid_count; in beiscsi_get_params()
808 phba->params.asyncpdus_per_ctrl = total_cid_count; in beiscsi_get_params()
809 phba->params.icds_per_ctrl = total_icd_count; in beiscsi_get_params()
810 phba->params.num_sge_per_io = BE2_SGE; in beiscsi_get_params()
811 phba->params.defpdu_hdr_sz = BE2_DEFPDU_HDR_SZ; in beiscsi_get_params()
812 phba->params.defpdu_data_sz = BE2_DEFPDU_DATA_SZ; in beiscsi_get_params()
813 phba->params.eq_timer = 64; in beiscsi_get_params()
814 phba->params.num_eq_entries = 1024; in beiscsi_get_params()
815 phba->params.num_cq_entries = 1024; in beiscsi_get_params()
816 phba->params.wrbs_per_cxn = 256; in beiscsi_get_params()
819 static void hwi_ring_eq_db(struct beiscsi_hba *phba, in hwi_ring_eq_db() argument
842 iowrite32(val, phba->db_va + DB_EQ_OFFSET); in hwi_ring_eq_db()
852 struct beiscsi_hba *phba; in be_isr_mcc() local
862 phba = pbe_eq->phba; in be_isr_mcc()
863 mcc = &phba->ctrl.mcc_obj.cq; in be_isr_mcc()
873 spin_lock_irqsave(&phba->isr_lock, flags); in be_isr_mcc()
875 spin_unlock_irqrestore(&phba->isr_lock, flags); in be_isr_mcc()
883 queue_work(phba->wq, &pbe_eq->work_cqs); in be_isr_mcc()
885 hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 1, 1); in be_isr_mcc()
897 struct beiscsi_hba *phba; in be_isr_msix() local
909 phba = pbe_eq->phba; in be_isr_msix()
923 hwi_ring_eq_db(phba, eq->id, 1, num_eq_processed, 0, 1); in be_isr_msix()
935 struct beiscsi_hba *phba; in be_isr() local
947 phba = dev_id; in be_isr()
948 ctrl = &phba->ctrl; in be_isr()
954 phwi_ctrlr = phba->phwi_ctrlr; in be_isr()
959 mcc = &phba->ctrl.mcc_obj.cq; in be_isr()
970 spin_lock_irqsave(&phba->isr_lock, flags); in be_isr()
972 spin_unlock_irqrestore(&phba->isr_lock, flags); in be_isr()
985 queue_work(phba->wq, &pbe_eq->work_cqs); in be_isr()
988 hwi_ring_eq_db(phba, eq->id, 0, in be_isr()
992 hwi_ring_eq_db(phba, eq->id, 0, in be_isr()
1001 static int beiscsi_init_irqs(struct beiscsi_hba *phba) in beiscsi_init_irqs() argument
1003 struct pci_dev *pcidev = phba->pcidev; in beiscsi_init_irqs()
1008 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_init_irqs()
1011 if (phba->msix_enabled) { in beiscsi_init_irqs()
1012 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_init_irqs()
1013 phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, in beiscsi_init_irqs()
1015 if (!phba->msi_name[i]) { in beiscsi_init_irqs()
1020 sprintf(phba->msi_name[i], "beiscsi_%02x_%02x", in beiscsi_init_irqs()
1021 phba->shost->host_no, i); in beiscsi_init_irqs()
1022 msix_vec = phba->msix_entries[i].vector; in beiscsi_init_irqs()
1024 phba->msi_name[i], in beiscsi_init_irqs()
1027 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_irqs()
1031 kfree(phba->msi_name[i]); in beiscsi_init_irqs()
1035 phba->msi_name[i] = kzalloc(BEISCSI_MSI_NAME, GFP_KERNEL); in beiscsi_init_irqs()
1036 if (!phba->msi_name[i]) { in beiscsi_init_irqs()
1040 sprintf(phba->msi_name[i], "beiscsi_mcc_%02x", in beiscsi_init_irqs()
1041 phba->shost->host_no); in beiscsi_init_irqs()
1042 msix_vec = phba->msix_entries[i].vector; in beiscsi_init_irqs()
1043 ret = request_irq(msix_vec, be_isr_mcc, 0, phba->msi_name[i], in beiscsi_init_irqs()
1046 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT , in beiscsi_init_irqs()
1049 kfree(phba->msi_name[i]); in beiscsi_init_irqs()
1055 "beiscsi", phba); in beiscsi_init_irqs()
1057 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_irqs()
1066 kfree(phba->msi_name[j]); in beiscsi_init_irqs()
1067 msix_vec = phba->msix_entries[j].vector; in beiscsi_init_irqs()
1073 void hwi_ring_cq_db(struct beiscsi_hba *phba, in hwi_ring_cq_db() argument
1092 iowrite32(val, phba->db_va + DB_CQ_OFFSET); in hwi_ring_cq_db()
1097 struct beiscsi_hba *phba, in beiscsi_process_async_pdu() argument
1119 beiscsi_log(phba, KERN_ERR, in beiscsi_process_async_pdu()
1131 beiscsi_log(phba, KERN_WARNING, in beiscsi_process_async_pdu()
1146 static struct sgl_handle *alloc_io_sgl_handle(struct beiscsi_hba *phba) in alloc_io_sgl_handle() argument
1150 if (phba->io_sgl_hndl_avbl) { in alloc_io_sgl_handle()
1151 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in alloc_io_sgl_handle()
1154 phba->io_sgl_alloc_index); in alloc_io_sgl_handle()
1156 psgl_handle = phba->io_sgl_hndl_base[phba-> in alloc_io_sgl_handle()
1158 phba->io_sgl_hndl_base[phba->io_sgl_alloc_index] = NULL; in alloc_io_sgl_handle()
1159 phba->io_sgl_hndl_avbl--; in alloc_io_sgl_handle()
1160 if (phba->io_sgl_alloc_index == (phba->params. in alloc_io_sgl_handle()
1162 phba->io_sgl_alloc_index = 0; in alloc_io_sgl_handle()
1164 phba->io_sgl_alloc_index++; in alloc_io_sgl_handle()
1171 free_io_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) in free_io_sgl_handle() argument
1173 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in free_io_sgl_handle()
1175 phba->io_sgl_free_index); in free_io_sgl_handle()
1177 if (phba->io_sgl_hndl_base[phba->io_sgl_free_index]) { in free_io_sgl_handle()
1182 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_IO, in free_io_sgl_handle()
1184 "value there=%p\n", phba->io_sgl_free_index, in free_io_sgl_handle()
1185 phba->io_sgl_hndl_base in free_io_sgl_handle()
1186 [phba->io_sgl_free_index]); in free_io_sgl_handle()
1189 phba->io_sgl_hndl_base[phba->io_sgl_free_index] = psgl_handle; in free_io_sgl_handle()
1190 phba->io_sgl_hndl_avbl++; in free_io_sgl_handle()
1191 if (phba->io_sgl_free_index == (phba->params.ios_per_ctrl - 1)) in free_io_sgl_handle()
1192 phba->io_sgl_free_index = 0; in free_io_sgl_handle()
1194 phba->io_sgl_free_index++; in free_io_sgl_handle()
1205 struct wrb_handle *alloc_wrb_handle(struct beiscsi_hba *phba, unsigned int cid, in alloc_wrb_handle() argument
1213 phwi_ctrlr = phba->phwi_ctrlr; in alloc_wrb_handle()
1220 (phba->params.wrbs_per_cxn - 1)) in alloc_wrb_handle()
1241 free_wrb_handle(struct beiscsi_hba *phba, struct hwi_wrb_context *pwrb_context, in free_wrb_handle() argument
1246 if (pwrb_context->free_index == (phba->params.wrbs_per_cxn - 1)) in free_wrb_handle()
1251 beiscsi_log(phba, KERN_INFO, in free_wrb_handle()
1259 static struct sgl_handle *alloc_mgmt_sgl_handle(struct beiscsi_hba *phba) in alloc_mgmt_sgl_handle() argument
1263 if (phba->eh_sgl_hndl_avbl) { in alloc_mgmt_sgl_handle()
1264 psgl_handle = phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index]; in alloc_mgmt_sgl_handle()
1265 phba->eh_sgl_hndl_base[phba->eh_sgl_alloc_index] = NULL; in alloc_mgmt_sgl_handle()
1266 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG, in alloc_mgmt_sgl_handle()
1268 phba->eh_sgl_alloc_index, in alloc_mgmt_sgl_handle()
1269 phba->eh_sgl_alloc_index); in alloc_mgmt_sgl_handle()
1271 phba->eh_sgl_hndl_avbl--; in alloc_mgmt_sgl_handle()
1272 if (phba->eh_sgl_alloc_index == in alloc_mgmt_sgl_handle()
1273 (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl - in alloc_mgmt_sgl_handle()
1275 phba->eh_sgl_alloc_index = 0; in alloc_mgmt_sgl_handle()
1277 phba->eh_sgl_alloc_index++; in alloc_mgmt_sgl_handle()
1284 free_mgmt_sgl_handle(struct beiscsi_hba *phba, struct sgl_handle *psgl_handle) in free_mgmt_sgl_handle() argument
1287 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG, in free_mgmt_sgl_handle()
1290 phba->eh_sgl_free_index); in free_mgmt_sgl_handle()
1292 if (phba->eh_sgl_hndl_base[phba->eh_sgl_free_index]) { in free_mgmt_sgl_handle()
1297 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG, in free_mgmt_sgl_handle()
1300 phba->eh_sgl_free_index); in free_mgmt_sgl_handle()
1303 phba->eh_sgl_hndl_base[phba->eh_sgl_free_index] = psgl_handle; in free_mgmt_sgl_handle()
1304 phba->eh_sgl_hndl_avbl++; in free_mgmt_sgl_handle()
1305 if (phba->eh_sgl_free_index == in free_mgmt_sgl_handle()
1306 (phba->params.icds_per_ctrl - phba->params.ios_per_ctrl - 1)) in free_mgmt_sgl_handle()
1307 phba->eh_sgl_free_index = 0; in free_mgmt_sgl_handle()
1309 phba->eh_sgl_free_index++; in free_mgmt_sgl_handle()
1430 struct beiscsi_hba *phba, struct sol_cqe *psol) in hwi_complete_drvr_msgs() argument
1439 phwi_ctrlr = phba->phwi_ctrlr; in hwi_complete_drvr_msgs()
1440 if (is_chip_be2_be3r(phba)) { in hwi_complete_drvr_msgs()
1482 static void adapter_get_sol_cqe(struct beiscsi_hba *phba, in adapter_get_sol_cqe() argument
1486 if (is_chip_be2_be3r(phba)) { in adapter_get_sol_cqe()
1537 struct beiscsi_hba *phba, struct sol_cqe *psol) in hwi_complete_cmd() argument
1550 phwi_ctrlr = phba->phwi_ctrlr; in hwi_complete_cmd()
1553 adapter_get_sol_cqe(phba, psol, &csol_cqe); in hwi_complete_cmd()
1584 beiscsi_log(phba, KERN_ERR, in hwi_complete_cmd()
1595 beiscsi_log(phba, KERN_WARNING, in hwi_complete_cmd()
1619 hwi_get_async_handle(struct beiscsi_hba *phba, in hwi_get_async_handle() argument
1630 if (is_chip_be2_be3r(phba)) { in hwi_get_async_handle()
1666 beiscsi_log(phba, KERN_WARNING, in hwi_get_async_handle()
1692 hwi_update_async_writables(struct beiscsi_hba *phba, in hwi_update_async_writables() argument
1731 beiscsi_log(phba, KERN_ERR, in hwi_update_async_writables()
1742 static void hwi_free_async_msg(struct beiscsi_hba *phba, in hwi_free_async_msg() argument
1783 static void hwi_post_async_buffers(struct beiscsi_hba *phba, in hwi_post_async_buffers() argument
1797 phwi_ctrlr = phba->phwi_ctrlr; in hwi_post_async_buffers()
1864 iowrite32(doorbell, phba->db_va + doorbell_offset); in hwi_post_async_buffers()
1868 static void hwi_flush_default_pdu_buffer(struct beiscsi_hba *phba, in hwi_flush_default_pdu_buffer() argument
1879 phwi_ctrlr = phba->phwi_ctrlr; in hwi_flush_default_pdu_buffer()
1884 pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx, in hwi_flush_default_pdu_buffer()
1888 hwi_update_async_writables(phba, pasync_ctx, in hwi_flush_default_pdu_buffer()
1891 hwi_free_async_msg(phba, pasync_ctx, pasync_handle->cri); in hwi_flush_default_pdu_buffer()
1892 hwi_post_async_buffers(phba, pasync_handle->is_header, in hwi_flush_default_pdu_buffer()
1899 struct beiscsi_hba *phba, in hwi_fwd_async_msg() argument
1929 status = beiscsi_process_async_pdu(beiscsi_conn, phba, in hwi_fwd_async_msg()
1933 hwi_free_async_msg(phba, pasync_ctx, cri); in hwi_fwd_async_msg()
1939 struct beiscsi_hba *phba, in hwi_gather_async_pdu() argument
1948 phwi_ctrlr = phba->phwi_ctrlr; in hwi_gather_async_pdu()
1958 hwi_free_async_msg(phba, pasync_ctx, cri); in hwi_gather_async_pdu()
1981 status = hwi_fwd_async_msg(beiscsi_conn, phba, in hwi_gather_async_pdu()
1998 status = hwi_fwd_async_msg(beiscsi_conn, phba, in hwi_gather_async_pdu()
2006 struct beiscsi_hba *phba, in hwi_process_default_pdu_ring() argument
2016 phwi_ctrlr = phba->phwi_ctrlr; in hwi_process_default_pdu_ring()
2021 pasync_handle = hwi_get_async_handle(phba, beiscsi_conn, pasync_ctx, in hwi_process_default_pdu_ring()
2025 hwi_update_async_writables(phba, pasync_ctx, in hwi_process_default_pdu_ring()
2028 hwi_gather_async_pdu(beiscsi_conn, phba, pasync_handle); in hwi_process_default_pdu_ring()
2029 hwi_post_async_buffers(phba, pasync_handle->is_header, in hwi_process_default_pdu_ring()
2034 static void beiscsi_process_mcc_isr(struct beiscsi_hba *phba) in beiscsi_process_mcc_isr() argument
2040 mcc_cq = &phba->ctrl.mcc_obj.cq; in beiscsi_process_mcc_isr()
2046 hwi_ring_cq_db(phba, mcc_cq->id, in beiscsi_process_mcc_isr()
2054 beiscsi_async_link_state_process(phba, in beiscsi_process_mcc_isr()
2057 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_MBOX, in beiscsi_process_mcc_isr()
2061 if (phba->state & BE_ADAPTER_LINK_UP) { in beiscsi_process_mcc_isr()
2062 phba->state |= BE_ADAPTER_CHECK_BOOT; in beiscsi_process_mcc_isr()
2063 phba->get_boot = BE_GET_BOOT_RETRIES; in beiscsi_process_mcc_isr()
2067 be_mcc_compl_process_isr(&phba->ctrl, mcc_compl); in beiscsi_process_mcc_isr()
2068 atomic_dec(&phba->ctrl.mcc_obj.q.used); in beiscsi_process_mcc_isr()
2079 hwi_ring_cq_db(phba, mcc_cq->id, num_processed, 1, 0); in beiscsi_process_mcc_isr()
2102 struct beiscsi_hba *phba; in beiscsi_process_cq() local
2106 phba = pbe_eq->phba; in beiscsi_process_cq()
2116 if (is_chip_be2_be3r(phba)) { in beiscsi_process_cq()
2131 ep = phba->ep_array[cri_index]; in beiscsi_process_cq()
2137 beiscsi_log(phba, KERN_WARNING, in beiscsi_process_cq()
2148 hwi_ring_cq_db(phba, cq->id, in beiscsi_process_cq()
2156 hwi_complete_cmd(beiscsi_conn, phba, sol); in beiscsi_process_cq()
2159 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2165 hwi_complete_drvr_msgs(beiscsi_conn, phba, sol); in beiscsi_process_cq()
2168 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2173 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2174 hwi_process_default_pdu_ring(beiscsi_conn, phba, in beiscsi_process_cq()
2176 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2179 beiscsi_log(phba, KERN_INFO, in beiscsi_process_cq()
2184 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2185 hwi_process_default_pdu_ring(beiscsi_conn, phba, in beiscsi_process_cq()
2187 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2192 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2205 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2211 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2215 spin_lock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2216 hwi_flush_default_pdu_buffer(phba, beiscsi_conn, in beiscsi_process_cq()
2218 spin_unlock_bh(&phba->async_pdu_lock); in beiscsi_process_cq()
2236 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2245 beiscsi_log(phba, KERN_ERR, in beiscsi_process_cq()
2262 hwi_ring_cq_db(phba, cq->id, num_processed, 1, 0); in beiscsi_process_cq()
2272 struct beiscsi_hba *phba; in beiscsi_process_all_cqs() local
2276 phba = pbe_eq->phba; in beiscsi_process_all_cqs()
2277 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_process_all_cqs()
2281 spin_lock_irqsave(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2283 spin_unlock_irqrestore(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2284 beiscsi_process_mcc_isr(phba); in beiscsi_process_all_cqs()
2288 spin_lock_irqsave(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2290 spin_unlock_irqrestore(&phba->isr_lock, flags); in beiscsi_process_all_cqs()
2295 hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1); in beiscsi_process_all_cqs()
2301 struct beiscsi_hba *phba; in be_iopoll() local
2308 phba = pbe_eq->phba; in be_iopoll()
2310 beiscsi_log(phba, KERN_INFO, in be_iopoll()
2314 hwi_ring_eq_db(phba, pbe_eq->q.id, 0, 0, 1, 1); in be_iopoll()
2512 struct beiscsi_hba *phba = beiscsi_conn->phba; in hwi_write_buffer() local
2526 if (is_chip_be2_be3r(phba)) in hwi_write_buffer()
2535 io_task->mtask_addr = pci_map_single(phba->pcidev, in hwi_write_buffer()
2589 static void beiscsi_find_mem_req(struct beiscsi_hba *phba) in beiscsi_find_mem_req() argument
2596 num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \ in beiscsi_find_mem_req()
2599 phba->params.hwi_ws_sz = sizeof(struct hwi_controller); in beiscsi_find_mem_req()
2601 phba->mem_req[ISCSI_MEM_GLOBAL_HEADER] = 2 * in beiscsi_find_mem_req()
2603 phba->mem_req[HWI_MEM_ADDN_CONTEXT] = in beiscsi_find_mem_req()
2607 phba->mem_req[HWI_MEM_WRB] = sizeof(struct iscsi_wrb) in beiscsi_find_mem_req()
2608 * (phba->params.wrbs_per_cxn) in beiscsi_find_mem_req()
2609 * phba->params.cxns_per_ctrl; in beiscsi_find_mem_req()
2611 (phba->params.wrbs_per_cxn); in beiscsi_find_mem_req()
2612 phba->mem_req[HWI_MEM_WRBH] = roundup_pow_of_two((wrb_sz_per_cxn) * in beiscsi_find_mem_req()
2613 phba->params.cxns_per_ctrl); in beiscsi_find_mem_req()
2615 phba->mem_req[HWI_MEM_SGLH] = sizeof(struct sgl_handle) * in beiscsi_find_mem_req()
2616 phba->params.icds_per_ctrl; in beiscsi_find_mem_req()
2617 phba->mem_req[HWI_MEM_SGE] = sizeof(struct iscsi_sge) * in beiscsi_find_mem_req()
2618 phba->params.num_sge_per_io * phba->params.icds_per_ctrl; in beiscsi_find_mem_req()
2620 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_find_mem_req()
2624 phba, ulp_num) * in beiscsi_find_mem_req()
2629 phba, ulp_num) * in beiscsi_find_mem_req()
2630 phba->params.defpdu_hdr_sz); in beiscsi_find_mem_req()
2634 phba, ulp_num) * in beiscsi_find_mem_req()
2635 phba->params.defpdu_data_sz); in beiscsi_find_mem_req()
2639 phba, ulp_num) * in beiscsi_find_mem_req()
2644 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2645 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2650 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2656 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2662 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2668 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2674 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2675 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2680 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2681 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2686 phba->mem_req[mem_descr_index] = in beiscsi_find_mem_req()
2688 (BEISCSI_GET_CID_COUNT(phba, ulp_num) * in beiscsi_find_mem_req()
2694 static int beiscsi_alloc_mem(struct beiscsi_hba *phba) in beiscsi_alloc_mem() argument
2702 phba->phwi_ctrlr = kzalloc(phba->params.hwi_ws_sz, GFP_KERNEL); in beiscsi_alloc_mem()
2703 if (!phba->phwi_ctrlr) in beiscsi_alloc_mem()
2707 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_alloc_mem()
2709 phba->params.cxns_per_ctrl, in beiscsi_alloc_mem()
2714 phba->init_mem = kcalloc(SE_MEM_MAX, sizeof(*mem_descr), in beiscsi_alloc_mem()
2716 if (!phba->init_mem) { in beiscsi_alloc_mem()
2718 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2725 kfree(phba->init_mem); in beiscsi_alloc_mem()
2727 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2731 mem_descr = phba->init_mem; in beiscsi_alloc_mem()
2733 if (!phba->mem_req[i]) { in beiscsi_alloc_mem()
2741 alloc_size = phba->mem_req[i]; in beiscsi_alloc_mem()
2747 phba->pcidev, in beiscsi_alloc_mem()
2771 mem_descr->size_in_bytes = phba->mem_req[i]; in beiscsi_alloc_mem()
2787 pci_free_consistent(phba->pcidev, in beiscsi_alloc_mem()
2802 kfree(phba->init_mem); in beiscsi_alloc_mem()
2803 kfree(phba->phwi_ctrlr->wrb_context); in beiscsi_alloc_mem()
2804 kfree(phba->phwi_ctrlr); in beiscsi_alloc_mem()
2808 static int beiscsi_get_memory(struct beiscsi_hba *phba) in beiscsi_get_memory() argument
2810 beiscsi_find_mem_req(phba); in beiscsi_get_memory()
2811 return beiscsi_alloc_mem(phba); in beiscsi_get_memory()
2814 static void iscsi_init_global_templates(struct beiscsi_hba *phba) in iscsi_init_global_templates() argument
2820 mem_descr = phba->init_mem; in iscsi_init_global_templates()
2839 static int beiscsi_init_wrb_handle(struct beiscsi_hba *phba) in beiscsi_init_wrb_handle() argument
2850 mem_descr_wrbh = phba->init_mem; in beiscsi_init_wrb_handle()
2853 mem_descr_wrb = phba->init_mem; in beiscsi_init_wrb_handle()
2855 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_init_wrb_handle()
2860 phba->params.cxns_per_ctrl, in beiscsi_init_wrb_handle()
2863 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2868 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in beiscsi_init_wrb_handle()
2872 phba->params.wrbs_per_cxn, GFP_KERNEL); in beiscsi_init_wrb_handle()
2874 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2880 phba->params.wrbs_per_cxn, GFP_KERNEL); in beiscsi_init_wrb_handle()
2882 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_wrb_handle()
2891 phba->params.wrbs_per_cxn)); in beiscsi_init_wrb_handle()
2899 for (j = 0; j < phba->params.wrbs_per_cxn; j++) { in beiscsi_init_wrb_handle()
2911 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in beiscsi_init_wrb_handle()
2917 phba->params.wrbs_per_cxn)); in beiscsi_init_wrb_handle()
2922 for (j = 0; j < phba->params.wrbs_per_cxn; j++) { in beiscsi_init_wrb_handle()
2940 static int hwi_init_async_pdu_ctx(struct beiscsi_hba *phba) in hwi_init_async_pdu_ctx() argument
2944 struct hba_parameters *p = &phba->params; in hwi_init_async_pdu_ctx()
2951 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_async_pdu_ctx()
2953 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2957 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_async_pdu_ctx()
2970 pasync_ctx->num_entries = BEISCSI_GET_CID_COUNT(phba, in hwi_init_async_pdu_ctx()
2974 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
2978 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
2985 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
2997 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3001 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3008 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()
3037 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3041 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3048 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_WARNING, in hwi_init_async_pdu_ctx()
3077 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in hwi_init_async_pdu_ctx()
3081 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_async_pdu_ctx()
3088 beiscsi_log(phba, KERN_WARNING, in hwi_init_async_pdu_ctx()
3101 phba->params.defpdu_data_sz); in hwi_init_async_pdu_ctx()
3105 (phba, ulp_num); index++) { in hwi_init_async_pdu_ctx()
3147 phba->params.defpdu_data_sz); in hwi_init_async_pdu_ctx()
3205 hwi_build_be_sgl_arr(struct beiscsi_hba *phba, in hwi_build_be_sgl_arr() argument
3217 hwi_build_be_sgl_by_offset(struct beiscsi_hba *phba, in hwi_build_be_sgl_by_offset() argument
3244 static int beiscsi_create_eqs(struct beiscsi_hba *phba, in beiscsi_create_eqs() argument
3254 num_eq_pages = PAGES_REQUIRED(phba->params.num_eq_entries * \ in beiscsi_create_eqs()
3257 if (phba->msix_enabled) in beiscsi_create_eqs()
3261 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in beiscsi_create_eqs()
3264 phwi_context->be_eq[i].phba = phba; in beiscsi_create_eqs()
3265 eq_vaddress = pci_alloc_consistent(phba->pcidev, in beiscsi_create_eqs()
3272 ret = be_fill_queue(eq, phba->params.num_eq_entries, in beiscsi_create_eqs()
3275 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3281 ret = beiscsi_cmd_eq_create(&phba->ctrl, eq, in beiscsi_create_eqs()
3284 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3290 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_eqs()
3296 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in beiscsi_create_eqs()
3300 pci_free_consistent(phba->pcidev, num_eq_pages in beiscsi_create_eqs()
3307 static int beiscsi_create_cqs(struct beiscsi_hba *phba, in beiscsi_create_cqs() argument
3318 num_cq_pages = PAGES_REQUIRED(phba->params.num_cq_entries * \ in beiscsi_create_cqs()
3321 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_create_cqs()
3326 pbe_eq->phba = phba; in beiscsi_create_cqs()
3328 cq_vaddress = pci_alloc_consistent(phba->pcidev, in beiscsi_create_cqs()
3333 ret = be_fill_queue(cq, phba->params.num_cq_entries, in beiscsi_create_cqs()
3336 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3343 ret = beiscsi_cmd_cq_create(&phba->ctrl, cq, eq, false, in beiscsi_create_cqs()
3346 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3351 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_cqs()
3358 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_create_cqs()
3362 pci_free_consistent(phba->pcidev, num_cq_pages in beiscsi_create_cqs()
3371 beiscsi_create_def_hdr(struct beiscsi_hba *phba, in beiscsi_create_def_hdr() argument
3387 mem_descr = phba->init_mem; in beiscsi_create_def_hdr()
3395 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3403 ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dq, in beiscsi_create_def_hdr()
3405 phba->params.defpdu_hdr_sz, in beiscsi_create_def_hdr()
3408 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3415 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_hdr()
3419 hwi_post_async_buffers(phba, BEISCSI_DEFQ_HDR, ulp_num); in beiscsi_create_def_hdr()
3424 beiscsi_create_def_data(struct beiscsi_hba *phba, in beiscsi_create_def_data() argument
3440 mem_descr = phba->init_mem; in beiscsi_create_def_data()
3448 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3457 ret = be_cmd_create_default_pdu_queue(&phba->ctrl, cq, dataq, in beiscsi_create_def_data()
3459 phba->params.defpdu_data_sz, in beiscsi_create_def_data()
3462 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3469 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3474 hwi_post_async_buffers(phba, BEISCSI_DEFQ_DATA, ulp_num); in beiscsi_create_def_data()
3475 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_create_def_data()
3484 beiscsi_post_template_hdr(struct beiscsi_hba *phba) in beiscsi_post_template_hdr() argument
3492 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_post_template_hdr()
3493 mem_descr = (struct be_mem_descriptor *)phba->init_mem; in beiscsi_post_template_hdr()
3498 hwi_build_be_sgl_arr(phba, pm_arr, &sgl); in beiscsi_post_template_hdr()
3500 &phba->ctrl, &sgl); in beiscsi_post_template_hdr()
3503 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_post_template_hdr()
3509 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_post_template_hdr()
3518 beiscsi_post_pages(struct beiscsi_hba *phba) in beiscsi_post_pages() argument
3526 mem_descr = phba->init_mem; in beiscsi_post_pages()
3531 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) in beiscsi_post_pages()
3534 page_offset = (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io * in beiscsi_post_pages()
3535 phba->fw_config.iscsi_icd_start[ulp_num]) / PAGE_SIZE; in beiscsi_post_pages()
3537 hwi_build_be_sgl_arr(phba, pm_arr, &sgl); in beiscsi_post_pages()
3538 status = be_cmd_iscsi_post_sgl_pages(&phba->ctrl, &sgl, in beiscsi_post_pages()
3543 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_post_pages()
3549 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_post_pages()
3554 static void be_queue_free(struct beiscsi_hba *phba, struct be_queue_info *q) in be_queue_free() argument
3558 pci_free_consistent(phba->pcidev, mem->size, in be_queue_free()
3564 static int be_queue_alloc(struct beiscsi_hba *phba, struct be_queue_info *q, in be_queue_alloc() argument
3573 mem->va = pci_zalloc_consistent(phba->pcidev, mem->size, &mem->dma); in be_queue_alloc()
3580 beiscsi_create_wrb_rings(struct beiscsi_hba *phba, in beiscsi_create_wrb_rings() argument
3597 mem_descr = phba->init_mem; in beiscsi_create_wrb_rings()
3599 pwrb_arr = kmalloc(sizeof(*pwrb_arr) * phba->params.cxns_per_ctrl, in beiscsi_create_wrb_rings()
3602 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_wrb_rings()
3609 (phba->params.wrbs_per_cxn * sizeof(struct iscsi_wrb)); in beiscsi_create_wrb_rings()
3611 for (num = 0; num < phba->params.cxns_per_ctrl; num++) { in beiscsi_create_wrb_rings()
3615 pwrb_arr[num].size = phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3626 (phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3631 pwrb_arr[num].size = phba->params.wrbs_per_cxn * in beiscsi_create_wrb_rings()
3641 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in beiscsi_create_wrb_rings()
3645 BEISCSI_GET_CID_COUNT(phba, ulp_num); in beiscsi_create_wrb_rings()
3648 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in beiscsi_create_wrb_rings()
3664 hwi_build_be_sgl_by_offset(phba, &pwrb_arr[i], &sgl); in beiscsi_create_wrb_rings()
3665 status = be_cmd_wrbq_create(&phba->ctrl, &sgl, in beiscsi_create_wrb_rings()
3670 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_create_wrb_rings()
3682 static void free_wrb_handles(struct beiscsi_hba *phba) in free_wrb_handles() argument
3688 phwi_ctrlr = phba->phwi_ctrlr; in free_wrb_handles()
3689 for (index = 0; index < phba->params.cxns_per_ctrl; index++) { in free_wrb_handles()
3696 static void be_mcc_queues_destroy(struct beiscsi_hba *phba) in be_mcc_queues_destroy() argument
3699 struct be_ctrl_info *ctrl = &phba->ctrl; in be_mcc_queues_destroy()
3701 q = &phba->ctrl.mcc_obj.q; in be_mcc_queues_destroy()
3704 be_queue_free(phba, q); in be_mcc_queues_destroy()
3707 q = &phba->ctrl.mcc_obj.cq; in be_mcc_queues_destroy()
3710 be_queue_free(phba, q); in be_mcc_queues_destroy()
3714 static void hwi_cleanup(struct beiscsi_hba *phba) in hwi_cleanup() argument
3717 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_cleanup()
3723 phwi_ctrlr = phba->phwi_ctrlr; in hwi_cleanup()
3728 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in hwi_cleanup()
3734 free_wrb_handles(phba); in hwi_cleanup()
3737 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_cleanup()
3753 for (i = 0; i < (phba->num_cpus); i++) { in hwi_cleanup()
3756 be_queue_free(phba, q); in hwi_cleanup()
3761 be_mcc_queues_destroy(phba); in hwi_cleanup()
3762 if (phba->msix_enabled) in hwi_cleanup()
3766 for (i = 0; i < (phba->num_cpus + eq_for_mcc); i++) { in hwi_cleanup()
3769 be_queue_free(phba, q); in hwi_cleanup()
3776 static int be_mcc_queues_create(struct beiscsi_hba *phba, in be_mcc_queues_create() argument
3780 struct be_ctrl_info *ctrl = &phba->ctrl; in be_mcc_queues_create()
3783 cq = &phba->ctrl.mcc_obj.cq; in be_mcc_queues_create()
3784 if (be_queue_alloc(phba, cq, MCC_CQ_LEN, in be_mcc_queues_create()
3788 if (phba->msix_enabled) { in be_mcc_queues_create()
3790 [phba->num_cpus].q, false, true, 0)) in be_mcc_queues_create()
3799 q = &phba->ctrl.mcc_obj.q; in be_mcc_queues_create()
3800 if (be_queue_alloc(phba, q, MCC_Q_LEN, sizeof(struct be_mcc_wrb))) in be_mcc_queues_create()
3804 if (beiscsi_cmd_mccq_create(phba, q, cq)) in be_mcc_queues_create()
3810 be_queue_free(phba, q); in be_mcc_queues_create()
3814 be_queue_free(phba, cq); in be_mcc_queues_create()
3825 static void find_num_cpus(struct beiscsi_hba *phba) in find_num_cpus() argument
3831 switch (phba->generation) { in find_num_cpus()
3834 phba->num_cpus = (num_cpus > BEISCSI_MAX_NUM_CPUS) ? in find_num_cpus()
3842 if (phba->fw_config.eqid_count == 1) { in find_num_cpus()
3844 phba->num_cpus = 1; in find_num_cpus()
3848 phba->num_cpus = in find_num_cpus()
3849 (num_cpus > (phba->fw_config.eqid_count - 1)) ? in find_num_cpus()
3850 (phba->fw_config.eqid_count - 1) : num_cpus; in find_num_cpus()
3853 phba->num_cpus = 1; in find_num_cpus()
3857 static int hwi_init_port(struct beiscsi_hba *phba) in hwi_init_port() argument
3862 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_init_port()
3865 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_port()
3870 be_cmd_fw_initialize(&phba->ctrl); in hwi_init_port()
3872 status = beiscsi_create_eqs(phba, phwi_context); in hwi_init_port()
3874 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3879 status = be_mcc_queues_create(phba, phwi_context); in hwi_init_port()
3883 status = mgmt_check_supported_fw(ctrl, phba); in hwi_init_port()
3885 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3890 status = beiscsi_create_cqs(phba, phwi_context); in hwi_init_port()
3892 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3898 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_port()
3901 BEISCSI_GET_CID_COUNT(phba, ulp_num) * in hwi_init_port()
3904 status = beiscsi_create_def_hdr(phba, phwi_context, in hwi_init_port()
3909 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3915 status = beiscsi_create_def_data(phba, phwi_context, in hwi_init_port()
3920 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3928 status = beiscsi_post_pages(phba); in hwi_init_port()
3930 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3935 status = beiscsi_post_template_hdr(phba); in hwi_init_port()
3937 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3941 status = beiscsi_create_wrb_rings(phba, phwi_context, phwi_ctrlr); in hwi_init_port()
3943 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3951 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) { in hwi_init_port()
3958 phba->params.cxns_per_ctrl; cri++) { in hwi_init_port()
3968 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_port()
3973 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_port()
3975 hwi_cleanup(phba); in hwi_init_port()
3979 static int hwi_init_controller(struct beiscsi_hba *phba) in hwi_init_controller() argument
3983 phwi_ctrlr = phba->phwi_ctrlr; in hwi_init_controller()
3984 if (1 == phba->init_mem[HWI_MEM_ADDN_CONTEXT].num_elements) { in hwi_init_controller()
3985 phwi_ctrlr->phwi_ctxt = (struct hwi_context_memory *)phba-> in hwi_init_controller()
3987 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_init_controller()
3991 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
3997 iscsi_init_global_templates(phba); in hwi_init_controller()
3998 if (beiscsi_init_wrb_handle(phba)) in hwi_init_controller()
4001 if (hwi_init_async_pdu_ctx(phba)) { in hwi_init_controller()
4002 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
4007 if (hwi_init_port(phba) != 0) { in hwi_init_controller()
4008 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hwi_init_controller()
4016 static void beiscsi_free_mem(struct beiscsi_hba *phba) in beiscsi_free_mem() argument
4021 mem_descr = phba->init_mem; in beiscsi_free_mem()
4026 pci_free_consistent(phba->pcidev, in beiscsi_free_mem()
4036 kfree(phba->init_mem); in beiscsi_free_mem()
4037 kfree(phba->phwi_ctrlr->wrb_context); in beiscsi_free_mem()
4038 kfree(phba->phwi_ctrlr); in beiscsi_free_mem()
4041 static int beiscsi_init_controller(struct beiscsi_hba *phba) in beiscsi_init_controller() argument
4045 ret = beiscsi_get_memory(phba); in beiscsi_init_controller()
4047 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_controller()
4053 ret = hwi_init_controller(phba); in beiscsi_init_controller()
4056 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_controller()
4062 beiscsi_free_mem(phba); in beiscsi_init_controller()
4066 static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba) in beiscsi_init_sgl_handle() argument
4074 phba->io_sgl_hndl_avbl = 0; in beiscsi_init_sgl_handle()
4075 phba->eh_sgl_hndl_avbl = 0; in beiscsi_init_sgl_handle()
4077 mem_descr_sglh = phba->init_mem; in beiscsi_init_sgl_handle()
4080 phba->io_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) * in beiscsi_init_sgl_handle()
4081 phba->params.ios_per_ctrl, in beiscsi_init_sgl_handle()
4083 if (!phba->io_sgl_hndl_base) { in beiscsi_init_sgl_handle()
4084 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4088 phba->eh_sgl_hndl_base = kzalloc(sizeof(struct sgl_handle *) * in beiscsi_init_sgl_handle()
4089 (phba->params.icds_per_ctrl - in beiscsi_init_sgl_handle()
4090 phba->params.ios_per_ctrl), in beiscsi_init_sgl_handle()
4092 if (!phba->eh_sgl_hndl_base) { in beiscsi_init_sgl_handle()
4093 kfree(phba->io_sgl_hndl_base); in beiscsi_init_sgl_handle()
4094 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4099 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4112 if (arr_index < phba->params.ios_per_ctrl) { in beiscsi_init_sgl_handle()
4113 phba->io_sgl_hndl_base[arr_index] = psgl_handle; in beiscsi_init_sgl_handle()
4114 phba->io_sgl_hndl_avbl++; in beiscsi_init_sgl_handle()
4117 phba->eh_sgl_hndl_base[arr_index - in beiscsi_init_sgl_handle()
4118 phba->params.ios_per_ctrl] = in beiscsi_init_sgl_handle()
4121 phba->eh_sgl_hndl_avbl++; in beiscsi_init_sgl_handle()
4127 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4130 phba->io_sgl_hndl_avbl, in beiscsi_init_sgl_handle()
4131 phba->eh_sgl_hndl_avbl); in beiscsi_init_sgl_handle()
4133 mem_descr_sg = phba->init_mem; in beiscsi_init_sgl_handle()
4135 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_init_sgl_handle()
4140 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) in beiscsi_init_sgl_handle()
4143 ulp_icd_start = phba->fw_config.iscsi_icd_start[ulp_num]; in beiscsi_init_sgl_handle()
4152 (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io); in beiscsi_init_sgl_handle()
4154 if (arr_index < phba->params.ios_per_ctrl) in beiscsi_init_sgl_handle()
4155 psgl_handle = phba->io_sgl_hndl_base[arr_index]; in beiscsi_init_sgl_handle()
4157 psgl_handle = phba->eh_sgl_hndl_base[arr_index - in beiscsi_init_sgl_handle()
4158 phba->params.ios_per_ctrl]; in beiscsi_init_sgl_handle()
4162 pfrag += phba->params.num_sge_per_io; in beiscsi_init_sgl_handle()
4167 phba->io_sgl_free_index = 0; in beiscsi_init_sgl_handle()
4168 phba->io_sgl_alloc_index = 0; in beiscsi_init_sgl_handle()
4169 phba->eh_sgl_free_index = 0; in beiscsi_init_sgl_handle()
4170 phba->eh_sgl_alloc_index = 0; in beiscsi_init_sgl_handle()
4174 static int hba_setup_cid_tbls(struct beiscsi_hba *phba) in hba_setup_cid_tbls() argument
4181 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4186 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4197 BEISCSI_GET_CID_COUNT(phba, in hba_setup_cid_tbls()
4200 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4211 phba, ulp_num); in hba_setup_cid_tbls()
4214 phba->cid_array_info[ulp_num] = ptr_cid_info; in hba_setup_cid_tbls()
4217 phba->ep_array = kzalloc(sizeof(struct iscsi_endpoint *) * in hba_setup_cid_tbls()
4218 phba->params.cxns_per_ctrl, GFP_KERNEL); in hba_setup_cid_tbls()
4219 if (!phba->ep_array) { in hba_setup_cid_tbls()
4220 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4228 phba->conn_table = kzalloc(sizeof(struct beiscsi_conn *) * in hba_setup_cid_tbls()
4229 phba->params.cxns_per_ctrl, GFP_KERNEL); in hba_setup_cid_tbls()
4230 if (!phba->conn_table) { in hba_setup_cid_tbls()
4231 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in hba_setup_cid_tbls()
4235 kfree(phba->ep_array); in hba_setup_cid_tbls()
4236 phba->ep_array = NULL; in hba_setup_cid_tbls()
4242 for (i = 0; i < phba->params.cxns_per_ctrl; i++) { in hba_setup_cid_tbls()
4243 ulp_num = phba->phwi_ctrlr->wrb_context[i].ulp_num; in hba_setup_cid_tbls()
4245 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4247 phba->phwi_ctrlr->wrb_context[i].cid; in hba_setup_cid_tbls()
4252 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4253 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4263 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in hba_setup_cid_tbls()
4264 ptr_cid_info = phba->cid_array_info[ulp_num]; in hba_setup_cid_tbls()
4269 phba->cid_array_info[ulp_num] = NULL; in hba_setup_cid_tbls()
4277 static void hwi_enable_intr(struct beiscsi_hba *phba) in hwi_enable_intr() argument
4279 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_enable_intr()
4287 phwi_ctrlr = phba->phwi_ctrlr; in hwi_enable_intr()
4297 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4302 if (!phba->msix_enabled) { in hwi_enable_intr()
4304 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4307 hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); in hwi_enable_intr()
4309 for (i = 0; i <= phba->num_cpus; i++) { in hwi_enable_intr()
4311 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in hwi_enable_intr()
4313 hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); in hwi_enable_intr()
4318 static void hwi_disable_intr(struct beiscsi_hba *phba) in hwi_disable_intr() argument
4320 struct be_ctrl_info *ctrl = &phba->ctrl; in hwi_disable_intr()
4330 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in hwi_disable_intr()
4344 static int beiscsi_get_boot_info(struct beiscsi_hba *phba) in beiscsi_get_boot_info() argument
4353 ret = be_mgmt_get_boot_shandle(phba, &s_handle); in beiscsi_get_boot_info()
4355 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4360 phba->get_boot = 0; in beiscsi_get_boot_info()
4365 phba->get_boot = 0; in beiscsi_get_boot_info()
4366 nonemb_cmd.va = pci_zalloc_consistent(phba->ctrl.pdev, in beiscsi_get_boot_info()
4370 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4378 tag = mgmt_get_session_info(phba, s_handle, in beiscsi_get_boot_info()
4381 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4389 ret = beiscsi_mccq_compl(phba, tag, NULL, &nonemb_cmd); in beiscsi_get_boot_info()
4391 beiscsi_log(phba, KERN_ERR, in beiscsi_get_boot_info()
4403 memcpy(&phba->boot_sess, &session_resp->session_info, in beiscsi_get_boot_info()
4406 beiscsi_logout_fw_sess(phba, in beiscsi_get_boot_info()
4407 phba->boot_sess.session_handle); in beiscsi_get_boot_info()
4411 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_get_boot_info()
4418 struct beiscsi_hba *phba = data; in beiscsi_boot_release() local
4420 scsi_host_put(phba->shost); in beiscsi_boot_release()
4423 static int beiscsi_setup_boot_info(struct beiscsi_hba *phba) in beiscsi_setup_boot_info() argument
4428 if (phba->boot_kset) in beiscsi_setup_boot_info()
4432 if (beiscsi_get_boot_info(phba)) in beiscsi_setup_boot_info()
4436 phba->boot_kset = iscsi_boot_create_host_kset(phba->shost->host_no); in beiscsi_setup_boot_info()
4437 if (!phba->boot_kset) in beiscsi_setup_boot_info()
4441 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4443 boot_kobj = iscsi_boot_create_target(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4450 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4452 boot_kobj = iscsi_boot_create_initiator(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4459 if (!scsi_host_get(phba->shost)) in beiscsi_setup_boot_info()
4461 boot_kobj = iscsi_boot_create_ethernet(phba->boot_kset, 0, phba, in beiscsi_setup_boot_info()
4470 scsi_host_put(phba->shost); in beiscsi_setup_boot_info()
4472 iscsi_boot_destroy_kset(phba->boot_kset); in beiscsi_setup_boot_info()
4473 phba->boot_kset = NULL; in beiscsi_setup_boot_info()
4477 static int beiscsi_init_port(struct beiscsi_hba *phba) in beiscsi_init_port() argument
4481 ret = beiscsi_init_controller(phba); in beiscsi_init_port()
4483 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4488 ret = beiscsi_init_sgl_handle(phba); in beiscsi_init_port()
4490 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4496 if (hba_setup_cid_tbls(phba)) { in beiscsi_init_port()
4497 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_init_port()
4499 kfree(phba->io_sgl_hndl_base); in beiscsi_init_port()
4500 kfree(phba->eh_sgl_hndl_base); in beiscsi_init_port()
4507 hwi_cleanup(phba); in beiscsi_init_port()
4511 static void hwi_purge_eq(struct beiscsi_hba *phba) in hwi_purge_eq() argument
4520 phwi_ctrlr = phba->phwi_ctrlr; in hwi_purge_eq()
4522 if (phba->msix_enabled) in hwi_purge_eq()
4527 for (i = 0; i < (phba->num_cpus + eq_msix); i++) { in hwi_purge_eq()
4540 hwi_ring_eq_db(phba, eq->id, 1, num_processed, 1, 1); in hwi_purge_eq()
4544 static void beiscsi_clean_port(struct beiscsi_hba *phba) in beiscsi_clean_port() argument
4550 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in beiscsi_clean_port()
4551 mgmt_status = mgmt_epfw_cleanup(phba, ulp_num); in beiscsi_clean_port()
4553 beiscsi_log(phba, KERN_WARNING, in beiscsi_clean_port()
4560 hwi_purge_eq(phba); in beiscsi_clean_port()
4561 hwi_cleanup(phba); in beiscsi_clean_port()
4562 kfree(phba->io_sgl_hndl_base); in beiscsi_clean_port()
4563 kfree(phba->eh_sgl_hndl_base); in beiscsi_clean_port()
4564 kfree(phba->ep_array); in beiscsi_clean_port()
4565 kfree(phba->conn_table); in beiscsi_clean_port()
4568 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) { in beiscsi_clean_port()
4569 ptr_cid_info = phba->cid_array_info[ulp_num]; in beiscsi_clean_port()
4574 phba->cid_array_info[ulp_num] = NULL; in beiscsi_clean_port()
4593 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_free_mgmt_task_handles() local
4599 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_free_mgmt_task_handles()
4607 free_wrb_handle(phba, pwrb_context, in beiscsi_free_mgmt_task_handles()
4613 spin_lock_bh(&phba->mgmt_sgl_lock); in beiscsi_free_mgmt_task_handles()
4614 free_mgmt_sgl_handle(phba, in beiscsi_free_mgmt_task_handles()
4617 spin_unlock_bh(&phba->mgmt_sgl_lock); in beiscsi_free_mgmt_task_handles()
4621 pci_unmap_single(phba->pcidev, in beiscsi_free_mgmt_task_handles()
4639 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_cleanup_task() local
4646 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_cleanup_task()
4657 free_wrb_handle(phba, pwrb_context, in beiscsi_cleanup_task()
4663 spin_lock(&phba->io_sgl_lock); in beiscsi_cleanup_task()
4664 free_io_sgl_handle(phba, io_task->psgl_handle); in beiscsi_cleanup_task()
4665 spin_unlock(&phba->io_sgl_lock); in beiscsi_cleanup_task()
4685 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_offload_connection() local
4699 pwrb_handle = alloc_wrb_handle(phba, beiscsi_conn->beiscsi_conn_cid, in beiscsi_offload_connection()
4703 if (is_chip_be2_be3r(phba)) in beiscsi_offload_connection()
4705 phba->init_mem, in beiscsi_offload_connection()
4718 iowrite32(doorbell, phba->db_va + in beiscsi_offload_connection()
4745 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_alloc_pdu() local
4767 spin_lock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4768 io_task->psgl_handle = alloc_io_sgl_handle(phba); in beiscsi_alloc_pdu()
4769 spin_unlock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4771 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4778 io_task->pwrb_handle = alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4782 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4794 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4796 alloc_mgmt_sgl_handle(phba); in beiscsi_alloc_pdu()
4797 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4799 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4813 alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4817 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4836 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4837 io_task->psgl_handle = alloc_mgmt_sgl_handle(phba); in beiscsi_alloc_pdu()
4838 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4840 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4850 alloc_wrb_handle(phba, in beiscsi_alloc_pdu()
4854 beiscsi_log(phba, KERN_ERR, in beiscsi_alloc_pdu()
4873 spin_lock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4874 free_io_sgl_handle(phba, io_task->psgl_handle); in beiscsi_alloc_pdu()
4875 spin_unlock(&phba->io_sgl_lock); in beiscsi_alloc_pdu()
4878 spin_lock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4879 free_mgmt_sgl_handle(phba, io_task->psgl_handle); in beiscsi_alloc_pdu()
4881 spin_unlock(&phba->mgmt_sgl_lock); in beiscsi_alloc_pdu()
4883 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_alloc_pdu()
4888 free_wrb_handle(phba, pwrb_context, io_task->pwrb_handle); in beiscsi_alloc_pdu()
4903 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_iotask_v2() local
4952 iowrite32(doorbell, phba->db_va + in beiscsi_iotask_v2()
4965 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_iotask() local
5014 iowrite32(doorbell, phba->db_va + in beiscsi_iotask()
5024 struct beiscsi_hba *phba = beiscsi_conn->phba; in beiscsi_mtask() local
5034 if (is_chip_be2_be3r(phba)) { in beiscsi_mtask()
5082 if (is_chip_be2_be3r(phba)) in beiscsi_mtask()
5090 if (is_chip_be2_be3r(phba)) in beiscsi_mtask()
5113 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_mtask()
5121 io_task->wrb_type = (is_chip_be2_be3r(phba)) ? in beiscsi_mtask()
5129 iowrite32(doorbell, phba->db_va + in beiscsi_mtask()
5138 struct beiscsi_hba *phba = NULL; in beiscsi_task_xmit() local
5143 phba = ((struct beiscsi_conn *)task->conn->dd_data)->phba; in beiscsi_task_xmit()
5152 struct beiscsi_hba *phba = NULL; in beiscsi_task_xmit() local
5154 phba = ((struct beiscsi_conn *)conn->dd_data)->phba; in beiscsi_task_xmit()
5155 beiscsi_log(phba, KERN_ERR, in beiscsi_task_xmit()
5171 return phba->iotask_fn(task, sg, num_sg, xferlen, writedir); in beiscsi_task_xmit()
5181 struct beiscsi_hba *phba; in beiscsi_bsg_request() local
5191 phba = iscsi_host_priv(shost); in beiscsi_bsg_request()
5195 nonemb_cmd.va = pci_alloc_consistent(phba->ctrl.pdev, in beiscsi_bsg_request()
5199 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5204 tag = mgmt_vendor_specific_fw_cmd(&phba->ctrl, phba, job, in beiscsi_bsg_request()
5207 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5210 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_bsg_request()
5216 phba->ctrl.mcc_wait[tag], in beiscsi_bsg_request()
5217 phba->ctrl.mcc_numtag[tag], in beiscsi_bsg_request()
5220 extd_status = (phba->ctrl.mcc_numtag[tag] & 0x0000FF00) >> 8; in beiscsi_bsg_request()
5221 status = phba->ctrl.mcc_numtag[tag] & 0x000000FF; in beiscsi_bsg_request()
5222 free_mcc_tag(&phba->ctrl, tag); in beiscsi_bsg_request()
5232 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size, in beiscsi_bsg_request()
5235 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5247 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, in beiscsi_bsg_request()
5256 void beiscsi_hba_attrs_init(struct beiscsi_hba *phba) in beiscsi_hba_attrs_init() argument
5259 beiscsi_log_enable_init(phba, beiscsi_log_enable); in beiscsi_hba_attrs_init()
5269 static void beiscsi_quiesce(struct beiscsi_hba *phba, in beiscsi_quiesce() argument
5277 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_quiesce()
5279 hwi_disable_intr(phba); in beiscsi_quiesce()
5280 if (phba->msix_enabled) { in beiscsi_quiesce()
5281 for (i = 0; i <= phba->num_cpus; i++) { in beiscsi_quiesce()
5282 msix_vec = phba->msix_entries[i].vector; in beiscsi_quiesce()
5285 kfree(phba->msi_name[i]); in beiscsi_quiesce()
5288 if (phba->pcidev->irq) { in beiscsi_quiesce()
5289 synchronize_irq(phba->pcidev->irq); in beiscsi_quiesce()
5290 free_irq(phba->pcidev->irq, phba); in beiscsi_quiesce()
5292 pci_disable_msix(phba->pcidev); in beiscsi_quiesce()
5293 cancel_delayed_work_sync(&phba->beiscsi_hw_check_task); in beiscsi_quiesce()
5295 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_quiesce()
5301 destroy_workqueue(phba->wq); in beiscsi_quiesce()
5302 beiscsi_clean_port(phba); in beiscsi_quiesce()
5303 beiscsi_free_mem(phba); in beiscsi_quiesce()
5305 beiscsi_unmap_pci_function(phba); in beiscsi_quiesce()
5306 pci_free_consistent(phba->pcidev, in beiscsi_quiesce()
5307 phba->ctrl.mbox_mem_alloced.size, in beiscsi_quiesce()
5308 phba->ctrl.mbox_mem_alloced.va, in beiscsi_quiesce()
5309 phba->ctrl.mbox_mem_alloced.dma); in beiscsi_quiesce()
5311 hwi_purge_eq(phba); in beiscsi_quiesce()
5312 hwi_cleanup(phba); in beiscsi_quiesce()
5320 struct beiscsi_hba *phba = NULL; in beiscsi_remove() local
5322 phba = pci_get_drvdata(pcidev); in beiscsi_remove()
5323 if (!phba) { in beiscsi_remove()
5328 beiscsi_destroy_def_ifaces(phba); in beiscsi_remove()
5329 beiscsi_quiesce(phba, BEISCSI_CLEAN_UNLOAD); in beiscsi_remove()
5330 iscsi_boot_destroy_kset(phba->boot_kset); in beiscsi_remove()
5331 iscsi_host_remove(phba->shost); in beiscsi_remove()
5332 pci_dev_put(phba->pcidev); in beiscsi_remove()
5333 iscsi_host_free(phba->shost); in beiscsi_remove()
5343 struct beiscsi_hba *phba = NULL; in beiscsi_shutdown() local
5345 phba = (struct beiscsi_hba *)pci_get_drvdata(pcidev); in beiscsi_shutdown()
5346 if (!phba) { in beiscsi_shutdown()
5351 phba->state = BE_ADAPTER_STATE_SHUTDOWN; in beiscsi_shutdown()
5352 iscsi_host_for_each_session(phba->shost, be2iscsi_fail_session); in beiscsi_shutdown()
5353 beiscsi_quiesce(phba, BEISCSI_CLEAN_UNLOAD); in beiscsi_shutdown()
5357 static void beiscsi_msix_enable(struct beiscsi_hba *phba) in beiscsi_msix_enable() argument
5361 for (i = 0; i <= phba->num_cpus; i++) in beiscsi_msix_enable()
5362 phba->msix_entries[i].entry = i; in beiscsi_msix_enable()
5364 status = pci_enable_msix_range(phba->pcidev, phba->msix_entries, in beiscsi_msix_enable()
5365 phba->num_cpus + 1, phba->num_cpus + 1); in beiscsi_msix_enable()
5367 phba->msix_enabled = true; in beiscsi_msix_enable()
5372 static void be_eqd_update(struct beiscsi_hba *phba) in be_eqd_update() argument
5384 phwi_ctrlr = phba->phwi_ctrlr; in be_eqd_update()
5387 for (i = 0; i <= phba->num_cpus; i++) { in be_eqd_update()
5388 aic = &phba->aic_obj[i]; in be_eqd_update()
5417 tag = be_cmd_modify_eq_delay(phba, set_eqd, num); in be_eqd_update()
5419 beiscsi_mccq_compl(phba, tag, NULL, NULL); in be_eqd_update()
5423 static void be_check_boot_session(struct beiscsi_hba *phba) in be_check_boot_session() argument
5425 if (beiscsi_setup_boot_info(phba)) in be_check_boot_session()
5426 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in be_check_boot_session()
5440 struct beiscsi_hba *phba = in beiscsi_hw_health_check() local
5444 be_eqd_update(phba); in beiscsi_hw_health_check()
5446 if (phba->state & BE_ADAPTER_CHECK_BOOT) { in beiscsi_hw_health_check()
5447 if ((phba->get_boot > 0) && (!phba->boot_kset)) { in beiscsi_hw_health_check()
5448 phba->get_boot--; in beiscsi_hw_health_check()
5449 if (!(phba->get_boot % BE_GET_BOOT_TO)) in beiscsi_hw_health_check()
5450 be_check_boot_session(phba); in beiscsi_hw_health_check()
5452 phba->state &= ~BE_ADAPTER_CHECK_BOOT; in beiscsi_hw_health_check()
5453 phba->get_boot = 0; in beiscsi_hw_health_check()
5457 beiscsi_ue_detect(phba); in beiscsi_hw_health_check()
5459 schedule_delayed_work(&phba->beiscsi_hw_check_task, in beiscsi_hw_health_check()
5467 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_err_detected() local
5469 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_err_detected()
5470 phba->state |= BE_ADAPTER_PCI_ERR; in beiscsi_eeh_err_detected()
5472 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_err_detected()
5475 beiscsi_quiesce(phba, BEISCSI_EEH_UNLOAD); in beiscsi_eeh_err_detected()
5478 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_err_detected()
5499 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_reset() local
5502 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_reset()
5504 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5516 status = be_chk_reset_complete(phba); in beiscsi_eeh_reset()
5518 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5521 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_eeh_reset()
5534 struct beiscsi_hba *phba = NULL; in beiscsi_eeh_resume() local
5538 phba = (struct beiscsi_hba *)pci_get_drvdata(pdev); in beiscsi_eeh_resume()
5542 find_num_cpus(phba); in beiscsi_eeh_resume()
5544 phba->num_cpus = 1; in beiscsi_eeh_resume()
5547 beiscsi_msix_enable(phba); in beiscsi_eeh_resume()
5548 if (!phba->msix_enabled) in beiscsi_eeh_resume()
5549 phba->num_cpus = 1; in beiscsi_eeh_resume()
5552 ret = beiscsi_cmd_reset_function(phba); in beiscsi_eeh_resume()
5554 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5559 ret = be_chk_reset_complete(phba); in beiscsi_eeh_resume()
5561 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5566 beiscsi_get_params(phba); in beiscsi_eeh_resume()
5567 phba->shost->max_id = phba->params.cxns_per_ctrl; in beiscsi_eeh_resume()
5568 phba->shost->can_queue = phba->params.ios_per_ctrl; in beiscsi_eeh_resume()
5569 ret = hwi_init_controller(phba); in beiscsi_eeh_resume()
5572 init_waitqueue_head(&phba->ctrl.mcc_wait[i + 1]); in beiscsi_eeh_resume()
5573 phba->ctrl.mcc_tag[i] = i + 1; in beiscsi_eeh_resume()
5574 phba->ctrl.mcc_numtag[i + 1] = 0; in beiscsi_eeh_resume()
5575 phba->ctrl.mcc_tag_available++; in beiscsi_eeh_resume()
5578 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_eeh_resume()
5581 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_eeh_resume()
5588 i = (phba->msix_enabled) ? i : 0; in beiscsi_eeh_resume()
5593 ret = beiscsi_init_irqs(phba); in beiscsi_eeh_resume()
5595 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5601 hwi_enable_intr(phba); in beiscsi_eeh_resume()
5602 phba->state &= ~BE_ADAPTER_PCI_ERR; in beiscsi_eeh_resume()
5606 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_eeh_resume()
5613 struct beiscsi_hba *phba = NULL; in beiscsi_dev_probe() local
5626 phba = beiscsi_hba_alloc(pcidev); in beiscsi_dev_probe()
5627 if (!phba) { in beiscsi_dev_probe()
5636 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5643 beiscsi_hba_attrs_init(phba); in beiscsi_dev_probe()
5645 phba->fw_timeout = false; in beiscsi_dev_probe()
5646 phba->mac_addr_set = false; in beiscsi_dev_probe()
5653 phba->generation = BE_GEN2; in beiscsi_dev_probe()
5654 phba->iotask_fn = beiscsi_iotask; in beiscsi_dev_probe()
5658 phba->generation = BE_GEN3; in beiscsi_dev_probe()
5659 phba->iotask_fn = beiscsi_iotask; in beiscsi_dev_probe()
5662 phba->generation = BE_GEN4; in beiscsi_dev_probe()
5663 phba->iotask_fn = beiscsi_iotask_v2; in beiscsi_dev_probe()
5666 phba->generation = 0; in beiscsi_dev_probe()
5669 ret = be_ctrl_init(phba, pcidev); in beiscsi_dev_probe()
5671 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5677 ret = beiscsi_cmd_reset_function(phba); in beiscsi_dev_probe()
5679 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5683 ret = be_chk_reset_complete(phba); in beiscsi_dev_probe()
5685 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5690 spin_lock_init(&phba->io_sgl_lock); in beiscsi_dev_probe()
5691 spin_lock_init(&phba->mgmt_sgl_lock); in beiscsi_dev_probe()
5692 spin_lock_init(&phba->isr_lock); in beiscsi_dev_probe()
5693 spin_lock_init(&phba->async_pdu_lock); in beiscsi_dev_probe()
5694 ret = mgmt_get_fw_config(&phba->ctrl, phba); in beiscsi_dev_probe()
5696 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5702 find_num_cpus(phba); in beiscsi_dev_probe()
5704 phba->num_cpus = 1; in beiscsi_dev_probe()
5706 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5708 phba->num_cpus); in beiscsi_dev_probe()
5711 beiscsi_msix_enable(phba); in beiscsi_dev_probe()
5712 if (!phba->msix_enabled) in beiscsi_dev_probe()
5713 phba->num_cpus = 1; in beiscsi_dev_probe()
5716 phba->shost->max_id = phba->params.cxns_per_ctrl; in beiscsi_dev_probe()
5717 beiscsi_get_params(phba); in beiscsi_dev_probe()
5718 phba->shost->can_queue = phba->params.ios_per_ctrl; in beiscsi_dev_probe()
5719 ret = beiscsi_init_port(phba); in beiscsi_dev_probe()
5721 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5728 init_waitqueue_head(&phba->ctrl.mcc_wait[i + 1]); in beiscsi_dev_probe()
5729 phba->ctrl.mcc_tag[i] = i + 1; in beiscsi_dev_probe()
5730 phba->ctrl.mcc_numtag[i + 1] = 0; in beiscsi_dev_probe()
5731 phba->ctrl.mcc_tag_available++; in beiscsi_dev_probe()
5732 memset(&phba->ctrl.ptag_state[i].tag_mem_state, 0, in beiscsi_dev_probe()
5736 phba->ctrl.mcc_alloc_index = phba->ctrl.mcc_free_index = 0; in beiscsi_dev_probe()
5738 snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_%02x_wq", in beiscsi_dev_probe()
5739 phba->shost->host_no); in beiscsi_dev_probe()
5740 phba->wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, phba->wq_name); in beiscsi_dev_probe()
5741 if (!phba->wq) { in beiscsi_dev_probe()
5742 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5748 INIT_DELAYED_WORK(&phba->beiscsi_hw_check_task, in beiscsi_dev_probe()
5751 phwi_ctrlr = phba->phwi_ctrlr; in beiscsi_dev_probe()
5754 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_dev_probe()
5761 i = (phba->msix_enabled) ? i : 0; in beiscsi_dev_probe()
5766 ret = beiscsi_init_irqs(phba); in beiscsi_dev_probe()
5768 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5773 hwi_enable_intr(phba); in beiscsi_dev_probe()
5775 if (iscsi_host_add(phba->shost, &phba->pcidev->dev)) in beiscsi_dev_probe()
5778 if (beiscsi_setup_boot_info(phba)) in beiscsi_dev_probe()
5783 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5787 beiscsi_create_def_ifaces(phba); in beiscsi_dev_probe()
5788 schedule_delayed_work(&phba->beiscsi_hw_check_task, in beiscsi_dev_probe()
5791 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT, in beiscsi_dev_probe()
5796 destroy_workqueue(phba->wq); in beiscsi_dev_probe()
5797 for (i = 0; i < phba->num_cpus; i++) { in beiscsi_dev_probe()
5802 beiscsi_clean_port(phba); in beiscsi_dev_probe()
5803 beiscsi_free_mem(phba); in beiscsi_dev_probe()
5805 pci_free_consistent(phba->pcidev, in beiscsi_dev_probe()
5806 phba->ctrl.mbox_mem_alloced.size, in beiscsi_dev_probe()
5807 phba->ctrl.mbox_mem_alloced.va, in beiscsi_dev_probe()
5808 phba->ctrl.mbox_mem_alloced.dma); in beiscsi_dev_probe()
5809 beiscsi_unmap_pci_function(phba); in beiscsi_dev_probe()
5811 if (phba->msix_enabled) in beiscsi_dev_probe()
5812 pci_disable_msix(phba->pcidev); in beiscsi_dev_probe()
5813 pci_dev_put(phba->pcidev); in beiscsi_dev_probe()
5814 iscsi_host_free(phba->shost); in beiscsi_dev_probe()