Lines Matching refs:qedi
63 static int qedi_alloc_global_queues(struct qedi_ctx *qedi);
64 static void qedi_free_global_queues(struct qedi_ctx *qedi);
65 static struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid);
67 static void qedi_ll2_free_skbs(struct qedi_ctx *qedi);
68 static struct nvm_iscsi_block *qedi_get_nvram_block(struct qedi_ctx *qedi);
75 struct qedi_ctx *qedi; in qedi_iscsi_event_cb() local
85 qedi = (struct qedi_ctx *)context; in qedi_iscsi_event_cb()
86 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_iscsi_event_cb()
90 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_iscsi_event_cb()
95 qedi_ep = qedi->ep_tbl[data->icid]; in qedi_iscsi_event_cb()
98 QEDI_WARN(&qedi->dbg_ctx, in qedi_iscsi_event_cb()
129 QEDI_ERR(&qedi->dbg_ctx, "Recv Unknown Event %u\n", in qedi_iscsi_event_cb()
139 struct qedi_ctx *qedi = udev->qedi; in qedi_uio_open() local
150 set_bit(UIO_DEV_OPENED, &qedi->flags); in qedi_uio_open()
159 struct qedi_ctx *qedi = udev->qedi; in qedi_uio_close() local
162 clear_bit(UIO_DEV_OPENED, &qedi->flags); in qedi_uio_close()
163 qedi_ll2_free_skbs(qedi); in qedi_uio_close()
206 struct qedi_ctx *qedi = NULL; in qedi_reset_uio_rings() local
209 qedi = udev->qedi; in qedi_reset_uio_rings()
212 spin_lock_bh(&qedi->ll2_lock); in qedi_reset_uio_rings()
220 spin_unlock_bh(&qedi->ll2_lock); in qedi_reset_uio_rings()
261 static int qedi_alloc_uio_rings(struct qedi_ctx *qedi) in qedi_alloc_uio_rings() argument
267 if (udev->pdev == qedi->pdev) { in qedi_alloc_uio_rings()
268 udev->qedi = qedi; in qedi_alloc_uio_rings()
270 udev->qedi = NULL; in qedi_alloc_uio_rings()
273 qedi->udev = udev; in qedi_alloc_uio_rings()
286 udev->qedi = qedi; in qedi_alloc_uio_rings()
287 udev->pdev = qedi->pdev; in qedi_alloc_uio_rings()
296 qedi->udev = udev; in qedi_alloc_uio_rings()
308 static int qedi_init_uio(struct qedi_ctx *qedi) in qedi_init_uio() argument
310 struct qedi_uio_dev *udev = qedi->udev; in qedi_init_uio()
344 QEDI_ERR(&qedi->dbg_ctx, in qedi_init_uio()
353 static int qedi_alloc_and_init_sb(struct qedi_ctx *qedi, in qedi_alloc_and_init_sb() argument
360 sb_virt = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_and_init_sb()
364 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_and_init_sb()
370 ret = qedi_ops->common->sb_init(qedi->cdev, sb_info, sb_virt, sb_phys, in qedi_alloc_and_init_sb()
373 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_and_init_sb()
382 static void qedi_free_sb(struct qedi_ctx *qedi) in qedi_free_sb() argument
387 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) { in qedi_free_sb()
388 sb_info = &qedi->sb_array[id]; in qedi_free_sb()
390 dma_free_coherent(&qedi->pdev->dev, in qedi_free_sb()
397 static void qedi_free_fp(struct qedi_ctx *qedi) in qedi_free_fp() argument
399 kfree(qedi->fp_array); in qedi_free_fp()
400 kfree(qedi->sb_array); in qedi_free_fp()
403 static void qedi_destroy_fp(struct qedi_ctx *qedi) in qedi_destroy_fp() argument
405 qedi_free_sb(qedi); in qedi_destroy_fp()
406 qedi_free_fp(qedi); in qedi_destroy_fp()
409 static int qedi_alloc_fp(struct qedi_ctx *qedi) in qedi_alloc_fp() argument
413 qedi->fp_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi), in qedi_alloc_fp()
415 if (!qedi->fp_array) { in qedi_alloc_fp()
416 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_fp()
421 qedi->sb_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi), in qedi_alloc_fp()
423 if (!qedi->sb_array) { in qedi_alloc_fp()
424 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_fp()
433 qedi_free_fp(qedi); in qedi_alloc_fp()
437 static void qedi_int_fp(struct qedi_ctx *qedi) in qedi_int_fp() argument
442 memset(qedi->fp_array, 0, MIN_NUM_CPUS_MSIX(qedi) * in qedi_int_fp()
443 sizeof(*qedi->fp_array)); in qedi_int_fp()
444 memset(qedi->sb_array, 0, MIN_NUM_CPUS_MSIX(qedi) * in qedi_int_fp()
445 sizeof(*qedi->sb_array)); in qedi_int_fp()
447 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) { in qedi_int_fp()
448 fp = &qedi->fp_array[id]; in qedi_int_fp()
449 fp->sb_info = &qedi->sb_array[id]; in qedi_int_fp()
451 fp->qedi = qedi; in qedi_int_fp()
461 static int qedi_prepare_fp(struct qedi_ctx *qedi) in qedi_prepare_fp() argument
466 ret = qedi_alloc_fp(qedi); in qedi_prepare_fp()
470 qedi_int_fp(qedi); in qedi_prepare_fp()
472 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) { in qedi_prepare_fp()
473 fp = &qedi->fp_array[id]; in qedi_prepare_fp()
474 ret = qedi_alloc_and_init_sb(qedi, fp->sb_info, fp->sb_id); in qedi_prepare_fp()
476 QEDI_ERR(&qedi->dbg_ctx, in qedi_prepare_fp()
486 qedi_free_sb(qedi); in qedi_prepare_fp()
487 qedi_free_fp(qedi); in qedi_prepare_fp()
492 static int qedi_setup_cid_que(struct qedi_ctx *qedi) in qedi_setup_cid_que() argument
496 qedi->cid_que.cid_que_base = kmalloc_array(qedi->max_active_conns, in qedi_setup_cid_que()
498 if (!qedi->cid_que.cid_que_base) in qedi_setup_cid_que()
501 qedi->cid_que.conn_cid_tbl = kmalloc_array(qedi->max_active_conns, in qedi_setup_cid_que()
504 if (!qedi->cid_que.conn_cid_tbl) { in qedi_setup_cid_que()
505 kfree(qedi->cid_que.cid_que_base); in qedi_setup_cid_que()
506 qedi->cid_que.cid_que_base = NULL; in qedi_setup_cid_que()
510 qedi->cid_que.cid_que = (u32 *)qedi->cid_que.cid_que_base; in qedi_setup_cid_que()
511 qedi->cid_que.cid_q_prod_idx = 0; in qedi_setup_cid_que()
512 qedi->cid_que.cid_q_cons_idx = 0; in qedi_setup_cid_que()
513 qedi->cid_que.cid_q_max_idx = qedi->max_active_conns; in qedi_setup_cid_que()
514 qedi->cid_que.cid_free_cnt = qedi->max_active_conns; in qedi_setup_cid_que()
516 for (i = 0; i < qedi->max_active_conns; i++) { in qedi_setup_cid_que()
517 qedi->cid_que.cid_que[i] = i; in qedi_setup_cid_que()
518 qedi->cid_que.conn_cid_tbl[i] = NULL; in qedi_setup_cid_que()
524 static void qedi_release_cid_que(struct qedi_ctx *qedi) in qedi_release_cid_que() argument
526 kfree(qedi->cid_que.cid_que_base); in qedi_release_cid_que()
527 qedi->cid_que.cid_que_base = NULL; in qedi_release_cid_que()
529 kfree(qedi->cid_que.conn_cid_tbl); in qedi_release_cid_que()
530 qedi->cid_que.conn_cid_tbl = NULL; in qedi_release_cid_que()
608 static void qedi_cm_free_mem(struct qedi_ctx *qedi) in qedi_cm_free_mem() argument
610 kfree(qedi->ep_tbl); in qedi_cm_free_mem()
611 qedi->ep_tbl = NULL; in qedi_cm_free_mem()
612 qedi_free_id_tbl(&qedi->lcl_port_tbl); in qedi_cm_free_mem()
615 static int qedi_cm_alloc_mem(struct qedi_ctx *qedi) in qedi_cm_alloc_mem() argument
619 qedi->ep_tbl = kzalloc((qedi->max_active_conns * in qedi_cm_alloc_mem()
621 if (!qedi->ep_tbl) in qedi_cm_alloc_mem()
624 if (qedi_init_id_tbl(&qedi->lcl_port_tbl, QEDI_LOCAL_PORT_RANGE, in qedi_cm_alloc_mem()
626 qedi_cm_free_mem(qedi); in qedi_cm_alloc_mem()
636 struct qedi_ctx *qedi = NULL; in qedi_host_alloc() local
651 qedi = iscsi_host_priv(shost); in qedi_host_alloc()
652 memset(qedi, 0, sizeof(*qedi)); in qedi_host_alloc()
653 qedi->shost = shost; in qedi_host_alloc()
654 qedi->dbg_ctx.host_no = shost->host_no; in qedi_host_alloc()
655 qedi->pdev = pdev; in qedi_host_alloc()
656 qedi->dbg_ctx.pdev = pdev; in qedi_host_alloc()
657 qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA; in qedi_host_alloc()
658 qedi->max_sqes = QEDI_SQ_SIZE; in qedi_host_alloc()
660 shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi); in qedi_host_alloc()
662 pci_set_drvdata(pdev, qedi); in qedi_host_alloc()
665 return qedi; in qedi_host_alloc()
670 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie; in qedi_ll2_rx() local
674 if (!qedi) { in qedi_ll2_rx()
679 if (!test_bit(UIO_DEV_OPENED, &qedi->flags)) { in qedi_ll2_rx()
680 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_UIO, in qedi_ll2_rx()
698 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2, in qedi_ll2_rx()
705 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2, in qedi_ll2_rx()
711 QEDI_WARN(&qedi->dbg_ctx, in qedi_ll2_rx()
726 spin_lock_bh(&qedi->ll2_lock); in qedi_ll2_rx()
727 list_add_tail(&work->list, &qedi->ll2_skb_list); in qedi_ll2_rx()
728 spin_unlock_bh(&qedi->ll2_lock); in qedi_ll2_rx()
730 wake_up_process(qedi->ll2_recv_thread); in qedi_ll2_rx()
736 static int qedi_ll2_process_skb(struct qedi_ctx *qedi, struct sk_buff *skb, in qedi_ll2_process_skb() argument
748 if (!qedi) { in qedi_ll2_process_skb()
753 udev = qedi->udev; in qedi_ll2_process_skb()
775 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2, in qedi_ll2_process_skb()
779 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2, in qedi_ll2_process_skb()
791 static void qedi_ll2_free_skbs(struct qedi_ctx *qedi) in qedi_ll2_free_skbs() argument
795 spin_lock_bh(&qedi->ll2_lock); in qedi_ll2_free_skbs()
796 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list, list) { in qedi_ll2_free_skbs()
801 spin_unlock_bh(&qedi->ll2_lock); in qedi_ll2_free_skbs()
806 struct qedi_ctx *qedi = (struct qedi_ctx *)arg; in qedi_ll2_recv_thread() local
812 spin_lock_bh(&qedi->ll2_lock); in qedi_ll2_recv_thread()
813 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list, in qedi_ll2_recv_thread()
816 qedi_ll2_process_skb(qedi, work->skb, work->vlan_id); in qedi_ll2_recv_thread()
821 spin_unlock_bh(&qedi->ll2_lock); in qedi_ll2_recv_thread()
829 static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi) in qedi_set_iscsi_pf_param() argument
838 qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi); in qedi_set_iscsi_pf_param()
840 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_set_iscsi_pf_param()
841 "Number of CQ count is %d\n", qedi->num_queues); in qedi_set_iscsi_pf_param()
843 memset(&qedi->pf_params.iscsi_pf_params, 0, in qedi_set_iscsi_pf_param()
844 sizeof(qedi->pf_params.iscsi_pf_params)); in qedi_set_iscsi_pf_param()
846 qedi->p_cpuq = dma_alloc_coherent(&qedi->pdev->dev, in qedi_set_iscsi_pf_param()
847 qedi->num_queues * sizeof(struct qedi_glbl_q_params), in qedi_set_iscsi_pf_param()
848 &qedi->hw_p_cpuq, GFP_KERNEL); in qedi_set_iscsi_pf_param()
849 if (!qedi->p_cpuq) { in qedi_set_iscsi_pf_param()
850 QEDI_ERR(&qedi->dbg_ctx, "dma_alloc_coherent fail\n"); in qedi_set_iscsi_pf_param()
855 rval = qedi_alloc_global_queues(qedi); in qedi_set_iscsi_pf_param()
857 QEDI_ERR(&qedi->dbg_ctx, "Global queue allocation failed.\n"); in qedi_set_iscsi_pf_param()
862 qedi->pf_params.iscsi_pf_params.num_cons = QEDI_MAX_ISCSI_CONNS_PER_HBA; in qedi_set_iscsi_pf_param()
863 qedi->pf_params.iscsi_pf_params.num_tasks = QEDI_MAX_ISCSI_TASK; in qedi_set_iscsi_pf_param()
864 qedi->pf_params.iscsi_pf_params.half_way_close_timeout = 10; in qedi_set_iscsi_pf_param()
865 qedi->pf_params.iscsi_pf_params.num_sq_pages_in_ring = num_sq_pages; in qedi_set_iscsi_pf_param()
866 qedi->pf_params.iscsi_pf_params.num_r2tq_pages_in_ring = num_sq_pages; in qedi_set_iscsi_pf_param()
867 qedi->pf_params.iscsi_pf_params.num_uhq_pages_in_ring = num_sq_pages; in qedi_set_iscsi_pf_param()
868 qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues; in qedi_set_iscsi_pf_param()
869 qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug; in qedi_set_iscsi_pf_param()
870 qedi->pf_params.iscsi_pf_params.two_msl_timer = 4000; in qedi_set_iscsi_pf_param()
871 qedi->pf_params.iscsi_pf_params.max_fin_rt = 2; in qedi_set_iscsi_pf_param()
877 qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size; in qedi_set_iscsi_pf_param()
879 qedi->pf_params.iscsi_pf_params.glbl_q_params_addr = in qedi_set_iscsi_pf_param()
880 (u64)qedi->hw_p_cpuq; in qedi_set_iscsi_pf_param()
886 qedi->pf_params.iscsi_pf_params.rqe_log_size = 8; in qedi_set_iscsi_pf_param()
888 qedi->pf_params.iscsi_pf_params.bdq_pbl_base_addr[BDQ_ID_RQ] = in qedi_set_iscsi_pf_param()
889 qedi->bdq_pbl_list_dma; in qedi_set_iscsi_pf_param()
890 qedi->pf_params.iscsi_pf_params.bdq_pbl_num_entries[BDQ_ID_RQ] = in qedi_set_iscsi_pf_param()
891 qedi->bdq_pbl_list_num_entries; in qedi_set_iscsi_pf_param()
892 qedi->pf_params.iscsi_pf_params.rq_buffer_size = QEDI_BDQ_BUF_SIZE; in qedi_set_iscsi_pf_param()
895 qedi->pf_params.iscsi_pf_params.cq_num_entries = 2048; in qedi_set_iscsi_pf_param()
897 qedi->pf_params.iscsi_pf_params.gl_rq_pi = QEDI_PROTO_CQ_PROD_IDX; in qedi_set_iscsi_pf_param()
898 qedi->pf_params.iscsi_pf_params.gl_cmd_pi = 1; in qedi_set_iscsi_pf_param()
905 static void qedi_free_iscsi_pf_param(struct qedi_ctx *qedi) in qedi_free_iscsi_pf_param() argument
909 if (qedi->p_cpuq) { in qedi_free_iscsi_pf_param()
910 size = qedi->num_queues * sizeof(struct qedi_glbl_q_params); in qedi_free_iscsi_pf_param()
911 dma_free_coherent(&qedi->pdev->dev, size, qedi->p_cpuq, in qedi_free_iscsi_pf_param()
912 qedi->hw_p_cpuq); in qedi_free_iscsi_pf_param()
915 qedi_free_global_queues(qedi); in qedi_free_iscsi_pf_param()
917 kfree(qedi->global_queues); in qedi_free_iscsi_pf_param()
941 static int qedi_find_boot_info(struct qedi_ctx *qedi, in qedi_find_boot_info() argument
975 for (i = 0; i < qedi->max_active_conns; i++) { in qedi_find_boot_info()
976 qedi_conn = qedi_get_conn_from_id(qedi, i); in qedi_find_boot_info()
1043 struct qedi_ctx *qedi; in qedi_get_generic_tlv_data() local
1050 qedi = (struct qedi_ctx *)dev; in qedi_get_generic_tlv_data()
1053 ether_addr_copy(data->mac[0], qedi->mac); in qedi_get_generic_tlv_data()
1065 struct qedi_ctx *qedi = dev; in qedi_get_protocol_tlv_data() local
1070 QEDI_ERR(&qedi->dbg_ctx, in qedi_get_protocol_tlv_data()
1075 mutex_lock(&qedi->stats_lock); in qedi_get_protocol_tlv_data()
1077 qedi_ops->get_stats(qedi->cdev, fw_iscsi_stats); in qedi_get_protocol_tlv_data()
1078 mutex_unlock(&qedi->stats_lock); in qedi_get_protocol_tlv_data()
1089 iscsi->frame_size = qedi->ll2_mtu; in qedi_get_protocol_tlv_data()
1090 block = qedi_get_nvram_block(qedi); in qedi_get_protocol_tlv_data()
1110 rval = qedi_find_boot_info(qedi, iscsi, block); in qedi_get_protocol_tlv_data()
1112 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_get_protocol_tlv_data()
1124 struct qedi_ctx *qedi = (struct qedi_ctx *)dev; in qedi_schedule_hw_err_handler() local
1128 qedi->qedi_err_flags = qedi_flags_override; in qedi_schedule_hw_err_handler()
1130 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_schedule_hw_err_handler()
1132 err_type, qedi->qedi_err_flags); in qedi_schedule_hw_err_handler()
1136 schedule_delayed_work(&qedi->board_disable_work, 0); in qedi_schedule_hw_err_handler()
1144 if (test_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags)) in qedi_schedule_hw_err_handler()
1145 qedi_ops->common->attn_clr_enable(qedi->cdev, true); in qedi_schedule_hw_err_handler()
1148 test_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags)) in qedi_schedule_hw_err_handler()
1149 qedi_ops->common->recovery_process(qedi->cdev); in qedi_schedule_hw_err_handler()
1159 struct qedi_ctx *qedi = dev; in qedi_schedule_recovery_handler() local
1161 QEDI_ERR(&qedi->dbg_ctx, "Recovery handler scheduled.\n"); in qedi_schedule_recovery_handler()
1163 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags)) in qedi_schedule_recovery_handler()
1166 atomic_set(&qedi->link_state, QEDI_LINK_DOWN); in qedi_schedule_recovery_handler()
1168 schedule_delayed_work(&qedi->recovery_work, 0); in qedi_schedule_recovery_handler()
1177 qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn); in qedi_set_conn_recovery()
1182 struct qedi_ctx *qedi = (struct qedi_ctx *)dev; in qedi_link_update() local
1185 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "Link Up event.\n"); in qedi_link_update()
1186 atomic_set(&qedi->link_state, QEDI_LINK_UP); in qedi_link_update()
1188 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_link_update()
1190 atomic_set(&qedi->link_state, QEDI_LINK_DOWN); in qedi_link_update()
1191 iscsi_host_for_each_session(qedi->shost, qedi_set_conn_recovery); in qedi_link_update()
1205 static int qedi_queue_cqe(struct qedi_ctx *qedi, union iscsi_cqe *cqe, in qedi_queue_cqe() argument
1215 q_conn = qedi->cid_que.conn_cid_tbl[iscsi_cid]; in qedi_queue_cqe()
1217 QEDI_WARN(&qedi->dbg_ctx, in qedi_queue_cqe()
1226 qedi_cmd = qedi_get_cmd_from_tid(qedi, cqe->cqe_solicited.itid); in qedi_queue_cqe()
1232 qedi_cmd->cqe_work.qedi = qedi; in qedi_queue_cqe()
1247 qedi_work->qedi = qedi; in qedi_queue_cqe()
1255 QEDI_ERR(&qedi->dbg_ctx, "FW Error cqe.\n"); in qedi_queue_cqe()
1262 struct qedi_ctx *qedi = fp->qedi; in qedi_process_completions() local
1279 que = qedi->global_queues[fp->sb_id]; in qedi_process_completions()
1280 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO, in qedi_process_completions()
1284 qedi->intr_cpu = fp->sb_id; in qedi_process_completions()
1295 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO, in qedi_process_completions()
1299 ret = qedi_queue_cqe(qedi, cqe, fp->sb_id, p); in qedi_process_completions()
1301 QEDI_WARN(&qedi->dbg_ctx, in qedi_process_completions()
1317 struct qedi_ctx *qedi = fp->qedi; in qedi_fp_has_work() local
1329 que = qedi->global_queues[fp->sb_id]; in qedi_fp_has_work()
1342 struct qedi_ctx *qedi = fp->qedi; in qedi_msix_handler() local
1350 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in qedi_msix_handler()
1372 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie; in qedi_simd_int_handler() local
1374 QEDI_WARN(&qedi->dbg_ctx, "qedi=%p.\n", qedi); in qedi_simd_int_handler()
1378 static void qedi_sync_free_irqs(struct qedi_ctx *qedi) in qedi_sync_free_irqs() argument
1383 if (qedi->int_info.msix_cnt) { in qedi_sync_free_irqs()
1384 for (i = 0; i < qedi->int_info.used_cnt; i++) { in qedi_sync_free_irqs()
1385 idx = i * qedi->dev_info.common.num_hwfns + in qedi_sync_free_irqs()
1386 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev); in qedi_sync_free_irqs()
1388 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_sync_free_irqs()
1391 synchronize_irq(qedi->int_info.msix[idx].vector); in qedi_sync_free_irqs()
1392 irq_set_affinity_hint(qedi->int_info.msix[idx].vector, in qedi_sync_free_irqs()
1394 free_irq(qedi->int_info.msix[idx].vector, in qedi_sync_free_irqs()
1395 &qedi->fp_array[i]); in qedi_sync_free_irqs()
1398 qedi_ops->common->simd_handler_clean(qedi->cdev, in qedi_sync_free_irqs()
1402 qedi->int_info.used_cnt = 0; in qedi_sync_free_irqs()
1403 qedi_ops->common->set_fp_int(qedi->cdev, 0); in qedi_sync_free_irqs()
1406 static int qedi_request_msix_irq(struct qedi_ctx *qedi) in qedi_request_msix_irq() argument
1412 for (i = 0; i < qedi->msix_count; i++) { in qedi_request_msix_irq()
1413 idx = i * qedi->dev_info.common.num_hwfns + in qedi_request_msix_irq()
1414 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev); in qedi_request_msix_irq()
1416 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_request_msix_irq()
1418 qedi->dev_info.common.num_hwfns, in qedi_request_msix_irq()
1419 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev)); in qedi_request_msix_irq()
1421 rc = request_irq(qedi->int_info.msix[idx].vector, in qedi_request_msix_irq()
1423 &qedi->fp_array[i]); in qedi_request_msix_irq()
1425 QEDI_WARN(&qedi->dbg_ctx, "request_irq failed.\n"); in qedi_request_msix_irq()
1426 qedi_sync_free_irqs(qedi); in qedi_request_msix_irq()
1429 qedi->int_info.used_cnt++; in qedi_request_msix_irq()
1430 rc = irq_set_affinity_hint(qedi->int_info.msix[idx].vector, in qedi_request_msix_irq()
1438 static int qedi_setup_int(struct qedi_ctx *qedi) in qedi_setup_int() argument
1442 rc = qedi_ops->common->set_fp_int(qedi->cdev, qedi->num_queues); in qedi_setup_int()
1446 qedi->msix_count = rc; in qedi_setup_int()
1448 rc = qedi_ops->common->get_fp_int(qedi->cdev, &qedi->int_info); in qedi_setup_int()
1452 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in qedi_setup_int()
1454 qedi->int_info.msix_cnt, num_online_cpus()); in qedi_setup_int()
1456 if (qedi->int_info.msix_cnt) { in qedi_setup_int()
1457 rc = qedi_request_msix_irq(qedi); in qedi_setup_int()
1460 qedi_ops->common->simd_handler_config(qedi->cdev, &qedi, in qedi_setup_int()
1463 qedi->int_info.used_cnt = 1; in qedi_setup_int()
1470 static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi) in qedi_free_nvm_iscsi_cfg() argument
1472 if (qedi->iscsi_image) in qedi_free_nvm_iscsi_cfg()
1473 dma_free_coherent(&qedi->pdev->dev, in qedi_free_nvm_iscsi_cfg()
1475 qedi->iscsi_image, qedi->nvm_buf_dma); in qedi_free_nvm_iscsi_cfg()
1478 static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi) in qedi_alloc_nvm_iscsi_cfg() argument
1480 qedi->iscsi_image = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_nvm_iscsi_cfg()
1482 &qedi->nvm_buf_dma, GFP_KERNEL); in qedi_alloc_nvm_iscsi_cfg()
1483 if (!qedi->iscsi_image) { in qedi_alloc_nvm_iscsi_cfg()
1484 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n"); in qedi_alloc_nvm_iscsi_cfg()
1487 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_alloc_nvm_iscsi_cfg()
1488 "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_image, in qedi_alloc_nvm_iscsi_cfg()
1489 qedi->nvm_buf_dma); in qedi_alloc_nvm_iscsi_cfg()
1494 static void qedi_free_bdq(struct qedi_ctx *qedi) in qedi_free_bdq() argument
1498 if (qedi->bdq_pbl_list) in qedi_free_bdq()
1499 dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE, in qedi_free_bdq()
1500 qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma); in qedi_free_bdq()
1502 if (qedi->bdq_pbl) in qedi_free_bdq()
1503 dma_free_coherent(&qedi->pdev->dev, qedi->bdq_pbl_mem_size, in qedi_free_bdq()
1504 qedi->bdq_pbl, qedi->bdq_pbl_dma); in qedi_free_bdq()
1507 if (qedi->bdq[i].buf_addr) { in qedi_free_bdq()
1508 dma_free_coherent(&qedi->pdev->dev, QEDI_BDQ_BUF_SIZE, in qedi_free_bdq()
1509 qedi->bdq[i].buf_addr, in qedi_free_bdq()
1510 qedi->bdq[i].buf_dma); in qedi_free_bdq()
1515 static void qedi_free_global_queues(struct qedi_ctx *qedi) in qedi_free_global_queues() argument
1518 struct global_queue **gl = qedi->global_queues; in qedi_free_global_queues()
1520 for (i = 0; i < qedi->num_queues; i++) { in qedi_free_global_queues()
1525 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_mem_size, in qedi_free_global_queues()
1528 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_pbl_size, in qedi_free_global_queues()
1533 qedi_free_bdq(qedi); in qedi_free_global_queues()
1534 qedi_free_nvm_iscsi_cfg(qedi); in qedi_free_global_queues()
1537 static int qedi_alloc_bdq(struct qedi_ctx *qedi) in qedi_alloc_bdq() argument
1546 qedi->bdq[i].buf_addr = in qedi_alloc_bdq()
1547 dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_bdq()
1549 &qedi->bdq[i].buf_dma, in qedi_alloc_bdq()
1551 if (!qedi->bdq[i].buf_addr) { in qedi_alloc_bdq()
1552 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_bdq()
1559 qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd); in qedi_alloc_bdq()
1560 qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE); in qedi_alloc_bdq()
1561 qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd); in qedi_alloc_bdq()
1563 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n", in qedi_alloc_bdq()
1564 qedi->rq_num_entries); in qedi_alloc_bdq()
1566 qedi->bdq_pbl = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_bdq()
1567 qedi->bdq_pbl_mem_size, in qedi_alloc_bdq()
1568 &qedi->bdq_pbl_dma, GFP_KERNEL); in qedi_alloc_bdq()
1569 if (!qedi->bdq_pbl) { in qedi_alloc_bdq()
1570 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate BDQ PBL.\n"); in qedi_alloc_bdq()
1578 pbl = (struct scsi_bd *)qedi->bdq_pbl; in qedi_alloc_bdq()
1581 cpu_to_le32(QEDI_U64_HI(qedi->bdq[i].buf_dma)); in qedi_alloc_bdq()
1583 cpu_to_le32(QEDI_U64_LO(qedi->bdq[i].buf_dma)); in qedi_alloc_bdq()
1584 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, in qedi_alloc_bdq()
1595 qedi->bdq_pbl_list = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_bdq()
1597 &qedi->bdq_pbl_list_dma, in qedi_alloc_bdq()
1599 if (!qedi->bdq_pbl_list) { in qedi_alloc_bdq()
1600 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_bdq()
1609 qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size / in qedi_alloc_bdq()
1611 list = (u64 *)qedi->bdq_pbl_list; in qedi_alloc_bdq()
1612 page = qedi->bdq_pbl_list_dma; in qedi_alloc_bdq()
1613 for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) { in qedi_alloc_bdq()
1614 *list = qedi->bdq_pbl_dma; in qedi_alloc_bdq()
1622 static int qedi_alloc_global_queues(struct qedi_ctx *qedi) in qedi_alloc_global_queues() argument
1635 if (!qedi->num_queues) { in qedi_alloc_global_queues()
1636 QEDI_ERR(&qedi->dbg_ctx, "No MSI-X vectors available!\n"); in qedi_alloc_global_queues()
1643 if (!qedi->p_cpuq) { in qedi_alloc_global_queues()
1648 qedi->global_queues = kzalloc((sizeof(struct global_queue *) * in qedi_alloc_global_queues()
1649 qedi->num_queues), GFP_KERNEL); in qedi_alloc_global_queues()
1650 if (!qedi->global_queues) { in qedi_alloc_global_queues()
1651 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_global_queues()
1655 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in qedi_alloc_global_queues()
1656 "qedi->global_queues=%p.\n", qedi->global_queues); in qedi_alloc_global_queues()
1659 status = qedi_alloc_bdq(qedi); in qedi_alloc_global_queues()
1664 status = qedi_alloc_nvm_iscsi_cfg(qedi); in qedi_alloc_global_queues()
1671 for (i = 0; i < qedi->num_queues; i++) { in qedi_alloc_global_queues()
1672 qedi->global_queues[i] = in qedi_alloc_global_queues()
1673 kzalloc(sizeof(*qedi->global_queues[0]), in qedi_alloc_global_queues()
1675 if (!qedi->global_queues[i]) { in qedi_alloc_global_queues()
1676 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_global_queues()
1682 qedi->global_queues[i]->cq_mem_size = in qedi_alloc_global_queues()
1684 qedi->global_queues[i]->cq_mem_size = in qedi_alloc_global_queues()
1685 (qedi->global_queues[i]->cq_mem_size + in qedi_alloc_global_queues()
1688 qedi->global_queues[i]->cq_pbl_size = in qedi_alloc_global_queues()
1689 (qedi->global_queues[i]->cq_mem_size / in qedi_alloc_global_queues()
1691 qedi->global_queues[i]->cq_pbl_size = in qedi_alloc_global_queues()
1692 (qedi->global_queues[i]->cq_pbl_size + in qedi_alloc_global_queues()
1695 qedi->global_queues[i]->cq = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_global_queues()
1696 qedi->global_queues[i]->cq_mem_size, in qedi_alloc_global_queues()
1697 &qedi->global_queues[i]->cq_dma, in qedi_alloc_global_queues()
1700 if (!qedi->global_queues[i]->cq) { in qedi_alloc_global_queues()
1701 QEDI_WARN(&qedi->dbg_ctx, in qedi_alloc_global_queues()
1706 qedi->global_queues[i]->cq_pbl = dma_alloc_coherent(&qedi->pdev->dev, in qedi_alloc_global_queues()
1707 qedi->global_queues[i]->cq_pbl_size, in qedi_alloc_global_queues()
1708 &qedi->global_queues[i]->cq_pbl_dma, in qedi_alloc_global_queues()
1711 if (!qedi->global_queues[i]->cq_pbl) { in qedi_alloc_global_queues()
1712 QEDI_WARN(&qedi->dbg_ctx, in qedi_alloc_global_queues()
1719 num_pages = qedi->global_queues[i]->cq_mem_size / in qedi_alloc_global_queues()
1721 page = qedi->global_queues[i]->cq_dma; in qedi_alloc_global_queues()
1722 pbl = (u32 *)qedi->global_queues[i]->cq_pbl; in qedi_alloc_global_queues()
1733 list = (u32 *)qedi->p_cpuq; in qedi_alloc_global_queues()
1741 for (i = 0; i < qedi->num_queues; i++) { in qedi_alloc_global_queues()
1742 *list = (u32)qedi->global_queues[i]->cq_pbl_dma; in qedi_alloc_global_queues()
1744 *list = (u32)((u64)qedi->global_queues[i]->cq_pbl_dma >> 32); in qedi_alloc_global_queues()
1756 qedi_free_global_queues(qedi); in qedi_alloc_global_queues()
1760 int qedi_alloc_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep) in qedi_alloc_sq() argument
1777 ep->sq = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_mem_size, in qedi_alloc_sq()
1780 QEDI_WARN(&qedi->dbg_ctx, in qedi_alloc_sq()
1785 ep->sq_pbl = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_pbl_size, in qedi_alloc_sq()
1788 QEDI_WARN(&qedi->dbg_ctx, in qedi_alloc_sq()
1810 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq, in qedi_alloc_sq()
1816 void qedi_free_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep) in qedi_free_sq() argument
1819 dma_free_coherent(&qedi->pdev->dev, ep->sq_pbl_size, ep->sq_pbl, in qedi_free_sq()
1822 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq, in qedi_free_sq()
1826 int qedi_get_task_idx(struct qedi_ctx *qedi) in qedi_get_task_idx() argument
1831 tmp_idx = find_first_zero_bit(qedi->task_idx_map, in qedi_get_task_idx()
1835 QEDI_ERR(&qedi->dbg_ctx, "FW task context pool is full.\n"); in qedi_get_task_idx()
1840 if (test_and_set_bit(tmp_idx, qedi->task_idx_map)) in qedi_get_task_idx()
1847 void qedi_clear_task_idx(struct qedi_ctx *qedi, int idx) in qedi_clear_task_idx() argument
1849 if (!test_and_clear_bit(idx, qedi->task_idx_map)) in qedi_clear_task_idx()
1850 QEDI_ERR(&qedi->dbg_ctx, in qedi_clear_task_idx()
1854 void qedi_update_itt_map(struct qedi_ctx *qedi, u32 tid, u32 proto_itt, in qedi_update_itt_map() argument
1857 qedi->itt_map[tid].itt = proto_itt; in qedi_update_itt_map()
1858 qedi->itt_map[tid].p_cmd = cmd; in qedi_update_itt_map()
1860 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, in qedi_update_itt_map()
1862 qedi->itt_map[tid].itt); in qedi_update_itt_map()
1865 void qedi_get_task_tid(struct qedi_ctx *qedi, u32 itt, s16 *tid) in qedi_get_task_tid() argument
1870 if (qedi->itt_map[i].itt == itt) { in qedi_get_task_tid()
1872 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, in qedi_get_task_tid()
1882 void qedi_get_proto_itt(struct qedi_ctx *qedi, u32 tid, u32 *proto_itt) in qedi_get_proto_itt() argument
1884 *proto_itt = qedi->itt_map[tid].itt; in qedi_get_proto_itt()
1885 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, in qedi_get_proto_itt()
1890 struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid) in qedi_get_cmd_from_tid() argument
1897 cmd = qedi->itt_map[tid].p_cmd; in qedi_get_cmd_from_tid()
1901 qedi->itt_map[tid].p_cmd = NULL; in qedi_get_cmd_from_tid()
1906 static int qedi_alloc_itt(struct qedi_ctx *qedi) in qedi_alloc_itt() argument
1908 qedi->itt_map = kcalloc(MAX_ISCSI_TASK_ENTRIES, in qedi_alloc_itt()
1910 if (!qedi->itt_map) { in qedi_alloc_itt()
1911 QEDI_ERR(&qedi->dbg_ctx, in qedi_alloc_itt()
1918 static void qedi_free_itt(struct qedi_ctx *qedi) in qedi_free_itt() argument
1920 kfree(qedi->itt_map); in qedi_free_itt()
2001 void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu) in qedi_reset_host_mtu() argument
2005 qedi_recover_all_conns(qedi); in qedi_reset_host_mtu()
2007 qedi_ops->ll2->stop(qedi->cdev); in qedi_reset_host_mtu()
2008 qedi_ll2_free_skbs(qedi); in qedi_reset_host_mtu()
2010 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "old MTU %u, new MTU %u\n", in qedi_reset_host_mtu()
2011 qedi->ll2_mtu, mtu); in qedi_reset_host_mtu()
2013 qedi->ll2_mtu = mtu; in qedi_reset_host_mtu()
2014 params.mtu = qedi->ll2_mtu + IPV6_HDR_LEN + TCP_HDR_LEN; in qedi_reset_host_mtu()
2017 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac); in qedi_reset_host_mtu()
2018 qedi_ops->ll2->start(qedi->cdev, ¶ms); in qedi_reset_host_mtu()
2026 qedi_get_nvram_block(struct qedi_ctx *qedi) in qedi_get_nvram_block() argument
2033 pf = qedi->dev_info.common.abs_pf_id; in qedi_get_nvram_block()
2034 block = &qedi->iscsi_image->iscsi_cfg.block[0]; in qedi_get_nvram_block()
2049 struct qedi_ctx *qedi = data; in qedi_show_boot_eth_info() local
2056 block = qedi_get_nvram_block(qedi); in qedi_show_boot_eth_info()
2100 rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN); in qedi_show_boot_eth_info()
2143 struct qedi_ctx *qedi = data; in qedi_show_boot_ini_info() local
2148 block = qedi_get_nvram_block(qedi); in qedi_show_boot_ini_info()
2182 qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type, in qedi_show_boot_tgt_info() argument
2191 block = qedi_get_nvram_block(qedi); in qedi_show_boot_tgt_info()
2195 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT, in qedi_show_boot_tgt_info()
2203 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT, in qedi_show_boot_tgt_info()
2277 struct qedi_ctx *qedi = data; in qedi_show_boot_tgt_pri_info() local
2279 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_PRI); in qedi_show_boot_tgt_pri_info()
2284 struct qedi_ctx *qedi = data; in qedi_show_boot_tgt_sec_info() local
2286 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_SEC); in qedi_show_boot_tgt_sec_info()
2315 struct qedi_ctx *qedi = data; in qedi_boot_release() local
2317 scsi_host_put(qedi->shost); in qedi_boot_release()
2320 static int qedi_get_boot_info(struct qedi_ctx *qedi) in qedi_get_boot_info() argument
2324 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_get_boot_info()
2326 ret = qedi_ops->common->nvm_get_image(qedi->cdev, in qedi_get_boot_info()
2328 (char *)qedi->iscsi_image, in qedi_get_boot_info()
2331 QEDI_ERR(&qedi->dbg_ctx, in qedi_get_boot_info()
2337 static int qedi_setup_boot_info(struct qedi_ctx *qedi) in qedi_setup_boot_info() argument
2341 if (qedi_get_boot_info(qedi)) in qedi_setup_boot_info()
2344 qedi->boot_kset = iscsi_boot_create_host_kset(qedi->shost->host_no); in qedi_setup_boot_info()
2345 if (!qedi->boot_kset) in qedi_setup_boot_info()
2348 if (!scsi_host_get(qedi->shost)) in qedi_setup_boot_info()
2351 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 0, qedi, in qedi_setup_boot_info()
2358 if (!scsi_host_get(qedi->shost)) in qedi_setup_boot_info()
2361 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 1, qedi, in qedi_setup_boot_info()
2368 if (!scsi_host_get(qedi->shost)) in qedi_setup_boot_info()
2371 boot_kobj = iscsi_boot_create_initiator(qedi->boot_kset, 0, qedi, in qedi_setup_boot_info()
2378 if (!scsi_host_get(qedi->shost)) in qedi_setup_boot_info()
2381 boot_kobj = iscsi_boot_create_ethernet(qedi->boot_kset, 0, qedi, in qedi_setup_boot_info()
2391 scsi_host_put(qedi->shost); in qedi_setup_boot_info()
2393 iscsi_boot_destroy_kset(qedi->boot_kset); in qedi_setup_boot_info()
2400 struct qedi_ctx *qedi = pci_get_drvdata(pdev); in qedi_io_error_detected() local
2402 QEDI_ERR(&qedi->dbg_ctx, "%s: PCI error detected [%d]\n", in qedi_io_error_detected()
2405 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags)) { in qedi_io_error_detected()
2406 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_io_error_detected()
2411 qedi_ops->common->recovery_process(qedi->cdev); in qedi_io_error_detected()
2418 struct qedi_ctx *qedi = pci_get_drvdata(pdev); in __qedi_remove() local
2423 iscsi_host_for_each_session(qedi->shost, in __qedi_remove()
2427 if (qedi->tmf_thread) { in __qedi_remove()
2428 flush_workqueue(qedi->tmf_thread); in __qedi_remove()
2429 destroy_workqueue(qedi->tmf_thread); in __qedi_remove()
2430 qedi->tmf_thread = NULL; in __qedi_remove()
2433 if (qedi->offload_thread) { in __qedi_remove()
2434 flush_workqueue(qedi->offload_thread); in __qedi_remove()
2435 destroy_workqueue(qedi->offload_thread); in __qedi_remove()
2436 qedi->offload_thread = NULL; in __qedi_remove()
2441 qedi_dbg_host_exit(&qedi->dbg_ctx); in __qedi_remove()
2443 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) in __qedi_remove()
2444 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0); in __qedi_remove()
2446 qedi_sync_free_irqs(qedi); in __qedi_remove()
2448 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) { in __qedi_remove()
2450 rval = qedi_ops->stop(qedi->cdev); in __qedi_remove()
2456 qedi_ops->ll2->stop(qedi->cdev); in __qedi_remove()
2459 qedi_free_iscsi_pf_param(qedi); in __qedi_remove()
2461 rval = qedi_ops->common->update_drv_state(qedi->cdev, false); in __qedi_remove()
2463 QEDI_ERR(&qedi->dbg_ctx, "Failed to send drv state to MFW\n"); in __qedi_remove()
2465 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) { in __qedi_remove()
2466 qedi_ops->common->slowpath_stop(qedi->cdev); in __qedi_remove()
2467 qedi_ops->common->remove(qedi->cdev); in __qedi_remove()
2470 qedi_destroy_fp(qedi); in __qedi_remove()
2473 qedi_release_cid_que(qedi); in __qedi_remove()
2474 qedi_cm_free_mem(qedi); in __qedi_remove()
2475 qedi_free_uio(qedi->udev); in __qedi_remove()
2476 qedi_free_itt(qedi); in __qedi_remove()
2478 if (qedi->ll2_recv_thread) { in __qedi_remove()
2479 kthread_stop(qedi->ll2_recv_thread); in __qedi_remove()
2480 qedi->ll2_recv_thread = NULL; in __qedi_remove()
2482 qedi_ll2_free_skbs(qedi); in __qedi_remove()
2484 if (qedi->boot_kset) in __qedi_remove()
2485 iscsi_boot_destroy_kset(qedi->boot_kset); in __qedi_remove()
2487 iscsi_host_remove(qedi->shost); in __qedi_remove()
2488 iscsi_host_free(qedi->shost); in __qedi_remove()
2494 struct qedi_ctx *qedi = in qedi_board_disable_work() local
2498 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in qedi_board_disable_work()
2501 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags)) in qedi_board_disable_work()
2504 __qedi_remove(qedi->pdev, QEDI_MODE_SHUTDOWN); in qedi_board_disable_work()
2509 struct qedi_ctx *qedi = pci_get_drvdata(pdev); in qedi_shutdown() local
2511 QEDI_ERR(&qedi->dbg_ctx, "%s: Shutdown qedi\n", __func__); in qedi_shutdown()
2512 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags)) in qedi_shutdown()
2519 struct qedi_ctx *qedi; in __qedi_probe() local
2532 qedi = qedi_host_alloc(pdev); in __qedi_probe()
2533 if (!qedi) { in __qedi_probe()
2538 qedi = pci_get_drvdata(pdev); in __qedi_probe()
2550 qedi->cdev = qedi_ops->common->probe(pdev, &qed_params); in __qedi_probe()
2551 if (!qedi->cdev) { in __qedi_probe()
2553 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in __qedi_probe()
2560 QEDI_ERR(&qedi->dbg_ctx, "Cannot initialize hardware\n"); in __qedi_probe()
2564 set_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags); in __qedi_probe()
2565 set_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags); in __qedi_probe()
2566 atomic_set(&qedi->link_state, QEDI_LINK_DOWN); in __qedi_probe()
2568 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info); in __qedi_probe()
2572 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in __qedi_probe()
2574 qedi->dev_info.common.num_hwfns, in __qedi_probe()
2575 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev)); in __qedi_probe()
2577 rc = qedi_set_iscsi_pf_param(qedi); in __qedi_probe()
2580 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2585 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params); in __qedi_probe()
2587 rc = qedi_prepare_fp(qedi); in __qedi_probe()
2589 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath.\n"); in __qedi_probe()
2601 rc = qedi_ops->common->slowpath_start(qedi->cdev, &sp_params); in __qedi_probe()
2603 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath\n"); in __qedi_probe()
2610 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params); in __qedi_probe()
2612 rc = qedi_setup_int(qedi); in __qedi_probe()
2616 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0); in __qedi_probe()
2619 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info); in __qedi_probe()
2624 qedi->bdq_primary_prod = qedi->dev_info.primary_dbq_rq_addr; in __qedi_probe()
2625 qedi->bdq_secondary_prod = qedi->dev_info.secondary_bdq_rq_addr; in __qedi_probe()
2626 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in __qedi_probe()
2628 qedi->bdq_primary_prod, in __qedi_probe()
2629 qedi->bdq_secondary_prod); in __qedi_probe()
2636 qedi->bdq_prod_idx = QEDI_BDQ_NUM; in __qedi_probe()
2637 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in __qedi_probe()
2639 qedi->bdq_prod_idx); in __qedi_probe()
2640 writew(qedi->bdq_prod_idx, qedi->bdq_primary_prod); in __qedi_probe()
2641 readw(qedi->bdq_primary_prod); in __qedi_probe()
2642 writew(qedi->bdq_prod_idx, qedi->bdq_secondary_prod); in __qedi_probe()
2643 readw(qedi->bdq_secondary_prod); in __qedi_probe()
2645 ether_addr_copy(qedi->mac, qedi->dev_info.common.hw_mac); in __qedi_probe()
2646 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, "MAC address is %pM.\n", in __qedi_probe()
2647 qedi->mac); in __qedi_probe()
2649 snprintf(host_buf, sizeof(host_buf), "host_%d", qedi->shost->host_no); in __qedi_probe()
2650 qedi_ops->common->set_name(qedi->cdev, host_buf); in __qedi_probe()
2652 qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi); in __qedi_probe()
2656 qedi->ll2_mtu = DEF_PATH_MTU; in __qedi_probe()
2659 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac); in __qedi_probe()
2663 INIT_LIST_HEAD(&qedi->ll2_skb_list); in __qedi_probe()
2664 spin_lock_init(&qedi->ll2_lock); in __qedi_probe()
2666 spin_lock_init(&qedi->hba_lock); in __qedi_probe()
2667 spin_lock_init(&qedi->task_idx_lock); in __qedi_probe()
2668 mutex_init(&qedi->stats_lock); in __qedi_probe()
2670 qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi); in __qedi_probe()
2671 qedi_ops->ll2->start(qedi->cdev, ¶ms); in __qedi_probe()
2674 qedi->ll2_recv_thread = kthread_run(qedi_ll2_recv_thread, in __qedi_probe()
2675 (void *)qedi, in __qedi_probe()
2679 rc = qedi_ops->start(qedi->cdev, &qedi->tasks, in __qedi_probe()
2680 qedi, qedi_iscsi_event_cb); in __qedi_probe()
2683 QEDI_ERR(&qedi->dbg_ctx, "Cannot start iSCSI function\n"); in __qedi_probe()
2687 task_start = qedi_get_task_mem(&qedi->tasks, 0); in __qedi_probe()
2688 task_end = qedi_get_task_mem(&qedi->tasks, MAX_TID_BLOCKS_ISCSI - 1); in __qedi_probe()
2689 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, in __qedi_probe()
2691 task_start, task_end, qedi->tasks.size); in __qedi_probe()
2695 rc = qedi_ops->common->set_link(qedi->cdev, &link_params); in __qedi_probe()
2697 QEDI_WARN(&qedi->dbg_ctx, "Link set up failed.\n"); in __qedi_probe()
2698 atomic_set(&qedi->link_state, QEDI_LINK_DOWN); in __qedi_probe()
2702 qedi_dbg_host_init(&qedi->dbg_ctx, qedi_debugfs_ops, in __qedi_probe()
2705 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, in __qedi_probe()
2711 if (iscsi_host_add(qedi->shost, &pdev->dev)) { in __qedi_probe()
2712 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2719 rc = qedi_alloc_uio_rings(qedi); in __qedi_probe()
2721 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2726 rc = qedi_init_uio(qedi); in __qedi_probe()
2728 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2734 rc = qedi_setup_cid_que(qedi); in __qedi_probe()
2736 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2741 rc = qedi_cm_alloc_mem(qedi); in __qedi_probe()
2743 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2748 rc = qedi_alloc_itt(qedi); in __qedi_probe()
2750 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2755 sprintf(host_buf, "host_%d", qedi->shost->host_no); in __qedi_probe()
2756 qedi->tmf_thread = create_singlethread_workqueue(host_buf); in __qedi_probe()
2757 if (!qedi->tmf_thread) { in __qedi_probe()
2758 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2764 sprintf(host_buf, "qedi_ofld%d", qedi->shost->host_no); in __qedi_probe()
2765 qedi->offload_thread = create_workqueue(host_buf); in __qedi_probe()
2766 if (!qedi->offload_thread) { in __qedi_probe()
2767 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2773 INIT_DELAYED_WORK(&qedi->recovery_work, qedi_recovery_handler); in __qedi_probe()
2774 INIT_DELAYED_WORK(&qedi->board_disable_work, in __qedi_probe()
2778 set_bit(QEDI_RESERVE_TASK_ID, qedi->task_idx_map); in __qedi_probe()
2779 atomic_set(&qedi->num_offloads, 0); in __qedi_probe()
2781 if (qedi_setup_boot_info(qedi)) in __qedi_probe()
2782 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2785 rc = qedi_ops->common->update_drv_state(qedi->cdev, true); in __qedi_probe()
2787 QEDI_ERR(&qedi->dbg_ctx, in __qedi_probe()
2795 destroy_workqueue(qedi->tmf_thread); in __qedi_probe()
2797 qedi_release_cid_que(qedi); in __qedi_probe()
2799 qedi_free_uio(qedi->udev); in __qedi_probe()
2802 qedi_dbg_host_exit(&qedi->dbg_ctx); in __qedi_probe()
2804 iscsi_host_remove(qedi->shost); in __qedi_probe()
2806 qedi_ops->stop(qedi->cdev); in __qedi_probe()
2808 qedi_ops->common->slowpath_stop(qedi->cdev); in __qedi_probe()
2810 qedi_ops->common->remove(qedi->cdev); in __qedi_probe()
2812 qedi_free_iscsi_pf_param(qedi); in __qedi_probe()
2814 iscsi_host_free(qedi->shost); in __qedi_probe()
2830 struct qedi_ctx *qedi = in qedi_recovery_handler() local
2833 iscsi_host_for_each_session(qedi->shost, qedi_mark_conn_recovery); in qedi_recovery_handler()
2838 qedi_ops->common->recovery_prolog(qedi->cdev); in qedi_recovery_handler()
2840 __qedi_remove(qedi->pdev, QEDI_MODE_RECOVERY); in qedi_recovery_handler()
2841 __qedi_probe(qedi->pdev, QEDI_MODE_RECOVERY); in qedi_recovery_handler()
2842 clear_bit(QEDI_IN_RECOVERY, &qedi->flags); in qedi_recovery_handler()