Lines Matching defs:qedi

27 #include "qedi.h"
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);
76 struct qedi_ctx *qedi;
86 qedi = (struct qedi_ctx *)context;
87 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
91 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
96 qedi_ep = qedi->ep_tbl[data->icid];
99 QEDI_WARN(&qedi->dbg_ctx,
130 QEDI_ERR(&qedi->dbg_ctx, "Recv Unknown Event %u\n",
140 struct qedi_ctx *qedi = udev->qedi;
151 set_bit(UIO_DEV_OPENED, &qedi->flags);
160 struct qedi_ctx *qedi = udev->qedi;
163 clear_bit(UIO_DEV_OPENED, &qedi->flags);
164 qedi_ll2_free_skbs(qedi);
207 struct qedi_ctx *qedi = NULL;
210 qedi = udev->qedi;
213 spin_lock_bh(&qedi->ll2_lock);
221 spin_unlock_bh(&qedi->ll2_lock);
262 static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
268 if (udev->pdev == qedi->pdev) {
269 udev->qedi = qedi;
271 udev->qedi = NULL;
274 qedi->udev = udev;
285 udev->qedi = qedi;
286 udev->pdev = qedi->pdev;
295 qedi->udev = udev;
307 static int qedi_init_uio(struct qedi_ctx *qedi)
309 struct qedi_uio_dev *udev = qedi->udev;
343 QEDI_ERR(&qedi->dbg_ctx,
352 static int qedi_alloc_and_init_sb(struct qedi_ctx *qedi,
359 sb_virt = dma_alloc_coherent(&qedi->pdev->dev,
363 QEDI_ERR(&qedi->dbg_ctx,
369 ret = qedi_ops->common->sb_init(qedi->cdev, sb_info, sb_virt, sb_phys,
372 QEDI_ERR(&qedi->dbg_ctx,
381 static void qedi_free_sb(struct qedi_ctx *qedi)
386 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
387 sb_info = &qedi->sb_array[id];
389 dma_free_coherent(&qedi->pdev->dev,
396 static void qedi_free_fp(struct qedi_ctx *qedi)
398 kfree(qedi->fp_array);
399 kfree(qedi->sb_array);
402 static void qedi_destroy_fp(struct qedi_ctx *qedi)
404 qedi_free_sb(qedi);
405 qedi_free_fp(qedi);
408 static int qedi_alloc_fp(struct qedi_ctx *qedi)
412 qedi->fp_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
414 if (!qedi->fp_array) {
415 QEDI_ERR(&qedi->dbg_ctx,
420 qedi->sb_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
422 if (!qedi->sb_array) {
423 QEDI_ERR(&qedi->dbg_ctx,
432 qedi_free_fp(qedi);
436 static void qedi_int_fp(struct qedi_ctx *qedi)
441 memset(qedi->fp_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
442 sizeof(*qedi->fp_array));
443 memset(qedi->sb_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
444 sizeof(*qedi->sb_array));
446 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
447 fp = &qedi->fp_array[id];
448 fp->sb_info = &qedi->sb_array[id];
450 fp->qedi = qedi;
452 "qedi", id);
460 static int qedi_prepare_fp(struct qedi_ctx *qedi)
465 ret = qedi_alloc_fp(qedi);
469 qedi_int_fp(qedi);
471 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
472 fp = &qedi->fp_array[id];
473 ret = qedi_alloc_and_init_sb(qedi, fp->sb_info, fp->sb_id);
475 QEDI_ERR(&qedi->dbg_ctx,
485 qedi_free_sb(qedi);
486 qedi_free_fp(qedi);
491 static int qedi_setup_cid_que(struct qedi_ctx *qedi)
495 qedi->cid_que.cid_que_base = kmalloc_array(qedi->max_active_conns,
497 if (!qedi->cid_que.cid_que_base)
500 qedi->cid_que.conn_cid_tbl = kmalloc_array(qedi->max_active_conns,
503 if (!qedi->cid_que.conn_cid_tbl) {
504 kfree(qedi->cid_que.cid_que_base);
505 qedi->cid_que.cid_que_base = NULL;
509 qedi->cid_que.cid_que = (u32 *)qedi->cid_que.cid_que_base;
510 qedi->cid_que.cid_q_prod_idx = 0;
511 qedi->cid_que.cid_q_cons_idx = 0;
512 qedi->cid_que.cid_q_max_idx = qedi->max_active_conns;
513 qedi->cid_que.cid_free_cnt = qedi->max_active_conns;
515 for (i = 0; i < qedi->max_active_conns; i++) {
516 qedi->cid_que.cid_que[i] = i;
517 qedi->cid_que.conn_cid_tbl[i] = NULL;
523 static void qedi_release_cid_que(struct qedi_ctx *qedi)
525 kfree(qedi->cid_que.cid_que_base);
526 qedi->cid_que.cid_que_base = NULL;
528 kfree(qedi->cid_que.conn_cid_tbl);
529 qedi->cid_que.conn_cid_tbl = NULL;
607 static void qedi_cm_free_mem(struct qedi_ctx *qedi)
609 kfree(qedi->ep_tbl);
610 qedi->ep_tbl = NULL;
611 qedi_free_id_tbl(&qedi->lcl_port_tbl);
614 static int qedi_cm_alloc_mem(struct qedi_ctx *qedi)
618 qedi->ep_tbl = kzalloc((qedi->max_active_conns *
620 if (!qedi->ep_tbl)
623 if (qedi_init_id_tbl(&qedi->lcl_port_tbl, QEDI_LOCAL_PORT_RANGE,
625 qedi_cm_free_mem(qedi);
635 struct qedi_ctx *qedi = NULL;
650 qedi = iscsi_host_priv(shost);
651 memset(qedi, 0, sizeof(*qedi));
652 qedi->shost = shost;
653 qedi->dbg_ctx.host_no = shost->host_no;
654 qedi->pdev = pdev;
655 qedi->dbg_ctx.pdev = pdev;
656 qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA;
657 qedi->max_sqes = QEDI_SQ_SIZE;
659 shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi);
661 pci_set_drvdata(pdev, qedi);
664 return qedi;
669 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
673 if (!qedi) {
674 QEDI_ERR(NULL, "qedi is NULL\n");
678 if (!test_bit(UIO_DEV_OPENED, &qedi->flags)) {
679 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_UIO,
697 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
704 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
710 QEDI_WARN(&qedi->dbg_ctx,
725 spin_lock_bh(&qedi->ll2_lock);
726 list_add_tail(&work->list, &qedi->ll2_skb_list);
727 spin_unlock_bh(&qedi->ll2_lock);
729 wake_up_process(qedi->ll2_recv_thread);
735 static int qedi_ll2_process_skb(struct qedi_ctx *qedi, struct sk_buff *skb,
747 if (!qedi) {
748 QEDI_ERR(NULL, "qedi is NULL\n");
752 udev = qedi->udev;
774 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
778 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
790 static void qedi_ll2_free_skbs(struct qedi_ctx *qedi)
794 spin_lock_bh(&qedi->ll2_lock);
795 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list, list) {
800 spin_unlock_bh(&qedi->ll2_lock);
805 struct qedi_ctx *qedi = (struct qedi_ctx *)arg;
811 spin_lock_bh(&qedi->ll2_lock);
812 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list,
815 qedi_ll2_process_skb(qedi, work->skb, work->vlan_id);
820 spin_unlock_bh(&qedi->ll2_lock);
828 static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
837 qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
839 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
840 "Number of CQ count is %d\n", qedi->num_queues);
842 memset(&qedi->pf_params.iscsi_pf_params, 0,
843 sizeof(qedi->pf_params.iscsi_pf_params));
845 qedi->p_cpuq = dma_alloc_coherent(&qedi->pdev->dev,
846 qedi->num_queues * sizeof(struct qedi_glbl_q_params),
847 &qedi->hw_p_cpuq, GFP_KERNEL);
848 if (!qedi->p_cpuq) {
849 QEDI_ERR(&qedi->dbg_ctx, "dma_alloc_coherent fail\n");
854 rval = qedi_alloc_global_queues(qedi);
856 QEDI_ERR(&qedi->dbg_ctx, "Global queue allocation failed.\n");
861 qedi->pf_params.iscsi_pf_params.num_cons = QEDI_MAX_ISCSI_CONNS_PER_HBA;
862 qedi->pf_params.iscsi_pf_params.num_tasks = QEDI_MAX_ISCSI_TASK;
863 qedi->pf_params.iscsi_pf_params.half_way_close_timeout = 10;
864 qedi->pf_params.iscsi_pf_params.num_sq_pages_in_ring = num_sq_pages;
865 qedi->pf_params.iscsi_pf_params.num_r2tq_pages_in_ring = num_sq_pages;
866 qedi->pf_params.iscsi_pf_params.num_uhq_pages_in_ring = num_sq_pages;
867 qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues;
868 qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug;
869 qedi->pf_params.iscsi_pf_params.two_msl_timer = QED_TWO_MSL_TIMER_DFLT;
870 qedi->pf_params.iscsi_pf_params.tx_sws_timer = QED_TX_SWS_TIMER_DFLT;
871 qedi->pf_params.iscsi_pf_params.max_fin_rt = 2;
877 qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size;
879 qedi->pf_params.iscsi_pf_params.glbl_q_params_addr =
880 (u64)qedi->hw_p_cpuq;
886 qedi->pf_params.iscsi_pf_params.rqe_log_size = 8;
888 qedi->pf_params.iscsi_pf_params.bdq_pbl_base_addr[BDQ_ID_RQ] =
889 qedi->bdq_pbl_list_dma;
890 qedi->pf_params.iscsi_pf_params.bdq_pbl_num_entries[BDQ_ID_RQ] =
891 qedi->bdq_pbl_list_num_entries;
892 qedi->pf_params.iscsi_pf_params.rq_buffer_size = QEDI_BDQ_BUF_SIZE;
895 qedi->pf_params.iscsi_pf_params.cq_num_entries = 2048;
897 qedi->pf_params.iscsi_pf_params.gl_rq_pi = QEDI_PROTO_CQ_PROD_IDX;
898 qedi->pf_params.iscsi_pf_params.gl_cmd_pi = 1;
905 static void qedi_free_iscsi_pf_param(struct qedi_ctx *qedi)
909 if (qedi->p_cpuq) {
910 size = qedi->num_queues * sizeof(struct qedi_glbl_q_params);
911 dma_free_coherent(&qedi->pdev->dev, size, qedi->p_cpuq,
912 qedi->hw_p_cpuq);
915 qedi_free_global_queues(qedi);
917 kfree(qedi->global_queues);
941 static int qedi_find_boot_info(struct qedi_ctx *qedi,
975 for (i = 0; i < qedi->max_active_conns; i++) {
976 qedi_conn = qedi_get_conn_from_id(qedi, i);
1043 struct qedi_ctx *qedi;
1050 qedi = (struct qedi_ctx *)dev;
1053 ether_addr_copy(data->mac[0], qedi->mac);
1065 struct qedi_ctx *qedi = dev;
1070 QEDI_ERR(&qedi->dbg_ctx,
1075 mutex_lock(&qedi->stats_lock);
1077 qedi_ops->get_stats(qedi->cdev, fw_iscsi_stats);
1078 mutex_unlock(&qedi->stats_lock);
1089 iscsi->frame_size = qedi->ll2_mtu;
1090 block = qedi_get_nvram_block(qedi);
1110 rval = qedi_find_boot_info(qedi, iscsi, block);
1112 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1124 struct qedi_ctx *qedi = (struct qedi_ctx *)dev;
1128 qedi->qedi_err_flags = qedi_flags_override;
1130 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1132 err_type, qedi->qedi_err_flags);
1136 schedule_delayed_work(&qedi->board_disable_work, 0);
1144 if (test_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags))
1145 qedi_ops->common->attn_clr_enable(qedi->cdev, true);
1148 test_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags))
1149 qedi_ops->common->recovery_process(qedi->cdev);
1159 struct qedi_ctx *qedi = dev;
1161 QEDI_ERR(&qedi->dbg_ctx, "Recovery handler scheduled.\n");
1163 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags))
1166 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
1168 schedule_delayed_work(&qedi->recovery_work, 0);
1177 qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn);
1182 struct qedi_ctx *qedi = (struct qedi_ctx *)dev;
1185 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "Link Up event.\n");
1186 atomic_set(&qedi->link_state, QEDI_LINK_UP);
1188 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1190 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
1191 iscsi_host_for_each_session(qedi->shost, qedi_set_conn_recovery);
1205 static int qedi_queue_cqe(struct qedi_ctx *qedi, union iscsi_cqe *cqe,
1215 q_conn = qedi->cid_que.conn_cid_tbl[iscsi_cid];
1217 QEDI_WARN(&qedi->dbg_ctx,
1226 qedi_cmd = qedi_get_cmd_from_tid(qedi, cqe->cqe_solicited.itid);
1232 qedi_cmd->cqe_work.qedi = qedi;
1247 qedi_work->qedi = qedi;
1255 QEDI_ERR(&qedi->dbg_ctx, "FW Error cqe.\n");
1262 struct qedi_ctx *qedi = fp->qedi;
1279 que = qedi->global_queues[fp->sb_id];
1280 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1284 qedi->intr_cpu = fp->sb_id;
1295 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1299 ret = qedi_queue_cqe(qedi, cqe, fp->sb_id, p);
1301 QEDI_WARN(&qedi->dbg_ctx,
1317 struct qedi_ctx *qedi = fp->qedi;
1329 que = qedi->global_queues[fp->sb_id];
1342 struct qedi_ctx *qedi = fp->qedi;
1350 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1372 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
1374 QEDI_WARN(&qedi->dbg_ctx, "qedi=%p.\n", qedi);
1378 static void qedi_sync_free_irqs(struct qedi_ctx *qedi)
1383 if (qedi->int_info.msix_cnt) {
1384 for (i = 0; i < qedi->int_info.used_cnt; i++) {
1385 idx = i * qedi->dev_info.common.num_hwfns +
1386 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1388 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1391 synchronize_irq(qedi->int_info.msix[idx].vector);
1392 irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1394 free_irq(qedi->int_info.msix[idx].vector,
1395 &qedi->fp_array[i]);
1398 qedi_ops->common->simd_handler_clean(qedi->cdev,
1402 qedi->int_info.used_cnt = 0;
1403 qedi_ops->common->set_fp_int(qedi->cdev, 0);
1406 static int qedi_request_msix_irq(struct qedi_ctx *qedi)
1412 for (i = 0; i < qedi->msix_count; i++) {
1413 idx = i * qedi->dev_info.common.num_hwfns +
1414 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1416 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1418 qedi->dev_info.common.num_hwfns,
1419 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
1421 rc = request_irq(qedi->int_info.msix[idx].vector,
1422 qedi_msix_handler, 0, "qedi",
1423 &qedi->fp_array[i]);
1425 QEDI_WARN(&qedi->dbg_ctx, "request_irq failed.\n");
1426 qedi_sync_free_irqs(qedi);
1429 qedi->int_info.used_cnt++;
1430 rc = irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1438 static int qedi_setup_int(struct qedi_ctx *qedi)
1442 rc = qedi_ops->common->set_fp_int(qedi->cdev, qedi->num_queues);
1446 qedi->msix_count = rc;
1448 rc = qedi_ops->common->get_fp_int(qedi->cdev, &qedi->int_info);
1452 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1454 qedi->int_info.msix_cnt, num_online_cpus());
1456 if (qedi->int_info.msix_cnt) {
1457 rc = qedi_request_msix_irq(qedi);
1460 qedi_ops->common->simd_handler_config(qedi->cdev, &qedi,
1463 qedi->int_info.used_cnt = 1;
1470 static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1472 if (qedi->iscsi_image)
1473 dma_free_coherent(&qedi->pdev->dev,
1475 qedi->iscsi_image, qedi->nvm_buf_dma);
1478 static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1480 qedi->iscsi_image = dma_alloc_coherent(&qedi->pdev->dev,
1482 &qedi->nvm_buf_dma, GFP_KERNEL);
1483 if (!qedi->iscsi_image) {
1484 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
1487 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1488 "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_image,
1489 qedi->nvm_buf_dma);
1494 static void qedi_free_bdq(struct qedi_ctx *qedi)
1498 if (qedi->bdq_pbl_list)
1499 dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
1500 qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma);
1502 if (qedi->bdq_pbl)
1503 dma_free_coherent(&qedi->pdev->dev, qedi->bdq_pbl_mem_size,
1504 qedi->bdq_pbl, qedi->bdq_pbl_dma);
1507 if (qedi->bdq[i].buf_addr) {
1508 dma_free_coherent(&qedi->pdev->dev, QEDI_BDQ_BUF_SIZE,
1509 qedi->bdq[i].buf_addr,
1510 qedi->bdq[i].buf_dma);
1515 static void qedi_free_global_queues(struct qedi_ctx *qedi)
1518 struct global_queue **gl = qedi->global_queues;
1520 for (i = 0; i < qedi->num_queues; i++) {
1525 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_mem_size,
1528 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_pbl_size,
1533 qedi_free_bdq(qedi);
1534 qedi_free_nvm_iscsi_cfg(qedi);
1537 static int qedi_alloc_bdq(struct qedi_ctx *qedi)
1545 qedi->bdq[i].buf_addr =
1546 dma_alloc_coherent(&qedi->pdev->dev,
1548 &qedi->bdq[i].buf_dma,
1550 if (!qedi->bdq[i].buf_addr) {
1551 QEDI_ERR(&qedi->dbg_ctx,
1558 qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd);
1559 qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE);
1560 qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd);
1562 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n",
1563 qedi->rq_num_entries);
1565 qedi->bdq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1566 qedi->bdq_pbl_mem_size,
1567 &qedi->bdq_pbl_dma, GFP_KERNEL);
1568 if (!qedi->bdq_pbl) {
1569 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate BDQ PBL.\n");
1577 pbl = (struct scsi_bd *)qedi->bdq_pbl;
1580 cpu_to_le32(QEDI_U64_HI(qedi->bdq[i].buf_dma));
1582 cpu_to_le32(QEDI_U64_LO(qedi->bdq[i].buf_dma));
1583 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1594 qedi->bdq_pbl_list = dma_alloc_coherent(&qedi->pdev->dev,
1596 &qedi->bdq_pbl_list_dma,
1598 if (!qedi->bdq_pbl_list) {
1599 QEDI_ERR(&qedi->dbg_ctx,
1608 qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size /
1610 list = (u64 *)qedi->bdq_pbl_list;
1611 for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) {
1612 *list = qedi->bdq_pbl_dma;
1619 static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
1632 if (!qedi->num_queues) {
1633 QEDI_ERR(&qedi->dbg_ctx, "No MSI-X vectors available!\n");
1640 if (!qedi->p_cpuq) {
1645 qedi->global_queues = kzalloc((sizeof(struct global_queue *) *
1646 qedi->num_queues), GFP_KERNEL);
1647 if (!qedi->global_queues) {
1648 QEDI_ERR(&qedi->dbg_ctx,
1652 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1653 "qedi->global_queues=%p.\n", qedi->global_queues);
1656 status = qedi_alloc_bdq(qedi);
1661 status = qedi_alloc_nvm_iscsi_cfg(qedi);
1668 for (i = 0; i < qedi->num_queues; i++) {
1669 qedi->global_queues[i] =
1670 kzalloc(sizeof(*qedi->global_queues[0]),
1672 if (!qedi->global_queues[i]) {
1673 QEDI_ERR(&qedi->dbg_ctx,
1679 qedi->global_queues[i]->cq_mem_size =
1681 qedi->global_queues[i]->cq_mem_size =
1682 (qedi->global_queues[i]->cq_mem_size +
1685 qedi->global_queues[i]->cq_pbl_size =
1686 (qedi->global_queues[i]->cq_mem_size /
1688 qedi->global_queues[i]->cq_pbl_size =
1689 (qedi->global_queues[i]->cq_pbl_size +
1692 qedi->global_queues[i]->cq = dma_alloc_coherent(&qedi->pdev->dev,
1693 qedi->global_queues[i]->cq_mem_size,
1694 &qedi->global_queues[i]->cq_dma,
1697 if (!qedi->global_queues[i]->cq) {
1698 QEDI_WARN(&qedi->dbg_ctx,
1703 qedi->global_queues[i]->cq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1704 qedi->global_queues[i]->cq_pbl_size,
1705 &qedi->global_queues[i]->cq_pbl_dma,
1708 if (!qedi->global_queues[i]->cq_pbl) {
1709 QEDI_WARN(&qedi->dbg_ctx,
1716 num_pages = qedi->global_queues[i]->cq_mem_size /
1718 page = qedi->global_queues[i]->cq_dma;
1719 pbl = (u32 *)qedi->global_queues[i]->cq_pbl;
1730 list = (u32 *)qedi->p_cpuq;
1738 for (i = 0; i < qedi->num_queues; i++) {
1739 *list = (u32)qedi->global_queues[i]->cq_pbl_dma;
1741 *list = (u32)((u64)qedi->global_queues[i]->cq_pbl_dma >> 32);
1753 qedi_free_global_queues(qedi);
1757 int qedi_alloc_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1774 ep->sq = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_mem_size,
1777 QEDI_WARN(&qedi->dbg_ctx,
1782 ep->sq_pbl = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_pbl_size,
1785 QEDI_WARN(&qedi->dbg_ctx,
1807 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1813 void qedi_free_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1816 dma_free_coherent(&qedi->pdev->dev, ep->sq_pbl_size, ep->sq_pbl,
1819 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1823 int qedi_get_task_idx(struct qedi_ctx *qedi)
1828 tmp_idx = find_first_zero_bit(qedi->task_idx_map,
1832 QEDI_ERR(&qedi->dbg_ctx, "FW task context pool is full.\n");
1837 if (test_and_set_bit(tmp_idx, qedi->task_idx_map))
1844 void qedi_clear_task_idx(struct qedi_ctx *qedi, int idx)
1846 if (!test_and_clear_bit(idx, qedi->task_idx_map))
1847 QEDI_ERR(&qedi->dbg_ctx,
1851 void qedi_update_itt_map(struct qedi_ctx *qedi, u32 tid, u32 proto_itt,
1854 qedi->itt_map[tid].itt = proto_itt;
1855 qedi->itt_map[tid].p_cmd = cmd;
1857 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1859 qedi->itt_map[tid].itt);
1862 void qedi_get_task_tid(struct qedi_ctx *qedi, u32 itt, s16 *tid)
1867 if (qedi->itt_map[i].itt == itt) {
1869 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1879 void qedi_get_proto_itt(struct qedi_ctx *qedi, u32 tid, u32 *proto_itt)
1881 *proto_itt = qedi->itt_map[tid].itt;
1882 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1887 struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid)
1894 cmd = qedi->itt_map[tid].p_cmd;
1898 qedi->itt_map[tid].p_cmd = NULL;
1903 static int qedi_alloc_itt(struct qedi_ctx *qedi)
1905 qedi->itt_map = kcalloc(MAX_ISCSI_TASK_ENTRIES,
1907 if (!qedi->itt_map) {
1908 QEDI_ERR(&qedi->dbg_ctx,
1915 static void qedi_free_itt(struct qedi_ctx *qedi)
1917 kfree(qedi->itt_map);
1999 void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
2003 qedi_recover_all_conns(qedi);
2005 qedi_ops->ll2->stop(qedi->cdev);
2006 qedi_ll2_free_skbs(qedi);
2008 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "old MTU %u, new MTU %u\n",
2009 qedi->ll2_mtu, mtu);
2011 qedi->ll2_mtu = mtu;
2012 params.mtu = qedi->ll2_mtu + IPV6_HDR_LEN + TCP_HDR_LEN;
2015 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
2016 qedi_ops->ll2->start(qedi->cdev, &params);
2024 qedi_get_nvram_block(struct qedi_ctx *qedi)
2031 pf = qedi->dev_info.common.abs_pf_id;
2032 block = &qedi->iscsi_image->iscsi_cfg.block[0];
2047 struct qedi_ctx *qedi = data;
2054 block = qedi_get_nvram_block(qedi);
2097 rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
2140 struct qedi_ctx *qedi = data;
2145 block = qedi_get_nvram_block(qedi);
2179 qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
2188 block = qedi_get_nvram_block(qedi);
2192 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2200 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2274 struct qedi_ctx *qedi = data;
2276 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_PRI);
2281 struct qedi_ctx *qedi = data;
2283 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_SEC);
2312 struct qedi_ctx *qedi = data;
2314 scsi_host_put(qedi->shost);
2317 static int qedi_get_boot_info(struct qedi_ctx *qedi)
2321 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2323 ret = qedi_ops->common->nvm_get_image(qedi->cdev,
2325 (char *)qedi->iscsi_image,
2328 QEDI_ERR(&qedi->dbg_ctx,
2334 static int qedi_setup_boot_info(struct qedi_ctx *qedi)
2338 if (qedi_get_boot_info(qedi))
2341 qedi->boot_kset = iscsi_boot_create_host_kset(qedi->shost->host_no);
2342 if (!qedi->boot_kset)
2345 if (!scsi_host_get(qedi->shost))
2348 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 0, qedi,
2355 if (!scsi_host_get(qedi->shost))
2358 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 1, qedi,
2365 if (!scsi_host_get(qedi->shost))
2368 boot_kobj = iscsi_boot_create_initiator(qedi->boot_kset, 0, qedi,
2375 if (!scsi_host_get(qedi->shost))
2378 boot_kobj = iscsi_boot_create_ethernet(qedi->boot_kset, 0, qedi,
2388 scsi_host_put(qedi->shost);
2390 iscsi_boot_destroy_kset(qedi->boot_kset);
2397 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2399 QEDI_ERR(&qedi->dbg_ctx, "%s: PCI error detected [%d]\n",
2402 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags)) {
2403 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2408 qedi_ops->common->recovery_process(qedi->cdev);
2415 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2420 iscsi_host_remove(qedi->shost, false);
2422 iscsi_host_remove(qedi->shost, true);
2425 if (qedi->tmf_thread) {
2426 destroy_workqueue(qedi->tmf_thread);
2427 qedi->tmf_thread = NULL;
2430 if (qedi->offload_thread) {
2431 destroy_workqueue(qedi->offload_thread);
2432 qedi->offload_thread = NULL;
2437 qedi_dbg_host_exit(&qedi->dbg_ctx);
2439 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags))
2440 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2442 qedi_sync_free_irqs(qedi);
2444 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2446 rval = qedi_ops->stop(qedi->cdev);
2452 qedi_ops->ll2->stop(qedi->cdev);
2455 cancel_delayed_work_sync(&qedi->recovery_work);
2456 cancel_delayed_work_sync(&qedi->board_disable_work);
2458 qedi_free_iscsi_pf_param(qedi);
2460 rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
2462 QEDI_ERR(&qedi->dbg_ctx, "Failed to send drv state to MFW\n");
2464 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2465 qedi_ops->common->slowpath_stop(qedi->cdev);
2466 qedi_ops->common->remove(qedi->cdev);
2469 qedi_destroy_fp(qedi);
2472 qedi_release_cid_que(qedi);
2473 qedi_cm_free_mem(qedi);
2474 qedi_free_uio(qedi->udev);
2475 qedi_free_itt(qedi);
2477 if (qedi->ll2_recv_thread) {
2478 kthread_stop(qedi->ll2_recv_thread);
2479 qedi->ll2_recv_thread = NULL;
2481 qedi_ll2_free_skbs(qedi);
2483 if (qedi->boot_kset)
2484 iscsi_boot_destroy_kset(qedi->boot_kset);
2486 iscsi_host_free(qedi->shost);
2492 struct qedi_ctx *qedi =
2496 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2499 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags))
2502 __qedi_remove(qedi->pdev, QEDI_MODE_NORMAL);
2507 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2509 QEDI_ERR(&qedi->dbg_ctx, "%s: Shutdown qedi\n", __func__);
2510 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags))
2517 struct qedi_ctx *qedi;
2524 qedi = pci_get_drvdata(pdev);
2526 QEDI_ERR(&qedi->dbg_ctx, "%s: Device does not support suspend operation\n", __func__);
2533 struct qedi_ctx *qedi;
2546 qedi = qedi_host_alloc(pdev);
2547 if (!qedi) {
2552 qedi = pci_get_drvdata(pdev);
2564 qedi->cdev = qedi_ops->common->probe(pdev, &qed_params);
2565 if (!qedi->cdev) {
2567 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2574 QEDI_ERR(&qedi->dbg_ctx, "Cannot initialize hardware\n");
2578 set_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags);
2579 set_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags);
2580 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2582 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2586 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2588 qedi->dev_info.common.num_hwfns,
2589 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
2591 rc = qedi_set_iscsi_pf_param(qedi);
2594 QEDI_ERR(&qedi->dbg_ctx,
2599 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2601 rc = qedi_prepare_fp(qedi);
2603 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath.\n");
2614 strscpy(sp_params.name, "qedi iSCSI", QED_DRV_VER_STR_SIZE);
2615 rc = qedi_ops->common->slowpath_start(qedi->cdev, &sp_params);
2617 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath\n");
2624 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2626 rc = qedi_setup_int(qedi);
2630 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2632 /* Learn information crucial for qedi to progress */
2633 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2638 qedi->bdq_primary_prod = qedi->dev_info.primary_dbq_rq_addr;
2639 qedi->bdq_secondary_prod = qedi->dev_info.secondary_bdq_rq_addr;
2640 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2642 qedi->bdq_primary_prod,
2643 qedi->bdq_secondary_prod);
2650 qedi->bdq_prod_idx = QEDI_BDQ_NUM;
2651 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2653 qedi->bdq_prod_idx);
2654 writew(qedi->bdq_prod_idx, qedi->bdq_primary_prod);
2655 readw(qedi->bdq_primary_prod);
2656 writew(qedi->bdq_prod_idx, qedi->bdq_secondary_prod);
2657 readw(qedi->bdq_secondary_prod);
2659 ether_addr_copy(qedi->mac, qedi->dev_info.common.hw_mac);
2660 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, "MAC address is %pM.\n",
2661 qedi->mac);
2663 snprintf(host_buf, sizeof(host_buf), "host_%d", qedi->shost->host_no);
2664 qedi_ops->common->set_name(qedi->cdev, host_buf);
2666 qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
2670 qedi->ll2_mtu = DEF_PATH_MTU;
2673 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
2677 INIT_LIST_HEAD(&qedi->ll2_skb_list);
2678 spin_lock_init(&qedi->ll2_lock);
2679 /* start qedi context */
2680 spin_lock_init(&qedi->hba_lock);
2681 spin_lock_init(&qedi->task_idx_lock);
2682 mutex_init(&qedi->stats_lock);
2684 qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
2685 qedi_ops->ll2->start(qedi->cdev, &params);
2688 qedi->ll2_recv_thread = kthread_run(qedi_ll2_recv_thread,
2689 (void *)qedi,
2693 rc = qedi_ops->start(qedi->cdev, &qedi->tasks,
2694 qedi, qedi_iscsi_event_cb);
2697 QEDI_ERR(&qedi->dbg_ctx, "Cannot start iSCSI function\n");
2701 task_start = qedi_get_task_mem(&qedi->tasks, 0);
2702 task_end = qedi_get_task_mem(&qedi->tasks, MAX_TID_BLOCKS_ISCSI - 1);
2703 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2705 task_start, task_end, qedi->tasks.size);
2709 rc = qedi_ops->common->set_link(qedi->cdev, &link_params);
2711 QEDI_WARN(&qedi->dbg_ctx, "Link set up failed.\n");
2712 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2716 qedi_dbg_host_init(&qedi->dbg_ctx, qedi_debugfs_ops,
2719 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2720 "QLogic FastLinQ iSCSI Module qedi %s, FW %d.%d.%d.%d\n",
2725 if (iscsi_host_add(qedi->shost, &pdev->dev)) {
2726 QEDI_ERR(&qedi->dbg_ctx,
2733 rc = qedi_alloc_uio_rings(qedi);
2735 QEDI_ERR(&qedi->dbg_ctx,
2740 rc = qedi_init_uio(qedi);
2742 QEDI_ERR(&qedi->dbg_ctx,
2748 rc = qedi_setup_cid_que(qedi);
2750 QEDI_ERR(&qedi->dbg_ctx,
2755 rc = qedi_cm_alloc_mem(qedi);
2757 QEDI_ERR(&qedi->dbg_ctx,
2762 rc = qedi_alloc_itt(qedi);
2764 QEDI_ERR(&qedi->dbg_ctx,
2769 sprintf(host_buf, "host_%d", qedi->shost->host_no);
2770 qedi->tmf_thread = create_singlethread_workqueue(host_buf);
2771 if (!qedi->tmf_thread) {
2772 QEDI_ERR(&qedi->dbg_ctx,
2778 sprintf(host_buf, "qedi_ofld%d", qedi->shost->host_no);
2779 qedi->offload_thread = create_workqueue(host_buf);
2780 if (!qedi->offload_thread) {
2781 QEDI_ERR(&qedi->dbg_ctx,
2787 INIT_DELAYED_WORK(&qedi->recovery_work, qedi_recovery_handler);
2788 INIT_DELAYED_WORK(&qedi->board_disable_work,
2792 set_bit(QEDI_RESERVE_TASK_ID, qedi->task_idx_map);
2793 atomic_set(&qedi->num_offloads, 0);
2795 if (qedi_setup_boot_info(qedi))
2796 QEDI_ERR(&qedi->dbg_ctx,
2799 rc = qedi_ops->common->update_drv_state(qedi->cdev, true);
2801 QEDI_ERR(&qedi->dbg_ctx,
2809 destroy_workqueue(qedi->tmf_thread);
2811 qedi_release_cid_que(qedi);
2813 qedi_free_uio(qedi->udev);
2816 qedi_dbg_host_exit(&qedi->dbg_ctx);
2818 iscsi_host_remove(qedi->shost, false);
2820 qedi_ops->stop(qedi->cdev);
2822 qedi_ops->common->slowpath_stop(qedi->cdev);
2824 qedi_ops->common->remove(qedi->cdev);
2826 qedi_free_iscsi_pf_param(qedi);
2828 iscsi_host_free(qedi->shost);
2844 struct qedi_ctx *qedi =
2847 iscsi_host_for_each_session(qedi->shost, qedi_mark_conn_recovery);
2852 qedi_ops->common->recovery_prolog(qedi->cdev);
2854 __qedi_remove(qedi->pdev, QEDI_MODE_RECOVERY);
2855 __qedi_probe(qedi->pdev, QEDI_MODE_RECOVERY);
2856 clear_bit(QEDI_IN_RECOVERY, &qedi->flags);
2904 qedi_dbg_init("qedi");
2909 QEDI_ERR(NULL, "Could not register qedi transport");
2921 rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "scsi/qedi:online",