Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[SCSI] qla2xxx: Correct multiqueue offset calculations.

parent e8b8b8ad
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -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)
		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);
+2 −3
Original line number Original line Diff line number Diff line
@@ -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
+4 −14
Original line number Original line Diff line number Diff line
@@ -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)
	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)


	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)
	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)
	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)


	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);
+2 −0
Original line number Original line Diff line number Diff line
@@ -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,