Re: [RFC 5/6] qedi: Add support for iSCSI session management.
From: Rangankar, Manish <hidden>
Date: 2016-10-20 09:24:30
Also in:
linux-scsi
On 19/10/16 1:33 PM, "Hannes Reinecke" [off-list ref] wrote:
On 10/19/2016 07:01 AM, manish.rangankar@cavium.com wrote:quoted
From: Manish Rangankar <redacted> This patch adds support for iscsi_transport LLD Login, Logout, NOP-IN/NOP-OUT, Async, Reject PDU processing and Firmware async event handling support. Signed-off-by: Nilesh Javali <redacted> Signed-off-by: Adheer Chandravanshi <redacted> Signed-off-by: Chad Dupuis <redacted> Signed-off-by: Saurav Kashyap <redacted> Signed-off-by: Arun Easi <redacted> Signed-off-by: Manish Rangankar <redacted> --- drivers/scsi/qedi/qedi_fw.c | 1123 ++++++++++++++++++++++++++++ drivers/scsi/qedi/qedi_gbl.h | 67 ++ drivers/scsi/qedi/qedi_iscsi.c | 1604 ++++++++++++++++++++++++++++++++++++++++ drivers/scsi/qedi/qedi_iscsi.h | 228 ++++++ drivers/scsi/qedi/qedi_main.c | 164 ++++ 5 files changed, 3186 insertions(+) create mode 100644 drivers/scsi/qedi/qedi_fw.c create mode 100644 drivers/scsi/qedi/qedi_gbl.h create mode 100644 drivers/scsi/qedi/qedi_iscsi.c create mode 100644 drivers/scsi/qedi/qedi_iscsi.h
--snipped--
quoted
+static void qedi_process_async_mesg(struct qedi_ctx *qedi, + union iscsi_cqe *cqe, + struct iscsi_task *task, + struct qedi_conn *qedi_conn, + u16 que_idx) +{ + struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data; + struct iscsi_session *session = conn->session; + struct iscsi_async_msg_hdr *cqe_async_msg; + struct iscsi_async *resp_hdr; + u32 scsi_lun[2]; + u32 pdu_len, num_bdqs; + char bdq_data[QEDI_BDQ_BUF_SIZE]; + unsigned long flags; + + spin_lock_bh(&session->back_lock); + + cqe_async_msg = &cqe->cqe_common.iscsi_hdr.async_msg; + pdu_len = cqe_async_msg->hdr_second_dword & + ISCSI_ASYNC_MSG_HDR_DATA_SEG_LEN_MASK; + num_bdqs = pdu_len / QEDI_BDQ_BUF_SIZE; + + if (cqe->cqe_common.cqe_type == ISCSI_CQE_TYPE_UNSOLICITED) { + spin_lock_irqsave(&qedi->hba_lock, flags); + qedi_unsol_pdu_adjust_bdq(qedi, &cqe->cqe_unsolicited, + pdu_len, num_bdqs, bdq_data); + spin_unlock_irqrestore(&qedi->hba_lock, flags); + } + + resp_hdr = (struct iscsi_async *)&qedi_conn->gen_pdu.resp_hdr; + memset(resp_hdr, 0, sizeof(struct iscsi_hdr)); + resp_hdr->opcode = cqe_async_msg->opcode; + resp_hdr->flags = 0x80; + + scsi_lun[0] = cpu_to_be32(cqe_async_msg->lun.lo); + scsi_lun[1] = cpu_to_be32(cqe_async_msg->lun.hi);I _think_ we have a SCSI LUN structure ...
Will do. --snipped--
quoted
+void qedi_process_iscsi_error(struct qedi_endpoint *ep, struct async_data *data) +{ + struct qedi_conn *qedi_conn; + struct qedi_ctx *qedi; + char warn_notice[] = "iscsi_warning"; + char error_notice[] = "iscsi_error"; + char *message; + int need_recovery = 0; + u32 err_mask = 0; + char msg[64]; + + if (!ep) + return; + + qedi_conn = ep->conn; + if (!qedi_conn) + return; + + qedi = ep->qedi; + + QEDI_ERR(&qedi->dbg_ctx, "async event iscsi error:0x%x\n", + data->error_code); + + if (err_mask) { + need_recovery = 0; + message = warn_notice; + } else { + need_recovery = 1; + message = error_notice; + } + + switch (data->error_code) { + case ISCSI_STATUS_NONE: + strcpy(msg, "tcp_error none"); + break; + case ISCSI_CONN_ERROR_TASK_CID_MISMATCH: + strcpy(msg, "task cid mismatch"); + break; + case ISCSI_CONN_ERROR_TASK_NOT_VALID: + strcpy(msg, "invalid task"); + break; + case ISCSI_CONN_ERROR_RQ_RING_IS_FULL: + strcpy(msg, "rq ring full"); + break; + case ISCSI_CONN_ERROR_CMDQ_RING_IS_FULL: + strcpy(msg, "cmdq ring full"); + break; + case ISCSI_CONN_ERROR_HQE_CACHING_FAILED: + strcpy(msg, "sge caching failed"); + break; + case ISCSI_CONN_ERROR_HEADER_DIGEST_ERROR: + strcpy(msg, "hdr digest error"); + break; + case ISCSI_CONN_ERROR_LOCAL_COMPLETION_ERROR: + strcpy(msg, "local cmpl error"); + break; + case ISCSI_CONN_ERROR_DATA_OVERRUN: + strcpy(msg, "invalid task"); + break; + case ISCSI_CONN_ERROR_OUT_OF_SGES_ERROR: + strcpy(msg, "out of sge error"); + break; + case ISCSI_CONN_ERROR_TCP_SEG_PROC_IP_OPTIONS_ERROR: + strcpy(msg, "tcp seg ip options error"); + break; + case ISCSI_CONN_ERROR_TCP_IP_FRAGMENT_ERROR: + strcpy(msg, "tcp ip fragment error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_AHS_LEN: + strcpy(msg, "AHS len protocol error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_ITT_OUT_OF_RANGE: + strcpy(msg, "itt out of range error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_EXCEEDS_PDU_SIZE: + strcpy(msg, "data seg more than pdu size"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE: + strcpy(msg, "invalid opcode"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE_BEFORE_UPDATE: + strcpy(msg, "invalid opcode before update"); + break; + case ISCSI_CONN_ERROR_UNVALID_NOPIN_DSL: + strcpy(msg, "unexpected opcode"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_CARRIES_NO_DATA: + strcpy(msg, "r2t carries no data"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SN: + strcpy(msg, "data sn error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_IN_TTT: + strcpy(msg, "data TTT error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_TTT: + strcpy(msg, "r2t TTT error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_BUFFER_OFFSET: + strcpy(msg, "buffer offset error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_BUFFER_OFFSET_OOO: + strcpy(msg, "buffer offset ooo"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_SN: + strcpy(msg, "data seg len 0"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0: + strcpy(msg, "data xer len error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1: + strcpy(msg, "data xer len1 error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_2: + strcpy(msg, "data xer len2 error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_LUN: + strcpy(msg, "protocol lun error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_F_BIT_ZERO: + strcpy(msg, "f bit zero error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_F_BIT_ZERO_S_BIT_ONE: + strcpy(msg, "f bit zero s bit one error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_EXP_STAT_SN: + strcpy(msg, "exp stat sn error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DSL_NOT_ZERO: + strcpy(msg, "dsl not zero error"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_DSL: + strcpy(msg, "invalid dsl"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG: + strcpy(msg, "data seg len too big"); + break; + case ISCSI_CONN_ERROR_PROTOCOL_ERR_OUTSTANDING_R2T_COUNT: + strcpy(msg, "outstanding r2t count error"); + break; + case ISCSI_CONN_ERROR_SENSE_DATA_LENGTH: + strcpy(msg, "sense datalen error"); + break;Please use an array for mapping values onto strings.
Will add this change in next revision. Thanks, Manish R.