Commit da9b1d5c authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley

[SCSI] qla2xxx: Correct multiqueue offset calculations.

Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarSaurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent e8b8b8ad
...@@ -527,7 +527,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) ...@@ -527,7 +527,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
uint32_t cnt, que_idx; uint32_t cnt, que_idx;
uint8_t que_cnt; uint8_t que_cnt;
struct qla2xxx_mq_chain *mq = ptr; struct qla2xxx_mq_chain *mq = ptr;
struct device_reg_25xxmq __iomem *reg; device_reg_t __iomem *reg;
if (!ha->mqenable || IS_QLA83XX(ha)) if (!ha->mqenable || IS_QLA83XX(ha))
return ptr; return ptr;
...@@ -541,13 +541,16 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) ...@@ -541,13 +541,16 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
ha->max_req_queues : ha->max_rsp_queues; ha->max_req_queues : ha->max_rsp_queues;
mq->count = htonl(que_cnt); mq->count = htonl(que_cnt);
for (cnt = 0; cnt < que_cnt; cnt++) { for (cnt = 0; cnt < que_cnt; cnt++) {
reg = (struct device_reg_25xxmq __iomem *) reg = ISP_QUE_REG(ha, cnt);
(ha->mqiobase + cnt * QLA_QUE_PAGE);
que_idx = cnt * 4; que_idx = cnt * 4;
mq->qregs[que_idx] = htonl(RD_REG_DWORD(&reg->req_q_in)); mq->qregs[que_idx] =
mq->qregs[que_idx+1] = htonl(RD_REG_DWORD(&reg->req_q_out)); htonl(RD_REG_DWORD(&reg->isp25mq.req_q_in));
mq->qregs[que_idx+2] = htonl(RD_REG_DWORD(&reg->rsp_q_in)); mq->qregs[que_idx+1] =
mq->qregs[que_idx+3] = htonl(RD_REG_DWORD(&reg->rsp_q_out)); htonl(RD_REG_DWORD(&reg->isp25mq.req_q_out));
mq->qregs[que_idx+2] =
htonl(RD_REG_DWORD(&reg->isp25mq.rsp_q_in));
mq->qregs[que_idx+3] =
htonl(RD_REG_DWORD(&reg->isp25mq.rsp_q_out));
} }
return ptr + sizeof(struct qla2xxx_mq_chain); return ptr + sizeof(struct qla2xxx_mq_chain);
......
...@@ -2671,9 +2671,8 @@ struct bidi_statistics { ...@@ -2671,9 +2671,8 @@ struct bidi_statistics {
#define QLA_MAX_QUEUES 256 #define QLA_MAX_QUEUES 256
#define ISP_QUE_REG(ha, id) \ #define ISP_QUE_REG(ha, id) \
((ha->mqenable || IS_QLA83XX(ha)) ? \ ((ha->mqenable || IS_QLA83XX(ha)) ? \
((device_reg_t __iomem *)(ha->mqiobase) +\ ((void __iomem *)ha->mqiobase + (QLA_QUE_PAGE * id)) :\
(QLA_QUE_PAGE * id)) :\ ((void __iomem *)ha->iobase))
((device_reg_t __iomem *)(ha->iobase)))
#define QLA_REQ_QUE_ID(tag) \ #define QLA_REQ_QUE_ID(tag) \
((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0) ((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0)
#define QLA_DEFAULT_QUE_QOS 5 #define QLA_DEFAULT_QUE_QOS 5
......
...@@ -3574,7 +3574,6 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3574,7 +3574,6 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
unsigned long flags; unsigned long flags;
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
struct device_reg_25xxmq __iomem *reg;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3,
...@@ -3595,9 +3594,6 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3595,9 +3594,6 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha))
mcp->mb[15] = 0; mcp->mb[15] = 0;
reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) +
QLA_QUE_PAGE * req->id);
mcp->mb[4] = req->id; mcp->mb[4] = req->id;
/* que in ptr index */ /* que in ptr index */
mcp->mb[8] = 0; mcp->mb[8] = 0;
...@@ -3619,12 +3615,10 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3619,12 +3615,10 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(req->options & BIT_0)) { if (!(req->options & BIT_0)) {
WRT_REG_DWORD(&reg->req_q_in, 0); WRT_REG_DWORD(req->req_q_in, 0);
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha))
WRT_REG_DWORD(&reg->req_q_out, 0); WRT_REG_DWORD(req->req_q_out, 0);
} }
req->req_q_in = &reg->req_q_in;
req->req_q_out = &reg->req_q_out;
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
rval = qla2x00_mailbox_command(vha, mcp); rval = qla2x00_mailbox_command(vha, mcp);
...@@ -3646,7 +3640,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -3646,7 +3640,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
unsigned long flags; unsigned long flags;
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
struct device_reg_25xxmq __iomem *reg;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6,
...@@ -3664,9 +3657,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -3664,9 +3657,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha))
mcp->mb[15] = 0; mcp->mb[15] = 0;
reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) +
QLA_QUE_PAGE * rsp->id);
mcp->mb[4] = rsp->id; mcp->mb[4] = rsp->id;
/* que in ptr index */ /* que in ptr index */
mcp->mb[8] = 0; mcp->mb[8] = 0;
...@@ -3690,9 +3680,9 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -3690,9 +3680,9 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(rsp->options & BIT_0)) { if (!(rsp->options & BIT_0)) {
WRT_REG_DWORD(&reg->rsp_q_out, 0); WRT_REG_DWORD(rsp->rsp_q_out, 0);
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha))
WRT_REG_DWORD(&reg->rsp_q_in, 0); WRT_REG_DWORD(rsp->rsp_q_in, 0);
} }
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
......
...@@ -699,6 +699,8 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, ...@@ -699,6 +699,8 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
req->cnt = req->length; req->cnt = req->length;
req->id = que_id; req->id = que_id;
reg = ISP_QUE_REG(ha, que_id); reg = ISP_QUE_REG(ha, que_id);
req->req_q_in = &reg->isp25mq.req_q_in;
req->req_q_out = &reg->isp25mq.req_q_out;
req->max_q_depth = ha->req_q_map[0]->max_q_depth; req->max_q_depth = ha->req_q_map[0]->max_q_depth;
mutex_unlock(&ha->vport_lock); mutex_unlock(&ha->vport_lock);
ql_dbg(ql_dbg_multiq, base_vha, 0xc004, ql_dbg(ql_dbg_multiq, base_vha, 0xc004,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment