diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2013-08-27 01:37:30 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-09-03 10:28:01 -0400 |
commit | da9b1d5cb9d408a1e634740c849187bc031929db (patch) | |
tree | 04c33b4fa27f07316c8f3ca5ccf0b913266aef6d | |
parent | e8b8b8ad6e5218e2073a9dddcd9f97d6b4fc514e (diff) |
[SCSI] qla2xxx: Correct multiqueue offset calculations.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 17 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 18 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 2 |
4 files changed, 18 insertions, 24 deletions
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 6ed98f933719..aa10109d5e33 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -527,7 +527,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
527 | uint32_t cnt, que_idx; | 527 | uint32_t cnt, que_idx; |
528 | uint8_t que_cnt; | 528 | uint8_t que_cnt; |
529 | struct qla2xxx_mq_chain *mq = ptr; | 529 | struct qla2xxx_mq_chain *mq = ptr; |
530 | struct device_reg_25xxmq __iomem *reg; | 530 | device_reg_t __iomem *reg; |
531 | 531 | ||
532 | if (!ha->mqenable || IS_QLA83XX(ha)) | 532 | if (!ha->mqenable || IS_QLA83XX(ha)) |
533 | return ptr; | 533 | return ptr; |
@@ -541,13 +541,16 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
541 | ha->max_req_queues : ha->max_rsp_queues; | 541 | ha->max_req_queues : ha->max_rsp_queues; |
542 | mq->count = htonl(que_cnt); | 542 | mq->count = htonl(que_cnt); |
543 | for (cnt = 0; cnt < que_cnt; cnt++) { | 543 | for (cnt = 0; cnt < que_cnt; cnt++) { |
544 | reg = (struct device_reg_25xxmq __iomem *) | 544 | reg = ISP_QUE_REG(ha, cnt); |
545 | (ha->mqiobase + cnt * QLA_QUE_PAGE); | ||
546 | que_idx = cnt * 4; | 545 | que_idx = cnt * 4; |
547 | mq->qregs[que_idx] = htonl(RD_REG_DWORD(®->req_q_in)); | 546 | mq->qregs[que_idx] = |
548 | mq->qregs[que_idx+1] = htonl(RD_REG_DWORD(®->req_q_out)); | 547 | htonl(RD_REG_DWORD(®->isp25mq.req_q_in)); |
549 | mq->qregs[que_idx+2] = htonl(RD_REG_DWORD(®->rsp_q_in)); | 548 | mq->qregs[que_idx+1] = |
550 | mq->qregs[que_idx+3] = htonl(RD_REG_DWORD(®->rsp_q_out)); | 549 | htonl(RD_REG_DWORD(®->isp25mq.req_q_out)); |
550 | mq->qregs[que_idx+2] = | ||
551 | htonl(RD_REG_DWORD(®->isp25mq.rsp_q_in)); | ||
552 | mq->qregs[que_idx+3] = | ||
553 | htonl(RD_REG_DWORD(®->isp25mq.rsp_q_out)); | ||
551 | } | 554 | } |
552 | 555 | ||
553 | return ptr + sizeof(struct qla2xxx_mq_chain); | 556 | return ptr + sizeof(struct qla2xxx_mq_chain); |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index c0a1a713b564..d675860397f6 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2671,9 +2671,8 @@ struct bidi_statistics { | |||
2671 | #define QLA_MAX_QUEUES 256 | 2671 | #define QLA_MAX_QUEUES 256 |
2672 | #define ISP_QUE_REG(ha, id) \ | 2672 | #define ISP_QUE_REG(ha, id) \ |
2673 | ((ha->mqenable || IS_QLA83XX(ha)) ? \ | 2673 | ((ha->mqenable || IS_QLA83XX(ha)) ? \ |
2674 | ((device_reg_t __iomem *)(ha->mqiobase) +\ | 2674 | ((void __iomem *)ha->mqiobase + (QLA_QUE_PAGE * id)) :\ |
2675 | (QLA_QUE_PAGE * id)) :\ | 2675 | ((void __iomem *)ha->iobase)) |
2676 | ((device_reg_t __iomem *)(ha->iobase))) | ||
2677 | #define QLA_REQ_QUE_ID(tag) \ | 2676 | #define QLA_REQ_QUE_ID(tag) \ |
2678 | ((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0) | 2677 | ((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0) |
2679 | #define QLA_DEFAULT_QUE_QOS 5 | 2678 | #define QLA_DEFAULT_QUE_QOS 5 |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 98e8a16edacd..bce41f4fc5fa 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -3574,7 +3574,6 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3574 | unsigned long flags; | 3574 | unsigned long flags; |
3575 | mbx_cmd_t mc; | 3575 | mbx_cmd_t mc; |
3576 | mbx_cmd_t *mcp = &mc; | 3576 | mbx_cmd_t *mcp = &mc; |
3577 | struct device_reg_25xxmq __iomem *reg; | ||
3578 | struct qla_hw_data *ha = vha->hw; | 3577 | struct qla_hw_data *ha = vha->hw; |
3579 | 3578 | ||
3580 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3, | 3579 | 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 | if (IS_QLA83XX(ha)) | 3594 | if (IS_QLA83XX(ha)) |
3596 | mcp->mb[15] = 0; | 3595 | mcp->mb[15] = 0; |
3597 | 3596 | ||
3598 | reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) + | ||
3599 | QLA_QUE_PAGE * req->id); | ||
3600 | |||
3601 | mcp->mb[4] = req->id; | 3597 | mcp->mb[4] = req->id; |
3602 | /* que in ptr index */ | 3598 | /* que in ptr index */ |
3603 | mcp->mb[8] = 0; | 3599 | mcp->mb[8] = 0; |
@@ -3619,12 +3615,10 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3619 | 3615 | ||
3620 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3616 | spin_lock_irqsave(&ha->hardware_lock, flags); |
3621 | if (!(req->options & BIT_0)) { | 3617 | if (!(req->options & BIT_0)) { |
3622 | WRT_REG_DWORD(®->req_q_in, 0); | 3618 | WRT_REG_DWORD(req->req_q_in, 0); |
3623 | if (!IS_QLA83XX(ha)) | 3619 | if (!IS_QLA83XX(ha)) |
3624 | WRT_REG_DWORD(®->req_q_out, 0); | 3620 | WRT_REG_DWORD(req->req_q_out, 0); |
3625 | } | 3621 | } |
3626 | req->req_q_in = ®->req_q_in; | ||
3627 | req->req_q_out = ®->req_q_out; | ||
3628 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 3622 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
3629 | 3623 | ||
3630 | rval = qla2x00_mailbox_command(vha, mcp); | 3624 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -3646,7 +3640,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3646 | unsigned long flags; | 3640 | unsigned long flags; |
3647 | mbx_cmd_t mc; | 3641 | mbx_cmd_t mc; |
3648 | mbx_cmd_t *mcp = &mc; | 3642 | mbx_cmd_t *mcp = &mc; |
3649 | struct device_reg_25xxmq __iomem *reg; | ||
3650 | struct qla_hw_data *ha = vha->hw; | 3643 | struct qla_hw_data *ha = vha->hw; |
3651 | 3644 | ||
3652 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6, | 3645 | 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 | if (IS_QLA83XX(ha)) | 3657 | if (IS_QLA83XX(ha)) |
3665 | mcp->mb[15] = 0; | 3658 | mcp->mb[15] = 0; |
3666 | 3659 | ||
3667 | reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) + | ||
3668 | QLA_QUE_PAGE * rsp->id); | ||
3669 | |||
3670 | mcp->mb[4] = rsp->id; | 3660 | mcp->mb[4] = rsp->id; |
3671 | /* que in ptr index */ | 3661 | /* que in ptr index */ |
3672 | mcp->mb[8] = 0; | 3662 | mcp->mb[8] = 0; |
@@ -3690,9 +3680,9 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3690 | 3680 | ||
3691 | spin_lock_irqsave(&ha->hardware_lock, flags); | 3681 | spin_lock_irqsave(&ha->hardware_lock, flags); |
3692 | if (!(rsp->options & BIT_0)) { | 3682 | if (!(rsp->options & BIT_0)) { |
3693 | WRT_REG_DWORD(®->rsp_q_out, 0); | 3683 | WRT_REG_DWORD(rsp->rsp_q_out, 0); |
3694 | if (!IS_QLA83XX(ha)) | 3684 | if (!IS_QLA83XX(ha)) |
3695 | WRT_REG_DWORD(®->rsp_q_in, 0); | 3685 | WRT_REG_DWORD(rsp->rsp_q_in, 0); |
3696 | } | 3686 | } |
3697 | 3687 | ||
3698 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 3688 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index f868a9f98afe..a72df701fb38 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -699,6 +699,8 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, | |||
699 | req->cnt = req->length; | 699 | req->cnt = req->length; |
700 | req->id = que_id; | 700 | req->id = que_id; |
701 | reg = ISP_QUE_REG(ha, que_id); | 701 | reg = ISP_QUE_REG(ha, que_id); |
702 | req->req_q_in = ®->isp25mq.req_q_in; | ||
703 | req->req_q_out = ®->isp25mq.req_q_out; | ||
702 | req->max_q_depth = ha->req_q_map[0]->max_q_depth; | 704 | req->max_q_depth = ha->req_q_map[0]->max_q_depth; |
703 | mutex_unlock(&ha->vport_lock); | 705 | mutex_unlock(&ha->vport_lock); |
704 | ql_dbg(ql_dbg_multiq, base_vha, 0xc004, | 706 | ql_dbg(ql_dbg_multiq, base_vha, 0xc004, |