aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_iocb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_iocb.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c158
1 files changed, 100 insertions, 58 deletions
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index 0c145c9e0cd9..6d2bd97c3b11 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -11,8 +11,9 @@
11 11
12#include <scsi/scsi_tcq.h> 12#include <scsi/scsi_tcq.h>
13 13
14static request_t *qla2x00_req_pkt(scsi_qla_host_t *); 14static request_t *qla2x00_req_pkt(struct scsi_qla_host *, struct req_que *,
15static void qla2x00_isp_cmd(scsi_qla_host_t *); 15 struct rsp_que *rsp);
16static void qla2x00_isp_cmd(struct scsi_qla_host *, struct req_que *);
16 17
17/** 18/**
18 * qla2x00_get_cmd_direction() - Determine control_flag data direction. 19 * qla2x00_get_cmd_direction() - Determine control_flag data direction.
@@ -91,10 +92,9 @@ qla2x00_calc_iocbs_64(uint16_t dsds)
91 * Returns a pointer to the Continuation Type 0 IOCB packet. 92 * Returns a pointer to the Continuation Type 0 IOCB packet.
92 */ 93 */
93static inline cont_entry_t * 94static inline cont_entry_t *
94qla2x00_prep_cont_type0_iocb(scsi_qla_host_t *vha) 95qla2x00_prep_cont_type0_iocb(struct req_que *req, struct scsi_qla_host *vha)
95{ 96{
96 cont_entry_t *cont_pkt; 97 cont_entry_t *cont_pkt;
97 struct req_que *req = vha->hw->req;
98 /* Adjust ring index. */ 98 /* Adjust ring index. */
99 req->ring_index++; 99 req->ring_index++;
100 if (req->ring_index == req->length) { 100 if (req->ring_index == req->length) {
@@ -120,10 +120,9 @@ qla2x00_prep_cont_type0_iocb(scsi_qla_host_t *vha)
120 * Returns a pointer to the continuation type 1 IOCB packet. 120 * Returns a pointer to the continuation type 1 IOCB packet.
121 */ 121 */
122static inline cont_a64_entry_t * 122static inline cont_a64_entry_t *
123qla2x00_prep_cont_type1_iocb(scsi_qla_host_t *vha) 123qla2x00_prep_cont_type1_iocb(struct req_que *req, scsi_qla_host_t *vha)
124{ 124{
125 cont_a64_entry_t *cont_pkt; 125 cont_a64_entry_t *cont_pkt;
126 struct req_que *req = vha->hw->req;
127 126
128 /* Adjust ring index. */ 127 /* Adjust ring index. */
129 req->ring_index++; 128 req->ring_index++;
@@ -160,6 +159,8 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
160 struct scsi_cmnd *cmd; 159 struct scsi_cmnd *cmd;
161 struct scatterlist *sg; 160 struct scatterlist *sg;
162 int i; 161 int i;
162 struct req_que *req;
163 uint16_t que_id;
163 164
164 cmd = sp->cmd; 165 cmd = sp->cmd;
165 166
@@ -174,6 +175,8 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
174 } 175 }
175 176
176 vha = sp->vha; 177 vha = sp->vha;
178 que_id = vha->req_ques[0];
179 req = vha->hw->req_q_map[que_id];
177 180
178 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 181 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
179 182
@@ -191,7 +194,7 @@ void qla2x00_build_scsi_iocbs_32(srb_t *sp, cmd_entry_t *cmd_pkt,
191 * Seven DSDs are available in the Continuation 194 * Seven DSDs are available in the Continuation
192 * Type 0 IOCB. 195 * Type 0 IOCB.
193 */ 196 */
194 cont_pkt = qla2x00_prep_cont_type0_iocb(vha); 197 cont_pkt = qla2x00_prep_cont_type0_iocb(req, vha);
195 cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address; 198 cur_dsd = (uint32_t *)&cont_pkt->dseg_0_address;
196 avail_dsds = 7; 199 avail_dsds = 7;
197 } 200 }
@@ -219,6 +222,8 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
219 struct scsi_cmnd *cmd; 222 struct scsi_cmnd *cmd;
220 struct scatterlist *sg; 223 struct scatterlist *sg;
221 int i; 224 int i;
225 struct req_que *req;
226 uint16_t que_id;
222 227
223 cmd = sp->cmd; 228 cmd = sp->cmd;
224 229
@@ -233,6 +238,8 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
233 } 238 }
234 239
235 vha = sp->vha; 240 vha = sp->vha;
241 que_id = vha->req_ques[0];
242 req = vha->hw->req_q_map[que_id];
236 243
237 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp)); 244 cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
238 245
@@ -251,7 +258,7 @@ void qla2x00_build_scsi_iocbs_64(srb_t *sp, cmd_entry_t *cmd_pkt,
251 * Five DSDs are available in the Continuation 258 * Five DSDs are available in the Continuation
252 * Type 1 IOCB. 259 * Type 1 IOCB.
253 */ 260 */
254 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 261 cont_pkt = qla2x00_prep_cont_type1_iocb(req, vha);
255 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 262 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address;
256 avail_dsds = 5; 263 avail_dsds = 5;
257 } 264 }
@@ -287,6 +294,7 @@ qla2x00_start_scsi(srb_t *sp)
287 struct device_reg_2xxx __iomem *reg; 294 struct device_reg_2xxx __iomem *reg;
288 struct qla_hw_data *ha; 295 struct qla_hw_data *ha;
289 struct req_que *req; 296 struct req_que *req;
297 struct rsp_que *rsp;
290 298
291 /* Setup device pointers. */ 299 /* Setup device pointers. */
292 ret = 0; 300 ret = 0;
@@ -294,13 +302,15 @@ qla2x00_start_scsi(srb_t *sp)
294 ha = vha->hw; 302 ha = vha->hw;
295 reg = &ha->iobase->isp; 303 reg = &ha->iobase->isp;
296 cmd = sp->cmd; 304 cmd = sp->cmd;
297 req = ha->req; 305 req = ha->req_q_map[0];
306 rsp = ha->rsp_q_map[0];
298 /* So we know we haven't pci_map'ed anything yet */ 307 /* So we know we haven't pci_map'ed anything yet */
299 tot_dsds = 0; 308 tot_dsds = 0;
300 309
301 /* Send marker if required */ 310 /* Send marker if required */
302 if (vha->marker_needed != 0) { 311 if (vha->marker_needed != 0) {
303 if (qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) 312 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL)
313 != QLA_SUCCESS)
304 return (QLA_FUNCTION_FAILED); 314 return (QLA_FUNCTION_FAILED);
305 vha->marker_needed = 0; 315 vha->marker_needed = 0;
306 } 316 }
@@ -392,8 +402,8 @@ qla2x00_start_scsi(srb_t *sp)
392 402
393 /* Manage unprocessed RIO/ZIO commands in response queue. */ 403 /* Manage unprocessed RIO/ZIO commands in response queue. */
394 if (vha->flags.process_response_queue && 404 if (vha->flags.process_response_queue &&
395 ha->rsp->ring_ptr->signature != RESPONSE_PROCESSED) 405 rsp->ring_ptr->signature != RESPONSE_PROCESSED)
396 qla2x00_process_response_queue(vha); 406 qla2x00_process_response_queue(rsp);
397 407
398 spin_unlock_irqrestore(&ha->hardware_lock, flags); 408 spin_unlock_irqrestore(&ha->hardware_lock, flags);
399 return (QLA_SUCCESS); 409 return (QLA_SUCCESS);
@@ -419,8 +429,9 @@ queuing_error:
419 * Returns non-zero if a failure occurred, else zero. 429 * Returns non-zero if a failure occurred, else zero.
420 */ 430 */
421int 431int
422__qla2x00_marker(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t lun, 432__qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
423 uint8_t type) 433 struct rsp_que *rsp, uint16_t loop_id,
434 uint16_t lun, uint8_t type)
424{ 435{
425 mrk_entry_t *mrk; 436 mrk_entry_t *mrk;
426 struct mrk_entry_24xx *mrk24; 437 struct mrk_entry_24xx *mrk24;
@@ -428,7 +439,7 @@ __qla2x00_marker(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t lun,
428 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 439 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
429 440
430 mrk24 = NULL; 441 mrk24 = NULL;
431 mrk = (mrk_entry_t *)qla2x00_req_pkt(base_vha); 442 mrk = (mrk_entry_t *)qla2x00_req_pkt(vha, req, rsp);
432 if (mrk == NULL) { 443 if (mrk == NULL) {
433 DEBUG2_3(printk("%s(%ld): failed to allocate Marker IOCB.\n", 444 DEBUG2_3(printk("%s(%ld): failed to allocate Marker IOCB.\n",
434 __func__, base_vha->host_no)); 445 __func__, base_vha->host_no));
@@ -453,22 +464,22 @@ __qla2x00_marker(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t lun,
453 } 464 }
454 wmb(); 465 wmb();
455 466
456 qla2x00_isp_cmd(base_vha); 467 qla2x00_isp_cmd(vha, req);
457 468
458 return (QLA_SUCCESS); 469 return (QLA_SUCCESS);
459} 470}
460 471
461int 472int
462qla2x00_marker(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t lun, 473qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req,
463 uint8_t type) 474 struct rsp_que *rsp, uint16_t loop_id, uint16_t lun,
475 uint8_t type)
464{ 476{
465 int ret; 477 int ret;
466 unsigned long flags = 0; 478 unsigned long flags = 0;
467 struct qla_hw_data *ha = vha->hw;
468 479
469 spin_lock_irqsave(&ha->hardware_lock, flags); 480 spin_lock_irqsave(&vha->hw->hardware_lock, flags);
470 ret = __qla2x00_marker(vha, loop_id, lun, type); 481 ret = __qla2x00_marker(vha, req, rsp, loop_id, lun, type);
471 spin_unlock_irqrestore(&ha->hardware_lock, flags); 482 spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
472 483
473 return (ret); 484 return (ret);
474} 485}
@@ -482,27 +493,32 @@ qla2x00_marker(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t lun,
482 * Returns NULL if function failed, else, a pointer to the request packet. 493 * Returns NULL if function failed, else, a pointer to the request packet.
483 */ 494 */
484static request_t * 495static request_t *
485qla2x00_req_pkt(scsi_qla_host_t *vha) 496qla2x00_req_pkt(struct scsi_qla_host *vha, struct req_que *req,
497 struct rsp_que *rsp)
486{ 498{
487 struct qla_hw_data *ha = vha->hw; 499 struct qla_hw_data *ha = vha->hw;
488 device_reg_t __iomem *reg = ha->iobase; 500 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
489 request_t *pkt = NULL; 501 request_t *pkt = NULL;
490 uint16_t cnt; 502 uint16_t cnt;
491 uint32_t *dword_ptr; 503 uint32_t *dword_ptr;
492 uint32_t timer; 504 uint32_t timer;
493 uint16_t req_cnt = 1; 505 uint16_t req_cnt = 1;
494 struct req_que *req = ha->req;
495 506
496 /* Wait 1 second for slot. */ 507 /* Wait 1 second for slot. */
497 for (timer = HZ; timer; timer--) { 508 for (timer = HZ; timer; timer--) {
498 if ((req_cnt + 2) >= req->cnt) { 509 if ((req_cnt + 2) >= req->cnt) {
499 /* Calculate number of free request entries. */ 510 /* Calculate number of free request entries. */
500 if (IS_FWI2_CAPABLE(ha)) 511 if (ha->mqenable)
501 cnt = (uint16_t)RD_REG_DWORD( 512 cnt = (uint16_t)
502 &reg->isp24.req_q_out); 513 RD_REG_DWORD(&reg->isp25mq.req_q_out);
503 else 514 else {
504 cnt = qla2x00_debounce_register( 515 if (IS_FWI2_CAPABLE(ha))
505 ISP_REQ_Q_OUT(ha, &reg->isp)); 516 cnt = (uint16_t)RD_REG_DWORD(
517 &reg->isp24.req_q_out);
518 else
519 cnt = qla2x00_debounce_register(
520 ISP_REQ_Q_OUT(ha, &reg->isp));
521 }
506 if (req->ring_index < cnt) 522 if (req->ring_index < cnt)
507 req->cnt = cnt - req->ring_index; 523 req->cnt = cnt - req->ring_index;
508 else 524 else
@@ -536,7 +552,7 @@ qla2x00_req_pkt(scsi_qla_host_t *vha)
536 /* Check for pending interrupts. */ 552 /* Check for pending interrupts. */
537 /* During init we issue marker directly */ 553 /* During init we issue marker directly */
538 if (!vha->marker_needed && !vha->flags.init_done) 554 if (!vha->marker_needed && !vha->flags.init_done)
539 qla2x00_poll(ha->rsp); 555 qla2x00_poll(rsp);
540 spin_lock_irq(&ha->hardware_lock); 556 spin_lock_irq(&ha->hardware_lock);
541 } 557 }
542 if (!pkt) { 558 if (!pkt) {
@@ -553,11 +569,10 @@ qla2x00_req_pkt(scsi_qla_host_t *vha)
553 * Note: The caller must hold the hardware lock before calling this routine. 569 * Note: The caller must hold the hardware lock before calling this routine.
554 */ 570 */
555static void 571static void
556qla2x00_isp_cmd(scsi_qla_host_t *vha) 572qla2x00_isp_cmd(struct scsi_qla_host *vha, struct req_que *req)
557{ 573{
558 struct qla_hw_data *ha = vha->hw; 574 struct qla_hw_data *ha = vha->hw;
559 device_reg_t __iomem *reg = ha->iobase; 575 device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
560 struct req_que *req = ha->req;
561 576
562 DEBUG5(printk("%s(): IOCB data:\n", __func__)); 577 DEBUG5(printk("%s(): IOCB data:\n", __func__));
563 DEBUG5(qla2x00_dump_buffer( 578 DEBUG5(qla2x00_dump_buffer(
@@ -572,12 +587,17 @@ qla2x00_isp_cmd(scsi_qla_host_t *vha)
572 req->ring_ptr++; 587 req->ring_ptr++;
573 588
574 /* Set chip new ring index. */ 589 /* Set chip new ring index. */
575 if (IS_FWI2_CAPABLE(ha)) { 590 if (ha->mqenable)
576 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index); 591 RD_REG_DWORD(&reg->isp25mq.req_q_out);
577 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in); 592 else {
578 } else { 593 if (IS_FWI2_CAPABLE(ha)) {
579 WRT_REG_WORD(ISP_REQ_Q_IN(ha, &reg->isp), req->ring_index); 594 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index);
580 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, &reg->isp)); 595 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in);
596 } else {
597 WRT_REG_WORD(ISP_REQ_Q_IN(ha, &reg->isp),
598 req->ring_index);
599 RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, &reg->isp));
600 }
581 } 601 }
582 602
583} 603}
@@ -622,6 +642,8 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
622 struct scsi_cmnd *cmd; 642 struct scsi_cmnd *cmd;
623 struct scatterlist *sg; 643 struct scatterlist *sg;
624 int i; 644 int i;
645 uint16_t que_id;
646 struct req_que *req;
625 647
626 cmd = sp->cmd; 648 cmd = sp->cmd;
627 649
@@ -636,6 +658,8 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
636 } 658 }
637 659
638 vha = sp->vha; 660 vha = sp->vha;
661 que_id = vha->req_ques[0];
662 req = vha->hw->req_q_map[que_id];
639 663
640 /* Set transfer direction */ 664 /* Set transfer direction */
641 if (cmd->sc_data_direction == DMA_TO_DEVICE) { 665 if (cmd->sc_data_direction == DMA_TO_DEVICE) {
@@ -666,7 +690,7 @@ qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
666 * Five DSDs are available in the Continuation 690 * Five DSDs are available in the Continuation
667 * Type 1 IOCB. 691 * Type 1 IOCB.
668 */ 692 */
669 cont_pkt = qla2x00_prep_cont_type1_iocb(vha); 693 cont_pkt = qla2x00_prep_cont_type1_iocb(req, vha);
670 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address; 694 cur_dsd = (uint32_t *)cont_pkt->dseg_0_address;
671 avail_dsds = 5; 695 avail_dsds = 5;
672 } 696 }
@@ -691,8 +715,6 @@ qla24xx_start_scsi(srb_t *sp)
691{ 715{
692 int ret, nseg; 716 int ret, nseg;
693 unsigned long flags; 717 unsigned long flags;
694 scsi_qla_host_t *vha;
695 struct scsi_cmnd *cmd;
696 uint32_t *clr_ptr; 718 uint32_t *clr_ptr;
697 uint32_t index; 719 uint32_t index;
698 uint32_t handle; 720 uint32_t handle;
@@ -700,23 +722,32 @@ qla24xx_start_scsi(srb_t *sp)
700 uint16_t cnt; 722 uint16_t cnt;
701 uint16_t req_cnt; 723 uint16_t req_cnt;
702 uint16_t tot_dsds; 724 uint16_t tot_dsds;
703 struct device_reg_24xx __iomem *reg; 725 struct req_que *req = NULL;
704 struct qla_hw_data *ha; 726 struct rsp_que *rsp = NULL;
705 struct req_que *req; 727 struct scsi_cmnd *cmd = sp->cmd;
728 struct scsi_qla_host *vha = sp->vha;
729 struct qla_hw_data *ha = vha->hw;
730 device_reg_t __iomem *reg;
731 uint16_t que_id;
706 732
707 /* Setup device pointers. */ 733 /* Setup device pointers. */
708 ret = 0; 734 ret = 0;
709 vha = sp->vha; 735 que_id = vha->req_ques[0];
710 ha = vha->hw; 736
711 reg = &ha->iobase->isp24; 737 req = ha->req_q_map[que_id];
712 cmd = sp->cmd; 738 reg = ISP_QUE_REG(ha, req->id);
713 req = ha->req; 739
740 if (req->rsp)
741 rsp = req->rsp;
742 else
743 rsp = ha->rsp_q_map[que_id];
714 /* So we know we haven't pci_map'ed anything yet */ 744 /* So we know we haven't pci_map'ed anything yet */
715 tot_dsds = 0; 745 tot_dsds = 0;
716 746
717 /* Send marker if required */ 747 /* Send marker if required */
718 if (vha->marker_needed != 0) { 748 if (vha->marker_needed != 0) {
719 if (qla2x00_marker(vha, 0, 0, MK_SYNC_ALL) != QLA_SUCCESS) 749 if (qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL)
750 != QLA_SUCCESS)
720 return QLA_FUNCTION_FAILED; 751 return QLA_FUNCTION_FAILED;
721 vha->marker_needed = 0; 752 vha->marker_needed = 0;
722 } 753 }
@@ -749,7 +780,13 @@ qla24xx_start_scsi(srb_t *sp)
749 780
750 req_cnt = qla24xx_calc_iocbs(tot_dsds); 781 req_cnt = qla24xx_calc_iocbs(tot_dsds);
751 if (req->cnt < (req_cnt + 2)) { 782 if (req->cnt < (req_cnt + 2)) {
752 cnt = (uint16_t)RD_REG_DWORD_RELAXED(&reg->req_q_out); 783 if (ha->mqenable)
784 cnt = (uint16_t)
785 RD_REG_DWORD_RELAXED(&reg->isp25mq.req_q_out);
786 else
787 cnt = (uint16_t)
788 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_out);
789
753 if (req->ring_index < cnt) 790 if (req->ring_index < cnt)
754 req->cnt = cnt - req->ring_index; 791 req->cnt = cnt - req->ring_index;
755 else 792 else
@@ -809,13 +846,17 @@ qla24xx_start_scsi(srb_t *sp)
809 sp->flags |= SRB_DMA_VALID; 846 sp->flags |= SRB_DMA_VALID;
810 847
811 /* Set chip new ring index. */ 848 /* Set chip new ring index. */
812 WRT_REG_DWORD(&reg->req_q_in, req->ring_index); 849 if (ha->mqenable)
813 RD_REG_DWORD_RELAXED(&reg->req_q_in); /* PCI Posting. */ 850 WRT_REG_DWORD(&reg->isp25mq.req_q_in, req->ring_index);
851 else {
852 WRT_REG_DWORD(&reg->isp24.req_q_in, req->ring_index);
853 RD_REG_DWORD_RELAXED(&reg->isp24.req_q_in);
854 }
814 855
815 /* Manage unprocessed RIO/ZIO commands in response queue. */ 856 /* Manage unprocessed RIO/ZIO commands in response queue. */
816 if (vha->flags.process_response_queue && 857 if (vha->flags.process_response_queue &&
817 ha->rsp->ring_ptr->signature != RESPONSE_PROCESSED) 858 rsp->ring_ptr->signature != RESPONSE_PROCESSED)
818 qla24xx_process_response_queue(vha); 859 qla24xx_process_response_queue(rsp);
819 860
820 spin_unlock_irqrestore(&ha->hardware_lock, flags); 861 spin_unlock_irqrestore(&ha->hardware_lock, flags);
821 return QLA_SUCCESS; 862 return QLA_SUCCESS;
@@ -828,3 +869,4 @@ queuing_error:
828 869
829 return QLA_FUNCTION_FAILED; 870 return QLA_FUNCTION_FAILED;
830} 871}
872