aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorJoe Carnuccio <joe.carnuccio@qlogic.com>2014-04-11 16:54:37 -0400
committerChristoph Hellwig <hch@lst.de>2014-05-19 07:31:04 -0400
commit7c6300e3941da8e84bf5faf1358bf3909c5ef97e (patch)
treeea02446a9501baeb915d8ef39fa74f97cb7271bf /drivers/scsi/qla2xxx
parentc04964017ac418d8d559aa32fd2ad6876fa162f7 (diff)
qla2xxx: ISP27xx queue index shadow registers.
For ISP27xx use the request/response queue index shadow registers to avoid directly access them on the PCI bus. Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h3
-rw-r--r--drivers/scsi/qla2xxx/qla_fw.h5
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c8
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c12
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c10
-rw-r--r--drivers/scsi/qla2xxx/qla_tmpl.c6
6 files changed, 33 insertions, 11 deletions
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 6c9724c1c5a4..5c590d40e676 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2685,6 +2685,7 @@ struct rsp_que {
2685 uint32_t __iomem *rsp_q_out; 2685 uint32_t __iomem *rsp_q_out;
2686 uint16_t ring_index; 2686 uint16_t ring_index;
2687 uint16_t out_ptr; 2687 uint16_t out_ptr;
2688 uint16_t *in_ptr; /* queue shadow in index */
2688 uint16_t length; 2689 uint16_t length;
2689 uint16_t options; 2690 uint16_t options;
2690 uint16_t rid; 2691 uint16_t rid;
@@ -2711,6 +2712,7 @@ struct req_que {
2711 uint32_t __iomem *req_q_out; 2712 uint32_t __iomem *req_q_out;
2712 uint16_t ring_index; 2713 uint16_t ring_index;
2713 uint16_t in_ptr; 2714 uint16_t in_ptr;
2715 uint16_t *out_ptr; /* queue shadow out index */
2714 uint16_t cnt; 2716 uint16_t cnt;
2715 uint16_t length; 2717 uint16_t length;
2716 uint16_t options; 2718 uint16_t options;
@@ -3019,6 +3021,7 @@ struct qla_hw_data {
3019 (((ha)->fw_attributes_h << 16 | (ha)->fw_attributes) & BIT_22)) 3021 (((ha)->fw_attributes_h << 16 | (ha)->fw_attributes) & BIT_22))
3020#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha)) 3022#define IS_ATIO_MSIX_CAPABLE(ha) (IS_QLA83XX(ha))
3021#define IS_TGT_MODE_CAPABLE(ha) (ha->tgt.atio_q_length) 3023#define IS_TGT_MODE_CAPABLE(ha) (ha->tgt.atio_q_length)
3024#define IS_SHADOW_REG_CAPABLE(ha) (IS_QLA27XX(ha))
3022 3025
3023 /* HBA serial number */ 3026 /* HBA serial number */
3024 uint8_t serial0; 3027 uint8_t serial0;
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index a9f86e713f75..2cdedd9e9f4d 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -371,7 +371,10 @@ struct init_cb_24xx {
371 * BIT 14 = Data Rate bit 1 371 * BIT 14 = Data Rate bit 1
372 * BIT 15 = Data Rate bit 2 372 * BIT 15 = Data Rate bit 2
373 * BIT 16 = Enable 75 ohm Termination Select 373 * BIT 16 = Enable 75 ohm Termination Select
374 * BIT 17-31 = Reserved 374 * BIT 17-28 = Reserved
375 * BIT 29 = Enable response queue 0 in index shadowing
376 * BIT 30 = Enable request queue 0 out index shadowing
377 * BIT 31 = Reserved
375 */ 378 */
376 uint32_t firmware_options_3; 379 uint32_t firmware_options_3;
377 uint16_t qos; 380 uint16_t qos;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 2d97d7c146e4..20b569e93340 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -2062,6 +2062,10 @@ qla24xx_config_rings(struct scsi_qla_host *vha)
2062 icb->atio_q_address[0] = cpu_to_le32(LSD(ha->tgt.atio_dma)); 2062 icb->atio_q_address[0] = cpu_to_le32(LSD(ha->tgt.atio_dma));
2063 icb->atio_q_address[1] = cpu_to_le32(MSD(ha->tgt.atio_dma)); 2063 icb->atio_q_address[1] = cpu_to_le32(MSD(ha->tgt.atio_dma));
2064 2064
2065 if (IS_SHADOW_REG_CAPABLE(ha))
2066 icb->firmware_options_2 |=
2067 __constant_cpu_to_le32(BIT_30|BIT_29);
2068
2065 if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) { 2069 if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
2066 icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS); 2070 icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS);
2067 icb->rid = __constant_cpu_to_le16(rid); 2071 icb->rid = __constant_cpu_to_le16(rid);
@@ -2139,6 +2143,8 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
2139 req = ha->req_q_map[que]; 2143 req = ha->req_q_map[que];
2140 if (!req) 2144 if (!req)
2141 continue; 2145 continue;
2146 req->out_ptr = (void *)(req->ring + req->length);
2147 *req->out_ptr = 0;
2142 for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) 2148 for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++)
2143 req->outstanding_cmds[cnt] = NULL; 2149 req->outstanding_cmds[cnt] = NULL;
2144 2150
@@ -2154,6 +2160,8 @@ qla2x00_init_rings(scsi_qla_host_t *vha)
2154 rsp = ha->rsp_q_map[que]; 2160 rsp = ha->rsp_q_map[que];
2155 if (!rsp) 2161 if (!rsp)
2156 continue; 2162 continue;
2163 rsp->in_ptr = (void *)(rsp->ring + rsp->length);
2164 *rsp->in_ptr = 0;
2157 /* Initialize response queue entries */ 2165 /* Initialize response queue entries */
2158 if (IS_QLAFX00(ha)) 2166 if (IS_QLAFX00(ha))
2159 qlafx00_init_response_q_entries(rsp); 2167 qlafx00_init_response_q_entries(rsp);
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 8707a64a0770..af83132141f7 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -1478,8 +1478,8 @@ qla24xx_start_scsi(srb_t *sp)
1478 tot_dsds = nseg; 1478 tot_dsds = nseg;
1479 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds); 1479 req_cnt = qla24xx_calc_iocbs(vha, tot_dsds);
1480 if (req->cnt < (req_cnt + 2)) { 1480 if (req->cnt < (req_cnt + 2)) {
1481 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1481 cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr :
1482 1482 RD_REG_DWORD_RELAXED(req->req_q_out);
1483 if (req->ring_index < cnt) 1483 if (req->ring_index < cnt)
1484 req->cnt = cnt - req->ring_index; 1484 req->cnt = cnt - req->ring_index;
1485 else 1485 else
@@ -1697,8 +1697,8 @@ qla24xx_dif_start_scsi(srb_t *sp)
1697 tot_prot_dsds = nseg; 1697 tot_prot_dsds = nseg;
1698 tot_dsds += nseg; 1698 tot_dsds += nseg;
1699 if (req->cnt < (req_cnt + 2)) { 1699 if (req->cnt < (req_cnt + 2)) {
1700 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 1700 cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr :
1701 1701 RD_REG_DWORD_RELAXED(req->req_q_out);
1702 if (req->ring_index < cnt) 1702 if (req->ring_index < cnt)
1703 req->cnt = cnt - req->ring_index; 1703 req->cnt = cnt - req->ring_index;
1704 else 1704 else
@@ -2825,8 +2825,8 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds)
2825 2825
2826 /* Check for room on request queue. */ 2826 /* Check for room on request queue. */
2827 if (req->cnt < req_cnt + 2) { 2827 if (req->cnt < req_cnt + 2) {
2828 cnt = RD_REG_DWORD_RELAXED(req->req_q_out); 2828 cnt = IS_SHADOW_REG_CAPABLE(ha) ? *req->out_ptr :
2829 2829 RD_REG_DWORD_RELAXED(req->req_q_out);
2830 if (req->ring_index < cnt) 2830 if (req->ring_index < cnt)
2831 req->cnt = cnt - req->ring_index; 2831 req->cnt = cnt - req->ring_index;
2832 else 2832 else
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index 01d9f54a3222..7f39e3605027 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -3735,6 +3735,9 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
3735 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3, 3735 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d3,
3736 "Entered %s.\n", __func__); 3736 "Entered %s.\n", __func__);
3737 3737
3738 if (IS_SHADOW_REG_CAPABLE(ha))
3739 req->options |= BIT_13;
3740
3738 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3741 mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
3739 mcp->mb[1] = req->options; 3742 mcp->mb[1] = req->options;
3740 mcp->mb[2] = MSW(LSD(req->dma)); 3743 mcp->mb[2] = MSW(LSD(req->dma));
@@ -3754,7 +3757,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
3754 /* que in ptr index */ 3757 /* que in ptr index */
3755 mcp->mb[8] = 0; 3758 mcp->mb[8] = 0;
3756 /* que out ptr index */ 3759 /* que out ptr index */
3757 mcp->mb[9] = 0; 3760 mcp->mb[9] = *req->out_ptr = 0;
3758 mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7| 3761 mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7|
3759 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; 3762 MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
3760 mcp->in_mb = MBX_0; 3763 mcp->in_mb = MBX_0;
@@ -3801,6 +3804,9 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
3801 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6, 3804 ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10d6,
3802 "Entered %s.\n", __func__); 3805 "Entered %s.\n", __func__);
3803 3806
3807 if (IS_SHADOW_REG_CAPABLE(ha))
3808 rsp->options |= BIT_13;
3809
3804 mcp->mb[0] = MBC_INITIALIZE_MULTIQ; 3810 mcp->mb[0] = MBC_INITIALIZE_MULTIQ;
3805 mcp->mb[1] = rsp->options; 3811 mcp->mb[1] = rsp->options;
3806 mcp->mb[2] = MSW(LSD(rsp->dma)); 3812 mcp->mb[2] = MSW(LSD(rsp->dma));
@@ -3815,7 +3821,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
3815 3821
3816 mcp->mb[4] = rsp->id; 3822 mcp->mb[4] = rsp->id;
3817 /* que in ptr index */ 3823 /* que in ptr index */
3818 mcp->mb[8] = 0; 3824 mcp->mb[8] = *rsp->in_ptr = 0;
3819 /* que out ptr index */ 3825 /* que out ptr index */
3820 mcp->mb[9] = 0; 3826 mcp->mb[9] = 0;
3821 mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7 3827 mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7
diff --git a/drivers/scsi/qla2xxx/qla_tmpl.c b/drivers/scsi/qla2xxx/qla_tmpl.c
index a9fa9b72b31a..cb9a0c4bc419 100644
--- a/drivers/scsi/qla2xxx/qla_tmpl.c
+++ b/drivers/scsi/qla2xxx/qla_tmpl.c
@@ -679,7 +679,8 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha,
679 if (req || !buf) { 679 if (req || !buf) {
680 qla27xx_insert16(i, buf, len); 680 qla27xx_insert16(i, buf, len);
681 qla27xx_insert16(1, buf, len); 681 qla27xx_insert16(1, buf, len);
682 qla27xx_insert32(0, buf, len); 682 qla27xx_insert32(req && req->out_ptr ?
683 *req->out_ptr : 0, buf, len);
683 count++; 684 count++;
684 } 685 }
685 } 686 }
@@ -689,7 +690,8 @@ qla27xx_fwdt_entry_t274(struct scsi_qla_host *vha,
689 if (rsp || !buf) { 690 if (rsp || !buf) {
690 qla27xx_insert16(i, buf, len); 691 qla27xx_insert16(i, buf, len);
691 qla27xx_insert16(1, buf, len); 692 qla27xx_insert16(1, buf, len);
692 qla27xx_insert32(0, buf, len); 693 qla27xx_insert32(rsp && rsp->in_ptr ?
694 *rsp->in_ptr : 0, buf, len);
693 count++; 695 count++;
694 } 696 }
695 } 697 }