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;
287 udev->qedi = qedi;
288 udev->pdev = qedi->pdev;
297 qedi->udev = udev;
309 static int qedi_init_uio(struct qedi_ctx *qedi)
311 struct qedi_uio_dev *udev = qedi->udev;
345 QEDI_ERR(&qedi->dbg_ctx,
354 static int qedi_alloc_and_init_sb(struct qedi_ctx *qedi,
361 sb_virt = dma_alloc_coherent(&qedi->pdev->dev,
365 QEDI_ERR(&qedi->dbg_ctx,
371 ret = qedi_ops->common->sb_init(qedi->cdev, sb_info, sb_virt, sb_phys,
374 QEDI_ERR(&qedi->dbg_ctx,
383 static void qedi_free_sb(struct qedi_ctx *qedi)
388 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
389 sb_info = &qedi->sb_array[id];
391 dma_free_coherent(&qedi->pdev->dev,
398 static void qedi_free_fp(struct qedi_ctx *qedi)
400 kfree(qedi->fp_array);
401 kfree(qedi->sb_array);
404 static void qedi_destroy_fp(struct qedi_ctx *qedi)
406 qedi_free_sb(qedi);
407 qedi_free_fp(qedi);
410 static int qedi_alloc_fp(struct qedi_ctx *qedi)
414 qedi->fp_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
416 if (!qedi->fp_array) {
417 QEDI_ERR(&qedi->dbg_ctx,
422 qedi->sb_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
424 if (!qedi->sb_array) {
425 QEDI_ERR(&qedi->dbg_ctx,
434 qedi_free_fp(qedi);
438 static void qedi_int_fp(struct qedi_ctx *qedi)
443 memset(qedi->fp_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
444 sizeof(*qedi->fp_array));
445 memset(qedi->sb_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
446 sizeof(*qedi->sb_array));
448 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
449 fp = &qedi->fp_array[id];
450 fp->sb_info = &qedi->sb_array[id];
452 fp->qedi = qedi;
454 "qedi", id);
462 static int qedi_prepare_fp(struct qedi_ctx *qedi)
467 ret = qedi_alloc_fp(qedi);
471 qedi_int_fp(qedi);
473 for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
474 fp = &qedi->fp_array[id];
475 ret = qedi_alloc_and_init_sb(qedi, fp->sb_info, fp->sb_id);
477 QEDI_ERR(&qedi->dbg_ctx,
487 qedi_free_sb(qedi);
488 qedi_free_fp(qedi);
493 static int qedi_setup_cid_que(struct qedi_ctx *qedi)
497 qedi->cid_que.cid_que_base = kmalloc_array(qedi->max_active_conns,
499 if (!qedi->cid_que.cid_que_base)
502 qedi->cid_que.conn_cid_tbl = kmalloc_array(qedi->max_active_conns,
505 if (!qedi->cid_que.conn_cid_tbl) {
506 kfree(qedi->cid_que.cid_que_base);
507 qedi->cid_que.cid_que_base = NULL;
511 qedi->cid_que.cid_que = (u32 *)qedi->cid_que.cid_que_base;
512 qedi->cid_que.cid_q_prod_idx = 0;
513 qedi->cid_que.cid_q_cons_idx = 0;
514 qedi->cid_que.cid_q_max_idx = qedi->max_active_conns;
515 qedi->cid_que.cid_free_cnt = qedi->max_active_conns;
517 for (i = 0; i < qedi->max_active_conns; i++) {
518 qedi->cid_que.cid_que[i] = i;
519 qedi->cid_que.conn_cid_tbl[i] = NULL;
525 static void qedi_release_cid_que(struct qedi_ctx *qedi)
527 kfree(qedi->cid_que.cid_que_base);
528 qedi->cid_que.cid_que_base = NULL;
530 kfree(qedi->cid_que.conn_cid_tbl);
531 qedi->cid_que.conn_cid_tbl = NULL;
609 static void qedi_cm_free_mem(struct qedi_ctx *qedi)
611 kfree(qedi->ep_tbl);
612 qedi->ep_tbl = NULL;
613 qedi_free_id_tbl(&qedi->lcl_port_tbl);
616 static int qedi_cm_alloc_mem(struct qedi_ctx *qedi)
620 qedi->ep_tbl = kzalloc((qedi->max_active_conns *
622 if (!qedi->ep_tbl)
625 if (qedi_init_id_tbl(&qedi->lcl_port_tbl, QEDI_LOCAL_PORT_RANGE,
627 qedi_cm_free_mem(qedi);
637 struct qedi_ctx *qedi = NULL;
652 qedi = iscsi_host_priv(shost);
653 memset(qedi, 0, sizeof(*qedi));
654 qedi->shost = shost;
655 qedi->dbg_ctx.host_no = shost->host_no;
656 qedi->pdev = pdev;
657 qedi->dbg_ctx.pdev = pdev;
658 qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA;
659 qedi->max_sqes = QEDI_SQ_SIZE;
661 shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi);
663 pci_set_drvdata(pdev, qedi);
666 return qedi;
671 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
675 if (!qedi) {
676 QEDI_ERR(NULL, "qedi is NULL\n");
680 if (!test_bit(UIO_DEV_OPENED, &qedi->flags)) {
681 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_UIO,
699 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
706 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
712 QEDI_WARN(&qedi->dbg_ctx,
727 spin_lock_bh(&qedi->ll2_lock);
728 list_add_tail(&work->list, &qedi->ll2_skb_list);
729 spin_unlock_bh(&qedi->ll2_lock);
731 wake_up_process(qedi->ll2_recv_thread);
737 static int qedi_ll2_process_skb(struct qedi_ctx *qedi, struct sk_buff *skb,
749 if (!qedi) {
750 QEDI_ERR(NULL, "qedi is NULL\n");
754 udev = qedi->udev;
776 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
780 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
792 static void qedi_ll2_free_skbs(struct qedi_ctx *qedi)
796 spin_lock_bh(&qedi->ll2_lock);
797 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list, list) {
802 spin_unlock_bh(&qedi->ll2_lock);
807 struct qedi_ctx *qedi = (struct qedi_ctx *)arg;
813 spin_lock_bh(&qedi->ll2_lock);
814 list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list,
817 qedi_ll2_process_skb(qedi, work->skb, work->vlan_id);
822 spin_unlock_bh(&qedi->ll2_lock);
830 static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
839 qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
841 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
842 "Number of CQ count is %d\n", qedi->num_queues);
844 memset(&qedi->pf_params.iscsi_pf_params, 0,
845 sizeof(qedi->pf_params.iscsi_pf_params));
847 qedi->p_cpuq = dma_alloc_coherent(&qedi->pdev->dev,
848 qedi->num_queues * sizeof(struct qedi_glbl_q_params),
849 &qedi->hw_p_cpuq, GFP_KERNEL);
850 if (!qedi->p_cpuq) {
851 QEDI_ERR(&qedi->dbg_ctx, "dma_alloc_coherent fail\n");
856 rval = qedi_alloc_global_queues(qedi);
858 QEDI_ERR(&qedi->dbg_ctx, "Global queue allocation failed.\n");
863 qedi->pf_params.iscsi_pf_params.num_cons = QEDI_MAX_ISCSI_CONNS_PER_HBA;
864 qedi->pf_params.iscsi_pf_params.num_tasks = QEDI_MAX_ISCSI_TASK;
865 qedi->pf_params.iscsi_pf_params.half_way_close_timeout = 10;
866 qedi->pf_params.iscsi_pf_params.num_sq_pages_in_ring = num_sq_pages;
867 qedi->pf_params.iscsi_pf_params.num_r2tq_pages_in_ring = num_sq_pages;
868 qedi->pf_params.iscsi_pf_params.num_uhq_pages_in_ring = num_sq_pages;
869 qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues;
870 qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug;
871 qedi->pf_params.iscsi_pf_params.two_msl_timer = 4000;
872 qedi->pf_params.iscsi_pf_params.max_fin_rt = 2;
878 qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size;
880 qedi->pf_params.iscsi_pf_params.glbl_q_params_addr =
881 (u64)qedi->hw_p_cpuq;
887 qedi->pf_params.iscsi_pf_params.rqe_log_size = 8;
889 qedi->pf_params.iscsi_pf_params.bdq_pbl_base_addr[BDQ_ID_RQ] =
890 qedi->bdq_pbl_list_dma;
891 qedi->pf_params.iscsi_pf_params.bdq_pbl_num_entries[BDQ_ID_RQ] =
892 qedi->bdq_pbl_list_num_entries;
893 qedi->pf_params.iscsi_pf_params.rq_buffer_size = QEDI_BDQ_BUF_SIZE;
896 qedi->pf_params.iscsi_pf_params.cq_num_entries = 2048;
898 qedi->pf_params.iscsi_pf_params.gl_rq_pi = QEDI_PROTO_CQ_PROD_IDX;
899 qedi->pf_params.iscsi_pf_params.gl_cmd_pi = 1;
906 static void qedi_free_iscsi_pf_param(struct qedi_ctx *qedi)
910 if (qedi->p_cpuq) {
911 size = qedi->num_queues * sizeof(struct qedi_glbl_q_params);
912 dma_free_coherent(&qedi->pdev->dev, size, qedi->p_cpuq,
913 qedi->hw_p_cpuq);
916 qedi_free_global_queues(qedi);
918 kfree(qedi->global_queues);
942 static int qedi_find_boot_info(struct qedi_ctx *qedi,
976 for (i = 0; i < qedi->max_active_conns; i++) {
977 qedi_conn = qedi_get_conn_from_id(qedi, i);
1044 struct qedi_ctx *qedi;
1051 qedi = (struct qedi_ctx *)dev;
1054 ether_addr_copy(data->mac[0], qedi->mac);
1066 struct qedi_ctx *qedi = dev;
1071 QEDI_ERR(&qedi->dbg_ctx,
1076 mutex_lock(&qedi->stats_lock);
1078 qedi_ops->get_stats(qedi->cdev, fw_iscsi_stats);
1079 mutex_unlock(&qedi->stats_lock);
1090 iscsi->frame_size = qedi->ll2_mtu;
1091 block = qedi_get_nvram_block(qedi);
1111 rval = qedi_find_boot_info(qedi, iscsi, block);
1113 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1125 struct qedi_ctx *qedi = (struct qedi_ctx *)dev;
1129 qedi->qedi_err_flags = qedi_flags_override;
1131 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1133 err_type, qedi->qedi_err_flags);
1137 schedule_delayed_work(&qedi->board_disable_work, 0);
1145 if (test_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags))
1146 qedi_ops->common->attn_clr_enable(qedi->cdev, true);
1149 test_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags))
1150 qedi_ops->common->recovery_process(qedi->cdev);
1160 struct qedi_ctx *qedi = dev;
1162 QEDI_ERR(&qedi->dbg_ctx, "Recovery handler scheduled.\n");
1164 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags))
1167 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
1169 schedule_delayed_work(&qedi->recovery_work, 0);
1178 qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn);
1183 struct qedi_ctx *qedi = (struct qedi_ctx *)dev;
1186 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "Link Up event.\n");
1187 atomic_set(&qedi->link_state, QEDI_LINK_UP);
1189 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1191 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
1192 iscsi_host_for_each_session(qedi->shost, qedi_set_conn_recovery);
1206 static int qedi_queue_cqe(struct qedi_ctx *qedi, union iscsi_cqe *cqe,
1216 q_conn = qedi->cid_que.conn_cid_tbl[iscsi_cid];
1218 QEDI_WARN(&qedi->dbg_ctx,
1227 qedi_cmd = qedi_get_cmd_from_tid(qedi, cqe->cqe_solicited.itid);
1233 qedi_cmd->cqe_work.qedi = qedi;
1248 qedi_work->qedi = qedi;
1256 QEDI_ERR(&qedi->dbg_ctx, "FW Error cqe.\n");
1263 struct qedi_ctx *qedi = fp->qedi;
1280 que = qedi->global_queues[fp->sb_id];
1281 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1285 qedi->intr_cpu = fp->sb_id;
1296 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1300 ret = qedi_queue_cqe(qedi, cqe, fp->sb_id, p);
1302 QEDI_WARN(&qedi->dbg_ctx,
1318 struct qedi_ctx *qedi = fp->qedi;
1330 que = qedi->global_queues[fp->sb_id];
1343 struct qedi_ctx *qedi = fp->qedi;
1351 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1373 struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
1375 QEDI_WARN(&qedi->dbg_ctx, "qedi=%p.\n", qedi);
1379 static void qedi_sync_free_irqs(struct qedi_ctx *qedi)
1384 if (qedi->int_info.msix_cnt) {
1385 for (i = 0; i < qedi->int_info.used_cnt; i++) {
1386 idx = i * qedi->dev_info.common.num_hwfns +
1387 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1389 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1392 synchronize_irq(qedi->int_info.msix[idx].vector);
1393 irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1395 free_irq(qedi->int_info.msix[idx].vector,
1396 &qedi->fp_array[i]);
1399 qedi_ops->common->simd_handler_clean(qedi->cdev,
1403 qedi->int_info.used_cnt = 0;
1404 qedi_ops->common->set_fp_int(qedi->cdev, 0);
1407 static int qedi_request_msix_irq(struct qedi_ctx *qedi)
1413 for (i = 0; i < qedi->msix_count; i++) {
1414 idx = i * qedi->dev_info.common.num_hwfns +
1415 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1417 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1419 qedi->dev_info.common.num_hwfns,
1420 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
1422 rc = request_irq(qedi->int_info.msix[idx].vector,
1423 qedi_msix_handler, 0, "qedi",
1424 &qedi->fp_array[i]);
1426 QEDI_WARN(&qedi->dbg_ctx, "request_irq failed.\n");
1427 qedi_sync_free_irqs(qedi);
1430 qedi->int_info.used_cnt++;
1431 rc = irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1439 static int qedi_setup_int(struct qedi_ctx *qedi)
1443 rc = qedi_ops->common->set_fp_int(qedi->cdev, qedi->num_queues);
1447 qedi->msix_count = rc;
1449 rc = qedi_ops->common->get_fp_int(qedi->cdev, &qedi->int_info);
1453 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1455 qedi->int_info.msix_cnt, num_online_cpus());
1457 if (qedi->int_info.msix_cnt) {
1458 rc = qedi_request_msix_irq(qedi);
1461 qedi_ops->common->simd_handler_config(qedi->cdev, &qedi,
1464 qedi->int_info.used_cnt = 1;
1471 static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1473 if (qedi->iscsi_image)
1474 dma_free_coherent(&qedi->pdev->dev,
1476 qedi->iscsi_image, qedi->nvm_buf_dma);
1479 static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1481 qedi->iscsi_image = dma_alloc_coherent(&qedi->pdev->dev,
1483 &qedi->nvm_buf_dma, GFP_KERNEL);
1484 if (!qedi->iscsi_image) {
1485 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
1488 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1489 "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_image,
1490 qedi->nvm_buf_dma);
1495 static void qedi_free_bdq(struct qedi_ctx *qedi)
1499 if (qedi->bdq_pbl_list)
1500 dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
1501 qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma);
1503 if (qedi->bdq_pbl)
1504 dma_free_coherent(&qedi->pdev->dev, qedi->bdq_pbl_mem_size,
1505 qedi->bdq_pbl, qedi->bdq_pbl_dma);
1508 if (qedi->bdq[i].buf_addr) {
1509 dma_free_coherent(&qedi->pdev->dev, QEDI_BDQ_BUF_SIZE,
1510 qedi->bdq[i].buf_addr,
1511 qedi->bdq[i].buf_dma);
1516 static void qedi_free_global_queues(struct qedi_ctx *qedi)
1519 struct global_queue **gl = qedi->global_queues;
1521 for (i = 0; i < qedi->num_queues; i++) {
1526 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_mem_size,
1529 dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_pbl_size,
1534 qedi_free_bdq(qedi);
1535 qedi_free_nvm_iscsi_cfg(qedi);
1538 static int qedi_alloc_bdq(struct qedi_ctx *qedi)
1547 qedi->bdq[i].buf_addr =
1548 dma_alloc_coherent(&qedi->pdev->dev,
1550 &qedi->bdq[i].buf_dma,
1552 if (!qedi->bdq[i].buf_addr) {
1553 QEDI_ERR(&qedi->dbg_ctx,
1560 qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd);
1561 qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE);
1562 qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd);
1564 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n",
1565 qedi->rq_num_entries);
1567 qedi->bdq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1568 qedi->bdq_pbl_mem_size,
1569 &qedi->bdq_pbl_dma, GFP_KERNEL);
1570 if (!qedi->bdq_pbl) {
1571 QEDI_ERR(&qedi->dbg_ctx, "Could not allocate BDQ PBL.\n");
1579 pbl = (struct scsi_bd *)qedi->bdq_pbl;
1582 cpu_to_le32(QEDI_U64_HI(qedi->bdq[i].buf_dma));
1584 cpu_to_le32(QEDI_U64_LO(qedi->bdq[i].buf_dma));
1585 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1596 qedi->bdq_pbl_list = dma_alloc_coherent(&qedi->pdev->dev,
1598 &qedi->bdq_pbl_list_dma,
1600 if (!qedi->bdq_pbl_list) {
1601 QEDI_ERR(&qedi->dbg_ctx,
1610 qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size /
1612 list = (u64 *)qedi->bdq_pbl_list;
1613 page = qedi->bdq_pbl_list_dma;
1614 for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) {
1615 *list = qedi->bdq_pbl_dma;
1623 static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
1636 if (!qedi->num_queues) {
1637 QEDI_ERR(&qedi->dbg_ctx, "No MSI-X vectors available!\n");
1644 if (!qedi->p_cpuq) {
1649 qedi->global_queues = kzalloc((sizeof(struct global_queue *) *
1650 qedi->num_queues), GFP_KERNEL);
1651 if (!qedi->global_queues) {
1652 QEDI_ERR(&qedi->dbg_ctx,
1656 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1657 "qedi->global_queues=%p.\n", qedi->global_queues);
1660 status = qedi_alloc_bdq(qedi);
1665 status = qedi_alloc_nvm_iscsi_cfg(qedi);
1672 for (i = 0; i < qedi->num_queues; i++) {
1673 qedi->global_queues[i] =
1674 kzalloc(sizeof(*qedi->global_queues[0]),
1676 if (!qedi->global_queues[i]) {
1677 QEDI_ERR(&qedi->dbg_ctx,
1683 qedi->global_queues[i]->cq_mem_size =
1685 qedi->global_queues[i]->cq_mem_size =
1686 (qedi->global_queues[i]->cq_mem_size +
1689 qedi->global_queues[i]->cq_pbl_size =
1690 (qedi->global_queues[i]->cq_mem_size /
1692 qedi->global_queues[i]->cq_pbl_size =
1693 (qedi->global_queues[i]->cq_pbl_size +
1696 qedi->global_queues[i]->cq = dma_alloc_coherent(&qedi->pdev->dev,
1697 qedi->global_queues[i]->cq_mem_size,
1698 &qedi->global_queues[i]->cq_dma,
1701 if (!qedi->global_queues[i]->cq) {
1702 QEDI_WARN(&qedi->dbg_ctx,
1707 qedi->global_queues[i]->cq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1708 qedi->global_queues[i]->cq_pbl_size,
1709 &qedi->global_queues[i]->cq_pbl_dma,
1712 if (!qedi->global_queues[i]->cq_pbl) {
1713 QEDI_WARN(&qedi->dbg_ctx,
1720 num_pages = qedi->global_queues[i]->cq_mem_size /
1722 page = qedi->global_queues[i]->cq_dma;
1723 pbl = (u32 *)qedi->global_queues[i]->cq_pbl;
1734 list = (u32 *)qedi->p_cpuq;
1742 for (i = 0; i < qedi->num_queues; i++) {
1743 *list = (u32)qedi->global_queues[i]->cq_pbl_dma;
1745 *list = (u32)((u64)qedi->global_queues[i]->cq_pbl_dma >> 32);
1757 qedi_free_global_queues(qedi);
1761 int qedi_alloc_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1778 ep->sq = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_mem_size,
1781 QEDI_WARN(&qedi->dbg_ctx,
1786 ep->sq_pbl = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_pbl_size,
1789 QEDI_WARN(&qedi->dbg_ctx,
1811 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1817 void qedi_free_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1820 dma_free_coherent(&qedi->pdev->dev, ep->sq_pbl_size, ep->sq_pbl,
1823 dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1827 int qedi_get_task_idx(struct qedi_ctx *qedi)
1832 tmp_idx = find_first_zero_bit(qedi->task_idx_map,
1836 QEDI_ERR(&qedi->dbg_ctx, "FW task context pool is full.\n");
1841 if (test_and_set_bit(tmp_idx, qedi->task_idx_map))
1848 void qedi_clear_task_idx(struct qedi_ctx *qedi, int idx)
1850 if (!test_and_clear_bit(idx, qedi->task_idx_map))
1851 QEDI_ERR(&qedi->dbg_ctx,
1855 void qedi_update_itt_map(struct qedi_ctx *qedi, u32 tid, u32 proto_itt,
1858 qedi->itt_map[tid].itt = proto_itt;
1859 qedi->itt_map[tid].p_cmd = cmd;
1861 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1863 qedi->itt_map[tid].itt);
1866 void qedi_get_task_tid(struct qedi_ctx *qedi, u32 itt, s16 *tid)
1871 if (qedi->itt_map[i].itt == itt) {
1873 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1883 void qedi_get_proto_itt(struct qedi_ctx *qedi, u32 tid, u32 *proto_itt)
1885 *proto_itt = qedi->itt_map[tid].itt;
1886 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1891 struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid)
1898 cmd = qedi->itt_map[tid].p_cmd;
1902 qedi->itt_map[tid].p_cmd = NULL;
1907 static int qedi_alloc_itt(struct qedi_ctx *qedi)
1909 qedi->itt_map = kcalloc(MAX_ISCSI_TASK_ENTRIES,
1911 if (!qedi->itt_map) {
1912 QEDI_ERR(&qedi->dbg_ctx,
1919 static void qedi_free_itt(struct qedi_ctx *qedi)
1921 kfree(qedi->itt_map);
2003 void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
2007 qedi_recover_all_conns(qedi);
2009 qedi_ops->ll2->stop(qedi->cdev);
2010 qedi_ll2_free_skbs(qedi);
2012 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "old MTU %u, new MTU %u\n",
2013 qedi->ll2_mtu, mtu);
2015 qedi->ll2_mtu = mtu;
2016 params.mtu = qedi->ll2_mtu + IPV6_HDR_LEN + TCP_HDR_LEN;
2019 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
2020 qedi_ops->ll2->start(qedi->cdev, ¶ms);
2028 qedi_get_nvram_block(struct qedi_ctx *qedi)
2035 pf = qedi->dev_info.common.abs_pf_id;
2036 block = &qedi->iscsi_image->iscsi_cfg.block[0];
2051 struct qedi_ctx *qedi = data;
2058 block = qedi_get_nvram_block(qedi);
2102 rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
2145 struct qedi_ctx *qedi = data;
2150 block = qedi_get_nvram_block(qedi);
2184 qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
2193 block = qedi_get_nvram_block(qedi);
2197 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2205 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2279 struct qedi_ctx *qedi = data;
2281 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_PRI);
2286 struct qedi_ctx *qedi = data;
2288 return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_SEC);
2317 struct qedi_ctx *qedi = data;
2319 scsi_host_put(qedi->shost);
2322 static int qedi_get_boot_info(struct qedi_ctx *qedi)
2326 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2328 ret = qedi_ops->common->nvm_get_image(qedi->cdev,
2330 (char *)qedi->iscsi_image,
2333 QEDI_ERR(&qedi->dbg_ctx,
2339 static int qedi_setup_boot_info(struct qedi_ctx *qedi)
2343 if (qedi_get_boot_info(qedi))
2346 qedi->boot_kset = iscsi_boot_create_host_kset(qedi->shost->host_no);
2347 if (!qedi->boot_kset)
2350 if (!scsi_host_get(qedi->shost))
2353 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 0, qedi,
2360 if (!scsi_host_get(qedi->shost))
2363 boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 1, qedi,
2370 if (!scsi_host_get(qedi->shost))
2373 boot_kobj = iscsi_boot_create_initiator(qedi->boot_kset, 0, qedi,
2380 if (!scsi_host_get(qedi->shost))
2383 boot_kobj = iscsi_boot_create_ethernet(qedi->boot_kset, 0, qedi,
2393 scsi_host_put(qedi->shost);
2395 iscsi_boot_destroy_kset(qedi->boot_kset);
2402 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2404 QEDI_ERR(&qedi->dbg_ctx, "%s: PCI error detected [%d]\n",
2407 if (test_and_set_bit(QEDI_IN_RECOVERY, &qedi->flags)) {
2408 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2413 qedi_ops->common->recovery_process(qedi->cdev);
2420 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2425 iscsi_host_for_each_session(qedi->shost,
2429 if (qedi->tmf_thread) {
2430 flush_workqueue(qedi->tmf_thread);
2431 destroy_workqueue(qedi->tmf_thread);
2432 qedi->tmf_thread = NULL;
2435 if (qedi->offload_thread) {
2436 flush_workqueue(qedi->offload_thread);
2437 destroy_workqueue(qedi->offload_thread);
2438 qedi->offload_thread = NULL;
2443 qedi_dbg_host_exit(&qedi->dbg_ctx);
2445 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags))
2446 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2448 qedi_sync_free_irqs(qedi);
2450 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2452 rval = qedi_ops->stop(qedi->cdev);
2458 qedi_ops->ll2->stop(qedi->cdev);
2461 cancel_delayed_work_sync(&qedi->recovery_work);
2462 cancel_delayed_work_sync(&qedi->board_disable_work);
2464 qedi_free_iscsi_pf_param(qedi);
2466 rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
2468 QEDI_ERR(&qedi->dbg_ctx, "Failed to send drv state to MFW\n");
2470 if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2471 qedi_ops->common->slowpath_stop(qedi->cdev);
2472 qedi_ops->common->remove(qedi->cdev);
2475 qedi_destroy_fp(qedi);
2478 qedi_release_cid_que(qedi);
2479 qedi_cm_free_mem(qedi);
2480 qedi_free_uio(qedi->udev);
2481 qedi_free_itt(qedi);
2483 if (qedi->ll2_recv_thread) {
2484 kthread_stop(qedi->ll2_recv_thread);
2485 qedi->ll2_recv_thread = NULL;
2487 qedi_ll2_free_skbs(qedi);
2489 if (qedi->boot_kset)
2490 iscsi_boot_destroy_kset(qedi->boot_kset);
2492 iscsi_host_remove(qedi->shost);
2493 iscsi_host_free(qedi->shost);
2499 struct qedi_ctx *qedi =
2503 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2506 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags))
2509 __qedi_remove(qedi->pdev, QEDI_MODE_SHUTDOWN);
2514 struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2516 QEDI_ERR(&qedi->dbg_ctx, "%s: Shutdown qedi\n", __func__);
2517 if (test_and_set_bit(QEDI_IN_SHUTDOWN, &qedi->flags))
2524 struct qedi_ctx *qedi;
2531 qedi = pci_get_drvdata(pdev);
2533 QEDI_ERR(&qedi->dbg_ctx, "%s: Device does not support suspend operation\n", __func__);
2540 struct qedi_ctx *qedi;
2553 qedi = qedi_host_alloc(pdev);
2554 if (!qedi) {
2559 qedi = pci_get_drvdata(pdev);
2571 qedi->cdev = qedi_ops->common->probe(pdev, &qed_params);
2572 if (!qedi->cdev) {
2574 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2581 QEDI_ERR(&qedi->dbg_ctx, "Cannot initialize hardware\n");
2585 set_bit(QEDI_ERR_ATTN_CLR_EN, &qedi->qedi_err_flags);
2586 set_bit(QEDI_ERR_IS_RECOVERABLE, &qedi->qedi_err_flags);
2587 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2589 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2593 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2595 qedi->dev_info.common.num_hwfns,
2596 qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
2598 rc = qedi_set_iscsi_pf_param(qedi);
2601 QEDI_ERR(&qedi->dbg_ctx,
2606 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2608 rc = qedi_prepare_fp(qedi);
2610 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath.\n");
2621 strlcpy(sp_params.name, "qedi iSCSI", QED_DRV_VER_STR_SIZE);
2622 rc = qedi_ops->common->slowpath_start(qedi->cdev, &sp_params);
2624 QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath\n");
2631 qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2633 rc = qedi_setup_int(qedi);
2637 qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2639 /* Learn information crucial for qedi to progress */
2640 rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2645 qedi->bdq_primary_prod = qedi->dev_info.primary_dbq_rq_addr;
2646 qedi->bdq_secondary_prod = qedi->dev_info.secondary_bdq_rq_addr;
2647 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2649 qedi->bdq_primary_prod,
2650 qedi->bdq_secondary_prod);
2657 qedi->bdq_prod_idx = QEDI_BDQ_NUM;
2658 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2660 qedi->bdq_prod_idx);
2661 writew(qedi->bdq_prod_idx, qedi->bdq_primary_prod);
2662 readw(qedi->bdq_primary_prod);
2663 writew(qedi->bdq_prod_idx, qedi->bdq_secondary_prod);
2664 readw(qedi->bdq_secondary_prod);
2666 ether_addr_copy(qedi->mac, qedi->dev_info.common.hw_mac);
2667 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, "MAC address is %pM.\n",
2668 qedi->mac);
2670 snprintf(host_buf, sizeof(host_buf), "host_%d", qedi->shost->host_no);
2671 qedi_ops->common->set_name(qedi->cdev, host_buf);
2673 qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
2677 qedi->ll2_mtu = DEF_PATH_MTU;
2680 ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
2684 INIT_LIST_HEAD(&qedi->ll2_skb_list);
2685 spin_lock_init(&qedi->ll2_lock);
2686 /* start qedi context */
2687 spin_lock_init(&qedi->hba_lock);
2688 spin_lock_init(&qedi->task_idx_lock);
2689 mutex_init(&qedi->stats_lock);
2691 qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
2692 qedi_ops->ll2->start(qedi->cdev, ¶ms);
2695 qedi->ll2_recv_thread = kthread_run(qedi_ll2_recv_thread,
2696 (void *)qedi,
2700 rc = qedi_ops->start(qedi->cdev, &qedi->tasks,
2701 qedi, qedi_iscsi_event_cb);
2704 QEDI_ERR(&qedi->dbg_ctx, "Cannot start iSCSI function\n");
2708 task_start = qedi_get_task_mem(&qedi->tasks, 0);
2709 task_end = qedi_get_task_mem(&qedi->tasks, MAX_TID_BLOCKS_ISCSI - 1);
2710 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2712 task_start, task_end, qedi->tasks.size);
2716 rc = qedi_ops->common->set_link(qedi->cdev, &link_params);
2718 QEDI_WARN(&qedi->dbg_ctx, "Link set up failed.\n");
2719 atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2723 qedi_dbg_host_init(&qedi->dbg_ctx, qedi_debugfs_ops,
2726 QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2727 "QLogic FastLinQ iSCSI Module qedi %s, FW %d.%d.%d.%d\n",
2732 if (iscsi_host_add(qedi->shost, &pdev->dev)) {
2733 QEDI_ERR(&qedi->dbg_ctx,
2740 rc = qedi_alloc_uio_rings(qedi);
2742 QEDI_ERR(&qedi->dbg_ctx,
2747 rc = qedi_init_uio(qedi);
2749 QEDI_ERR(&qedi->dbg_ctx,
2755 rc = qedi_setup_cid_que(qedi);
2757 QEDI_ERR(&qedi->dbg_ctx,
2762 rc = qedi_cm_alloc_mem(qedi);
2764 QEDI_ERR(&qedi->dbg_ctx,
2769 rc = qedi_alloc_itt(qedi);
2771 QEDI_ERR(&qedi->dbg_ctx,
2776 sprintf(host_buf, "host_%d", qedi->shost->host_no);
2777 qedi->tmf_thread = create_singlethread_workqueue(host_buf);
2778 if (!qedi->tmf_thread) {
2779 QEDI_ERR(&qedi->dbg_ctx,
2785 sprintf(host_buf, "qedi_ofld%d", qedi->shost->host_no);
2786 qedi->offload_thread = create_workqueue(host_buf);
2787 if (!qedi->offload_thread) {
2788 QEDI_ERR(&qedi->dbg_ctx,
2794 INIT_DELAYED_WORK(&qedi->recovery_work, qedi_recovery_handler);
2795 INIT_DELAYED_WORK(&qedi->board_disable_work,
2799 set_bit(QEDI_RESERVE_TASK_ID, qedi->task_idx_map);
2800 atomic_set(&qedi->num_offloads, 0);
2802 if (qedi_setup_boot_info(qedi))
2803 QEDI_ERR(&qedi->dbg_ctx,
2806 rc = qedi_ops->common->update_drv_state(qedi->cdev, true);
2808 QEDI_ERR(&qedi->dbg_ctx,
2816 destroy_workqueue(qedi->tmf_thread);
2818 qedi_release_cid_que(qedi);
2820 qedi_free_uio(qedi->udev);
2823 qedi_dbg_host_exit(&qedi->dbg_ctx);
2825 iscsi_host_remove(qedi->shost);
2827 qedi_ops->stop(qedi->cdev);
2829 qedi_ops->common->slowpath_stop(qedi->cdev);
2831 qedi_ops->common->remove(qedi->cdev);
2833 qedi_free_iscsi_pf_param(qedi);
2835 iscsi_host_free(qedi->shost);
2851 struct qedi_ctx *qedi =
2854 iscsi_host_for_each_session(qedi->shost, qedi_mark_conn_recovery);
2859 qedi_ops->common->recovery_prolog(qedi->cdev);
2861 __qedi_remove(qedi->pdev, QEDI_MODE_RECOVERY);
2862 __qedi_probe(qedi->pdev, QEDI_MODE_RECOVERY);
2863 clear_bit(QEDI_IN_RECOVERY, &qedi->flags);
2911 qedi_dbg_init("qedi");
2916 QEDI_ERR(NULL, "Could not register qedi transport");
2928 rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "scsi/qedi:online",