提交 618a7523 编写于 作者: A Anirban Chakraborty 提交者: James Bottomley

[SCSI] qla2xxx: Remove interrupt request bit check in the response processing path in multiq mode.

Correct response-queue-0 processing by instructing the firmware
to run with interrupt-handshaking disabled, similarly to what is
now done for all non-0 response queues.  Since all
response-queues now run in the same mode, the driver no longer
needs the hot-path 'is-disabled-HCCR' test.
Signed-off-by: NAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: NAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
上级 e916141c
...@@ -376,10 +376,8 @@ extern int qla2x00_dfs_remove(scsi_qla_host_t *); ...@@ -376,10 +376,8 @@ extern int qla2x00_dfs_remove(scsi_qla_host_t *);
/* Globa function prototypes for multi-q */ /* Globa function prototypes for multi-q */
extern int qla25xx_request_irq(struct rsp_que *); extern int qla25xx_request_irq(struct rsp_que *);
extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *, extern int qla25xx_init_req_que(struct scsi_qla_host *, struct req_que *);
uint8_t); extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *);
extern int qla25xx_init_rsp_que(struct scsi_qla_host *, struct rsp_que *,
uint8_t);
extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t, extern int qla25xx_create_req_que(struct qla_hw_data *, uint16_t, uint8_t,
uint16_t, uint8_t, uint8_t); uint16_t, uint8_t, uint8_t);
extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t, extern int qla25xx_create_rsp_que(struct qla_hw_data *, uint16_t, uint8_t,
......
...@@ -1226,9 +1226,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha) ...@@ -1226,9 +1226,8 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
icb->firmware_options_2 |= icb->firmware_options_2 |=
__constant_cpu_to_le32(BIT_18); __constant_cpu_to_le32(BIT_18);
icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22); icb->firmware_options_2 &= __constant_cpu_to_le32(~BIT_22);
icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23); icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23);
ha->rsp_q_map[0]->options = icb->firmware_options_2;
WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0); WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0);
WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0); WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0);
...@@ -3493,7 +3492,7 @@ qla25xx_init_queues(struct qla_hw_data *ha) ...@@ -3493,7 +3492,7 @@ qla25xx_init_queues(struct qla_hw_data *ha)
rsp = ha->rsp_q_map[i]; rsp = ha->rsp_q_map[i];
if (rsp) { if (rsp) {
rsp->options &= ~BIT_0; rsp->options &= ~BIT_0;
ret = qla25xx_init_rsp_que(base_vha, rsp, rsp->options); ret = qla25xx_init_rsp_que(base_vha, rsp);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING DEBUG2_17(printk(KERN_WARNING
"%s Rsp que:%d init failed\n", __func__, "%s Rsp que:%d init failed\n", __func__,
...@@ -3507,7 +3506,7 @@ qla25xx_init_queues(struct qla_hw_data *ha) ...@@ -3507,7 +3506,7 @@ qla25xx_init_queues(struct qla_hw_data *ha)
if (req) { if (req) {
/* Clear outstanding commands array. */ /* Clear outstanding commands array. */
req->options &= ~BIT_0; req->options &= ~BIT_0;
ret = qla25xx_init_req_que(base_vha, req, req->options); ret = qla25xx_init_req_que(base_vha, req);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING DEBUG2_17(printk(KERN_WARNING
"%s Req que:%d init failed\n", __func__, "%s Req que:%d init failed\n", __func__,
......
...@@ -1707,7 +1707,6 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) ...@@ -1707,7 +1707,6 @@ qla25xx_msix_rsp_q(int irq, void *dev_id)
struct qla_hw_data *ha; struct qla_hw_data *ha;
struct rsp_que *rsp; struct rsp_que *rsp;
struct device_reg_24xx __iomem *reg; struct device_reg_24xx __iomem *reg;
uint16_t msix_disabled_hccr = 0;
rsp = (struct rsp_que *) dev_id; rsp = (struct rsp_que *) dev_id;
if (!rsp) { if (!rsp) {
...@@ -1720,17 +1719,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id) ...@@ -1720,17 +1719,8 @@ qla25xx_msix_rsp_q(int irq, void *dev_id)
spin_lock_irq(&ha->hardware_lock); spin_lock_irq(&ha->hardware_lock);
msix_disabled_hccr = rsp->options;
if (!rsp->id)
msix_disabled_hccr &= __constant_cpu_to_le32(BIT_22);
else
msix_disabled_hccr &= __constant_cpu_to_le32(BIT_6);
qla24xx_process_response_queue(rsp); qla24xx_process_response_queue(rsp);
if (!msix_disabled_hccr)
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
spin_unlock_irq(&ha->hardware_lock); spin_unlock_irq(&ha->hardware_lock);
return IRQ_HANDLED; return IRQ_HANDLED;
......
...@@ -3090,8 +3090,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status) ...@@ -3090,8 +3090,7 @@ qla84xx_verify_chip(struct scsi_qla_host *vha, uint16_t *status)
} }
int int
qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
uint8_t options)
{ {
int rval; int rval;
unsigned long flags; unsigned long flags;
...@@ -3101,7 +3100,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3101,7 +3100,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
mcp->mb[0] = MBC_INITIALIZE_MULTIQ; mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
mcp->mb[1] = options; mcp->mb[1] = req->options;
mcp->mb[2] = MSW(LSD(req->dma)); mcp->mb[2] = MSW(LSD(req->dma));
mcp->mb[3] = LSW(LSD(req->dma)); mcp->mb[3] = LSW(LSD(req->dma));
mcp->mb[6] = MSW(MSD(req->dma)); mcp->mb[6] = MSW(MSD(req->dma));
...@@ -3128,7 +3127,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3128,7 +3127,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
mcp->tov = 60; mcp->tov = 60;
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(options & BIT_0)) { if (!(req->options & BIT_0)) {
WRT_REG_DWORD(&reg->req_q_in, 0); WRT_REG_DWORD(&reg->req_q_in, 0);
WRT_REG_DWORD(&reg->req_q_out, 0); WRT_REG_DWORD(&reg->req_q_out, 0);
} }
...@@ -3142,8 +3141,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req, ...@@ -3142,8 +3141,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req,
} }
int int
qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
uint8_t options)
{ {
int rval; int rval;
unsigned long flags; unsigned long flags;
...@@ -3153,7 +3151,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, ...@@ -3153,7 +3151,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
mcp->mb[0] = MBC_INITIALIZE_MULTIQ; mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
mcp->mb[1] = options; mcp->mb[1] = rsp->options;
mcp->mb[2] = MSW(LSD(rsp->dma)); mcp->mb[2] = MSW(LSD(rsp->dma));
mcp->mb[3] = LSW(LSD(rsp->dma)); mcp->mb[3] = LSW(LSD(rsp->dma));
mcp->mb[6] = MSW(MSD(rsp->dma)); mcp->mb[6] = MSW(MSD(rsp->dma));
...@@ -3178,7 +3176,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, ...@@ -3178,7 +3176,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp,
mcp->tov = 60; mcp->tov = 60;
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(options & BIT_0)) { if (!(rsp->options & BIT_0)) {
WRT_REG_DWORD(&reg->rsp_q_out, 0); WRT_REG_DWORD(&reg->rsp_q_out, 0);
WRT_REG_DWORD(&reg->rsp_q_in, 0); WRT_REG_DWORD(&reg->rsp_q_in, 0);
} }
......
...@@ -471,7 +471,7 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -471,7 +471,7 @@ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req)
if (req) { if (req) {
req->options |= BIT_0; req->options |= BIT_0;
ret = qla25xx_init_req_que(vha, req, req->options); ret = qla25xx_init_req_que(vha, req);
} }
if (ret == QLA_SUCCESS) if (ret == QLA_SUCCESS)
qla25xx_free_req_que(vha, req); qla25xx_free_req_que(vha, req);
...@@ -486,7 +486,7 @@ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -486,7 +486,7 @@ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
if (rsp) { if (rsp) {
rsp->options |= BIT_0; rsp->options |= BIT_0;
ret = qla25xx_init_rsp_que(vha, rsp, rsp->options); ret = qla25xx_init_rsp_que(vha, rsp);
} }
if (ret == QLA_SUCCESS) if (ret == QLA_SUCCESS)
qla25xx_free_rsp_que(vha, rsp); qla25xx_free_rsp_que(vha, rsp);
...@@ -502,7 +502,7 @@ int qla25xx_update_req_que(struct scsi_qla_host *vha, uint8_t que, uint8_t qos) ...@@ -502,7 +502,7 @@ int qla25xx_update_req_que(struct scsi_qla_host *vha, uint8_t que, uint8_t qos)
req->options |= BIT_3; req->options |= BIT_3;
req->qos = qos; req->qos = qos;
ret = qla25xx_init_req_que(vha, req, req->options); ret = qla25xx_init_req_que(vha, req);
if (ret != QLA_SUCCESS) if (ret != QLA_SUCCESS)
DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__)); DEBUG2_17(printk(KERN_WARNING "%s failed\n", __func__));
/* restore options bit */ /* restore options bit */
...@@ -632,7 +632,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, ...@@ -632,7 +632,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
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);
ret = qla25xx_init_req_que(base_vha, req, options); ret = qla25xx_init_req_que(base_vha, req);
if (ret != QLA_SUCCESS) { if (ret != QLA_SUCCESS) {
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__); qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
mutex_lock(&ha->vport_lock); mutex_lock(&ha->vport_lock);
...@@ -710,7 +710,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options, ...@@ -710,7 +710,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
if (ret) if (ret)
goto que_failed; goto que_failed;
ret = qla25xx_init_rsp_que(base_vha, rsp, options); ret = qla25xx_init_rsp_que(base_vha, rsp);
if (ret != QLA_SUCCESS) { if (ret != QLA_SUCCESS) {
qla_printk(KERN_WARNING, ha, "%s failed\n", __func__); qla_printk(KERN_WARNING, ha, "%s failed\n", __func__);
mutex_lock(&ha->vport_lock); mutex_lock(&ha->vport_lock);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册