scsi: qla2xxx: Cleanup ELS/PUREX iocb fields

This patch does the following to improve RDP processing:

 - Rename field port_id to d_id in ELS and PUREX iocb structs to match FW
   spec.

 - Remove redundant comments from ELS and PUREX iocb structs.

 - Refactor fields in ELS iocb struct for error subcode common access.

 - Properly use error subcode fields in rdp processing routine.

 - Add print logs for alloc failure in purex rdp processing routine.

Link: https://lore.kernel.org/r/20200212214436.25532-13-hmadhani@marvell.com
Signed-off-by: Joe Carnuccio <joe.carnuccio@cavium.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Joe Carnuccio 2020-02-12 13:44:23 -08:00 committed by Martin K. Petersen
parent 8b01e4db83
commit 09e382bc3d
3 changed files with 48 additions and 31 deletions

View File

@ -779,9 +779,8 @@ struct els_entry_24xx {
uint32_t handle; /* System handle. */ uint32_t handle; /* System handle. */
uint16_t reserved_1; uint16_t comp_status; /* response only */
uint16_t nport_handle;
uint16_t nport_handle; /* N_PORT handle. */
uint16_t tx_dsd_count; uint16_t tx_dsd_count;
@ -796,7 +795,7 @@ struct els_entry_24xx {
uint8_t opcode; uint8_t opcode;
uint8_t reserved_2; uint8_t reserved_2;
uint8_t port_id[3]; uint8_t d_id[3];
uint8_t s_id[3]; uint8_t s_id[3];
uint16_t control_flags; /* Control flags. */ uint16_t control_flags; /* Control flags. */
@ -808,13 +807,24 @@ struct els_entry_24xx {
#define ECF_CLR_PASSTHRU_PEND BIT_12 #define ECF_CLR_PASSTHRU_PEND BIT_12
#define ECF_INCL_FRAME_HDR BIT_11 #define ECF_INCL_FRAME_HDR BIT_11
__le32 rx_byte_count; union {
__le32 tx_byte_count; struct {
__le32 rx_byte_count;
__le32 tx_byte_count;
__le64 tx_address __packed; /* Data segment 0 address. */ __le64 tx_address __packed; /* DSD 0 address. */
__le32 tx_len; /* Data segment 0 length. */ __le32 tx_len; /* DSD 0 length. */
__le64 rx_address __packed; /* Data segment 1 address. */
__le32 rx_len; /* Data segment 1 length. */ __le64 rx_address __packed; /* DSD 1 address. */
__le32 rx_len; /* DSD 1 length. */
};
struct {
uint32_t total_byte_count;
uint32_t error_subcode_1;
uint32_t error_subcode_2;
uint32_t error_subcode_3;
};
};
}; };
struct els_sts_entry_24xx { struct els_sts_entry_24xx {
@ -840,15 +850,16 @@ struct els_sts_entry_24xx {
uint8_t opcode; uint8_t opcode;
uint8_t reserved_3; uint8_t reserved_3;
uint8_t port_id[3]; uint8_t d_id[3];
uint8_t reserved_4; uint8_t s_id[3];
uint16_t reserved_5;
uint16_t control_flags; /* Control flags. */ uint16_t control_flags; /* Control flags. */
uint32_t total_byte_count; uint32_t total_byte_count;
uint32_t error_subcode_1; uint32_t error_subcode_1;
uint32_t error_subcode_2; uint32_t error_subcode_2;
uint32_t error_subcode_3;
uint32_t reserved_4[4];
}; };
/* /*
* ISP queue - Mailbox Command entry structure definition. * ISP queue - Mailbox Command entry structure definition.

View File

@ -2684,9 +2684,9 @@ qla24xx_els_logo_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
els_iocb->rx_dsd_count = 0; els_iocb->rx_dsd_count = 0;
els_iocb->opcode = elsio->u.els_logo.els_cmd; els_iocb->opcode = elsio->u.els_logo.els_cmd;
els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; els_iocb->d_id[0] = sp->fcport->d_id.b.al_pa;
els_iocb->port_id[1] = sp->fcport->d_id.b.area; els_iocb->d_id[1] = sp->fcport->d_id.b.area;
els_iocb->port_id[2] = sp->fcport->d_id.b.domain; els_iocb->d_id[2] = sp->fcport->d_id.b.domain;
/* For SID the byte order is different than DID */ /* For SID the byte order is different than DID */
els_iocb->s_id[1] = vha->d_id.b.al_pa; els_iocb->s_id[1] = vha->d_id.b.al_pa;
els_iocb->s_id[2] = vha->d_id.b.area; els_iocb->s_id[2] = vha->d_id.b.area;
@ -3030,9 +3030,9 @@ qla24xx_els_iocb(srb_t *sp, struct els_entry_24xx *els_iocb)
sp->type == SRB_ELS_CMD_RPT ? sp->type == SRB_ELS_CMD_RPT ?
bsg_request->rqst_data.r_els.els_code : bsg_request->rqst_data.r_els.els_code :
bsg_request->rqst_data.h_els.command_code; bsg_request->rqst_data.h_els.command_code;
els_iocb->port_id[0] = sp->fcport->d_id.b.al_pa; els_iocb->d_id[0] = sp->fcport->d_id.b.al_pa;
els_iocb->port_id[1] = sp->fcport->d_id.b.area; els_iocb->d_id[1] = sp->fcport->d_id.b.area;
els_iocb->port_id[2] = sp->fcport->d_id.b.domain; els_iocb->d_id[2] = sp->fcport->d_id.b.domain;
els_iocb->control_flags = 0; els_iocb->control_flags = 0;
els_iocb->rx_byte_count = els_iocb->rx_byte_count =
cpu_to_le32(bsg_job->reply_payload.payload_len); cpu_to_le32(bsg_job->reply_payload.payload_len);

View File

@ -5888,13 +5888,19 @@ static int qla24xx_process_purex_iocb(struct scsi_qla_host *vha, void *pkt)
rsp_els = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_els), rsp_els = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_els),
&rsp_els_dma, GFP_KERNEL); &rsp_els_dma, GFP_KERNEL);
if (!rsp_els) if (!rsp_els) {
ql_log(ql_log_warn, vha, 0x0183,
"Failed allocate dma buffer ELS RSP.\n");
goto dealloc; goto dealloc;
}
rsp_payload = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_payload), rsp_payload = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_payload),
&rsp_payload_dma, GFP_KERNEL); &rsp_payload_dma, GFP_KERNEL);
if (!rsp_payload) if (!rsp_payload) {
ql_log(ql_log_warn, vha, 0x0184,
"Failed allocate dma buffer ELS RSP payload.\n");
goto dealloc; goto dealloc;
}
sfp = dma_alloc_coherent(&ha->pdev->dev, SFP_RTDI_LEN, sfp = dma_alloc_coherent(&ha->pdev->dev, SFP_RTDI_LEN,
&sfp_dma, GFP_KERNEL); &sfp_dma, GFP_KERNEL);
@ -5920,9 +5926,9 @@ static int qla24xx_process_purex_iocb(struct scsi_qla_host *vha, void *pkt)
rsp_els->rx_dsd_count = 0; rsp_els->rx_dsd_count = 0;
rsp_els->opcode = purex->els_frame_payload[0]; rsp_els->opcode = purex->els_frame_payload[0];
rsp_els->port_id[0] = purex->s_id[0]; rsp_els->d_id[0] = purex->s_id[0];
rsp_els->port_id[1] = purex->s_id[1]; rsp_els->d_id[1] = purex->s_id[1];
rsp_els->port_id[2] = purex->s_id[2]; rsp_els->d_id[2] = purex->s_id[2];
rsp_els->control_flags = EPD_ELS_ACC; rsp_els->control_flags = EPD_ELS_ACC;
rsp_els->rx_byte_count = 0; rsp_els->rx_byte_count = 0;
@ -6265,14 +6271,14 @@ static int qla24xx_process_purex_iocb(struct scsi_qla_host *vha, void *pkt)
rval = qla2x00_issue_iocb(vha, rsp_els, rsp_els_dma, 0); rval = qla2x00_issue_iocb(vha, rsp_els, rsp_els_dma, 0);
if (rval != QLA_SUCCESS) { if (rval) {
ql_log(ql_log_warn, vha, 0x0188, ql_log(ql_log_warn, vha, 0x0188,
"%s: failed to issue IOCB (%x).\n", __func__, rval); "%s: iocb failed to execute -> %x\n", __func__, rval);
} else if (rsp_els->entry_status != 0) { } else if (rsp_els->comp_status) {
ql_log(ql_log_warn, vha, 0x0189, ql_log(ql_log_warn, vha, 0x0189,
"%s: failed to complete IOCB -- error status (%x).\n", "%s: iocb failed to complete -> completion=%#x subcode=(%#x,%#x)\n",
__func__, rsp_els->entry_status); __func__, rsp_els->comp_status,
rval = QLA_FUNCTION_FAILED; rsp_els->error_subcode_1, rsp_els->error_subcode_2);
} else { } else {
ql_dbg(ql_dbg_init, vha, 0x018a, "%s: done.\n", __func__); ql_dbg(ql_dbg_init, vha, 0x018a, "%s: done.\n", __func__);
} }