^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * QLogic iSCSI Offload Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2016 Cavium Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/if_vlan.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <scsi/scsi_tcq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "qedi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "qedi_iscsi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "qedi_gbl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) int qedi_recover_all_conns(struct qedi_ctx *qedi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct qedi_conn *qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) for (i = 0; i < qedi->max_active_conns; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) qedi_conn = qedi_get_conn_from_id(qedi, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) if (!qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) qedi_start_conn_recovery(qedi, qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static int qedi_eh_host_reset(struct scsi_cmnd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct Scsi_Host *shost = cmd->device->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return qedi_recover_all_conns(qedi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct scsi_host_template qedi_host_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .module = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .name = "QLogic QEDI 25/40/100Gb iSCSI Initiator Driver",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .proc_name = QEDI_MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .queuecommand = iscsi_queuecommand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .eh_timed_out = iscsi_eh_cmd_timed_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .eh_abort_handler = iscsi_eh_abort,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .eh_device_reset_handler = iscsi_eh_device_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .eh_target_reset_handler = iscsi_eh_recover_target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .eh_host_reset_handler = qedi_eh_host_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .target_alloc = iscsi_target_alloc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .change_queue_depth = scsi_change_queue_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .can_queue = QEDI_MAX_ISCSI_TASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .this_id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .sg_tablesize = QEDI_ISCSI_MAX_BDS_PER_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .max_sectors = 0xffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .dma_boundary = QEDI_HW_DMA_BOUNDARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .cmd_per_lun = 128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .shost_attrs = qedi_shost_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static void qedi_conn_free_login_resources(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (qedi_conn->gen_pdu.resp_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) qedi_conn->gen_pdu.resp_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) qedi_conn->gen_pdu.resp_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) qedi_conn->gen_pdu.resp_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (qedi_conn->gen_pdu.req_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) qedi_conn->gen_pdu.req_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) qedi_conn->gen_pdu.req_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) qedi_conn->gen_pdu.req_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (qedi_conn->gen_pdu.resp_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) dma_free_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) qedi_conn->gen_pdu.resp_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) qedi_conn->gen_pdu.resp_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) qedi_conn->gen_pdu.resp_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (qedi_conn->gen_pdu.req_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) dma_free_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) qedi_conn->gen_pdu.req_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) qedi_conn->gen_pdu.req_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) qedi_conn->gen_pdu.req_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) static int qedi_conn_alloc_login_resources(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) qedi_conn->gen_pdu.req_buf =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) dma_alloc_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) &qedi_conn->gen_pdu.req_dma_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (!qedi_conn->gen_pdu.req_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) goto login_req_buf_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) qedi_conn->gen_pdu.req_buf_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) qedi_conn->gen_pdu.req_wr_ptr = qedi_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) qedi_conn->gen_pdu.resp_buf =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) dma_alloc_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) &qedi_conn->gen_pdu.resp_dma_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (!qedi_conn->gen_pdu.resp_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) goto login_resp_buf_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) qedi_conn->gen_pdu.resp_buf_size = ISCSI_DEF_MAX_RECV_SEG_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) qedi_conn->gen_pdu.resp_wr_ptr = qedi_conn->gen_pdu.resp_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) qedi_conn->gen_pdu.req_bd_tbl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dma_alloc_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) &qedi_conn->gen_pdu.req_bd_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) if (!qedi_conn->gen_pdu.req_bd_tbl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) goto login_req_bd_tbl_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) qedi_conn->gen_pdu.resp_bd_tbl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) dma_alloc_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) &qedi_conn->gen_pdu.resp_bd_dma,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (!qedi_conn->gen_pdu.resp_bd_tbl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) goto login_resp_bd_tbl_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) "Allocation successful, cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) qedi_conn->iscsi_conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) login_resp_bd_tbl_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) qedi_conn->gen_pdu.req_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) qedi_conn->gen_pdu.req_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) qedi_conn->gen_pdu.req_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) login_req_bd_tbl_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) dma_free_coherent(&qedi->pdev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) qedi_conn->gen_pdu.resp_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) qedi_conn->gen_pdu.resp_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) qedi_conn->gen_pdu.resp_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) login_resp_buf_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) dma_free_coherent(&qedi->pdev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) qedi_conn->gen_pdu.req_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) qedi_conn->gen_pdu.req_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) qedi_conn->gen_pdu.req_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) login_req_buf_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) iscsi_conn_printk(KERN_ERR, qedi_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) "login resource alloc failed!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) static void qedi_destroy_cmd_pool(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) struct iscsi_session *session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) for (i = 0; i < session->cmds_max; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct iscsi_task *task = session->cmds[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) struct qedi_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (cmd->io_tbl.sge_tbl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) dma_free_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) QEDI_ISCSI_MAX_BDS_PER_CMD *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) sizeof(struct scsi_sge),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) cmd->io_tbl.sge_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) cmd->io_tbl.sge_tbl_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (cmd->sense_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) dma_free_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) SCSI_SENSE_BUFFERSIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) cmd->sense_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) cmd->sense_buffer_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) static int qedi_alloc_sget(struct qedi_ctx *qedi, struct iscsi_session *session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct qedi_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) struct qedi_io_bdt *io = &cmd->io_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) struct scsi_sge *sge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) io->sge_tbl = dma_alloc_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) QEDI_ISCSI_MAX_BDS_PER_CMD *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) sizeof(*sge),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) &io->sge_tbl_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (!io->sge_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) iscsi_session_printk(KERN_ERR, session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) "Could not allocate BD table.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) io->sge_valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static int qedi_setup_cmd_pool(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) struct iscsi_session *session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) for (i = 0; i < session->cmds_max; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct iscsi_task *task = session->cmds[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct qedi_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) task->hdr = &cmd->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) task->hdr_max = sizeof(struct iscsi_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (qedi_alloc_sget(qedi, session, cmd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) goto free_sgets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) cmd->sense_buffer = dma_alloc_coherent(&qedi->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) SCSI_SENSE_BUFFERSIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) &cmd->sense_buffer_dma,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!cmd->sense_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) goto free_sgets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) free_sgets:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) qedi_destroy_cmd_pool(qedi, session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static struct iscsi_cls_session *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) qedi_session_create(struct iscsi_endpoint *ep, u16 cmds_max,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) u16 qdepth, uint32_t initial_cmdsn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) struct iscsi_cls_session *cls_session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) shost = qedi_ep->qedi->shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (cmds_max > qedi->max_sqes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) cmds_max = qedi->max_sqes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) else if (cmds_max < QEDI_SQ_WQES_MIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) cmds_max = QEDI_SQ_WQES_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) cls_session = iscsi_session_setup(&qedi_iscsi_transport, shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) cmds_max, 0, sizeof(struct qedi_cmd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) initial_cmdsn, ISCSI_MAX_TARGET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (!cls_session) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) "Failed to setup session for ep=%p\n", qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (qedi_setup_cmd_pool(qedi, cls_session->dd_data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) "Failed to setup cmd pool for ep=%p\n", qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) goto session_teardown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return cls_session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) session_teardown:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) iscsi_session_teardown(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) static void qedi_session_destroy(struct iscsi_cls_session *cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct iscsi_session *session = cls_session->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct qedi_ctx *qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) qedi_destroy_cmd_pool(qedi, session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) iscsi_session_teardown(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static struct iscsi_cls_conn *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) qedi_conn_create(struct iscsi_cls_session *cls_session, uint32_t cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct qedi_ctx *qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) struct iscsi_cls_conn *cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) struct qedi_conn *qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct iscsi_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) cls_conn = iscsi_conn_setup(cls_session, sizeof(*qedi_conn),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (!cls_conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) "conn_new: iscsi conn setup failed, cid=0x%x, cls_sess=%p!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) cid, cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) qedi_conn->cls_conn = cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) qedi_conn->qedi = qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) qedi_conn->ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) qedi_conn->active_cmd_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) INIT_LIST_HEAD(&qedi_conn->active_cmd_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) spin_lock_init(&qedi_conn->list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (qedi_conn_alloc_login_resources(qedi, qedi_conn)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) iscsi_conn_printk(KERN_ALERT, conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) "conn_new: login resc alloc failed, cid=0x%x, cls_sess=%p!!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) cid, cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) goto free_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) free_conn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) iscsi_conn_teardown(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) void qedi_mark_device_missing(struct iscsi_cls_session *cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) struct iscsi_session *session = cls_session->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct qedi_conn *qedi_conn = session->leadconn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) spin_lock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) set_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) spin_unlock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) void qedi_mark_device_available(struct iscsi_cls_session *cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) struct iscsi_session *session = cls_session->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) struct qedi_conn *qedi_conn = session->leadconn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) spin_lock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) clear_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) spin_unlock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static int qedi_bind_conn_to_iscsi_cid(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) u32 iscsi_cid = qedi_conn->iscsi_conn_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (qedi->cid_que.conn_cid_tbl[iscsi_cid]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) iscsi_conn_printk(KERN_ALERT, qedi_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) "conn bind - entry #%d not free\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) qedi->cid_que.conn_cid_tbl[iscsi_cid] = qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct qedi_conn *qedi_get_conn_from_id(struct qedi_ctx *qedi, u32 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) if (!qedi->cid_que.conn_cid_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) QEDI_ERR(&qedi->dbg_ctx, "missing conn<->cid table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) } else if (iscsi_cid >= qedi->max_active_conns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) QEDI_ERR(&qedi->dbg_ctx, "wrong cid #%d\n", iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return qedi->cid_que.conn_cid_tbl[iscsi_cid];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) static int qedi_conn_bind(struct iscsi_cls_session *cls_session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) struct iscsi_cls_conn *cls_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) u64 transport_fd, int is_leading)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct qedi_ctx *qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) struct iscsi_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) ep = iscsi_lookup_endpoint(transport_fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if ((qedi_ep->state == EP_STATE_TCP_FIN_RCVD) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) (qedi_ep->state == EP_STATE_TCP_RST_RCVD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (iscsi_conn_bind(cls_session, cls_conn, is_leading))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) qedi_ep->conn = qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) qedi_conn->ep = qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) qedi_conn->iscsi_ep = ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) qedi_conn->iscsi_conn_id = qedi_ep->iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) qedi_conn->fw_cid = qedi_ep->fw_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) qedi_conn->cmd_cleanup_req = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) qedi_conn->cmd_cleanup_cmpl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (qedi_bind_conn_to_iscsi_cid(qedi, qedi_conn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) spin_lock_init(&qedi_conn->tmf_work_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) INIT_LIST_HEAD(&qedi_conn->tmf_work_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) init_waitqueue_head(&qedi_conn->wait_queue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) static int qedi_iscsi_update_conn(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) struct qed_iscsi_params_update *conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) struct iscsi_cls_conn *cls_conn = qedi_conn->cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) int rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) qedi_ep = qedi_conn->ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) conn_info = kzalloc(sizeof(*conn_info), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if (!conn_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) QEDI_ERR(&qedi->dbg_ctx, "memory alloc failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) conn_info->update_flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) if (conn->hdrdgst_en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) SET_FIELD(conn_info->update_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) ISCSI_CONN_UPDATE_RAMROD_PARAMS_HD_EN, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (conn->datadgst_en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) SET_FIELD(conn_info->update_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) ISCSI_CONN_UPDATE_RAMROD_PARAMS_DD_EN, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) if (conn->session->initial_r2t_en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) SET_FIELD(conn_info->update_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) ISCSI_CONN_UPDATE_RAMROD_PARAMS_INITIAL_R2T,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (conn->session->imm_data_en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) SET_FIELD(conn_info->update_flag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) ISCSI_CONN_UPDATE_RAMROD_PARAMS_IMMEDIATE_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) conn_info->max_seq_size = conn->session->max_burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) conn_info->max_recv_pdu_length = conn->max_recv_dlength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) conn_info->max_send_pdu_length = conn->max_xmit_dlength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) conn_info->first_seq_length = conn->session->first_burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) conn_info->exp_stat_sn = conn->exp_statsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) rval = qedi_ops->update_conn(qedi->cdev, qedi_ep->handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) conn_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) if (rval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) rval = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) QEDI_ERR(&qedi->dbg_ctx, "Could not update connection\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) kfree(conn_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) static u16 qedi_calc_mss(u16 pmtu, u8 is_ipv6, u8 tcp_ts_en, u8 vlan_en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) u16 mss = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) u16 hdrs = TCP_HDR_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (is_ipv6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) hdrs += IPV6_HDR_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) hdrs += IPV4_HDR_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) mss = pmtu - hdrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (!mss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) mss = DEF_MSS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) return mss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) static int qedi_iscsi_offload_conn(struct qedi_endpoint *qedi_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) struct qedi_ctx *qedi = qedi_ep->qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct qed_iscsi_params_offload *conn_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) int rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) conn_info = kzalloc(sizeof(*conn_info), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) if (!conn_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) "Failed to allocate memory ep=%p\n", qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) ether_addr_copy(conn_info->src.mac, qedi_ep->src_mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) ether_addr_copy(conn_info->dst.mac, qedi_ep->dst_mac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) conn_info->src.ip[0] = ntohl(qedi_ep->src_addr[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) conn_info->dst.ip[0] = ntohl(qedi_ep->dst_addr[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (qedi_ep->ip_type == TCP_IPV4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) conn_info->ip_version = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) "After ntohl: src_addr=%pI4, dst_addr=%pI4\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) qedi_ep->src_addr, qedi_ep->dst_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) for (i = 1; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) conn_info->src.ip[i] = ntohl(qedi_ep->src_addr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) conn_info->dst.ip[i] = ntohl(qedi_ep->dst_addr[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) conn_info->ip_version = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) "After ntohl: src_addr=%pI6, dst_addr=%pI6\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) qedi_ep->src_addr, qedi_ep->dst_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) conn_info->src.port = qedi_ep->src_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) conn_info->dst.port = qedi_ep->dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) conn_info->layer_code = ISCSI_SLOW_PATH_LAYER_CODE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) conn_info->sq_pbl_addr = qedi_ep->sq_pbl_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) conn_info->vlan_id = qedi_ep->vlan_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_TS_EN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_DA_EN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_DA_CNT_EN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_KA_EN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) conn_info->default_cq = (qedi_ep->fw_cid % qedi->num_queues);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) conn_info->ka_max_probe_cnt = DEF_KA_MAX_PROBE_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) conn_info->dup_ack_theshold = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) conn_info->rcv_wnd = 65535;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) conn_info->ss_thresh = 65535;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) conn_info->srtt = 300;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) conn_info->rtt_var = 150;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) conn_info->flow_label = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) conn_info->ka_timeout = DEF_KA_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) conn_info->ka_interval = DEF_KA_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) conn_info->max_rt_time = DEF_MAX_RT_TIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) conn_info->ttl = DEF_TTL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) conn_info->tos_or_tc = DEF_TOS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) conn_info->remote_port = qedi_ep->dst_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) conn_info->local_port = qedi_ep->src_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) conn_info->mss = qedi_calc_mss(qedi_ep->pmtu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) (qedi_ep->ip_type == TCP_IPV6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 1, (qedi_ep->vlan_id != 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) conn_info->cwnd = DEF_MAX_CWND * conn_info->mss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) conn_info->rcv_wnd_scale = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) conn_info->da_timeout_value = 200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) conn_info->ack_frequency = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) "Default cq index [%d], mss [%d]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) conn_info->default_cq, conn_info->mss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) rval = qedi_ops->offload_conn(qedi->cdev, qedi_ep->handle, conn_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) if (rval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) QEDI_ERR(&qedi->dbg_ctx, "offload_conn returned %d, ep=%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) rval, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) kfree(conn_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) static int qedi_conn_start(struct iscsi_cls_conn *cls_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) int rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) qedi = qedi_conn->qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) rval = qedi_iscsi_update_conn(qedi, qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) if (rval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) iscsi_conn_printk(KERN_ALERT, conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) "conn_start: FW offload conn failed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) rval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) goto start_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) qedi_conn->abrt_conn = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) rval = iscsi_conn_start(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (rval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) iscsi_conn_printk(KERN_ALERT, conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) "iscsi_conn_start: FW offload conn failed!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) start_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) return rval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) static void qedi_conn_destroy(struct iscsi_cls_conn *cls_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) shost = iscsi_session_to_shost(iscsi_conn_to_session(cls_conn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) qedi_conn_free_login_resources(qedi, qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) iscsi_conn_teardown(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) static int qedi_ep_get_param(struct iscsi_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) enum iscsi_param param, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) struct qedi_endpoint *qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (!qedi_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) case ISCSI_PARAM_CONN_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) len = sprintf(buf, "%hu\n", qedi_ep->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) case ISCSI_PARAM_CONN_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) if (qedi_ep->ip_type == TCP_IPV4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) len = sprintf(buf, "%pI4\n", qedi_ep->dst_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) len = sprintf(buf, "%pI6\n", qedi_ep->dst_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) static int qedi_host_get_param(struct Scsi_Host *shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) enum iscsi_host_param param, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) case ISCSI_HOST_PARAM_HWADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) len = sysfs_format_mac(buf, qedi->mac, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) case ISCSI_HOST_PARAM_NETDEV_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) len = sprintf(buf, "host%d\n", shost->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) case ISCSI_HOST_PARAM_IPADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) if (qedi->ip_type == TCP_IPV4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) len = sprintf(buf, "%pI4\n", qedi->src_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) len = sprintf(buf, "%pI6\n", qedi->src_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) return iscsi_host_get_param(shost, param, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) static void qedi_conn_get_stats(struct iscsi_cls_conn *cls_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct iscsi_stats *stats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct qed_iscsi_stats iscsi_stats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) shost = iscsi_session_to_shost(iscsi_conn_to_session(cls_conn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) qedi_ops->get_stats(qedi->cdev, &iscsi_stats);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) conn->txdata_octets = iscsi_stats.iscsi_tx_bytes_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) conn->rxdata_octets = iscsi_stats.iscsi_rx_bytes_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) conn->dataout_pdus_cnt = (uint32_t)iscsi_stats.iscsi_tx_data_pdu_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) conn->datain_pdus_cnt = (uint32_t)iscsi_stats.iscsi_rx_data_pdu_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) conn->r2t_pdus_cnt = (uint32_t)iscsi_stats.iscsi_rx_r2t_pdu_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) stats->txdata_octets = conn->txdata_octets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) stats->rxdata_octets = conn->rxdata_octets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) stats->scsicmd_pdus = conn->scsicmd_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) stats->dataout_pdus = conn->dataout_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) stats->scsirsp_pdus = conn->scsirsp_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) stats->datain_pdus = conn->datain_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) stats->r2t_pdus = conn->r2t_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) stats->digest_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) stats->timeout_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) strcpy(stats->custom[0].desc, "eh_abort_cnt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) stats->custom[0].value = conn->eh_abort_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) stats->custom_length = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) static void qedi_iscsi_prep_generic_pdu_bd(struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) struct scsi_sge *bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) bd_tbl = (struct scsi_sge *)qedi_conn->gen_pdu.req_bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) bd_tbl->sge_addr.hi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) (u32)((u64)qedi_conn->gen_pdu.req_dma_addr >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) bd_tbl->sge_addr.lo = (u32)qedi_conn->gen_pdu.req_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) bd_tbl->sge_len = qedi_conn->gen_pdu.req_wr_ptr -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) qedi_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) bd_tbl = (struct scsi_sge *)qedi_conn->gen_pdu.resp_bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) bd_tbl->sge_addr.hi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) (u32)((u64)qedi_conn->gen_pdu.resp_dma_addr >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) bd_tbl->sge_addr.lo = (u32)qedi_conn->gen_pdu.resp_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) bd_tbl->sge_len = ISCSI_DEF_MAX_RECV_SEG_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static int qedi_iscsi_send_generic_request(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) struct qedi_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct qedi_conn *qedi_conn = cmd->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) int data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) qedi_iscsi_prep_generic_pdu_bd(qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) switch (task->hdr->opcode & ISCSI_OPCODE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) case ISCSI_OP_LOGIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) qedi_send_iscsi_login(qedi_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) case ISCSI_OP_NOOP_OUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) data_len = qedi_conn->gen_pdu.req_buf_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) buf = qedi_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) if (data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) rc = qedi_send_iscsi_nopout(qedi_conn, task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) buf, data_len, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) rc = qedi_send_iscsi_nopout(qedi_conn, task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) NULL, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) case ISCSI_OP_LOGOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) rc = qedi_send_iscsi_logout(qedi_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) case ISCSI_OP_SCSI_TMFUNC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) rc = qedi_iscsi_abort_work(qedi_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) case ISCSI_OP_TEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) rc = qedi_send_iscsi_text(qedi_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) iscsi_conn_printk(KERN_ALERT, qedi_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) "unsupported op 0x%x\n", task->hdr->opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) static int qedi_mtask_xmit(struct iscsi_conn *conn, struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct qedi_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) memset(qedi_conn->gen_pdu.req_buf, 0, ISCSI_DEF_MAX_RECV_SEG_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) qedi_conn->gen_pdu.req_buf_size = task->data_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) if (task->data_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) memcpy(qedi_conn->gen_pdu.req_buf, task->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) task->data_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) qedi_conn->gen_pdu.req_wr_ptr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) qedi_conn->gen_pdu.req_buf + task->data_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) cmd->conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) return qedi_iscsi_send_generic_request(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) static int qedi_task_xmit(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) struct iscsi_conn *conn = task->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) struct qedi_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) struct scsi_cmnd *sc = task->sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) /* Clear now so in cleanup_task we know it didn't make it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) cmd->scsi_cmd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) cmd->task_id = U16_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (test_bit(QEDI_IN_SHUTDOWN, &qedi_conn->qedi->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (test_bit(QEDI_BLOCK_IO, &qedi_conn->qedi->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) cmd->state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) cmd->task = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) cmd->use_slowpath = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) cmd->conn = qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) cmd->task = task;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) cmd->io_cmd_in_list = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) INIT_LIST_HEAD(&cmd->io_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) if (!sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) return qedi_mtask_xmit(conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) cmd->scsi_cmd = sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) return qedi_iscsi_send_ioreq(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) static struct iscsi_endpoint *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) qedi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) int non_blocking)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) struct iscsi_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) struct sockaddr_in *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) struct sockaddr_in6 *addr6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) struct iscsi_path path_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) u32 msg_type = ISCSI_KEVENT_IF_DOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) u32 iscsi_cid = QEDI_CID_RESERVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) u16 len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) char *buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) int ret, tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) if (!shost) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) QEDI_ERR(NULL, "shost is NULL\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) if (qedi_do_not_recover) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (test_bit(QEDI_IN_OFFLINE, &qedi->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) test_bit(QEDI_IN_RECOVERY, &qedi->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) if (atomic_read(&qedi->link_state) != QEDI_LINK_UP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) QEDI_WARN(&qedi->dbg_ctx, "qedi link down\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return ERR_PTR(-ENXIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) ep = iscsi_create_endpoint(sizeof(struct qedi_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (!ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) QEDI_ERR(&qedi->dbg_ctx, "endpoint create fail\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) memset(qedi_ep, 0, sizeof(struct qedi_endpoint));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) qedi_ep->state = EP_STATE_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) qedi_ep->iscsi_cid = (u32)-1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) qedi_ep->qedi = qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (dst_addr->sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) addr = (struct sockaddr_in *)dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) memcpy(qedi_ep->dst_addr, &addr->sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) sizeof(struct in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) qedi_ep->dst_port = ntohs(addr->sin_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) qedi_ep->ip_type = TCP_IPV4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) "dst_addr=%pI4, dst_port=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) qedi_ep->dst_addr, qedi_ep->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) } else if (dst_addr->sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) addr6 = (struct sockaddr_in6 *)dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) memcpy(qedi_ep->dst_addr, &addr6->sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) sizeof(struct in6_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) qedi_ep->dst_port = ntohs(addr6->sin6_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) qedi_ep->ip_type = TCP_IPV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) "dst_addr=%pI6, dst_port=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) qedi_ep->dst_addr, qedi_ep->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) QEDI_ERR(&qedi->dbg_ctx, "Invalid endpoint\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) ret = qedi_alloc_sq(qedi, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) goto ep_conn_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) ret = qedi_ops->acquire_conn(qedi->cdev, &qedi_ep->handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) &qedi_ep->fw_cid, &qedi_ep->p_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) QEDI_ERR(&qedi->dbg_ctx, "Could not acquire connection\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) goto ep_free_sq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) iscsi_cid = qedi_ep->handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) qedi_ep->iscsi_cid = iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) init_waitqueue_head(&qedi_ep->ofld_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) init_waitqueue_head(&qedi_ep->tcp_ofld_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) qedi_ep->state = EP_STATE_OFLDCONN_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) qedi->ep_tbl[iscsi_cid] = qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) buf = (char *)&path_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) len = sizeof(path_req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) memset(&path_req, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) msg_type = ISCSI_KEVENT_PATH_REQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) path_req.handle = (u64)qedi_ep->iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) path_req.pmtu = qedi->ll2_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) qedi_ep->pmtu = qedi->ll2_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) if (qedi_ep->ip_type == TCP_IPV4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) memcpy(&path_req.dst.v4_addr, &qedi_ep->dst_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) sizeof(struct in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) path_req.ip_addr_len = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) memcpy(&path_req.dst.v6_addr, &qedi_ep->dst_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) sizeof(struct in6_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) path_req.ip_addr_len = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) ret = iscsi_offload_mesg(shost, &qedi_iscsi_transport, msg_type, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) "iscsi_offload_mesg() failed for cid=0x%x ret=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) iscsi_cid, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) goto ep_rel_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) atomic_inc(&qedi->num_offloads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) ep_rel_conn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) qedi->ep_tbl[iscsi_cid] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) tmp = qedi_ops->release_conn(qedi->cdev, qedi_ep->handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) if (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) QEDI_WARN(&qedi->dbg_ctx, "release_conn returned %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) ep_free_sq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) qedi_free_sq(qedi, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) ep_conn_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) iscsi_destroy_endpoint(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) return ERR_PTR(ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) static int qedi_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) if (qedi_do_not_recover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) if (qedi_ep->state == EP_STATE_IDLE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) qedi_ep->state == EP_STATE_OFLDCONN_NONE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) qedi_ep->state == EP_STATE_OFLDCONN_FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) if (qedi_ep->state == EP_STATE_OFLDCONN_COMPL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) ret = wait_event_interruptible_timeout(qedi_ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) QEDI_OFLD_WAIT_STATE(qedi_ep),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) msecs_to_jiffies(timeout_ms));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (qedi_ep->state == EP_STATE_OFLDCONN_FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (ret > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) else if (!ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) static void qedi_cleanup_active_cmd_list(struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) struct qedi_cmd *cmd, *cmd_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) spin_lock(&qedi_conn->list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) list_for_each_entry_safe(cmd, cmd_tmp, &qedi_conn->active_cmd_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) io_cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) list_del_init(&cmd->io_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) qedi_conn->active_cmd_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) spin_unlock(&qedi_conn->list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) struct qedi_conn *qedi_conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) struct iscsi_conn *conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) int wait_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int abrt_conn = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) int count = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) wait_delay = 60 * HZ + DEF_MAX_RT_TIME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) qedi_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) qedi = qedi_ep->qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) if (qedi_ep->state == EP_STATE_OFLDCONN_START)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) goto ep_exit_recover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (qedi_ep->state != EP_STATE_OFLDCONN_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) flush_work(&qedi_ep->offload_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) if (qedi_ep->conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) qedi_conn = qedi_ep->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) conn = qedi_conn->cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) iscsi_suspend_queue(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) abrt_conn = qedi_conn->abrt_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (!test_bit(QEDI_CONN_FW_CLEANUP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) &qedi_conn->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) msleep(1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (test_bit(QEDI_IN_RECOVERY, &qedi->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) if (qedi_do_not_recover) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) "Do not recover cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) qedi_ep->iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) goto ep_exit_recover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) "Reset recovery cid=0x%x, qedi_ep=%p, state=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) qedi_ep->iscsi_cid, qedi_ep, qedi_ep->state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) qedi_cleanup_active_cmd_list(qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) goto ep_release_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) if (qedi_do_not_recover)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) goto ep_exit_recover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) switch (qedi_ep->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) case EP_STATE_OFLDCONN_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) case EP_STATE_OFLDCONN_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) goto ep_release_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) case EP_STATE_OFLDCONN_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) case EP_STATE_OFLDCONN_COMPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) if (unlikely(!qedi_conn))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) "Active cmd count=%d, abrt_conn=%d, ep state=0x%x, cid=0x%x, qedi_conn=%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) qedi_conn->active_cmd_count, abrt_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) qedi_ep->state,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) qedi_ep->iscsi_cid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) qedi_ep->conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (!qedi_conn->active_cmd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) abrt_conn = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) abrt_conn = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) if (abrt_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) qedi_clearsq(qedi, qedi_conn, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) if (!abrt_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) wait_delay += qedi->pf_params.iscsi_pf_params.two_msl_timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) qedi_ep->state = EP_STATE_DISCONN_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) if (test_bit(QEDI_IN_SHUTDOWN, &qedi->flags) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) test_bit(QEDI_IN_RECOVERY, &qedi->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) goto ep_release_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) ret = qedi_ops->destroy_conn(qedi->cdev, qedi_ep->handle, abrt_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) QEDI_WARN(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) "destroy_conn failed returned %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) ret = wait_event_interruptible_timeout(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) qedi_ep->tcp_ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) (qedi_ep->state !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) EP_STATE_DISCONN_START),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) wait_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if ((ret <= 0) || (qedi_ep->state == EP_STATE_DISCONN_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) QEDI_WARN(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) "Destroy conn timedout or interrupted, ret=%d, delay=%d, cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) ret, wait_delay, qedi_ep->iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) ep_release_conn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) ret = qedi_ops->release_conn(qedi->cdev, qedi_ep->handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) QEDI_WARN(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) "release_conn returned %d, cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) ret, qedi_ep->iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) ep_exit_recover:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) qedi_ep->state = EP_STATE_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) qedi->ep_tbl[qedi_ep->iscsi_cid] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) qedi->cid_que.conn_cid_tbl[qedi_ep->iscsi_cid] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) qedi_free_id(&qedi->lcl_port_tbl, qedi_ep->src_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) qedi_free_sq(qedi, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) if (qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) qedi_conn->ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) qedi_ep->conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) qedi_ep->qedi = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) atomic_dec(&qedi->num_offloads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) iscsi_destroy_endpoint(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) static int qedi_data_avail(struct qedi_ctx *qedi, u16 vlanid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) struct qed_dev *cdev = qedi->cdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct qedi_uio_dev *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) struct qedi_uio_ctrl *uctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) u32 len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) udev = qedi->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) if (!udev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) QEDI_ERR(&qedi->dbg_ctx, "udev is NULL.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) uctrl = (struct qedi_uio_ctrl *)udev->uctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) if (!uctrl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) QEDI_ERR(&qedi->dbg_ctx, "uctlr is NULL.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) len = uctrl->host_tx_pkt_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (!len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) QEDI_ERR(&qedi->dbg_ctx, "Invalid len %u\n", len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) skb = alloc_skb(len, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) QEDI_ERR(&qedi->dbg_ctx, "alloc_skb failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) skb_put(skb, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) memcpy(skb->data, udev->tx_pkt, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) skb->ip_summed = CHECKSUM_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) if (vlanid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlanid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) rc = qedi_ops->ll2->start_xmit(cdev, skb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) QEDI_ERR(&qedi->dbg_ctx, "ll2 start_xmit returned %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) uctrl->host_tx_pkt_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) uctrl->hw_tx_cons++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) static void qedi_offload_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) struct qedi_endpoint *qedi_ep =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) container_of(work, struct qedi_endpoint, offload_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) int wait_delay = 5 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) qedi = qedi_ep->qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) ret = qedi_iscsi_offload_conn(qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) "offload error: iscsi_cid=%u, qedi_ep=%p, ret=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) qedi_ep->iscsi_cid, qedi_ep, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) qedi_ep->state = EP_STATE_OFLDCONN_FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) ret = wait_event_interruptible_timeout(qedi_ep->tcp_ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) (qedi_ep->state ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) EP_STATE_OFLDCONN_COMPL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) wait_delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) if ((ret <= 0) || (qedi_ep->state != EP_STATE_OFLDCONN_COMPL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) qedi_ep->state = EP_STATE_OFLDCONN_FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) "Offload conn TIMEOUT iscsi_cid=%u, qedi_ep=%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) qedi_ep->iscsi_cid, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) static int qedi_set_path(struct Scsi_Host *shost, struct iscsi_path *path_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) struct qedi_endpoint *qedi_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) u32 iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) u16 port_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (!shost) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) QEDI_ERR(NULL, "shost is NULL\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) if (strcmp(shost->hostt->proc_name, "qedi")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) QEDI_ERR(NULL, "shost %s is invalid\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) shost->hostt->proc_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) qedi = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) if (path_data->handle == QEDI_PATH_HANDLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) ret = qedi_data_avail(qedi, path_data->vlan_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) iscsi_cid = (u32)path_data->handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (iscsi_cid >= qedi->max_active_conns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) qedi_ep = qedi->ep_tbl[iscsi_cid];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) "iscsi_cid=0x%x, qedi_ep=%p\n", iscsi_cid, qedi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) if (!qedi_ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) if (!is_valid_ether_addr(&path_data->mac_addr[0])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) QEDI_NOTICE(&qedi->dbg_ctx, "dst mac NOT VALID\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) qedi_ep->state = EP_STATE_OFLDCONN_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) ether_addr_copy(&qedi_ep->src_mac[0], &qedi->mac[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) ether_addr_copy(&qedi_ep->dst_mac[0], &path_data->mac_addr[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) qedi_ep->vlan_id = path_data->vlan_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) if (path_data->pmtu < DEF_PATH_MTU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) qedi_ep->pmtu = qedi->ll2_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) "MTU cannot be %u, using default MTU %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) path_data->pmtu, qedi_ep->pmtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) if (path_data->pmtu != qedi->ll2_mtu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) if (path_data->pmtu > JUMBO_MTU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) QEDI_ERR(NULL, "Invalid MTU %u\n", path_data->pmtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) qedi_reset_host_mtu(qedi, path_data->pmtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) qedi_ep->pmtu = qedi->ll2_mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) port_id = qedi_ep->src_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (port_id >= QEDI_LOCAL_PORT_MIN &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) port_id < QEDI_LOCAL_PORT_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) if (qedi_alloc_id(&qedi->lcl_port_tbl, port_id))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) port_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) port_id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) if (!port_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) port_id = qedi_alloc_new_id(&qedi->lcl_port_tbl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (port_id == QEDI_LOCAL_PORT_INVALID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) "Failed to allocate port id for iscsi_cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) goto set_path_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) qedi_ep->src_port = port_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) if (qedi_ep->ip_type == TCP_IPV4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) memcpy(&qedi_ep->src_addr[0], &path_data->src.v4_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) sizeof(struct in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) memcpy(&qedi->src_ip[0], &path_data->src.v4_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) sizeof(struct in_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) qedi->ip_type = TCP_IPV4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) "src addr:port=%pI4:%u, dst addr:port=%pI4:%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) qedi_ep->src_addr, qedi_ep->src_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) qedi_ep->dst_addr, qedi_ep->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) memcpy(&qedi_ep->src_addr[0], &path_data->src.v6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) sizeof(struct in6_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) memcpy(&qedi->src_ip[0], &path_data->src.v6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) sizeof(struct in6_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) qedi->ip_type = TCP_IPV6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) "src addr:port=%pI6:%u, dst addr:port=%pI6:%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) qedi_ep->src_addr, qedi_ep->src_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) qedi_ep->dst_addr, qedi_ep->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) INIT_WORK(&qedi_ep->offload_work, qedi_offload_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) queue_work(qedi->offload_thread, &qedi_ep->offload_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) set_path_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) static umode_t qedi_attr_is_visible(int param_type, int param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) switch (param_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) case ISCSI_HOST_PARAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) case ISCSI_HOST_PARAM_NETDEV_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) case ISCSI_HOST_PARAM_HWADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) case ISCSI_HOST_PARAM_IPADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) return 0444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) case ISCSI_PARAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) case ISCSI_PARAM_MAX_RECV_DLENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) case ISCSI_PARAM_MAX_XMIT_DLENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) case ISCSI_PARAM_HDRDGST_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) case ISCSI_PARAM_DATADGST_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) case ISCSI_PARAM_CONN_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) case ISCSI_PARAM_CONN_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) case ISCSI_PARAM_EXP_STATSN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) case ISCSI_PARAM_PERSISTENT_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) case ISCSI_PARAM_PERSISTENT_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) case ISCSI_PARAM_PING_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) case ISCSI_PARAM_RECV_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) case ISCSI_PARAM_INITIAL_R2T_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) case ISCSI_PARAM_MAX_R2T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) case ISCSI_PARAM_IMM_DATA_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) case ISCSI_PARAM_FIRST_BURST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) case ISCSI_PARAM_MAX_BURST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) case ISCSI_PARAM_PDU_INORDER_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) case ISCSI_PARAM_DATASEQ_INORDER_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) case ISCSI_PARAM_ERL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) case ISCSI_PARAM_TARGET_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) case ISCSI_PARAM_TPGT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) case ISCSI_PARAM_USERNAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) case ISCSI_PARAM_PASSWORD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) case ISCSI_PARAM_USERNAME_IN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) case ISCSI_PARAM_PASSWORD_IN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) case ISCSI_PARAM_FAST_ABORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) case ISCSI_PARAM_ABORT_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) case ISCSI_PARAM_LU_RESET_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) case ISCSI_PARAM_TGT_RESET_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) case ISCSI_PARAM_IFACE_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) case ISCSI_PARAM_INITIATOR_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) case ISCSI_PARAM_BOOT_ROOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) case ISCSI_PARAM_BOOT_NIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) case ISCSI_PARAM_BOOT_TARGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) return 0444;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) static void qedi_cleanup_task(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) struct qedi_cmd *cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (task->state == ISCSI_TASK_PENDING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) QEDI_INFO(NULL, QEDI_LOG_IO, "Returning ref_cnt=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) refcount_read(&task->refcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) if (task->sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) qedi_iscsi_unmap_sg_list(task->dd_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) if (cmd->task_id != U16_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) qedi_clear_task_idx(iscsi_host_priv(task->conn->session->host),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) cmd->task_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) cmd->task_id = U16_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) cmd->scsi_cmd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) struct iscsi_transport qedi_iscsi_transport = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) .name = QEDI_MODULE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) .caps = CAP_RECOVERY_L0 | CAP_HDRDGST | CAP_MULTI_R2T | CAP_DATADGST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) CAP_DATA_PATH_OFFLOAD | CAP_TEXT_NEGO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) .create_session = qedi_session_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) .destroy_session = qedi_session_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) .create_conn = qedi_conn_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) .bind_conn = qedi_conn_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) .start_conn = qedi_conn_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) .stop_conn = iscsi_conn_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) .destroy_conn = qedi_conn_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) .set_param = iscsi_set_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) .get_ep_param = qedi_ep_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) .get_conn_param = iscsi_conn_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) .get_session_param = iscsi_session_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) .get_host_param = qedi_host_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) .send_pdu = iscsi_conn_send_pdu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) .get_stats = qedi_conn_get_stats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) .xmit_task = qedi_task_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) .cleanup_task = qedi_cleanup_task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) .session_recovery_timedout = iscsi_session_recovery_timedout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) .ep_connect = qedi_ep_connect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) .ep_poll = qedi_ep_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) .ep_disconnect = qedi_ep_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) .set_path = qedi_set_path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) .attr_is_visible = qedi_attr_is_visible,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) void qedi_start_conn_recovery(struct qedi_ctx *qedi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) struct qedi_conn *qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) struct iscsi_cls_session *cls_sess;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) struct iscsi_cls_conn *cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) struct iscsi_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) cls_conn = qedi_conn->cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) cls_sess = iscsi_conn_to_session(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) if (iscsi_is_session_online(cls_sess)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) qedi_conn->abrt_conn = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) QEDI_ERR(&qedi->dbg_ctx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) "Failing connection, state=0x%x, cid=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) conn->session->state, qedi_conn->iscsi_conn_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) iscsi_conn_failure(qedi_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) ISCSI_ERR_CONN_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) enum iscsi_error_types error_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) char *err_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) } qedi_iscsi_error[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) { ISCSI_STATUS_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) "tcp_error none"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) { ISCSI_CONN_ERROR_TASK_CID_MISMATCH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) "task cid mismatch"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) { ISCSI_CONN_ERROR_TASK_NOT_VALID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) "invalid task"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) { ISCSI_CONN_ERROR_RQ_RING_IS_FULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) "rq ring full"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) { ISCSI_CONN_ERROR_CMDQ_RING_IS_FULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) "cmdq ring full"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) { ISCSI_CONN_ERROR_HQE_CACHING_FAILED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) "sge caching failed"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) { ISCSI_CONN_ERROR_HEADER_DIGEST_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) "hdr digest error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) { ISCSI_CONN_ERROR_LOCAL_COMPLETION_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) "local cmpl error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) { ISCSI_CONN_ERROR_DATA_OVERRUN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) "invalid task"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) { ISCSI_CONN_ERROR_OUT_OF_SGES_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) "out of sge error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) { ISCSI_CONN_ERROR_TCP_IP_FRAGMENT_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) "tcp ip fragment error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) { ISCSI_CONN_ERROR_PROTOCOL_ERR_AHS_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) "AHS len protocol error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) { ISCSI_CONN_ERROR_PROTOCOL_ERR_ITT_OUT_OF_RANGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) "itt out of range error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_EXCEEDS_PDU_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) "data seg more than pdu size"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) { ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) "invalid opcode"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) { ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE_BEFORE_UPDATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) "invalid opcode before update"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) { ISCSI_CONN_ERROR_UNVALID_NOPIN_DSL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) "unexpected opcode"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) { ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_CARRIES_NO_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) "r2t carries no data"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) "data sn error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_IN_TTT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) "data TTT error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) { ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_TTT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) "r2t TTT error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) { ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_BUFFER_OFFSET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) "buffer offset error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) { ISCSI_CONN_ERROR_PROTOCOL_ERR_BUFFER_OFFSET_OOO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) "buffer offset ooo"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) { ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_SN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) "data seg len 0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) "data xer len error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) "data xer len1 error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) "data xer len2 error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) { ISCSI_CONN_ERROR_PROTOCOL_ERR_LUN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) "protocol lun error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) { ISCSI_CONN_ERROR_PROTOCOL_ERR_F_BIT_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) "f bit zero error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) { ISCSI_CONN_ERROR_PROTOCOL_ERR_EXP_STAT_SN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) "exp stat sn error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DSL_NOT_ZERO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) "dsl not zero error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) { ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_DSL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) "invalid dsl"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) { ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) "data seg len too big"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) { ISCSI_CONN_ERROR_PROTOCOL_ERR_OUTSTANDING_R2T_COUNT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) "outstanding r2t count error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) { ISCSI_CONN_ERROR_SENSE_DATA_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) "sense datalen error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) static char *qedi_get_iscsi_error(enum iscsi_error_types err_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) char *msg = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) for (i = 0; i < ARRAY_SIZE(qedi_iscsi_error); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) if (qedi_iscsi_error[i].error_code == err_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) msg = qedi_iscsi_error[i].err_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) void qedi_process_iscsi_error(struct qedi_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) struct iscsi_eqe_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) struct qedi_conn *qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) struct qedi_ctx *qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) char warn_notice[] = "iscsi_warning";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) char error_notice[] = "iscsi_error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) char unknown_msg[] = "Unknown error";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) char *message;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) int need_recovery = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) u32 err_mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) char *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) qedi_conn = ep->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) if (!qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) qedi = ep->qedi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) QEDI_ERR(&qedi->dbg_ctx, "async event iscsi error:0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) data->error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (err_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) need_recovery = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) message = warn_notice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) need_recovery = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) message = error_notice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) msg = qedi_get_iscsi_error(data->error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) if (!msg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) need_recovery = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) msg = unknown_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) iscsi_conn_printk(KERN_ALERT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) qedi_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) "qedi: %s - %s\n", message, msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) if (need_recovery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) void qedi_clear_session_ctx(struct iscsi_cls_session *cls_sess)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) struct iscsi_session *session = cls_sess->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) struct iscsi_conn *conn = session->leadconn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) struct qedi_conn *qedi_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) if (iscsi_is_session_online(cls_sess))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) qedi_ep_disconnect(qedi_conn->iscsi_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) qedi_conn_destroy(qedi_conn->cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) qedi_session_destroy(cls_sess);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) void qedi_process_tcp_error(struct qedi_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) struct iscsi_eqe_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) struct qedi_conn *qedi_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) qedi_conn = ep->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) if (!qedi_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) QEDI_ERR(&ep->qedi->dbg_ctx, "async event TCP error:0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) data->error_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) qedi_start_conn_recovery(qedi_conn->qedi, qedi_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) }