diff options
author | Joe Carnuccio <joe.carnuccio@qlogic.com> | 2014-04-11 16:54:37 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-05-19 07:31:04 -0400 |
commit | 7c6300e3941da8e84bf5faf1358bf3909c5ef97e (patch) | |
tree | ea02446a9501baeb915d8ef39fa74f97cb7271bf /drivers/scsi/qla2xxx | |
parent | c04964017ac418d8d559aa32fd2ad6876fa162f7 (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.h | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 8 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 12 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_tmpl.c | 6 |
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 | } |