|
@@ -242,32 +242,34 @@ static void
|
|
qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
|
qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
|
{
|
|
{
|
|
uint16_t cnt;
|
|
uint16_t cnt;
|
|
|
|
+ uint32_t mboxes;
|
|
uint16_t __iomem *wptr;
|
|
uint16_t __iomem *wptr;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
|
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
|
|
|
|
|
|
|
+ /* Read all mbox registers? */
|
|
|
|
+ mboxes = (1 << ha->mbx_count) - 1;
|
|
|
|
+ if (!ha->mcp)
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x5001, "MBX pointer ERRROR.\n");
|
|
|
|
+ else
|
|
|
|
+ mboxes = ha->mcp->in_mb;
|
|
|
|
+
|
|
/* Load return mailbox registers. */
|
|
/* Load return mailbox registers. */
|
|
ha->flags.mbox_int = 1;
|
|
ha->flags.mbox_int = 1;
|
|
ha->mailbox_out[0] = mb0;
|
|
ha->mailbox_out[0] = mb0;
|
|
|
|
+ mboxes >>= 1;
|
|
wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 1);
|
|
wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 1);
|
|
|
|
|
|
for (cnt = 1; cnt < ha->mbx_count; cnt++) {
|
|
for (cnt = 1; cnt < ha->mbx_count; cnt++) {
|
|
if (IS_QLA2200(ha) && cnt == 8)
|
|
if (IS_QLA2200(ha) && cnt == 8)
|
|
wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
|
|
wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
|
|
- if (cnt == 4 || cnt == 5)
|
|
|
|
|
|
+ if ((cnt == 4 || cnt == 5) && (mboxes & BIT_0))
|
|
ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
|
|
ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
|
|
- else
|
|
|
|
|
|
+ else if (mboxes & BIT_0)
|
|
ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
|
|
ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
|
|
|
|
|
|
wptr++;
|
|
wptr++;
|
|
- }
|
|
|
|
-
|
|
|
|
- if (ha->mcp) {
|
|
|
|
- ql_dbg(ql_dbg_async, vha, 0x5000,
|
|
|
|
- "Got mbx completion. cmd=%x.\n", ha->mcp->mb[0]);
|
|
|
|
- } else {
|
|
|
|
- ql_dbg(ql_dbg_async, vha, 0x5001,
|
|
|
|
- "MBX pointer ERROR.\n");
|
|
|
|
|
|
+ mboxes >>= 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -298,7 +300,7 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
|
|
return;
|
|
return;
|
|
|
|
|
|
ql_dbg(ql_dbg_async, vha, 0x5022,
|
|
ql_dbg(ql_dbg_async, vha, 0x5022,
|
|
- "Inter-Driver Commucation %s -- ACK timeout=%d.\n",
|
|
|
|
|
|
+ "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
|
|
vha->host_no, event[aen & 0xff], timeout);
|
|
vha->host_no, event[aen & 0xff], timeout);
|
|
|
|
|
|
rval = qla2x00_post_idc_ack_work(vha, mb);
|
|
rval = qla2x00_post_idc_ack_work(vha, mb);
|
|
@@ -453,7 +455,7 @@ skip_rio:
|
|
break;
|
|
break;
|
|
|
|
|
|
case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */
|
|
case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */
|
|
- ql_log(ql_log_info, vha, 0x5009,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x5009,
|
|
"LIP occurred (%x).\n", mb[1]);
|
|
"LIP occurred (%x).\n", mb[1]);
|
|
|
|
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
@@ -487,7 +489,7 @@ skip_rio:
|
|
ha->link_data_rate = mb[1];
|
|
ha->link_data_rate = mb[1];
|
|
}
|
|
}
|
|
|
|
|
|
- ql_log(ql_log_info, vha, 0x500a,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x500a,
|
|
"LOOP UP detected (%s Gbps).\n", link_speed);
|
|
"LOOP UP detected (%s Gbps).\n", link_speed);
|
|
|
|
|
|
vha->flags.management_server_logged_in = 0;
|
|
vha->flags.management_server_logged_in = 0;
|
|
@@ -497,7 +499,7 @@ skip_rio:
|
|
case MBA_LOOP_DOWN: /* Loop Down Event */
|
|
case MBA_LOOP_DOWN: /* Loop Down Event */
|
|
mbx = IS_QLA81XX(ha) ? RD_REG_WORD(®24->mailbox4) : 0;
|
|
mbx = IS_QLA81XX(ha) ? RD_REG_WORD(®24->mailbox4) : 0;
|
|
mbx = IS_QLA82XX(ha) ? RD_REG_WORD(®82->mailbox_out[4]) : mbx;
|
|
mbx = IS_QLA82XX(ha) ? RD_REG_WORD(®82->mailbox_out[4]) : mbx;
|
|
- ql_log(ql_log_info, vha, 0x500b,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x500b,
|
|
"LOOP DOWN detected (%x %x %x %x).\n",
|
|
"LOOP DOWN detected (%x %x %x %x).\n",
|
|
mb[1], mb[2], mb[3], mbx);
|
|
mb[1], mb[2], mb[3], mbx);
|
|
|
|
|
|
@@ -519,7 +521,7 @@ skip_rio:
|
|
break;
|
|
break;
|
|
|
|
|
|
case MBA_LIP_RESET: /* LIP reset occurred */
|
|
case MBA_LIP_RESET: /* LIP reset occurred */
|
|
- ql_log(ql_log_info, vha, 0x500c,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x500c,
|
|
"LIP reset occurred (%x).\n", mb[1]);
|
|
"LIP reset occurred (%x).\n", mb[1]);
|
|
|
|
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
@@ -587,7 +589,7 @@ skip_rio:
|
|
if (IS_QLA2100(ha))
|
|
if (IS_QLA2100(ha))
|
|
break;
|
|
break;
|
|
|
|
|
|
- ql_log(ql_log_info, vha, 0x500f,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x500f,
|
|
"Configuration change detected: value=%x.\n", mb[1]);
|
|
"Configuration change detected: value=%x.\n", mb[1]);
|
|
|
|
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
|
@@ -920,15 +922,15 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
QLA_LOGIO_LOGIN_RETRIED : 0;
|
|
QLA_LOGIO_LOGIN_RETRIED : 0;
|
|
if (mbx->entry_status) {
|
|
if (mbx->entry_status) {
|
|
ql_dbg(ql_dbg_async, vha, 0x5043,
|
|
ql_dbg(ql_dbg_async, vha, 0x5043,
|
|
- "Async-%s error entry - portid=%02x%02x%02x "
|
|
|
|
|
|
+ "Async-%s error entry - hdl=%x portid=%02x%02x%02x "
|
|
"entry-status=%x status=%x state-flag=%x "
|
|
"entry-status=%x status=%x state-flag=%x "
|
|
- "status-flags=%x.\n",
|
|
|
|
- type, fcport->d_id.b.domain, fcport->d_id.b.area,
|
|
|
|
|
|
+ "status-flags=%x.\n", type, sp->handle,
|
|
|
|
+ fcport->d_id.b.domain, fcport->d_id.b.area,
|
|
fcport->d_id.b.al_pa, mbx->entry_status,
|
|
fcport->d_id.b.al_pa, mbx->entry_status,
|
|
le16_to_cpu(mbx->status), le16_to_cpu(mbx->state_flags),
|
|
le16_to_cpu(mbx->status), le16_to_cpu(mbx->state_flags),
|
|
le16_to_cpu(mbx->status_flags));
|
|
le16_to_cpu(mbx->status_flags));
|
|
|
|
|
|
- ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5057,
|
|
|
|
|
|
+ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5029,
|
|
(uint8_t *)mbx, sizeof(*mbx));
|
|
(uint8_t *)mbx, sizeof(*mbx));
|
|
|
|
|
|
goto logio_done;
|
|
goto logio_done;
|
|
@@ -940,9 +942,10 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
status = 0;
|
|
status = 0;
|
|
if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) {
|
|
if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) {
|
|
ql_dbg(ql_dbg_async, vha, 0x5045,
|
|
ql_dbg(ql_dbg_async, vha, 0x5045,
|
|
- "Async-%s complete - portid=%02x%02x%02x mbx1=%x.\n",
|
|
|
|
- type, fcport->d_id.b.domain, fcport->d_id.b.area,
|
|
|
|
- fcport->d_id.b.al_pa, le16_to_cpu(mbx->mb1));
|
|
|
|
|
|
+ "Async-%s complete - hdl=%x portid=%02x%02x%02x mbx1=%x.\n",
|
|
|
|
+ type, sp->handle, fcport->d_id.b.domain,
|
|
|
|
+ fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
|
|
+ le16_to_cpu(mbx->mb1));
|
|
|
|
|
|
data[0] = MBS_COMMAND_COMPLETE;
|
|
data[0] = MBS_COMMAND_COMPLETE;
|
|
if (ctx->type == SRB_LOGIN_CMD) {
|
|
if (ctx->type == SRB_LOGIN_CMD) {
|
|
@@ -968,11 +971,10 @@ qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
}
|
|
}
|
|
|
|
|
|
ql_log(ql_log_warn, vha, 0x5046,
|
|
ql_log(ql_log_warn, vha, 0x5046,
|
|
- "Async-%s failed - portid=%02x%02x%02x status=%x "
|
|
|
|
- "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n",
|
|
|
|
- type, fcport->d_id.b.domain,
|
|
|
|
- fcport->d_id.b.area, fcport->d_id.b.al_pa, status,
|
|
|
|
- le16_to_cpu(mbx->mb0), le16_to_cpu(mbx->mb1),
|
|
|
|
|
|
+ "Async-%s failed - hdl=%x portid=%02x%02x%02x status=%x "
|
|
|
|
+ "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n", type, sp->handle,
|
|
|
|
+ fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
|
|
+ status, le16_to_cpu(mbx->mb0), le16_to_cpu(mbx->mb1),
|
|
le16_to_cpu(mbx->mb2), le16_to_cpu(mbx->mb6),
|
|
le16_to_cpu(mbx->mb2), le16_to_cpu(mbx->mb6),
|
|
le16_to_cpu(mbx->mb7));
|
|
le16_to_cpu(mbx->mb7));
|
|
|
|
|
|
@@ -1036,7 +1038,7 @@ qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
bsg_job->reply->result = DID_ERROR << 16;
|
|
bsg_job->reply->result = DID_ERROR << 16;
|
|
bsg_job->reply->reply_payload_rcv_len = 0;
|
|
bsg_job->reply->reply_payload_rcv_len = 0;
|
|
}
|
|
}
|
|
- ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5058,
|
|
|
|
|
|
+ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035,
|
|
(uint8_t *)pkt, sizeof(*pkt));
|
|
(uint8_t *)pkt, sizeof(*pkt));
|
|
} else {
|
|
} else {
|
|
bsg_job->reply->result = DID_OK << 16;
|
|
bsg_job->reply->result = DID_OK << 16;
|
|
@@ -1111,9 +1113,9 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->total_byte_count);
|
|
le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->total_byte_count);
|
|
|
|
|
|
ql_log(ql_log_info, vha, 0x503f,
|
|
ql_log(ql_log_info, vha, 0x503f,
|
|
- "ELS-CT pass-through-%s error comp_status-status=0x%x "
|
|
|
|
|
|
+ "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
|
|
"error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
|
|
"error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
|
|
- type, comp_status, fw_status[1], fw_status[2],
|
|
|
|
|
|
+ type, sp->handle, comp_status, fw_status[1], fw_status[2],
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
pkt)->total_byte_count));
|
|
pkt)->total_byte_count));
|
|
fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply);
|
|
fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply);
|
|
@@ -1121,9 +1123,9 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
ql_log(ql_log_info, vha, 0x5040,
|
|
ql_log(ql_log_info, vha, 0x5040,
|
|
- "ELS-CT pass-through-%s error comp_status-status=0x%x "
|
|
|
|
|
|
+ "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
|
|
"error subcode 1=0x%x error subcode 2=0x%x.\n",
|
|
"error subcode 1=0x%x error subcode 2=0x%x.\n",
|
|
- type, comp_status,
|
|
|
|
|
|
+ type, sp->handle, comp_status,
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
pkt)->error_subcode_1),
|
|
pkt)->error_subcode_1),
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
le16_to_cpu(((struct els_sts_entry_24xx *)
|
|
@@ -1184,11 +1186,12 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
QLA_LOGIO_LOGIN_RETRIED : 0;
|
|
QLA_LOGIO_LOGIN_RETRIED : 0;
|
|
if (logio->entry_status) {
|
|
if (logio->entry_status) {
|
|
ql_log(ql_log_warn, vha, 0x5034,
|
|
ql_log(ql_log_warn, vha, 0x5034,
|
|
- "Async-%s error entry - "
|
|
|
|
|
|
+ "Async-%s error entry - hdl=%x"
|
|
"portid=%02x%02x%02x entry-status=%x.\n",
|
|
"portid=%02x%02x%02x entry-status=%x.\n",
|
|
- type, fcport->d_id.b.domain, fcport->d_id.b.area,
|
|
|
|
- fcport->d_id.b.al_pa, logio->entry_status);
|
|
|
|
- ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5059,
|
|
|
|
|
|
+ type, sp->handle, fcport->d_id.b.domain,
|
|
|
|
+ fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
|
|
+ logio->entry_status);
|
|
|
|
+ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x504d,
|
|
(uint8_t *)logio, sizeof(*logio));
|
|
(uint8_t *)logio, sizeof(*logio));
|
|
|
|
|
|
goto logio_done;
|
|
goto logio_done;
|
|
@@ -1196,10 +1199,9 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
|
|
|
|
if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) {
|
|
if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) {
|
|
ql_dbg(ql_dbg_async, vha, 0x5036,
|
|
ql_dbg(ql_dbg_async, vha, 0x5036,
|
|
- "Async-%s complete - portid=%02x%02x%02x "
|
|
|
|
- "iop0=%x.\n",
|
|
|
|
- type, fcport->d_id.b.domain, fcport->d_id.b.area,
|
|
|
|
- fcport->d_id.b.al_pa,
|
|
|
|
|
|
+ "Async-%s complete - hdl=%x portid=%02x%02x%02x "
|
|
|
|
+ "iop0=%x.\n", type, sp->handle, fcport->d_id.b.domain,
|
|
|
|
+ fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
le32_to_cpu(logio->io_parameter[0]));
|
|
le32_to_cpu(logio->io_parameter[0]));
|
|
|
|
|
|
data[0] = MBS_COMMAND_COMPLETE;
|
|
data[0] = MBS_COMMAND_COMPLETE;
|
|
@@ -1238,9 +1240,8 @@ qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
}
|
|
}
|
|
|
|
|
|
ql_dbg(ql_dbg_async, vha, 0x5037,
|
|
ql_dbg(ql_dbg_async, vha, 0x5037,
|
|
- "Async-%s failed - portid=%02x%02x%02x comp=%x "
|
|
|
|
- "iop0=%x iop1=%x.\n",
|
|
|
|
- type, fcport->d_id.b.domain,
|
|
|
|
|
|
+ "Async-%s failed - hdl=%x portid=%02x%02x%02x comp=%x "
|
|
|
|
+ "iop0=%x iop1=%x.\n", type, sp->handle, fcport->d_id.b.domain,
|
|
fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
fcport->d_id.b.area, fcport->d_id.b.al_pa,
|
|
le16_to_cpu(logio->comp_status),
|
|
le16_to_cpu(logio->comp_status),
|
|
le32_to_cpu(logio->io_parameter[0]),
|
|
le32_to_cpu(logio->io_parameter[0]),
|
|
@@ -1274,25 +1275,25 @@ qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
|
|
|
|
|
|
if (sts->entry_status) {
|
|
if (sts->entry_status) {
|
|
ql_log(ql_log_warn, vha, 0x5038,
|
|
ql_log(ql_log_warn, vha, 0x5038,
|
|
- "Async-%s error - entry-status(%x).\n",
|
|
|
|
- type, sts->entry_status);
|
|
|
|
|
|
+ "Async-%s error - hdl=%x entry-status(%x).\n",
|
|
|
|
+ type, sp->handle, sts->entry_status);
|
|
} else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
|
|
} else if (sts->comp_status != __constant_cpu_to_le16(CS_COMPLETE)) {
|
|
ql_log(ql_log_warn, vha, 0x5039,
|
|
ql_log(ql_log_warn, vha, 0x5039,
|
|
- "Async-%s error - completion status(%x).\n",
|
|
|
|
- type, sts->comp_status);
|
|
|
|
|
|
+ "Async-%s error - hdl=%x completion status(%x).\n",
|
|
|
|
+ type, sp->handle, sts->comp_status);
|
|
} else if (!(le16_to_cpu(sts->scsi_status) &
|
|
} else if (!(le16_to_cpu(sts->scsi_status) &
|
|
SS_RESPONSE_INFO_LEN_VALID)) {
|
|
SS_RESPONSE_INFO_LEN_VALID)) {
|
|
ql_log(ql_log_warn, vha, 0x503a,
|
|
ql_log(ql_log_warn, vha, 0x503a,
|
|
- "Async-%s error - no response info(%x).\n",
|
|
|
|
- type, sts->scsi_status);
|
|
|
|
|
|
+ "Async-%s error - hdl=%x no response info(%x).\n",
|
|
|
|
+ type, sp->handle, sts->scsi_status);
|
|
} else if (le32_to_cpu(sts->rsp_data_len) < 4) {
|
|
} else if (le32_to_cpu(sts->rsp_data_len) < 4) {
|
|
ql_log(ql_log_warn, vha, 0x503b,
|
|
ql_log(ql_log_warn, vha, 0x503b,
|
|
- "Async-%s error - not enough response(%d).\n",
|
|
|
|
- type, sts->rsp_data_len);
|
|
|
|
|
|
+ "Async-%s error - hdl=%x not enough response(%d).\n",
|
|
|
|
+ type, sp->handle, sts->rsp_data_len);
|
|
} else if (sts->data[3]) {
|
|
} else if (sts->data[3]) {
|
|
ql_log(ql_log_warn, vha, 0x503c,
|
|
ql_log(ql_log_warn, vha, 0x503c,
|
|
- "Async-%s error - response(%x).\n",
|
|
|
|
- type, sts->data[3]);
|
|
|
|
|
|
+ "Async-%s error - hdl=%x response(%x).\n",
|
|
|
|
+ type, sp->handle, sts->data[3]);
|
|
} else {
|
|
} else {
|
|
error = 0;
|
|
error = 0;
|
|
}
|
|
}
|
|
@@ -1337,9 +1338,6 @@ qla2x00_process_response_queue(struct rsp_que *rsp)
|
|
}
|
|
}
|
|
|
|
|
|
if (pkt->entry_status != 0) {
|
|
if (pkt->entry_status != 0) {
|
|
- ql_log(ql_log_warn, vha, 0x5035,
|
|
|
|
- "Process error entry.\n");
|
|
|
|
-
|
|
|
|
qla2x00_error_entry(vha, rsp, pkt);
|
|
qla2x00_error_entry(vha, rsp, pkt);
|
|
((response_t *)pkt)->signature = RESPONSE_PROCESSED;
|
|
((response_t *)pkt)->signature = RESPONSE_PROCESSED;
|
|
wmb();
|
|
wmb();
|
|
@@ -1391,7 +1389,6 @@ qla2x00_process_response_queue(struct rsp_que *rsp)
|
|
}
|
|
}
|
|
|
|
|
|
static inline void
|
|
static inline void
|
|
-
|
|
|
|
qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
|
|
qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
|
|
uint32_t sense_len, struct rsp_que *rsp)
|
|
uint32_t sense_len, struct rsp_que *rsp)
|
|
{
|
|
{
|
|
@@ -1413,13 +1410,14 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
|
|
if (sp->request_sense_length != 0)
|
|
if (sp->request_sense_length != 0)
|
|
rsp->status_srb = sp;
|
|
rsp->status_srb = sp;
|
|
|
|
|
|
- ql_dbg(ql_dbg_io, vha, 0x301c,
|
|
|
|
- "Check condition Sense data, scsi(%ld:%d:%d:%d) cmd=%p.\n",
|
|
|
|
- sp->fcport->vha->host_no, cp->device->channel, cp->device->id,
|
|
|
|
- cp->device->lun, cp);
|
|
|
|
- if (sense_len)
|
|
|
|
|
|
+ if (sense_len) {
|
|
|
|
+ ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c,
|
|
|
|
+ "Check condition Sense data, nexus%ld:%d:%d cmd=%p.\n",
|
|
|
|
+ sp->fcport->vha->host_no, cp->device->id, cp->device->lun,
|
|
|
|
+ cp);
|
|
ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302b,
|
|
ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302b,
|
|
cp->sense_buffer, sense_len);
|
|
cp->sense_buffer, sense_len);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
struct scsi_dif_tuple {
|
|
struct scsi_dif_tuple {
|
|
@@ -1506,7 +1504,7 @@ qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24)
|
|
}
|
|
}
|
|
|
|
|
|
if (k != blocks_done) {
|
|
if (k != blocks_done) {
|
|
- qla_printk(KERN_WARNING, sp->fcport->vha->hw,
|
|
|
|
|
|
+ ql_log(ql_log_warn, vha, 0x302f,
|
|
"unexpected tag values tag:lba=%x:%llx)\n",
|
|
"unexpected tag values tag:lba=%x:%llx)\n",
|
|
e_ref_tag, (unsigned long long)lba_s);
|
|
e_ref_tag, (unsigned long long)lba_s);
|
|
return 1;
|
|
return 1;
|
|
@@ -1611,7 +1609,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
sp = NULL;
|
|
sp = NULL;
|
|
|
|
|
|
if (sp == NULL) {
|
|
if (sp == NULL) {
|
|
- ql_log(ql_log_warn, vha, 0x3017,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x3017,
|
|
"Invalid status handle (0x%x).\n", sts->handle);
|
|
"Invalid status handle (0x%x).\n", sts->handle);
|
|
|
|
|
|
if (IS_QLA82XX(ha))
|
|
if (IS_QLA82XX(ha))
|
|
@@ -1623,7 +1621,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
}
|
|
}
|
|
cp = sp->cmd;
|
|
cp = sp->cmd;
|
|
if (cp == NULL) {
|
|
if (cp == NULL) {
|
|
- ql_log(ql_log_warn, vha, 0x3018,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x3018,
|
|
"Command already returned (0x%x/%p).\n",
|
|
"Command already returned (0x%x/%p).\n",
|
|
sts->handle, sp);
|
|
sts->handle, sp);
|
|
|
|
|
|
@@ -1670,7 +1668,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
par_sense_len -= rsp_info_len;
|
|
par_sense_len -= rsp_info_len;
|
|
}
|
|
}
|
|
if (rsp_info_len > 3 && rsp_info[3]) {
|
|
if (rsp_info_len > 3 && rsp_info[3]) {
|
|
- ql_log(ql_log_warn, vha, 0x3019,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x3019,
|
|
"FCP I/O protocol failure (0x%x/0x%x).\n",
|
|
"FCP I/O protocol failure (0x%x/0x%x).\n",
|
|
rsp_info_len, rsp_info[3]);
|
|
rsp_info_len, rsp_info[3]);
|
|
|
|
|
|
@@ -1701,7 +1699,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
if (!lscsi_status &&
|
|
if (!lscsi_status &&
|
|
((unsigned)(scsi_bufflen(cp) - resid) <
|
|
((unsigned)(scsi_bufflen(cp) - resid) <
|
|
cp->underflow)) {
|
|
cp->underflow)) {
|
|
- ql_log(ql_log_warn, vha, 0x301a,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x301a,
|
|
"Mid-layer underflow "
|
|
"Mid-layer underflow "
|
|
"detected (0x%x of 0x%x bytes).\n",
|
|
"detected (0x%x of 0x%x bytes).\n",
|
|
resid, scsi_bufflen(cp));
|
|
resid, scsi_bufflen(cp));
|
|
@@ -1713,7 +1711,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
cp->result = DID_OK << 16 | lscsi_status;
|
|
cp->result = DID_OK << 16 | lscsi_status;
|
|
|
|
|
|
if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
|
|
if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
|
|
- ql_log(ql_log_warn, vha, 0x301b,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x301b,
|
|
"QUEUE FULL detected.\n");
|
|
"QUEUE FULL detected.\n");
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -1735,7 +1733,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
scsi_set_resid(cp, resid);
|
|
scsi_set_resid(cp, resid);
|
|
if (scsi_status & SS_RESIDUAL_UNDER) {
|
|
if (scsi_status & SS_RESIDUAL_UNDER) {
|
|
if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) {
|
|
if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) {
|
|
- ql_log(ql_log_warn, vha, 0x301d,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x301d,
|
|
"Dropped frame(s) detected "
|
|
"Dropped frame(s) detected "
|
|
"(0x%x of 0x%x bytes).\n",
|
|
"(0x%x of 0x%x bytes).\n",
|
|
resid, scsi_bufflen(cp));
|
|
resid, scsi_bufflen(cp));
|
|
@@ -1747,7 +1745,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
if (!lscsi_status &&
|
|
if (!lscsi_status &&
|
|
((unsigned)(scsi_bufflen(cp) - resid) <
|
|
((unsigned)(scsi_bufflen(cp) - resid) <
|
|
cp->underflow)) {
|
|
cp->underflow)) {
|
|
- ql_log(ql_log_warn, vha, 0x301e,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x301e,
|
|
"Mid-layer underflow "
|
|
"Mid-layer underflow "
|
|
"detected (0x%x of 0x%x bytes).\n",
|
|
"detected (0x%x of 0x%x bytes).\n",
|
|
resid, scsi_bufflen(cp));
|
|
resid, scsi_bufflen(cp));
|
|
@@ -1756,7 +1754,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- ql_log(ql_log_warn, vha, 0x301f,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x301f,
|
|
"Dropped frame(s) detected (0x%x "
|
|
"Dropped frame(s) detected (0x%x "
|
|
"of 0x%x bytes).\n", resid, scsi_bufflen(cp));
|
|
"of 0x%x bytes).\n", resid, scsi_bufflen(cp));
|
|
|
|
|
|
@@ -1774,7 +1772,7 @@ check_scsi_status:
|
|
*/
|
|
*/
|
|
if (lscsi_status != 0) {
|
|
if (lscsi_status != 0) {
|
|
if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
|
|
if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
|
|
- ql_log(ql_log_warn, vha, 0x3020,
|
|
|
|
|
|
+ ql_dbg(ql_dbg_io, vha, 0x3020,
|
|
"QUEUE FULL detected.\n");
|
|
"QUEUE FULL detected.\n");
|
|
logit = 1;
|
|
logit = 1;
|
|
break;
|
|
break;
|
|
@@ -1838,10 +1836,15 @@ out:
|
|
if (logit)
|
|
if (logit)
|
|
ql_dbg(ql_dbg_io, vha, 0x3022,
|
|
ql_dbg(ql_dbg_io, vha, 0x3022,
|
|
"FCP command status: 0x%x-0x%x (0x%x) "
|
|
"FCP command status: 0x%x-0x%x (0x%x) "
|
|
- "oxid=0x%x cdb=%02x%02x%02x len=0x%x "
|
|
|
|
|
|
+ "nexus=%ld:%d:%d portid=%02x%02x%02x oxid=0x%x "
|
|
|
|
+ "cdb=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x len=0x%x "
|
|
"rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n",
|
|
"rsp_info=0x%x resid=0x%x fw_resid=0x%x.\n",
|
|
- comp_status, scsi_status, cp->result, ox_id, cp->cmnd[0],
|
|
|
|
- cp->cmnd[1], cp->cmnd[2], scsi_bufflen(cp), rsp_info_len,
|
|
|
|
|
|
+ comp_status, scsi_status, cp->result, vha->host_no,
|
|
|
|
+ cp->device->id, cp->device->lun, fcport->d_id.b.domain,
|
|
|
|
+ fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id,
|
|
|
|
+ cp->cmnd[0], cp->cmnd[1], cp->cmnd[2], cp->cmnd[3],
|
|
|
|
+ cp->cmnd[4], cp->cmnd[5], cp->cmnd[6], cp->cmnd[7],
|
|
|
|
+ cp->cmnd[8], cp->cmnd[9], scsi_bufflen(cp), rsp_info_len,
|
|
resid_len, fw_resid_len);
|
|
resid_len, fw_resid_len);
|
|
|
|
|
|
if (rsp->status_srb == NULL)
|
|
if (rsp->status_srb == NULL)
|
|
@@ -1899,6 +1902,45 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+qla2x00_free_sp_ctx(scsi_qla_host_t *vha, srb_t *sp)
|
|
|
|
+{
|
|
|
|
+ struct qla_hw_data *ha = vha->hw;
|
|
|
|
+ struct srb_ctx *ctx;
|
|
|
|
+
|
|
|
|
+ if (!sp->ctx)
|
|
|
|
+ return 1;
|
|
|
|
+
|
|
|
|
+ ctx = sp->ctx;
|
|
|
|
+
|
|
|
|
+ if (ctx->type == SRB_LOGIN_CMD ||
|
|
|
|
+ ctx->type == SRB_LOGOUT_CMD ||
|
|
|
|
+ ctx->type == SRB_TM_CMD) {
|
|
|
|
+ ctx->u.iocb_cmd->done(sp);
|
|
|
|
+ return 0;
|
|
|
|
+ } else if (ctx->type == SRB_ADISC_CMD) {
|
|
|
|
+ ctx->u.iocb_cmd->free(sp);
|
|
|
|
+ return 0;
|
|
|
|
+ } else {
|
|
|
|
+ struct fc_bsg_job *bsg_job;
|
|
|
|
+
|
|
|
|
+ bsg_job = ctx->u.bsg_job;
|
|
|
|
+ if (ctx->type == SRB_ELS_CMD_HST ||
|
|
|
|
+ ctx->type == SRB_CT_CMD)
|
|
|
|
+ kfree(sp->fcport);
|
|
|
|
+
|
|
|
|
+ bsg_job->reply->reply_data.ctels_reply.status =
|
|
|
|
+ FC_CTELS_STATUS_OK;
|
|
|
|
+ bsg_job->reply->result = DID_ERROR << 16;
|
|
|
|
+ bsg_job->reply->reply_payload_rcv_len = 0;
|
|
|
|
+ kfree(sp->ctx);
|
|
|
|
+ mempool_free(sp, ha->srb_mempool);
|
|
|
|
+ bsg_job->job_done(bsg_job);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* qla2x00_error_entry() - Process an error entry.
|
|
* qla2x00_error_entry() - Process an error entry.
|
|
* @ha: SCSI driver HA context
|
|
* @ha: SCSI driver HA context
|
|
@@ -1909,7 +1951,7 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
|
|
{
|
|
{
|
|
srb_t *sp;
|
|
srb_t *sp;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
- uint32_t handle = LSW(pkt->handle);
|
|
|
|
|
|
+ const char func[] = "ERROR-IOCB";
|
|
uint16_t que = MSW(pkt->handle);
|
|
uint16_t que = MSW(pkt->handle);
|
|
struct req_que *req = ha->req_q_map[que];
|
|
struct req_que *req = ha->req_q_map[que];
|
|
|
|
|
|
@@ -1932,28 +1974,20 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
|
|
ql_dbg(ql_dbg_async, vha, 0x502f,
|
|
ql_dbg(ql_dbg_async, vha, 0x502f,
|
|
"UNKNOWN flag error.\n");
|
|
"UNKNOWN flag error.\n");
|
|
|
|
|
|
- /* Validate handle. */
|
|
|
|
- if (handle < MAX_OUTSTANDING_COMMANDS)
|
|
|
|
- sp = req->outstanding_cmds[handle];
|
|
|
|
- else
|
|
|
|
- sp = NULL;
|
|
|
|
-
|
|
|
|
|
|
+ sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
|
|
if (sp) {
|
|
if (sp) {
|
|
- /* Free outstanding command slot. */
|
|
|
|
- req->outstanding_cmds[handle] = NULL;
|
|
|
|
-
|
|
|
|
- /* Bad payload or header */
|
|
|
|
- if (pkt->entry_status &
|
|
|
|
- (RF_INV_E_ORDER | RF_INV_E_COUNT |
|
|
|
|
- RF_INV_E_PARAM | RF_INV_E_TYPE)) {
|
|
|
|
- sp->cmd->result = DID_ERROR << 16;
|
|
|
|
- } else if (pkt->entry_status & RF_BUSY) {
|
|
|
|
- sp->cmd->result = DID_BUS_BUSY << 16;
|
|
|
|
- } else {
|
|
|
|
- sp->cmd->result = DID_ERROR << 16;
|
|
|
|
|
|
+ if (qla2x00_free_sp_ctx(vha, sp)) {
|
|
|
|
+ if (pkt->entry_status &
|
|
|
|
+ (RF_INV_E_ORDER | RF_INV_E_COUNT |
|
|
|
|
+ RF_INV_E_PARAM | RF_INV_E_TYPE)) {
|
|
|
|
+ sp->cmd->result = DID_ERROR << 16;
|
|
|
|
+ } else if (pkt->entry_status & RF_BUSY) {
|
|
|
|
+ sp->cmd->result = DID_BUS_BUSY << 16;
|
|
|
|
+ } else {
|
|
|
|
+ sp->cmd->result = DID_ERROR << 16;
|
|
|
|
+ }
|
|
|
|
+ qla2x00_sp_compl(ha, sp);
|
|
}
|
|
}
|
|
- qla2x00_sp_compl(ha, sp);
|
|
|
|
-
|
|
|
|
} else if (pkt->entry_type == COMMAND_A64_TYPE || pkt->entry_type ==
|
|
} else if (pkt->entry_type == COMMAND_A64_TYPE || pkt->entry_type ==
|
|
COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7
|
|
COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7
|
|
|| pkt->entry_type == COMMAND_TYPE_6) {
|
|
|| pkt->entry_type == COMMAND_TYPE_6) {
|
|
@@ -1977,26 +2011,30 @@ static void
|
|
qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
|
qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
|
{
|
|
{
|
|
uint16_t cnt;
|
|
uint16_t cnt;
|
|
|
|
+ uint32_t mboxes;
|
|
uint16_t __iomem *wptr;
|
|
uint16_t __iomem *wptr;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct qla_hw_data *ha = vha->hw;
|
|
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
|
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
|
|
|
|
|
|
|
+ /* Read all mbox registers? */
|
|
|
|
+ mboxes = (1 << ha->mbx_count) - 1;
|
|
|
|
+ if (!ha->mcp)
|
|
|
|
+ ql_dbg(ql_dbg_async, vha, 0x504e, "MBX pointer ERRROR.\n");
|
|
|
|
+ else
|
|
|
|
+ mboxes = ha->mcp->in_mb;
|
|
|
|
+
|
|
/* Load return mailbox registers. */
|
|
/* Load return mailbox registers. */
|
|
ha->flags.mbox_int = 1;
|
|
ha->flags.mbox_int = 1;
|
|
ha->mailbox_out[0] = mb0;
|
|
ha->mailbox_out[0] = mb0;
|
|
|
|
+ mboxes >>= 1;
|
|
wptr = (uint16_t __iomem *)®->mailbox1;
|
|
wptr = (uint16_t __iomem *)®->mailbox1;
|
|
|
|
|
|
for (cnt = 1; cnt < ha->mbx_count; cnt++) {
|
|
for (cnt = 1; cnt < ha->mbx_count; cnt++) {
|
|
- ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
|
|
|
|
- wptr++;
|
|
|
|
- }
|
|
|
|
|
|
+ if (mboxes & BIT_0)
|
|
|
|
+ ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
|
|
|
|
|
|
- if (ha->mcp) {
|
|
|
|
- ql_dbg(ql_dbg_async, vha, 0x504d,
|
|
|
|
- "Got mailbox completion. cmd=%x.\n", ha->mcp->mb[0]);
|
|
|
|
- } else {
|
|
|
|
- ql_dbg(ql_dbg_async, vha, 0x504e,
|
|
|
|
- "MBX pointer ERROR.\n");
|
|
|
|
|
|
+ mboxes >>= 1;
|
|
|
|
+ wptr++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2025,9 +2063,6 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
|
|
}
|
|
}
|
|
|
|
|
|
if (pkt->entry_status != 0) {
|
|
if (pkt->entry_status != 0) {
|
|
- ql_dbg(ql_dbg_async, vha, 0x5029,
|
|
|
|
- "Process error entry.\n");
|
|
|
|
-
|
|
|
|
qla2x00_error_entry(vha, rsp, (sts_entry_t *) pkt);
|
|
qla2x00_error_entry(vha, rsp, (sts_entry_t *) pkt);
|
|
((response_t *)pkt)->signature = RESPONSE_PROCESSED;
|
|
((response_t *)pkt)->signature = RESPONSE_PROCESSED;
|
|
wmb();
|
|
wmb();
|