diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2009-03-24 12:07:55 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-04-03 10:22:44 -0400 |
commit | 08029990b25b76b1bc167336358bd21812567f2a (patch) | |
tree | 87cb617366a61bd643818996cc6186e817e23b63 /drivers/scsi | |
parent | 534841b3c110b0f149513c7695751879951d3f22 (diff) |
[SCSI] qla2xxx: Refactor request/response-queue register handling.
Original code used an overabundance of indirect pointers to
function helpers. Instead, the driver can exploit the immutable
properties of a queue's ISP-association and ID, which are both
known at queue initialization-time.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 17 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 37 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 18 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mid.c | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 27 |
5 files changed, 31 insertions, 78 deletions
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index e0c5bb54b258..c2bc67c42648 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -372,10 +372,10 @@ struct device_reg_2xxx { | |||
372 | }; | 372 | }; |
373 | 373 | ||
374 | struct device_reg_25xxmq { | 374 | struct device_reg_25xxmq { |
375 | volatile uint32_t req_q_in; | 375 | uint32_t req_q_in; |
376 | volatile uint32_t req_q_out; | 376 | uint32_t req_q_out; |
377 | volatile uint32_t rsp_q_in; | 377 | uint32_t rsp_q_in; |
378 | volatile uint32_t rsp_q_out; | 378 | uint32_t rsp_q_out; |
379 | }; | 379 | }; |
380 | 380 | ||
381 | typedef union { | 381 | typedef union { |
@@ -2102,9 +2102,6 @@ struct isp_operations { | |||
2102 | 2102 | ||
2103 | int (*get_flash_version) (struct scsi_qla_host *, void *); | 2103 | int (*get_flash_version) (struct scsi_qla_host *, void *); |
2104 | int (*start_scsi) (srb_t *); | 2104 | int (*start_scsi) (srb_t *); |
2105 | void (*wrt_req_reg) (struct qla_hw_data *, uint16_t, uint16_t); | ||
2106 | void (*wrt_rsp_reg) (struct qla_hw_data *, uint16_t, uint16_t); | ||
2107 | uint16_t (*rd_req_reg) (struct qla_hw_data *, uint16_t); | ||
2108 | }; | 2105 | }; |
2109 | 2106 | ||
2110 | /* MSI-X Support *************************************************************/ | 2107 | /* MSI-X Support *************************************************************/ |
@@ -2200,6 +2197,8 @@ struct rsp_que { | |||
2200 | dma_addr_t dma; | 2197 | dma_addr_t dma; |
2201 | response_t *ring; | 2198 | response_t *ring; |
2202 | response_t *ring_ptr; | 2199 | response_t *ring_ptr; |
2200 | uint32_t __iomem *rsp_q_in; /* FWI2-capable only. */ | ||
2201 | uint32_t __iomem *rsp_q_out; | ||
2203 | uint16_t ring_index; | 2202 | uint16_t ring_index; |
2204 | uint16_t out_ptr; | 2203 | uint16_t out_ptr; |
2205 | uint16_t length; | 2204 | uint16_t length; |
@@ -2217,6 +2216,8 @@ struct req_que { | |||
2217 | dma_addr_t dma; | 2216 | dma_addr_t dma; |
2218 | request_t *ring; | 2217 | request_t *ring; |
2219 | request_t *ring_ptr; | 2218 | request_t *ring_ptr; |
2219 | uint32_t __iomem *req_q_in; /* FWI2-capable only. */ | ||
2220 | uint32_t __iomem *req_q_out; | ||
2220 | uint16_t ring_index; | 2221 | uint16_t ring_index; |
2221 | uint16_t in_ptr; | 2222 | uint16_t in_ptr; |
2222 | uint16_t cnt; | 2223 | uint16_t cnt; |
@@ -2277,7 +2278,7 @@ struct qla_hw_data { | |||
2277 | 2278 | ||
2278 | #define MIN_IOBASE_LEN 0x100 | 2279 | #define MIN_IOBASE_LEN 0x100 |
2279 | /* Multi queue data structs */ | 2280 | /* Multi queue data structs */ |
2280 | device_reg_t *mqiobase; | 2281 | device_reg_t __iomem *mqiobase; |
2281 | uint16_t msix_count; | 2282 | uint16_t msix_count; |
2282 | uint8_t mqenable; | 2283 | uint8_t mqenable; |
2283 | struct req_que **req_q_map; | 2284 | struct req_que **req_q_map; |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 2258152b1f41..a8abbb95730d 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
@@ -776,7 +776,7 @@ qla24xx_start_scsi(srb_t *sp) | |||
776 | 776 | ||
777 | req_cnt = qla24xx_calc_iocbs(tot_dsds); | 777 | req_cnt = qla24xx_calc_iocbs(tot_dsds); |
778 | if (req->cnt < (req_cnt + 2)) { | 778 | if (req->cnt < (req_cnt + 2)) { |
779 | cnt = ha->isp_ops->rd_req_reg(ha, req->id); | 779 | cnt = RD_REG_DWORD_RELAXED(req->req_q_out); |
780 | 780 | ||
781 | if (req->ring_index < cnt) | 781 | if (req->ring_index < cnt) |
782 | req->cnt = cnt - req->ring_index; | 782 | req->cnt = cnt - req->ring_index; |
@@ -836,7 +836,8 @@ qla24xx_start_scsi(srb_t *sp) | |||
836 | sp->flags |= SRB_DMA_VALID; | 836 | sp->flags |= SRB_DMA_VALID; |
837 | 837 | ||
838 | /* Set chip new ring index. */ | 838 | /* Set chip new ring index. */ |
839 | ha->isp_ops->wrt_req_reg(ha, req->id, req->ring_index); | 839 | WRT_REG_DWORD(req->req_q_in, req->ring_index); |
840 | RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); | ||
840 | 841 | ||
841 | /* Manage unprocessed RIO/ZIO commands in response queue. */ | 842 | /* Manage unprocessed RIO/ZIO commands in response queue. */ |
842 | if (vha->flags.process_response_queue && | 843 | if (vha->flags.process_response_queue && |
@@ -854,35 +855,3 @@ queuing_error: | |||
854 | 855 | ||
855 | return QLA_FUNCTION_FAILED; | 856 | return QLA_FUNCTION_FAILED; |
856 | } | 857 | } |
857 | |||
858 | uint16_t | ||
859 | qla24xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id) | ||
860 | { | ||
861 | device_reg_t __iomem *reg = (void *) ha->iobase; | ||
862 | return RD_REG_DWORD_RELAXED(®->isp24.req_q_out); | ||
863 | } | ||
864 | |||
865 | uint16_t | ||
866 | qla25xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id) | ||
867 | { | ||
868 | device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id; | ||
869 | return RD_REG_DWORD_RELAXED(®->isp25mq.req_q_out); | ||
870 | } | ||
871 | |||
872 | void | ||
873 | qla24xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index) | ||
874 | { | ||
875 | device_reg_t __iomem *reg = (void *) ha->iobase; | ||
876 | WRT_REG_DWORD(®->isp24.req_q_in, index); | ||
877 | RD_REG_DWORD_RELAXED(®->isp24.req_q_in); | ||
878 | } | ||
879 | |||
880 | void | ||
881 | qla25xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index) | ||
882 | { | ||
883 | device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id; | ||
884 | struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp; | ||
885 | WRT_REG_DWORD(®->isp25mq.req_q_in, index); | ||
886 | RD_REG_DWORD(&ioreg->hccr); /* PCI posting */ | ||
887 | } | ||
888 | |||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index f250e5b7897c..8e91f4aec977 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -1499,7 +1499,6 @@ qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0) | |||
1499 | void | 1499 | void |
1500 | qla24xx_process_response_queue(struct rsp_que *rsp) | 1500 | qla24xx_process_response_queue(struct rsp_que *rsp) |
1501 | { | 1501 | { |
1502 | struct qla_hw_data *ha = rsp->hw; | ||
1503 | struct sts_entry_24xx *pkt; | 1502 | struct sts_entry_24xx *pkt; |
1504 | struct scsi_qla_host *vha; | 1503 | struct scsi_qla_host *vha; |
1505 | 1504 | ||
@@ -1553,7 +1552,7 @@ qla24xx_process_response_queue(struct rsp_que *rsp) | |||
1553 | } | 1552 | } |
1554 | 1553 | ||
1555 | /* Adjust ring index */ | 1554 | /* Adjust ring index */ |
1556 | ha->isp_ops->wrt_rsp_reg(ha, rsp->id, rsp->ring_index); | 1555 | WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index); |
1557 | } | 1556 | } |
1558 | 1557 | ||
1559 | static void | 1558 | static void |
@@ -2117,18 +2116,3 @@ int qla25xx_request_irq(struct rsp_que *rsp) | |||
2117 | msix->rsp = rsp; | 2116 | msix->rsp = rsp; |
2118 | return ret; | 2117 | return ret; |
2119 | } | 2118 | } |
2120 | |||
2121 | void | ||
2122 | qla25xx_wrt_rsp_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index) | ||
2123 | { | ||
2124 | device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id; | ||
2125 | WRT_REG_DWORD(®->isp25mq.rsp_q_out, index); | ||
2126 | } | ||
2127 | |||
2128 | void | ||
2129 | qla24xx_wrt_rsp_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index) | ||
2130 | { | ||
2131 | device_reg_t __iomem *reg = (void *) ha->iobase; | ||
2132 | WRT_REG_DWORD(®->isp24.rsp_q_out, index); | ||
2133 | } | ||
2134 | |||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 785c61279e6e..e2bd36e7e885 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -584,6 +584,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, | |||
584 | struct req_que *req = NULL; | 584 | struct req_que *req = NULL; |
585 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | 585 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); |
586 | uint16_t que_id = 0; | 586 | uint16_t que_id = 0; |
587 | device_reg_t __iomem *reg; | ||
587 | 588 | ||
588 | req = kzalloc(sizeof(struct req_que), GFP_KERNEL); | 589 | req = kzalloc(sizeof(struct req_que), GFP_KERNEL); |
589 | if (req == NULL) { | 590 | if (req == NULL) { |
@@ -631,6 +632,9 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, | |||
631 | req->ring_index = 0; | 632 | req->ring_index = 0; |
632 | req->cnt = req->length; | 633 | req->cnt = req->length; |
633 | req->id = que_id; | 634 | req->id = que_id; |
635 | reg = ISP_QUE_REG(ha, que_id); | ||
636 | req->req_q_in = ®->isp25mq.req_q_in; | ||
637 | req->req_q_out = ®->isp25mq.req_q_out; | ||
634 | req->max_q_depth = ha->req_q_map[0]->max_q_depth; | 638 | req->max_q_depth = ha->req_q_map[0]->max_q_depth; |
635 | mutex_unlock(&ha->vport_lock); | 639 | mutex_unlock(&ha->vport_lock); |
636 | 640 | ||
@@ -658,7 +662,8 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options, | |||
658 | int ret = 0; | 662 | int ret = 0; |
659 | struct rsp_que *rsp = NULL; | 663 | struct rsp_que *rsp = NULL; |
660 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | 664 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); |
661 | uint16_t que_id = 0;; | 665 | uint16_t que_id = 0; |
666 | device_reg_t __iomem *reg; | ||
662 | 667 | ||
663 | rsp = kzalloc(sizeof(struct rsp_que), GFP_KERNEL); | 668 | rsp = kzalloc(sizeof(struct rsp_que), GFP_KERNEL); |
664 | if (rsp == NULL) { | 669 | if (rsp == NULL) { |
@@ -706,6 +711,9 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options, | |||
706 | rsp->ring_ptr = rsp->ring; | 711 | rsp->ring_ptr = rsp->ring; |
707 | rsp->ring_index = 0; | 712 | rsp->ring_index = 0; |
708 | rsp->id = que_id; | 713 | rsp->id = que_id; |
714 | reg = ISP_QUE_REG(ha, que_id); | ||
715 | rsp->rsp_q_in = ®->isp25mq.rsp_q_in; | ||
716 | rsp->rsp_q_out = ®->isp25mq.rsp_q_out; | ||
709 | mutex_unlock(&ha->vport_lock); | 717 | mutex_unlock(&ha->vport_lock); |
710 | 718 | ||
711 | ret = qla25xx_request_irq(rsp); | 719 | ret = qla25xx_request_irq(rsp); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3ddfa889e949..a6761ff73e24 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1351,9 +1351,6 @@ static struct isp_operations qla2100_isp_ops = { | |||
1351 | .write_optrom = qla2x00_write_optrom_data, | 1351 | .write_optrom = qla2x00_write_optrom_data, |
1352 | .get_flash_version = qla2x00_get_flash_version, | 1352 | .get_flash_version = qla2x00_get_flash_version, |
1353 | .start_scsi = qla2x00_start_scsi, | 1353 | .start_scsi = qla2x00_start_scsi, |
1354 | .wrt_req_reg = NULL, | ||
1355 | .wrt_rsp_reg = NULL, | ||
1356 | .rd_req_reg = NULL, | ||
1357 | }; | 1354 | }; |
1358 | 1355 | ||
1359 | static struct isp_operations qla2300_isp_ops = { | 1356 | static struct isp_operations qla2300_isp_ops = { |
@@ -1389,9 +1386,6 @@ static struct isp_operations qla2300_isp_ops = { | |||
1389 | .write_optrom = qla2x00_write_optrom_data, | 1386 | .write_optrom = qla2x00_write_optrom_data, |
1390 | .get_flash_version = qla2x00_get_flash_version, | 1387 | .get_flash_version = qla2x00_get_flash_version, |
1391 | .start_scsi = qla2x00_start_scsi, | 1388 | .start_scsi = qla2x00_start_scsi, |
1392 | .wrt_req_reg = NULL, | ||
1393 | .wrt_rsp_reg = NULL, | ||
1394 | .rd_req_reg = NULL, | ||
1395 | }; | 1389 | }; |
1396 | 1390 | ||
1397 | static struct isp_operations qla24xx_isp_ops = { | 1391 | static struct isp_operations qla24xx_isp_ops = { |
@@ -1427,9 +1421,6 @@ static struct isp_operations qla24xx_isp_ops = { | |||
1427 | .write_optrom = qla24xx_write_optrom_data, | 1421 | .write_optrom = qla24xx_write_optrom_data, |
1428 | .get_flash_version = qla24xx_get_flash_version, | 1422 | .get_flash_version = qla24xx_get_flash_version, |
1429 | .start_scsi = qla24xx_start_scsi, | 1423 | .start_scsi = qla24xx_start_scsi, |
1430 | .wrt_req_reg = qla24xx_wrt_req_reg, | ||
1431 | .wrt_rsp_reg = qla24xx_wrt_rsp_reg, | ||
1432 | .rd_req_reg = qla24xx_rd_req_reg, | ||
1433 | }; | 1424 | }; |
1434 | 1425 | ||
1435 | static struct isp_operations qla25xx_isp_ops = { | 1426 | static struct isp_operations qla25xx_isp_ops = { |
@@ -1465,9 +1456,6 @@ static struct isp_operations qla25xx_isp_ops = { | |||
1465 | .write_optrom = qla24xx_write_optrom_data, | 1456 | .write_optrom = qla24xx_write_optrom_data, |
1466 | .get_flash_version = qla24xx_get_flash_version, | 1457 | .get_flash_version = qla24xx_get_flash_version, |
1467 | .start_scsi = qla24xx_start_scsi, | 1458 | .start_scsi = qla24xx_start_scsi, |
1468 | .wrt_req_reg = qla24xx_wrt_req_reg, | ||
1469 | .wrt_rsp_reg = qla24xx_wrt_rsp_reg, | ||
1470 | .rd_req_reg = qla24xx_rd_req_reg, | ||
1471 | }; | 1459 | }; |
1472 | 1460 | ||
1473 | static struct isp_operations qla81xx_isp_ops = { | 1461 | static struct isp_operations qla81xx_isp_ops = { |
@@ -1503,9 +1491,6 @@ static struct isp_operations qla81xx_isp_ops = { | |||
1503 | .write_optrom = qla24xx_write_optrom_data, | 1491 | .write_optrom = qla24xx_write_optrom_data, |
1504 | .get_flash_version = qla24xx_get_flash_version, | 1492 | .get_flash_version = qla24xx_get_flash_version, |
1505 | .start_scsi = qla24xx_start_scsi, | 1493 | .start_scsi = qla24xx_start_scsi, |
1506 | .wrt_req_reg = qla24xx_wrt_req_reg, | ||
1507 | .wrt_rsp_reg = qla24xx_wrt_rsp_reg, | ||
1508 | .rd_req_reg = qla24xx_rd_req_reg, | ||
1509 | }; | 1494 | }; |
1510 | 1495 | ||
1511 | static inline void | 1496 | static inline void |
@@ -1927,10 +1912,16 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1927 | ha->rsp_q_map[0] = rsp; | 1912 | ha->rsp_q_map[0] = rsp; |
1928 | ha->req_q_map[0] = req; | 1913 | ha->req_q_map[0] = req; |
1929 | 1914 | ||
1915 | /* FWI2-capable only. */ | ||
1916 | req->req_q_in = &ha->iobase->isp24.req_q_in; | ||
1917 | req->req_q_out = &ha->iobase->isp24.req_q_out; | ||
1918 | rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; | ||
1919 | rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; | ||
1930 | if (ha->mqenable) { | 1920 | if (ha->mqenable) { |
1931 | ha->isp_ops->wrt_req_reg = qla25xx_wrt_req_reg; | 1921 | req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; |
1932 | ha->isp_ops->wrt_rsp_reg = qla25xx_wrt_rsp_reg; | 1922 | req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; |
1933 | ha->isp_ops->rd_req_reg = qla25xx_rd_req_reg; | 1923 | rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; |
1924 | rsp->rsp_q_out = &ha->mqiobase->isp25mq.rsp_q_out; | ||
1934 | } | 1925 | } |
1935 | 1926 | ||
1936 | if (qla2x00_initialize_adapter(base_vha)) { | 1927 | if (qla2x00_initialize_adapter(base_vha)) { |