[SCSI] qla2xxx: Use proper request/response queues with MQ instantiations.
Original code would inadvertanly place I/Os on the default request-queue. Also, correctly pass in the proper MSI-X vector during response-queue initialization. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
committed by
James Bottomley
parent
d63ab53394
commit
444786d7fd
@@ -187,7 +187,6 @@ struct req_que;
|
|||||||
* SCSI Request Block
|
* SCSI Request Block
|
||||||
*/
|
*/
|
||||||
typedef struct srb {
|
typedef struct srb {
|
||||||
struct scsi_qla_host *vha; /* HA the SP is queued on */
|
|
||||||
struct req_que *que;
|
struct req_que *que;
|
||||||
struct fc_port *fcport;
|
struct fc_port *fcport;
|
||||||
|
|
||||||
|
@@ -173,7 +173,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vha = sp->vha;
|
vha = sp->fcport->vha;
|
||||||
req = sp->que;
|
req = sp->que;
|
||||||
|
|
||||||
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
|
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
|
||||||
@@ -234,7 +234,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vha = sp->vha;
|
vha = sp->fcport->vha;
|
||||||
req = sp->que;
|
req = sp->que;
|
||||||
|
|
||||||
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
|
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
|
||||||
@@ -294,7 +294,7 @@ qla2x00_start_scsi(srb_t *sp)
|
|||||||
|
|
||||||
/* Setup device pointers. */
|
/* Setup device pointers. */
|
||||||
ret = 0;
|
ret = 0;
|
||||||
vha = sp->vha;
|
vha = sp->fcport->vha;
|
||||||
ha = vha->hw;
|
ha = vha->hw;
|
||||||
reg = &ha->iobase->isp;
|
reg = &ha->iobase->isp;
|
||||||
cmd = sp->cmd;
|
cmd = sp->cmd;
|
||||||
@@ -353,7 +353,6 @@ qla2x00_start_scsi(srb_t *sp)
|
|||||||
/* Build command packet */
|
/* Build command packet */
|
||||||
req->current_outstanding_cmd = handle;
|
req->current_outstanding_cmd = handle;
|
||||||
req->outstanding_cmds[handle] = sp;
|
req->outstanding_cmds[handle] = sp;
|
||||||
sp->vha = vha;
|
|
||||||
sp->que = req;
|
sp->que = req;
|
||||||
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
|
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
|
||||||
req->cnt -= req_cnt;
|
req->cnt -= req_cnt;
|
||||||
@@ -656,7 +655,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vha = sp->vha;
|
vha = sp->fcport->vha;
|
||||||
req = sp->que;
|
req = sp->que;
|
||||||
|
|
||||||
/* Set transfer direction */
|
/* Set transfer direction */
|
||||||
@@ -723,7 +722,7 @@ qla24xx_start_scsi(srb_t *sp)
|
|||||||
struct req_que *req = NULL;
|
struct req_que *req = NULL;
|
||||||
struct rsp_que *rsp = NULL;
|
struct rsp_que *rsp = NULL;
|
||||||
struct scsi_cmnd *cmd = sp->cmd;
|
struct scsi_cmnd *cmd = sp->cmd;
|
||||||
struct scsi_qla_host *vha = sp->vha;
|
struct scsi_qla_host *vha = sp->fcport->vha;
|
||||||
struct qla_hw_data *ha = vha->hw;
|
struct qla_hw_data *ha = vha->hw;
|
||||||
uint16_t que_id;
|
uint16_t que_id;
|
||||||
|
|
||||||
@@ -791,7 +790,6 @@ qla24xx_start_scsi(srb_t *sp)
|
|||||||
/* Build command packet. */
|
/* Build command packet. */
|
||||||
req->current_outstanding_cmd = handle;
|
req->current_outstanding_cmd = handle;
|
||||||
req->outstanding_cmds[handle] = sp;
|
req->outstanding_cmds[handle] = sp;
|
||||||
sp->vha = vha;
|
|
||||||
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
|
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
|
||||||
req->cnt -= req_cnt;
|
req->cnt -= req_cnt;
|
||||||
|
|
||||||
|
@@ -2026,7 +2026,7 @@ qla2x00_get_rsp_host(struct rsp_que *rsp)
|
|||||||
if (pkt && pkt->handle < MAX_OUTSTANDING_COMMANDS) {
|
if (pkt && pkt->handle < MAX_OUTSTANDING_COMMANDS) {
|
||||||
sp = req->outstanding_cmds[pkt->handle];
|
sp = req->outstanding_cmds[pkt->handle];
|
||||||
if (sp)
|
if (sp)
|
||||||
vha = sp->vha;
|
vha = sp->fcport->vha;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!vha)
|
if (!vha)
|
||||||
|
@@ -3145,7 +3145,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
|
|||||||
mcp->mb[7] = LSW(MSD(rsp->dma));
|
mcp->mb[7] = LSW(MSD(rsp->dma));
|
||||||
mcp->mb[5] = rsp->length;
|
mcp->mb[5] = rsp->length;
|
||||||
mcp->mb[11] = rsp->vp_idx;
|
mcp->mb[11] = rsp->vp_idx;
|
||||||
mcp->mb[14] = rsp->msix->vector;
|
mcp->mb[14] = rsp->msix->entry;
|
||||||
mcp->mb[13] = rsp->rid;
|
mcp->mb[13] = rsp->rid;
|
||||||
|
|
||||||
reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
|
reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) +
|
||||||
|
@@ -614,8 +614,10 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
|
|||||||
req->vp_idx = vp_idx;
|
req->vp_idx = vp_idx;
|
||||||
req->qos = qos;
|
req->qos = qos;
|
||||||
|
|
||||||
if (ha->rsp_q_map[rsp_que])
|
if (ha->rsp_q_map[rsp_que]) {
|
||||||
req->rsp = ha->rsp_q_map[rsp_que];
|
req->rsp = ha->rsp_q_map[rsp_que];
|
||||||
|
req->rsp->req = req;
|
||||||
|
}
|
||||||
/* Use alternate PCI bus number */
|
/* Use alternate PCI bus number */
|
||||||
if (MSB(req->rid))
|
if (MSB(req->rid))
|
||||||
options |= BIT_4;
|
options |= BIT_4;
|
||||||
|
@@ -438,7 +438,6 @@ qla2x00_get_new_sp(scsi_qla_host_t *vha, fc_port_t *fcport,
|
|||||||
if (!sp)
|
if (!sp)
|
||||||
return sp;
|
return sp;
|
||||||
|
|
||||||
sp->vha = vha;
|
|
||||||
sp->fcport = fcport;
|
sp->fcport = fcport;
|
||||||
sp->cmd = cmd;
|
sp->cmd = cmd;
|
||||||
sp->que = ha->req_q_map[0];
|
sp->que = ha->req_q_map[0];
|
||||||
@@ -1182,7 +1181,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
|||||||
continue;
|
continue;
|
||||||
for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
|
for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
|
||||||
sp = req->outstanding_cmds[cnt];
|
sp = req->outstanding_cmds[cnt];
|
||||||
if (sp && sp->vha == vha) {
|
if (sp && sp->fcport->vha == vha) {
|
||||||
req->outstanding_cmds[cnt] = NULL;
|
req->outstanding_cmds[cnt] = NULL;
|
||||||
sp->cmd->result = res;
|
sp->cmd->result = res;
|
||||||
qla2x00_sp_compl(ha, sp);
|
qla2x00_sp_compl(ha, sp);
|
||||||
|
Reference in New Issue
Block a user