forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4
kernel/drivers/scsi/qla2xxx/qla_isr.c
....@@ -1,8 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * QLogic Fibre Channel HBA Driver
34 * Copyright (c) 2003-2014 QLogic Corporation
4
- *
5
- * See LICENSE.qla2xxx for copyright and licensing details.
65 */
76 #include "qla_def.h"
87 #include "qla_target.h"
....@@ -22,10 +21,156 @@
2221 static void qla2x00_status_cont_entry(struct rsp_que *, sts_cont_entry_t *);
2322 static int qla2x00_error_entry(scsi_qla_host_t *, struct rsp_que *,
2423 sts_entry_t *);
24
+static void qla27xx_process_purex_fpin(struct scsi_qla_host *vha,
25
+ struct purex_item *item);
26
+static struct purex_item *qla24xx_alloc_purex_item(scsi_qla_host_t *vha,
27
+ uint16_t size);
28
+static struct purex_item *qla24xx_copy_std_pkt(struct scsi_qla_host *vha,
29
+ void *pkt);
30
+static struct purex_item *qla27xx_copy_fpin_pkt(struct scsi_qla_host *vha,
31
+ void **pkt, struct rsp_que **rsp);
32
+
33
+static void
34
+qla27xx_process_purex_fpin(struct scsi_qla_host *vha, struct purex_item *item)
35
+{
36
+ void *pkt = &item->iocb;
37
+ uint16_t pkt_size = item->size;
38
+
39
+ ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x508d,
40
+ "%s: Enter\n", __func__);
41
+
42
+ ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x508e,
43
+ "-------- ELS REQ -------\n");
44
+ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x508f,
45
+ pkt, pkt_size);
46
+
47
+ fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt);
48
+}
49
+
50
+const char *const port_state_str[] = {
51
+ "Unknown",
52
+ "UNCONFIGURED",
53
+ "DEAD",
54
+ "LOST",
55
+ "ONLINE"
56
+};
57
+
58
+static void
59
+qla24xx_process_abts(struct scsi_qla_host *vha, struct purex_item *pkt)
60
+{
61
+ struct abts_entry_24xx *abts =
62
+ (struct abts_entry_24xx *)&pkt->iocb;
63
+ struct qla_hw_data *ha = vha->hw;
64
+ struct els_entry_24xx *rsp_els;
65
+ struct abts_entry_24xx *abts_rsp;
66
+ dma_addr_t dma;
67
+ uint32_t fctl;
68
+ int rval;
69
+
70
+ ql_dbg(ql_dbg_init, vha, 0x0286, "%s: entered.\n", __func__);
71
+
72
+ ql_log(ql_log_warn, vha, 0x0287,
73
+ "Processing ABTS xchg=%#x oxid=%#x rxid=%#x seqid=%#x seqcnt=%#x\n",
74
+ abts->rx_xch_addr_to_abort, abts->ox_id, abts->rx_id,
75
+ abts->seq_id, abts->seq_cnt);
76
+ ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x0287,
77
+ "-------- ABTS RCV -------\n");
78
+ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x0287,
79
+ (uint8_t *)abts, sizeof(*abts));
80
+
81
+ rsp_els = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_els), &dma,
82
+ GFP_KERNEL);
83
+ if (!rsp_els) {
84
+ ql_log(ql_log_warn, vha, 0x0287,
85
+ "Failed allocate dma buffer ABTS/ELS RSP.\n");
86
+ return;
87
+ }
88
+
89
+ /* terminate exchange */
90
+ rsp_els->entry_type = ELS_IOCB_TYPE;
91
+ rsp_els->entry_count = 1;
92
+ rsp_els->nport_handle = cpu_to_le16(~0);
93
+ rsp_els->rx_xchg_address = abts->rx_xch_addr_to_abort;
94
+ rsp_els->control_flags = cpu_to_le16(EPD_RX_XCHG);
95
+ ql_dbg(ql_dbg_init, vha, 0x0283,
96
+ "Sending ELS Response to terminate exchange %#x...\n",
97
+ abts->rx_xch_addr_to_abort);
98
+ ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x0283,
99
+ "-------- ELS RSP -------\n");
100
+ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x0283,
101
+ (uint8_t *)rsp_els, sizeof(*rsp_els));
102
+ rval = qla2x00_issue_iocb(vha, rsp_els, dma, 0);
103
+ if (rval) {
104
+ ql_log(ql_log_warn, vha, 0x0288,
105
+ "%s: iocb failed to execute -> %x\n", __func__, rval);
106
+ } else if (rsp_els->comp_status) {
107
+ ql_log(ql_log_warn, vha, 0x0289,
108
+ "%s: iocb failed to complete -> completion=%#x subcode=(%#x,%#x)\n",
109
+ __func__, rsp_els->comp_status,
110
+ rsp_els->error_subcode_1, rsp_els->error_subcode_2);
111
+ } else {
112
+ ql_dbg(ql_dbg_init, vha, 0x028a,
113
+ "%s: abort exchange done.\n", __func__);
114
+ }
115
+
116
+ /* send ABTS response */
117
+ abts_rsp = (void *)rsp_els;
118
+ memset(abts_rsp, 0, sizeof(*abts_rsp));
119
+ abts_rsp->entry_type = ABTS_RSP_TYPE;
120
+ abts_rsp->entry_count = 1;
121
+ abts_rsp->nport_handle = abts->nport_handle;
122
+ abts_rsp->vp_idx = abts->vp_idx;
123
+ abts_rsp->sof_type = abts->sof_type & 0xf0;
124
+ abts_rsp->rx_xch_addr = abts->rx_xch_addr;
125
+ abts_rsp->d_id[0] = abts->s_id[0];
126
+ abts_rsp->d_id[1] = abts->s_id[1];
127
+ abts_rsp->d_id[2] = abts->s_id[2];
128
+ abts_rsp->r_ctl = FC_ROUTING_BLD | FC_R_CTL_BLD_BA_ACC;
129
+ abts_rsp->s_id[0] = abts->d_id[0];
130
+ abts_rsp->s_id[1] = abts->d_id[1];
131
+ abts_rsp->s_id[2] = abts->d_id[2];
132
+ abts_rsp->cs_ctl = abts->cs_ctl;
133
+ /* include flipping bit23 in fctl */
134
+ fctl = ~(abts->f_ctl[2] | 0x7F) << 16 |
135
+ FC_F_CTL_LAST_SEQ | FC_F_CTL_END_SEQ | FC_F_CTL_SEQ_INIT;
136
+ abts_rsp->f_ctl[0] = fctl >> 0 & 0xff;
137
+ abts_rsp->f_ctl[1] = fctl >> 8 & 0xff;
138
+ abts_rsp->f_ctl[2] = fctl >> 16 & 0xff;
139
+ abts_rsp->type = FC_TYPE_BLD;
140
+ abts_rsp->rx_id = abts->rx_id;
141
+ abts_rsp->ox_id = abts->ox_id;
142
+ abts_rsp->payload.ba_acc.aborted_rx_id = abts->rx_id;
143
+ abts_rsp->payload.ba_acc.aborted_ox_id = abts->ox_id;
144
+ abts_rsp->payload.ba_acc.high_seq_cnt = cpu_to_le16(~0);
145
+ abts_rsp->rx_xch_addr_to_abort = abts->rx_xch_addr_to_abort;
146
+ ql_dbg(ql_dbg_init, vha, 0x028b,
147
+ "Sending BA ACC response to ABTS %#x...\n",
148
+ abts->rx_xch_addr_to_abort);
149
+ ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x028b,
150
+ "-------- ELS RSP -------\n");
151
+ ql_dump_buffer(ql_dbg_init + ql_dbg_verbose, vha, 0x028b,
152
+ (uint8_t *)abts_rsp, sizeof(*abts_rsp));
153
+ rval = qla2x00_issue_iocb(vha, abts_rsp, dma, 0);
154
+ if (rval) {
155
+ ql_log(ql_log_warn, vha, 0x028c,
156
+ "%s: iocb failed to execute -> %x\n", __func__, rval);
157
+ } else if (abts_rsp->comp_status) {
158
+ ql_log(ql_log_warn, vha, 0x028d,
159
+ "%s: iocb failed to complete -> completion=%#x subcode=(%#x,%#x)\n",
160
+ __func__, abts_rsp->comp_status,
161
+ abts_rsp->payload.error.subcode1,
162
+ abts_rsp->payload.error.subcode2);
163
+ } else {
164
+ ql_dbg(ql_dbg_init, vha, 0x028ea,
165
+ "%s: done.\n", __func__);
166
+ }
167
+
168
+ dma_free_coherent(&ha->pdev->dev, sizeof(*rsp_els), rsp_els, dma);
169
+}
25170
26171 /**
27172 * qla2100_intr_handler() - Process interrupts for the ISP2100 and ISP2200.
28
- * @irq:
173
+ * @irq: interrupt number
29174 * @dev_id: SCSI driver HA context
30175 *
31176 * Called by system whenever the host adapter generates an interrupt.
....@@ -41,7 +186,7 @@
41186 int status;
42187 unsigned long iter;
43188 uint16_t hccr;
44
- uint16_t mb[4];
189
+ uint16_t mb[8];
45190 struct rsp_que *rsp;
46191 unsigned long flags;
47192
....@@ -59,7 +204,7 @@
59204 spin_lock_irqsave(&ha->hardware_lock, flags);
60205 vha = pci_get_drvdata(ha->pdev);
61206 for (iter = 50; iter--; ) {
62
- hccr = RD_REG_WORD(&reg->hccr);
207
+ hccr = rd_reg_word(&reg->hccr);
63208 if (qla2x00_check_reg16_for_disconnect(vha, hccr))
64209 break;
65210 if (hccr & HCCR_RISC_PAUSE) {
....@@ -71,18 +216,18 @@
71216 * bit to be cleared. Schedule a big hammer to get
72217 * out of the RISC PAUSED state.
73218 */
74
- WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
75
- RD_REG_WORD(&reg->hccr);
219
+ wrt_reg_word(&reg->hccr, HCCR_RESET_RISC);
220
+ rd_reg_word(&reg->hccr);
76221
77
- ha->isp_ops->fw_dump(vha, 1);
222
+ ha->isp_ops->fw_dump(vha);
78223 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
79224 break;
80
- } else if ((RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) == 0)
225
+ } else if ((rd_reg_word(&reg->istatus) & ISR_RISC_INT) == 0)
81226 break;
82227
83
- if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
84
- WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
85
- RD_REG_WORD(&reg->hccr);
228
+ if (rd_reg_word(&reg->semaphore) & BIT_0) {
229
+ wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
230
+ rd_reg_word(&reg->hccr);
86231
87232 /* Get mailbox data. */
88233 mb[0] = RD_MAILBOX_REG(ha, reg, 0);
....@@ -101,13 +246,13 @@
101246 mb[0]);
102247 }
103248 /* Release mailbox registers. */
104
- WRT_REG_WORD(&reg->semaphore, 0);
105
- RD_REG_WORD(&reg->semaphore);
249
+ wrt_reg_word(&reg->semaphore, 0);
250
+ rd_reg_word(&reg->semaphore);
106251 } else {
107252 qla2x00_process_response_queue(rsp);
108253
109
- WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
110
- RD_REG_WORD(&reg->hccr);
254
+ wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
255
+ rd_reg_word(&reg->hccr);
111256 }
112257 }
113258 qla2x00_handle_mbx_completion(ha, status);
....@@ -144,7 +289,7 @@
144289
145290 /**
146291 * qla2300_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
147
- * @irq:
292
+ * @irq: interrupt number
148293 * @dev_id: SCSI driver HA context
149294 *
150295 * Called by system whenever the host adapter generates an interrupt.
....@@ -160,7 +305,7 @@
160305 unsigned long iter;
161306 uint32_t stat;
162307 uint16_t hccr;
163
- uint16_t mb[4];
308
+ uint16_t mb[8];
164309 struct rsp_que *rsp;
165310 struct qla_hw_data *ha;
166311 unsigned long flags;
....@@ -179,14 +324,14 @@
179324 spin_lock_irqsave(&ha->hardware_lock, flags);
180325 vha = pci_get_drvdata(ha->pdev);
181326 for (iter = 50; iter--; ) {
182
- stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
327
+ stat = rd_reg_dword(&reg->u.isp2300.host_status);
183328 if (qla2x00_check_reg32_for_disconnect(vha, stat))
184329 break;
185330 if (stat & HSR_RISC_PAUSED) {
186331 if (unlikely(pci_channel_offline(ha->pdev)))
187332 break;
188333
189
- hccr = RD_REG_WORD(&reg->hccr);
334
+ hccr = rd_reg_word(&reg->hccr);
190335
191336 if (hccr & (BIT_15 | BIT_13 | BIT_11 | BIT_8))
192337 ql_log(ql_log_warn, vha, 0x5026,
....@@ -202,10 +347,10 @@
202347 * interrupt bit to be cleared. Schedule a big
203348 * hammer to get out of the RISC PAUSED state.
204349 */
205
- WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
206
- RD_REG_WORD(&reg->hccr);
350
+ wrt_reg_word(&reg->hccr, HCCR_RESET_RISC);
351
+ rd_reg_word(&reg->hccr);
207352
208
- ha->isp_ops->fw_dump(vha, 1);
353
+ ha->isp_ops->fw_dump(vha);
209354 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
210355 break;
211356 } else if ((stat & HSR_RISC_INT) == 0)
....@@ -220,7 +365,7 @@
220365 status |= MBX_INTERRUPT;
221366
222367 /* Release mailbox registers. */
223
- WRT_REG_WORD(&reg->semaphore, 0);
368
+ wrt_reg_word(&reg->semaphore, 0);
224369 break;
225370 case 0x12:
226371 mb[0] = MSW(stat);
....@@ -248,8 +393,8 @@
248393 "Unrecognized interrupt type (%d).\n", stat & 0xff);
249394 break;
250395 }
251
- WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
252
- RD_REG_WORD_RELAXED(&reg->hccr);
396
+ wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
397
+ rd_reg_word_relaxed(&reg->hccr);
253398 }
254399 qla2x00_handle_mbx_completion(ha, status);
255400 spin_unlock_irqrestore(&ha->hardware_lock, flags);
....@@ -267,7 +412,7 @@
267412 {
268413 uint16_t cnt;
269414 uint32_t mboxes;
270
- uint16_t __iomem *wptr;
415
+ __le16 __iomem *wptr;
271416 struct qla_hw_data *ha = vha->hw;
272417 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
273418
....@@ -283,15 +428,15 @@
283428 ha->flags.mbox_int = 1;
284429 ha->mailbox_out[0] = mb0;
285430 mboxes >>= 1;
286
- wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 1);
431
+ wptr = MAILBOX_REG(ha, reg, 1);
287432
288433 for (cnt = 1; cnt < ha->mbx_count; cnt++) {
289434 if (IS_QLA2200(ha) && cnt == 8)
290
- wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
435
+ wptr = MAILBOX_REG(ha, reg, 8);
291436 if ((cnt == 4 || cnt == 5) && (mboxes & BIT_0))
292437 ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
293438 else if (mboxes & BIT_0)
294
- ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
439
+ ha->mailbox_out[cnt] = rd_reg_word(wptr);
295440
296441 wptr++;
297442 mboxes >>= 1;
....@@ -306,19 +451,19 @@
306451 int rval;
307452 struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
308453 struct device_reg_82xx __iomem *reg82 = &vha->hw->iobase->isp82;
309
- uint16_t __iomem *wptr;
454
+ __le16 __iomem *wptr;
310455 uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
311456
312457 /* Seed data -- mailbox1 -> mailbox7. */
313458 if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw))
314
- wptr = (uint16_t __iomem *)&reg24->mailbox1;
459
+ wptr = &reg24->mailbox1;
315460 else if (IS_QLA8044(vha->hw))
316
- wptr = (uint16_t __iomem *)&reg82->mailbox_out[1];
461
+ wptr = &reg82->mailbox_out[1];
317462 else
318463 return;
319464
320465 for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
321
- mb[cnt] = RD_REG_WORD(wptr);
466
+ mb[cnt] = rd_reg_word(wptr);
322467
323468 ql_dbg(ql_dbg_async, vha, 0x5021,
324469 "Inter-Driver Communication %s -- "
....@@ -366,7 +511,7 @@
366511 static const char *const link_speeds[] = {
367512 "1", "2", "?", "4", "8", "16", "32", "10"
368513 };
369
-#define QLA_LAST_SPEED 7
514
+#define QLA_LAST_SPEED (ARRAY_SIZE(link_speeds) - 1)
370515
371516 if (IS_QLA2100(ha) || IS_QLA2200(ha))
372517 return link_speeds[0];
....@@ -611,6 +756,212 @@
611756 return NULL;
612757 }
613758
759
+/* Shall be called only on supported adapters. */
760
+static void
761
+qla27xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb)
762
+{
763
+ struct qla_hw_data *ha = vha->hw;
764
+ bool reset_isp_needed = 0;
765
+
766
+ ql_log(ql_log_warn, vha, 0x02f0,
767
+ "MPI Heartbeat stop. MPI reset is%s needed. "
768
+ "MB0[%xh] MB1[%xh] MB2[%xh] MB3[%xh]\n",
769
+ mb[1] & BIT_8 ? "" : " not",
770
+ mb[0], mb[1], mb[2], mb[3]);
771
+
772
+ if ((mb[1] & BIT_8) == 0)
773
+ return;
774
+
775
+ ql_log(ql_log_warn, vha, 0x02f1,
776
+ "MPI Heartbeat stop. FW dump needed\n");
777
+
778
+ if (ql2xfulldump_on_mpifail) {
779
+ ha->isp_ops->fw_dump(vha);
780
+ reset_isp_needed = 1;
781
+ }
782
+
783
+ ha->isp_ops->mpi_fw_dump(vha, 1);
784
+
785
+ if (reset_isp_needed) {
786
+ vha->hw->flags.fw_init_done = 0;
787
+ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
788
+ qla2xxx_wake_dpc(vha);
789
+ }
790
+}
791
+
792
+static struct purex_item *
793
+qla24xx_alloc_purex_item(scsi_qla_host_t *vha, uint16_t size)
794
+{
795
+ struct purex_item *item = NULL;
796
+ uint8_t item_hdr_size = sizeof(*item);
797
+
798
+ if (size > QLA_DEFAULT_PAYLOAD_SIZE) {
799
+ item = kzalloc(item_hdr_size +
800
+ (size - QLA_DEFAULT_PAYLOAD_SIZE), GFP_ATOMIC);
801
+ } else {
802
+ if (atomic_inc_return(&vha->default_item.in_use) == 1) {
803
+ item = &vha->default_item;
804
+ goto initialize_purex_header;
805
+ } else {
806
+ item = kzalloc(item_hdr_size, GFP_ATOMIC);
807
+ }
808
+ }
809
+ if (!item) {
810
+ ql_log(ql_log_warn, vha, 0x5092,
811
+ ">> Failed allocate purex list item.\n");
812
+
813
+ return NULL;
814
+ }
815
+
816
+initialize_purex_header:
817
+ item->vha = vha;
818
+ item->size = size;
819
+ return item;
820
+}
821
+
822
+static void
823
+qla24xx_queue_purex_item(scsi_qla_host_t *vha, struct purex_item *pkt,
824
+ void (*process_item)(struct scsi_qla_host *vha,
825
+ struct purex_item *pkt))
826
+{
827
+ struct purex_list *list = &vha->purex_list;
828
+ ulong flags;
829
+
830
+ pkt->process_item = process_item;
831
+
832
+ spin_lock_irqsave(&list->lock, flags);
833
+ list_add_tail(&pkt->list, &list->head);
834
+ spin_unlock_irqrestore(&list->lock, flags);
835
+
836
+ set_bit(PROCESS_PUREX_IOCB, &vha->dpc_flags);
837
+}
838
+
839
+/**
840
+ * qla24xx_copy_std_pkt() - Copy over purex ELS which is
841
+ * contained in a single IOCB.
842
+ * purex packet.
843
+ * @vha: SCSI driver HA context
844
+ * @pkt: ELS packet
845
+ */
846
+static struct purex_item
847
+*qla24xx_copy_std_pkt(struct scsi_qla_host *vha, void *pkt)
848
+{
849
+ struct purex_item *item;
850
+
851
+ item = qla24xx_alloc_purex_item(vha,
852
+ QLA_DEFAULT_PAYLOAD_SIZE);
853
+ if (!item)
854
+ return item;
855
+
856
+ memcpy(&item->iocb, pkt, sizeof(item->iocb));
857
+ return item;
858
+}
859
+
860
+/**
861
+ * qla27xx_copy_fpin_pkt() - Copy over fpin packets that can
862
+ * span over multiple IOCBs.
863
+ * @vha: SCSI driver HA context
864
+ * @pkt: ELS packet
865
+ * @rsp: Response queue
866
+ */
867
+static struct purex_item *
868
+qla27xx_copy_fpin_pkt(struct scsi_qla_host *vha, void **pkt,
869
+ struct rsp_que **rsp)
870
+{
871
+ struct purex_entry_24xx *purex = *pkt;
872
+ struct rsp_que *rsp_q = *rsp;
873
+ sts_cont_entry_t *new_pkt;
874
+ uint16_t no_bytes = 0, total_bytes = 0, pending_bytes = 0;
875
+ uint16_t buffer_copy_offset = 0;
876
+ uint16_t entry_count, entry_count_remaining;
877
+ struct purex_item *item;
878
+ void *fpin_pkt = NULL;
879
+
880
+ total_bytes = (le16_to_cpu(purex->frame_size) & 0x0FFF)
881
+ - PURX_ELS_HEADER_SIZE;
882
+ pending_bytes = total_bytes;
883
+ entry_count = entry_count_remaining = purex->entry_count;
884
+ no_bytes = (pending_bytes > sizeof(purex->els_frame_payload)) ?
885
+ sizeof(purex->els_frame_payload) : pending_bytes;
886
+ ql_log(ql_log_info, vha, 0x509a,
887
+ "FPIN ELS, frame_size 0x%x, entry count %d\n",
888
+ total_bytes, entry_count);
889
+
890
+ item = qla24xx_alloc_purex_item(vha, total_bytes);
891
+ if (!item)
892
+ return item;
893
+
894
+ fpin_pkt = &item->iocb;
895
+
896
+ memcpy(fpin_pkt, &purex->els_frame_payload[0], no_bytes);
897
+ buffer_copy_offset += no_bytes;
898
+ pending_bytes -= no_bytes;
899
+ --entry_count_remaining;
900
+
901
+ ((response_t *)purex)->signature = RESPONSE_PROCESSED;
902
+ wmb();
903
+
904
+ do {
905
+ while ((total_bytes > 0) && (entry_count_remaining > 0)) {
906
+ if (rsp_q->ring_ptr->signature == RESPONSE_PROCESSED) {
907
+ ql_dbg(ql_dbg_async, vha, 0x5084,
908
+ "Ran out of IOCBs, partial data 0x%x\n",
909
+ buffer_copy_offset);
910
+ cpu_relax();
911
+ continue;
912
+ }
913
+
914
+ new_pkt = (sts_cont_entry_t *)rsp_q->ring_ptr;
915
+ *pkt = new_pkt;
916
+
917
+ if (new_pkt->entry_type != STATUS_CONT_TYPE) {
918
+ ql_log(ql_log_warn, vha, 0x507a,
919
+ "Unexpected IOCB type, partial data 0x%x\n",
920
+ buffer_copy_offset);
921
+ break;
922
+ }
923
+
924
+ rsp_q->ring_index++;
925
+ if (rsp_q->ring_index == rsp_q->length) {
926
+ rsp_q->ring_index = 0;
927
+ rsp_q->ring_ptr = rsp_q->ring;
928
+ } else {
929
+ rsp_q->ring_ptr++;
930
+ }
931
+ no_bytes = (pending_bytes > sizeof(new_pkt->data)) ?
932
+ sizeof(new_pkt->data) : pending_bytes;
933
+ if ((buffer_copy_offset + no_bytes) <= total_bytes) {
934
+ memcpy(((uint8_t *)fpin_pkt +
935
+ buffer_copy_offset), new_pkt->data,
936
+ no_bytes);
937
+ buffer_copy_offset += no_bytes;
938
+ pending_bytes -= no_bytes;
939
+ --entry_count_remaining;
940
+ } else {
941
+ ql_log(ql_log_warn, vha, 0x5044,
942
+ "Attempt to copy more that we got, optimizing..%x\n",
943
+ buffer_copy_offset);
944
+ memcpy(((uint8_t *)fpin_pkt +
945
+ buffer_copy_offset), new_pkt->data,
946
+ total_bytes - buffer_copy_offset);
947
+ }
948
+
949
+ ((response_t *)new_pkt)->signature = RESPONSE_PROCESSED;
950
+ wmb();
951
+ }
952
+
953
+ if (pending_bytes != 0 || entry_count_remaining != 0) {
954
+ ql_log(ql_log_fatal, vha, 0x508b,
955
+ "Dropping partial FPIN, underrun bytes = 0x%x, entry cnts 0x%x\n",
956
+ total_bytes, entry_count_remaining);
957
+ qla24xx_free_purex_item(item);
958
+ return NULL;
959
+ }
960
+ } while (entry_count_remaining > 0);
961
+ host_to_fcp_swap((uint8_t *)&item->iocb, total_bytes);
962
+ return item;
963
+}
964
+
614965 /**
615966 * qla2x00_async_event() - Process aynchronous events.
616967 * @vha: SCSI driver HA context
....@@ -640,7 +991,7 @@
640991 goto skip_rio;
641992 switch (mb[0]) {
642993 case MBA_SCSI_COMPLETION:
643
- handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1]));
994
+ handles[0] = make_handle(mb[2], mb[1]);
644995 handle_cnt = 1;
645996 break;
646997 case MBA_CMPLT_1_16BIT:
....@@ -679,10 +1030,9 @@
6791030 mb[0] = MBA_SCSI_COMPLETION;
6801031 break;
6811032 case MBA_CMPLT_2_32BIT:
682
- handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1]));
683
- handles[1] = le32_to_cpu(
684
- ((uint32_t)(RD_MAILBOX_REG(ha, reg, 7) << 16)) |
685
- RD_MAILBOX_REG(ha, reg, 6));
1033
+ handles[0] = make_handle(mb[2], mb[1]);
1034
+ handles[1] = make_handle(RD_MAILBOX_REG(ha, reg, 7),
1035
+ RD_MAILBOX_REG(ha, reg, 6));
6861036 handle_cnt = 2;
6871037 mb[0] = MBA_SCSI_COMPLETION;
6881038 break;
....@@ -708,13 +1058,28 @@
7081058 break;
7091059
7101060 case MBA_SYSTEM_ERR: /* System Error */
711
- mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ?
712
- RD_REG_WORD(&reg24->mailbox7) : 0;
713
- ql_log(ql_log_warn, vha, 0x5003,
714
- "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh "
715
- "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx);
1061
+ mbx = 0;
1062
+ if (IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
1063
+ IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1064
+ u16 m[4];
7161065
717
- ha->isp_ops->fw_dump(vha, 1);
1066
+ m[0] = rd_reg_word(&reg24->mailbox4);
1067
+ m[1] = rd_reg_word(&reg24->mailbox5);
1068
+ m[2] = rd_reg_word(&reg24->mailbox6);
1069
+ mbx = m[3] = rd_reg_word(&reg24->mailbox7);
1070
+
1071
+ ql_log(ql_log_warn, vha, 0x5003,
1072
+ "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh mbx4=%xh mbx5=%xh mbx6=%xh mbx7=%xh.\n",
1073
+ mb[1], mb[2], mb[3], m[0], m[1], m[2], m[3]);
1074
+ } else
1075
+ ql_log(ql_log_warn, vha, 0x5003,
1076
+ "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n ",
1077
+ mb[1], mb[2], mb[3]);
1078
+
1079
+ if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
1080
+ rd_reg_word(&reg24->mailbox7) & BIT_8)
1081
+ ha->isp_ops->mpi_fw_dump(vha, 1);
1082
+ ha->isp_ops->fw_dump(vha);
7181083 ha->flags.fw_init_done = 0;
7191084 QLA_FW_STOPPED(ha);
7201085
....@@ -765,7 +1130,6 @@
7651130 case MBA_LOOP_INIT_ERR:
7661131 ql_log(ql_log_warn, vha, 0x5090,
7671132 "LOOP INIT ERROR (%x).\n", mb[1]);
768
- ha->isp_ops->fw_dump(vha, 1);
7691133 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
7701134 break;
7711135
....@@ -778,7 +1142,7 @@
7781142 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
7791143 atomic_set(&vha->loop_state, LOOP_DOWN);
7801144 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
781
- qla2x00_mark_all_devices_lost(vha, 1);
1145
+ qla2x00_mark_all_devices_lost(vha);
7821146 }
7831147
7841148 if (vha->vp_idx) {
....@@ -803,13 +1167,15 @@
8031167 "LOOP UP detected (%s Gbps).\n",
8041168 qla2x00_get_link_speed_str(ha, ha->link_data_rate));
8051169
1170
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1171
+ if (mb[2] & BIT_0)
1172
+ ql_log(ql_log_info, vha, 0x11a0,
1173
+ "FEC=enabled (link up).\n");
1174
+ }
1175
+
8061176 vha->flags.management_server_logged_in = 0;
8071177 qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate);
8081178
809
- if (AUTO_DETECT_SFP_SUPPORT(vha)) {
810
- set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags);
811
- qla2xxx_wake_dpc(vha);
812
- }
8131179 break;
8141180
8151181 case MBA_LOOP_DOWN: /* Loop Down Event */
....@@ -818,8 +1184,8 @@
8181184 ha->current_topology = 0;
8191185
8201186 mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha))
821
- ? RD_REG_WORD(&reg24->mailbox4) : 0;
822
- mbx = (IS_P3P_TYPE(ha)) ? RD_REG_WORD(&reg82->mailbox_out[4])
1187
+ ? rd_reg_word(&reg24->mailbox4) : 0;
1188
+ mbx = (IS_P3P_TYPE(ha)) ? rd_reg_word(&reg82->mailbox_out[4])
8231189 : mbx;
8241190 ql_log(ql_log_info, vha, 0x500b,
8251191 "LOOP DOWN detected (%x %x %x %x).\n",
....@@ -834,9 +1200,9 @@
8341200 * Restore for Physical Port only
8351201 */
8361202 if (!vha->vp_idx) {
837
- if (ha->flags.fawwpn_enabled) {
838
- void *wwpn = ha->init_cb->port_name;
839
- memcpy(vha->port_name, wwpn, WWN_SIZE);
1203
+ if (ha->flags.fawwpn_enabled &&
1204
+ (ha->current_topology == ISP_CFG_F)) {
1205
+ memcpy(vha->port_name, ha->port_name, WWN_SIZE);
8401206 fc_host_port_name(vha->host) =
8411207 wwn_to_u64(vha->port_name);
8421208 ql_dbg(ql_dbg_init + ql_dbg_verbose,
....@@ -849,7 +1215,7 @@
8491215 }
8501216
8511217 vha->device_flags |= DFLG_NO_CABLE;
852
- qla2x00_mark_all_devices_lost(vha, 1);
1218
+ qla2x00_mark_all_devices_lost(vha);
8531219 }
8541220
8551221 if (vha->vp_idx) {
....@@ -869,7 +1235,7 @@
8691235 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
8701236 atomic_set(&vha->loop_state, LOOP_DOWN);
8711237 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
872
- qla2x00_mark_all_devices_lost(vha, 1);
1238
+ qla2x00_mark_all_devices_lost(vha);
8731239 }
8741240
8751241 if (vha->vp_idx) {
....@@ -912,7 +1278,7 @@
9121278 atomic_set(&vha->loop_down_timer,
9131279 LOOP_DOWN_TIME);
9141280 if (!N2N_TOPO(ha))
915
- qla2x00_mark_all_devices_lost(vha, 1);
1281
+ qla2x00_mark_all_devices_lost(vha);
9161282 }
9171283
9181284 if (vha->vp_idx) {
....@@ -941,7 +1307,7 @@
9411307 if (!atomic_read(&vha->loop_down_timer))
9421308 atomic_set(&vha->loop_down_timer,
9431309 LOOP_DOWN_TIME);
944
- qla2x00_mark_all_devices_lost(vha, 1);
1310
+ qla2x00_mark_all_devices_lost(vha);
9451311 }
9461312
9471313 if (vha->vp_idx) {
....@@ -1010,7 +1376,6 @@
10101376 "Marking port lost loopid=%04x portid=%06x.\n",
10111377 fcport->loop_id, fcport->d_id.b24);
10121378 if (qla_ini_mode_enabled(vha)) {
1013
- qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
10141379 fcport->logout_on_delete = 0;
10151380 qlt_schedule_sess_for_deletion(fcport);
10161381 }
....@@ -1022,14 +1387,14 @@
10221387 atomic_set(&vha->loop_down_timer,
10231388 LOOP_DOWN_TIME);
10241389 vha->device_flags |= DFLG_NO_CABLE;
1025
- qla2x00_mark_all_devices_lost(vha, 1);
1390
+ qla2x00_mark_all_devices_lost(vha);
10261391 }
10271392
10281393 if (vha->vp_idx) {
10291394 atomic_set(&vha->vp_state, VP_FAILED);
10301395 fc_vport_set_state(vha->fc_vport,
10311396 FC_VPORT_FAILED);
1032
- qla2x00_mark_all_devices_lost(vha, 1);
1397
+ qla2x00_mark_all_devices_lost(vha);
10331398 }
10341399
10351400 vha->flags.management_server_logged_in = 0;
....@@ -1102,11 +1467,23 @@
11021467 struct event_arg ea;
11031468
11041469 memset(&ea, 0, sizeof(ea));
1105
- ea.event = FCME_RSCN;
11061470 ea.id.b24 = rscn_entry;
11071471 ea.id.b.rsvd_1 = rscn_entry >> 24;
1108
- qla2x00_fcport_event_handler(vha, &ea);
1472
+ qla2x00_handle_rscn(vha, &ea);
11091473 qla2x00_post_aen_work(vha, FCH_EVT_RSCN, rscn_entry);
1474
+ }
1475
+ break;
1476
+ case MBA_CONGN_NOTI_RECV:
1477
+ if (!ha->flags.scm_enabled ||
1478
+ mb[1] != QLA_CON_PRIMITIVE_RECEIVED)
1479
+ break;
1480
+
1481
+ if (mb[2] == QLA_CONGESTION_ARB_WARNING) {
1482
+ ql_dbg(ql_dbg_async, vha, 0x509b,
1483
+ "Congestion Warning %04x %04x.\n", mb[1], mb[2]);
1484
+ } else if (mb[2] == QLA_CONGESTION_ARB_ALARM) {
1485
+ ql_log(ql_log_warn, vha, 0x509b,
1486
+ "Congestion Alarm %04x %04x.\n", mb[1], mb[2]);
11101487 }
11111488 break;
11121489 /* case MBA_RIO_RESPONSE: */
....@@ -1186,7 +1563,7 @@
11861563 break;
11871564 case MBA_IDC_NOTIFY:
11881565 if (IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
1189
- mb[4] = RD_REG_WORD(&reg24->mailbox4);
1566
+ mb[4] = rd_reg_word(&reg24->mailbox4);
11901567 if (((mb[2] & 0x7fff) == MBC_PORT_RESET ||
11911568 (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) &&
11921569 (mb[4] & INTERNAL_LOOPBACK_MASK) != 0) {
....@@ -1200,11 +1577,11 @@
12001577 qla2xxx_wake_dpc(vha);
12011578 }
12021579 }
1203
- /* fall through */
1580
+ fallthrough;
12041581 case MBA_IDC_COMPLETE:
12051582 if (ha->notify_lb_portup_comp && !vha->vp_idx)
12061583 complete(&ha->lb_portup_comp);
1207
- /* Fallthru */
1584
+ fallthrough;
12081585 case MBA_IDC_TIME_EXT:
12091586 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) ||
12101587 IS_QLA8044(ha))
....@@ -1212,20 +1589,51 @@
12121589 break;
12131590
12141591 case MBA_IDC_AEN:
1215
- mb[4] = RD_REG_WORD(&reg24->mailbox4);
1216
- mb[5] = RD_REG_WORD(&reg24->mailbox5);
1217
- mb[6] = RD_REG_WORD(&reg24->mailbox6);
1218
- mb[7] = RD_REG_WORD(&reg24->mailbox7);
1219
- qla83xx_handle_8200_aen(vha, mb);
1592
+ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1593
+ qla27xx_handle_8200_aen(vha, mb);
1594
+ } else if (IS_QLA83XX(ha)) {
1595
+ mb[4] = rd_reg_word(&reg24->mailbox4);
1596
+ mb[5] = rd_reg_word(&reg24->mailbox5);
1597
+ mb[6] = rd_reg_word(&reg24->mailbox6);
1598
+ mb[7] = rd_reg_word(&reg24->mailbox7);
1599
+ qla83xx_handle_8200_aen(vha, mb);
1600
+ } else {
1601
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1602
+ "skip Heartbeat processing mb0-3=[0x%04x] [0x%04x] [0x%04x] [0x%04x]\n",
1603
+ mb[0], mb[1], mb[2], mb[3]);
1604
+ }
12201605 break;
12211606
12221607 case MBA_DPORT_DIAGNOSTICS:
12231608 ql_dbg(ql_dbg_async, vha, 0x5052,
1224
- "D-Port Diagnostics: %04x result=%s\n",
1225
- mb[0],
1226
- mb[1] == 0 ? "start" :
1227
- mb[1] == 1 ? "done (pass)" :
1228
- mb[1] == 2 ? "done (error)" : "other");
1609
+ "D-Port Diagnostics: %04x %04x %04x %04x\n",
1610
+ mb[0], mb[1], mb[2], mb[3]);
1611
+ memcpy(vha->dport_data, mb, sizeof(vha->dport_data));
1612
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1613
+ static char *results[] = {
1614
+ "start", "done(pass)", "done(error)", "undefined" };
1615
+ static char *types[] = {
1616
+ "none", "dynamic", "static", "other" };
1617
+ uint result = mb[1] >> 0 & 0x3;
1618
+ uint type = mb[1] >> 6 & 0x3;
1619
+ uint sw = mb[1] >> 15 & 0x1;
1620
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1621
+ "D-Port Diagnostics: result=%s type=%s [sw=%u]\n",
1622
+ results[result], types[type], sw);
1623
+ if (result == 2) {
1624
+ static char *reasons[] = {
1625
+ "reserved", "unexpected reject",
1626
+ "unexpected phase", "retry exceeded",
1627
+ "timed out", "not supported",
1628
+ "user stopped" };
1629
+ uint reason = mb[2] >> 0 & 0xf;
1630
+ uint phase = mb[2] >> 12 & 0xf;
1631
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1632
+ "D-Port Diagnostics: reason=%s phase=%u \n",
1633
+ reason < 7 ? reasons[reason] : "other",
1634
+ phase >> 1);
1635
+ }
1636
+ }
12291637 break;
12301638
12311639 case MBA_TEMPERATURE_ALERT:
....@@ -1238,6 +1646,11 @@
12381646 case MBA_TRANS_INSERT:
12391647 ql_dbg(ql_dbg_async, vha, 0x5091,
12401648 "Transceiver Insertion: %04x\n", mb[1]);
1649
+ set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags);
1650
+ break;
1651
+
1652
+ case MBA_TRANS_REMOVE:
1653
+ ql_dbg(ql_dbg_async, vha, 0x5091, "Transceiver Removal\n");
12411654 break;
12421655
12431656 default:
....@@ -1300,35 +1713,35 @@
13001713 {
13011714 struct qla_hw_data *ha = vha->hw;
13021715 sts_entry_t *pkt = iocb;
1303
- srb_t *sp = NULL;
1716
+ srb_t *sp;
13041717 uint16_t index;
13051718
13061719 index = LSW(pkt->handle);
13071720 if (index >= req->num_outstanding_cmds) {
13081721 ql_log(ql_log_warn, vha, 0x5031,
1309
- "Invalid command index (%x) type %8ph.\n",
1310
- index, iocb);
1722
+ "%s: Invalid command index (%x) type %8ph.\n",
1723
+ func, index, iocb);
13111724 if (IS_P3P_TYPE(ha))
13121725 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
13131726 else
13141727 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1315
- goto done;
1728
+ return NULL;
13161729 }
13171730 sp = req->outstanding_cmds[index];
13181731 if (!sp) {
13191732 ql_log(ql_log_warn, vha, 0x5032,
1320
- "Invalid completion handle (%x) -- timed-out.\n", index);
1321
- return sp;
1733
+ "%s: Invalid completion handle (%x) -- timed-out.\n",
1734
+ func, index);
1735
+ return NULL;
13221736 }
13231737 if (sp->handle != index) {
13241738 ql_log(ql_log_warn, vha, 0x5033,
1325
- "SRB handle (%x) mismatch %x.\n", sp->handle, index);
1739
+ "%s: SRB handle (%x) mismatch %x.\n", func,
1740
+ sp->handle, index);
13261741 return NULL;
13271742 }
13281743
13291744 req->outstanding_cmds[index] = NULL;
1330
-
1331
-done:
13321745 return sp;
13331746 }
13341747
....@@ -1367,7 +1780,7 @@
13671780 le16_to_cpu(mbx->status_flags));
13681781
13691782 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5029,
1370
- (uint8_t *)mbx, sizeof(*mbx));
1783
+ mbx, sizeof(*mbx));
13711784
13721785 goto logio_done;
13731786 }
....@@ -1423,6 +1836,7 @@
14231836 struct mbx_24xx_entry *pkt)
14241837 {
14251838 const char func[] = "MBX-IOCB2";
1839
+ struct qla_hw_data *ha = vha->hw;
14261840 srb_t *sp;
14271841 struct srb_iocb *si;
14281842 u16 sz, i;
....@@ -1432,11 +1846,23 @@
14321846 if (!sp)
14331847 return;
14341848
1849
+ if (sp->type == SRB_SCSI_CMD ||
1850
+ sp->type == SRB_NVME_CMD ||
1851
+ sp->type == SRB_TM_CMD) {
1852
+ ql_log(ql_log_warn, vha, 0x509d,
1853
+ "Inconsistent event entry type %d\n", sp->type);
1854
+ if (IS_P3P_TYPE(ha))
1855
+ set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1856
+ else
1857
+ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1858
+ return;
1859
+ }
1860
+
14351861 si = &sp->u.iocb_cmd;
14361862 sz = min(ARRAY_SIZE(pkt->mb), ARRAY_SIZE(sp->u.iocb_cmd.u.mbx.in_mb));
14371863
14381864 for (i = 0; i < sz; i++)
1439
- si->u.mbx.in_mb[i] = le16_to_cpu(pkt->mb[i]);
1865
+ si->u.mbx.in_mb[i] = pkt->mb[i];
14401866
14411867 res = (si->u.mbx.in_mb[0] & MBS_MASK);
14421868
....@@ -1497,7 +1923,7 @@
14971923 if (comp_status == CS_DATA_UNDERRUN) {
14981924 res = DID_OK << 16;
14991925 bsg_reply->reply_payload_rcv_len =
1500
- le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len);
1926
+ le16_to_cpu(pkt->rsp_info_len);
15011927
15021928 ql_log(ql_log_warn, vha, 0x5048,
15031929 "CT pass-through-%s error comp_status=0x%x total_byte=0x%x.\n",
....@@ -1511,7 +1937,7 @@
15111937 bsg_reply->reply_payload_rcv_len = 0;
15121938 }
15131939 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035,
1514
- (uint8_t *)pkt, sizeof(*pkt));
1940
+ pkt, sizeof(*pkt));
15151941 } else {
15161942 res = DID_OK << 16;
15171943 bsg_reply->reply_payload_rcv_len =
....@@ -1537,6 +1963,7 @@
15371963 qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
15381964 struct sts_entry_24xx *pkt, int iocb_type)
15391965 {
1966
+ struct els_sts_entry_24xx *ese = (struct els_sts_entry_24xx *)pkt;
15401967 const char func[] = "ELS_CT_IOCB";
15411968 const char *type;
15421969 srb_t *sp;
....@@ -1586,33 +2013,31 @@
15862013 }
15872014
15882015 comp_status = fw_status[0] = le16_to_cpu(pkt->comp_status);
1589
- fw_status[1] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_1);
1590
- fw_status[2] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_2);
2016
+ fw_status[1] = le32_to_cpu(ese->error_subcode_1);
2017
+ fw_status[2] = le32_to_cpu(ese->error_subcode_2);
15912018
15922019 if (iocb_type == ELS_IOCB_TYPE) {
15932020 els = &sp->u.iocb_cmd;
1594
- els->u.els_plogi.fw_status[0] = fw_status[0];
1595
- els->u.els_plogi.fw_status[1] = fw_status[1];
1596
- els->u.els_plogi.fw_status[2] = fw_status[2];
1597
- els->u.els_plogi.comp_status = fw_status[0];
2021
+ els->u.els_plogi.fw_status[0] = cpu_to_le32(fw_status[0]);
2022
+ els->u.els_plogi.fw_status[1] = cpu_to_le32(fw_status[1]);
2023
+ els->u.els_plogi.fw_status[2] = cpu_to_le32(fw_status[2]);
2024
+ els->u.els_plogi.comp_status = cpu_to_le16(fw_status[0]);
15982025 if (comp_status == CS_COMPLETE) {
15992026 res = DID_OK << 16;
16002027 } else {
16012028 if (comp_status == CS_DATA_UNDERRUN) {
16022029 res = DID_OK << 16;
1603
- els->u.els_plogi.len =
1604
- le16_to_cpu(((struct els_sts_entry_24xx *)
1605
- pkt)->total_byte_count);
2030
+ els->u.els_plogi.len = cpu_to_le16(le32_to_cpu(
2031
+ ese->total_byte_count));
16062032 } else {
16072033 els->u.els_plogi.len = 0;
16082034 res = DID_ERROR << 16;
16092035 }
16102036 }
1611
- ql_log(ql_log_info, vha, 0x503f,
1612
- "ELS IOCB Done -%s error hdl=%x comp_status=0x%x error subcode 1=0x%x error subcode 2=0x%x total_byte=0x%x\n",
2037
+ ql_dbg(ql_dbg_disc, vha, 0x503f,
2038
+ "ELS IOCB Done -%s hdl=%x comp_status=0x%x error subcode 1=0x%x error subcode 2=0x%x total_byte=0x%x\n",
16132039 type, sp->handle, comp_status, fw_status[1], fw_status[2],
1614
- le16_to_cpu(((struct els_sts_entry_24xx *)
1615
- pkt)->total_byte_count));
2040
+ le32_to_cpu(ese->total_byte_count));
16162041 goto els_ct_done;
16172042 }
16182043
....@@ -1628,30 +2053,27 @@
16282053 if (comp_status == CS_DATA_UNDERRUN) {
16292054 res = DID_OK << 16;
16302055 bsg_reply->reply_payload_rcv_len =
1631
- le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->total_byte_count);
2056
+ le32_to_cpu(ese->total_byte_count);
16322057
16332058 ql_dbg(ql_dbg_user, vha, 0x503f,
16342059 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
16352060 "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
16362061 type, sp->handle, comp_status, fw_status[1], fw_status[2],
1637
- le16_to_cpu(((struct els_sts_entry_24xx *)
1638
- pkt)->total_byte_count));
2062
+ le32_to_cpu(ese->total_byte_count));
16392063 } else {
16402064 ql_dbg(ql_dbg_user, vha, 0x5040,
16412065 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
16422066 "error subcode 1=0x%x error subcode 2=0x%x.\n",
16432067 type, sp->handle, comp_status,
1644
- le16_to_cpu(((struct els_sts_entry_24xx *)
1645
- pkt)->error_subcode_1),
1646
- le16_to_cpu(((struct els_sts_entry_24xx *)
1647
- pkt)->error_subcode_2));
2068
+ le32_to_cpu(ese->error_subcode_1),
2069
+ le32_to_cpu(ese->error_subcode_2));
16482070 res = DID_ERROR << 16;
16492071 bsg_reply->reply_payload_rcv_len = 0;
16502072 }
16512073 memcpy(bsg_job->reply + sizeof(struct fc_bsg_reply),
16522074 fw_status, sizeof(fw_status));
16532075 ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056,
1654
- (uint8_t *)pkt, sizeof(*pkt));
2076
+ pkt, sizeof(*pkt));
16552077 }
16562078 else {
16572079 res = DID_OK << 16;
....@@ -1695,21 +2117,28 @@
16952117 fcport->d_id.b.area, fcport->d_id.b.al_pa,
16962118 logio->entry_status);
16972119 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x504d,
1698
- (uint8_t *)logio, sizeof(*logio));
2120
+ logio, sizeof(*logio));
16992121
17002122 goto logio_done;
17012123 }
17022124
17032125 if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) {
1704
- ql_dbg(ql_dbg_async, fcport->vha, 0x5036,
1705
- "Async-%s complete - %8phC hdl=%x portid=%02x%02x%02x "
1706
- "iop0=%x.\n", type, fcport->port_name, sp->handle,
1707
- fcport->d_id.b.domain,
1708
- fcport->d_id.b.area, fcport->d_id.b.al_pa,
2126
+ ql_dbg(ql_dbg_async, sp->vha, 0x5036,
2127
+ "Async-%s complete: handle=%x pid=%06x wwpn=%8phC iop0=%x\n",
2128
+ type, sp->handle, fcport->d_id.b24, fcport->port_name,
17092129 le32_to_cpu(logio->io_parameter[0]));
17102130
17112131 vha->hw->exch_starvation = 0;
17122132 data[0] = MBS_COMMAND_COMPLETE;
2133
+
2134
+ if (sp->type == SRB_PRLI_CMD) {
2135
+ lio->u.logio.iop[0] =
2136
+ le32_to_cpu(logio->io_parameter[0]);
2137
+ lio->u.logio.iop[1] =
2138
+ le32_to_cpu(logio->io_parameter[1]);
2139
+ goto logio_done;
2140
+ }
2141
+
17132142 if (sp->type != SRB_LOGIN_CMD)
17142143 goto logio_done;
17152144
....@@ -1769,17 +2198,15 @@
17692198 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
17702199 qla2xxx_wake_dpc(vha);
17712200 }
1772
- /* fall through */
2201
+ fallthrough;
17732202 default:
17742203 data[0] = MBS_COMMAND_ERROR;
17752204 break;
17762205 }
17772206
1778
- ql_dbg(ql_dbg_async, fcport->vha, 0x5037,
1779
- "Async-%s failed - %8phC hdl=%x portid=%02x%02x%02x comp=%x "
1780
- "iop0=%x iop1=%x.\n", type, fcport->port_name,
1781
- sp->handle, fcport->d_id.b.domain,
1782
- fcport->d_id.b.area, fcport->d_id.b.al_pa,
2207
+ ql_dbg(ql_dbg_async, sp->vha, 0x5037,
2208
+ "Async-%s failed: handle=%x pid=%06x wwpn=%8phC comp_status=%x iop0=%x iop1=%x\n",
2209
+ type, sp->handle, fcport->d_id.b24, fcport->port_name,
17832210 le16_to_cpu(logio->comp_status),
17842211 le32_to_cpu(logio->io_parameter[0]),
17852212 le32_to_cpu(logio->io_parameter[1]));
....@@ -1819,6 +2246,7 @@
18192246 iocb->u.tmf.data = QLA_FUNCTION_FAILED;
18202247 } else if ((le16_to_cpu(sts->scsi_status) &
18212248 SS_RESPONSE_INFO_LEN_VALID)) {
2249
+ host_to_fcp_swap(sts->data, sizeof(sts->data));
18222250 if (le32_to_cpu(sts->rsp_data_len) < 4) {
18232251 ql_log(ql_log_warn, fcport->vha, 0x503b,
18242252 "Async-%s error - hdl=%x not enough response(%d).\n",
....@@ -1832,8 +2260,8 @@
18322260 }
18332261
18342262 if (iocb->u.tmf.data != QLA_SUCCESS)
1835
- ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5055,
1836
- (uint8_t *)sts, sizeof(*sts));
2263
+ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, sp->vha, 0x5055,
2264
+ sts, sizeof(*sts));
18372265
18382266 sp->done(sp, 0);
18392267 }
....@@ -1846,16 +2274,24 @@
18462274 struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
18472275 uint16_t state_flags;
18482276 struct nvmefc_fcp_req *fd;
1849
- uint16_t ret = 0;
2277
+ uint16_t ret = QLA_SUCCESS;
2278
+ __le16 comp_status = sts->comp_status;
2279
+ int logit = 0;
18502280
18512281 iocb = &sp->u.iocb_cmd;
18522282 fcport = sp->fcport;
1853
- iocb->u.nvme.comp_status = le16_to_cpu(sts->comp_status);
2283
+ iocb->u.nvme.comp_status = comp_status;
18542284 state_flags = le16_to_cpu(sts->state_flags);
18552285 fd = iocb->u.nvme.desc;
18562286
18572287 if (unlikely(iocb->u.nvme.aen_op))
18582288 atomic_dec(&sp->vha->hw->nvme_active_aen_cnt);
2289
+
2290
+ if (unlikely(comp_status != CS_COMPLETE))
2291
+ logit = 1;
2292
+
2293
+ fd->transferred_length = fd->payload_length -
2294
+ le32_to_cpu(sts->residual_len);
18592295
18602296 /*
18612297 * State flags: Bit 6 and 0.
....@@ -1867,16 +2303,28 @@
18672303 */
18682304 if (!(state_flags & (SF_FCP_RSP_DMA | SF_NVME_ERSP))) {
18692305 iocb->u.nvme.rsp_pyld_len = 0;
2306
+ } else if ((state_flags & (SF_FCP_RSP_DMA | SF_NVME_ERSP)) ==
2307
+ (SF_FCP_RSP_DMA | SF_NVME_ERSP)) {
2308
+ /* Response already DMA'd to fd->rspaddr. */
2309
+ iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len;
18702310 } else if ((state_flags & SF_FCP_RSP_DMA)) {
1871
- iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len);
2311
+ /*
2312
+ * Non-zero value in first 12 bytes of NVMe_RSP IU, treat this
2313
+ * as an error.
2314
+ */
2315
+ iocb->u.nvme.rsp_pyld_len = 0;
2316
+ fd->transferred_length = 0;
2317
+ ql_dbg(ql_dbg_io, fcport->vha, 0x307a,
2318
+ "Unexpected values in NVMe_RSP IU.\n");
2319
+ logit = 1;
18722320 } else if (state_flags & SF_NVME_ERSP) {
18732321 uint32_t *inbuf, *outbuf;
18742322 uint16_t iter;
18752323
18762324 inbuf = (uint32_t *)&sts->nvme_ersp_data;
18772325 outbuf = (uint32_t *)fd->rspaddr;
1878
- iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len);
1879
- if (unlikely(iocb->u.nvme.rsp_pyld_len >
2326
+ iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len;
2327
+ if (unlikely(le16_to_cpu(iocb->u.nvme.rsp_pyld_len) >
18802328 sizeof(struct nvme_fc_ersp_iu))) {
18812329 if (ql_mask_match(ql_dbg_io)) {
18822330 WARN_ONCE(1, "Unexpected response payload length %u.\n",
....@@ -1886,42 +2334,61 @@
18862334 iocb->u.nvme.rsp_pyld_len);
18872335 }
18882336 iocb->u.nvme.rsp_pyld_len =
1889
- sizeof(struct nvme_fc_ersp_iu);
2337
+ cpu_to_le16(sizeof(struct nvme_fc_ersp_iu));
18902338 }
1891
- iter = iocb->u.nvme.rsp_pyld_len >> 2;
2339
+ iter = le16_to_cpu(iocb->u.nvme.rsp_pyld_len) >> 2;
18922340 for (; iter; iter--)
18932341 *outbuf++ = swab32(*inbuf++);
1894
- } else { /* unhandled case */
1895
- ql_log(ql_log_warn, fcport->vha, 0x503a,
1896
- "NVME-%s error. Unhandled state_flags of %x\n",
1897
- sp->name, state_flags);
18982342 }
18992343
1900
- fd->transferred_length = fd->payload_length -
1901
- le32_to_cpu(sts->residual_len);
2344
+ if (state_flags & SF_NVME_ERSP) {
2345
+ struct nvme_fc_ersp_iu *rsp_iu = fd->rspaddr;
2346
+ u32 tgt_xfer_len;
19022347
1903
- switch (le16_to_cpu(sts->comp_status)) {
2348
+ tgt_xfer_len = be32_to_cpu(rsp_iu->xfrd_len);
2349
+ if (fd->transferred_length != tgt_xfer_len) {
2350
+ ql_dbg(ql_dbg_io, fcport->vha, 0x3079,
2351
+ "Dropped frame(s) detected (sent/rcvd=%u/%u).\n",
2352
+ tgt_xfer_len, fd->transferred_length);
2353
+ logit = 1;
2354
+ } else if (le16_to_cpu(comp_status) == CS_DATA_UNDERRUN) {
2355
+ /*
2356
+ * Do not log if this is just an underflow and there
2357
+ * is no data loss.
2358
+ */
2359
+ logit = 0;
2360
+ }
2361
+ }
2362
+
2363
+ if (unlikely(logit))
2364
+ ql_log(ql_log_warn, fcport->vha, 0x5060,
2365
+ "NVME-%s ERR Handling - hdl=%x status(%x) tr_len:%x resid=%x ox_id=%x\n",
2366
+ sp->name, sp->handle, comp_status,
2367
+ fd->transferred_length, le32_to_cpu(sts->residual_len),
2368
+ sts->ox_id);
2369
+
2370
+ /*
2371
+ * If transport error then Failure (HBA rejects request)
2372
+ * otherwise transport will handle.
2373
+ */
2374
+ switch (le16_to_cpu(comp_status)) {
19042375 case CS_COMPLETE:
1905
- ret = QLA_SUCCESS;
19062376 break;
1907
- case CS_ABORTED:
2377
+
19082378 case CS_RESET:
19092379 case CS_PORT_UNAVAILABLE:
19102380 case CS_PORT_LOGGED_OUT:
2381
+ fcport->nvme_flag |= NVME_FLAG_RESETTING;
2382
+ fallthrough;
2383
+ case CS_ABORTED:
19112384 case CS_PORT_BUSY:
1912
- ql_log(ql_log_warn, fcport->vha, 0x5060,
1913
- "NVME-%s ERR Handling - hdl=%x completion status(%x) resid=%x ox_id=%x\n",
1914
- sp->name, sp->handle, sts->comp_status,
1915
- le32_to_cpu(sts->residual_len), sts->ox_id);
19162385 fd->transferred_length = 0;
19172386 iocb->u.nvme.rsp_pyld_len = 0;
19182387 ret = QLA_ABORTED;
19192388 break;
2389
+ case CS_DATA_UNDERRUN:
2390
+ break;
19202391 default:
1921
- ql_log(ql_log_warn, fcport->vha, 0x5060,
1922
- "NVME-%s error - hdl=%x completion status(%x) resid=%x ox_id=%x\n",
1923
- sp->name, sp->handle, sts->comp_status,
1924
- le32_to_cpu(sts->residual_len), sts->ox_id);
19252392 ret = QLA_FUNCTION_FAILED;
19262393 break;
19272394 }
....@@ -1959,6 +2426,52 @@
19592426 sp->done(sp, rval);
19602427 }
19612428
2429
+/* Process a single response queue entry. */
2430
+static void qla2x00_process_response_entry(struct scsi_qla_host *vha,
2431
+ struct rsp_que *rsp,
2432
+ sts_entry_t *pkt)
2433
+{
2434
+ sts21_entry_t *sts21_entry;
2435
+ sts22_entry_t *sts22_entry;
2436
+ uint16_t handle_cnt;
2437
+ uint16_t cnt;
2438
+
2439
+ switch (pkt->entry_type) {
2440
+ case STATUS_TYPE:
2441
+ qla2x00_status_entry(vha, rsp, pkt);
2442
+ break;
2443
+ case STATUS_TYPE_21:
2444
+ sts21_entry = (sts21_entry_t *)pkt;
2445
+ handle_cnt = sts21_entry->handle_count;
2446
+ for (cnt = 0; cnt < handle_cnt; cnt++)
2447
+ qla2x00_process_completed_request(vha, rsp->req,
2448
+ sts21_entry->handle[cnt]);
2449
+ break;
2450
+ case STATUS_TYPE_22:
2451
+ sts22_entry = (sts22_entry_t *)pkt;
2452
+ handle_cnt = sts22_entry->handle_count;
2453
+ for (cnt = 0; cnt < handle_cnt; cnt++)
2454
+ qla2x00_process_completed_request(vha, rsp->req,
2455
+ sts22_entry->handle[cnt]);
2456
+ break;
2457
+ case STATUS_CONT_TYPE:
2458
+ qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt);
2459
+ break;
2460
+ case MBX_IOCB_TYPE:
2461
+ qla2x00_mbx_iocb_entry(vha, rsp->req, (struct mbx_entry *)pkt);
2462
+ break;
2463
+ case CT_IOCB_TYPE:
2464
+ qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE);
2465
+ break;
2466
+ default:
2467
+ /* Type Not Supported. */
2468
+ ql_log(ql_log_warn, vha, 0x504a,
2469
+ "Received unknown response pkt type %x entry status=%x.\n",
2470
+ pkt->entry_type, pkt->entry_status);
2471
+ break;
2472
+ }
2473
+}
2474
+
19622475 /**
19632476 * qla2x00_process_response_queue() - Process response queue entries.
19642477 * @rsp: response queue
....@@ -1970,8 +2483,6 @@
19702483 struct qla_hw_data *ha = rsp->hw;
19712484 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
19722485 sts_entry_t *pkt;
1973
- uint16_t handle_cnt;
1974
- uint16_t cnt;
19752486
19762487 vha = pci_get_drvdata(ha->pdev);
19772488
....@@ -1996,48 +2507,13 @@
19962507 continue;
19972508 }
19982509
1999
- switch (pkt->entry_type) {
2000
- case STATUS_TYPE:
2001
- qla2x00_status_entry(vha, rsp, pkt);
2002
- break;
2003
- case STATUS_TYPE_21:
2004
- handle_cnt = ((sts21_entry_t *)pkt)->handle_count;
2005
- for (cnt = 0; cnt < handle_cnt; cnt++) {
2006
- qla2x00_process_completed_request(vha, rsp->req,
2007
- ((sts21_entry_t *)pkt)->handle[cnt]);
2008
- }
2009
- break;
2010
- case STATUS_TYPE_22:
2011
- handle_cnt = ((sts22_entry_t *)pkt)->handle_count;
2012
- for (cnt = 0; cnt < handle_cnt; cnt++) {
2013
- qla2x00_process_completed_request(vha, rsp->req,
2014
- ((sts22_entry_t *)pkt)->handle[cnt]);
2015
- }
2016
- break;
2017
- case STATUS_CONT_TYPE:
2018
- qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt);
2019
- break;
2020
- case MBX_IOCB_TYPE:
2021
- qla2x00_mbx_iocb_entry(vha, rsp->req,
2022
- (struct mbx_entry *)pkt);
2023
- break;
2024
- case CT_IOCB_TYPE:
2025
- qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE);
2026
- break;
2027
- default:
2028
- /* Type Not Supported. */
2029
- ql_log(ql_log_warn, vha, 0x504a,
2030
- "Received unknown response pkt type %x "
2031
- "entry status=%x.\n",
2032
- pkt->entry_type, pkt->entry_status);
2033
- break;
2034
- }
2510
+ qla2x00_process_response_entry(vha, rsp, pkt);
20352511 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
20362512 wmb();
20372513 }
20382514
20392515 /* Adjust ring index */
2040
- WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index);
2516
+ wrt_reg_word(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index);
20412517 }
20422518
20432519 static inline void
....@@ -2106,12 +2582,12 @@
21062582 * swab32 of the "data" field in the beginning of qla2x00_status_entry()
21072583 * would make guard field appear at offset 2
21082584 */
2109
- a_guard = le16_to_cpu(*(uint16_t *)(ap + 2));
2110
- a_app_tag = le16_to_cpu(*(uint16_t *)(ap + 0));
2111
- a_ref_tag = le32_to_cpu(*(uint32_t *)(ap + 4));
2112
- e_guard = le16_to_cpu(*(uint16_t *)(ep + 2));
2113
- e_app_tag = le16_to_cpu(*(uint16_t *)(ep + 0));
2114
- e_ref_tag = le32_to_cpu(*(uint32_t *)(ep + 4));
2585
+ a_guard = get_unaligned_le16(ap + 2);
2586
+ a_app_tag = get_unaligned_le16(ap + 0);
2587
+ a_ref_tag = get_unaligned_le32(ap + 4);
2588
+ e_guard = get_unaligned_le16(ep + 2);
2589
+ e_app_tag = get_unaligned_le16(ep + 0);
2590
+ e_ref_tag = get_unaligned_le32(ep + 4);
21152591
21162592 ql_dbg(ql_dbg_io, vha, 0x3023,
21172593 "iocb(s) %p Returned STATUS.\n", sts24);
....@@ -2128,9 +2604,9 @@
21282604 * For type 3: ref & app tag is all 'f's
21292605 * For type 0,1,2: app tag is all 'f's
21302606 */
2131
- if ((a_app_tag == T10_PI_APP_ESCAPE) &&
2132
- ((scsi_get_prot_type(cmd) != SCSI_PROT_DIF_TYPE3) ||
2133
- (a_ref_tag == T10_PI_REF_ESCAPE))) {
2607
+ if (a_app_tag == be16_to_cpu(T10_PI_APP_ESCAPE) &&
2608
+ (scsi_get_prot_type(cmd) != SCSI_PROT_DIF_TYPE3 ||
2609
+ a_ref_tag == be32_to_cpu(T10_PI_REF_ESCAPE))) {
21342610 uint32_t blocks_done, resid;
21352611 sector_t lba_s = scsi_get_lba(cmd);
21362612
....@@ -2226,10 +2702,8 @@
22262702 struct bsg_job *bsg_job = NULL;
22272703 struct fc_bsg_request *bsg_request;
22282704 struct fc_bsg_reply *bsg_reply;
2229
- sts_entry_t *sts;
2230
- struct sts_entry_24xx *sts24;
2231
- sts = (sts_entry_t *) pkt;
2232
- sts24 = (struct sts_entry_24xx *) pkt;
2705
+ sts_entry_t *sts = pkt;
2706
+ struct sts_entry_24xx *sts24 = pkt;
22332707
22342708 /* Validate handle. */
22352709 if (index >= req->num_outstanding_cmds) {
....@@ -2375,8 +2849,8 @@
23752849 srb_t *sp;
23762850 fc_port_t *fcport;
23772851 struct scsi_cmnd *cp;
2378
- sts_entry_t *sts;
2379
- struct sts_entry_24xx *sts24;
2852
+ sts_entry_t *sts = pkt;
2853
+ struct sts_entry_24xx *sts24 = pkt;
23802854 uint16_t comp_status;
23812855 uint16_t scsi_status;
23822856 uint16_t ox_id;
....@@ -2392,10 +2866,8 @@
23922866 int logit = 1;
23932867 int res = 0;
23942868 uint16_t state_flags = 0;
2395
- uint16_t retry_delay = 0;
2869
+ uint16_t sts_qual = 0;
23962870
2397
- sts = (sts_entry_t *) pkt;
2398
- sts24 = (struct sts_entry_24xx *) pkt;
23992871 if (IS_FWI2_CAPABLE(ha)) {
24002872 comp_status = le16_to_cpu(sts24->comp_status);
24012873 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK;
....@@ -2440,6 +2912,7 @@
24402912 }
24412913 return;
24422914 }
2915
+ qla_put_iocbs(sp->qpair, &sp->iores);
24432916
24442917 if (sp->cmd_type != TYPE_SRB) {
24452918 req->outstanding_cmds[handle] = NULL;
....@@ -2505,13 +2978,7 @@
25052978 host_to_fcp_swap(sts24->data, sizeof(sts24->data));
25062979 ox_id = le16_to_cpu(sts24->ox_id);
25072980 par_sense_len = sizeof(sts24->data);
2508
- /* Valid values of the retry delay timer are 0x1-0xffef */
2509
- if (sts24->retry_delay > 0 && sts24->retry_delay < 0xfff1) {
2510
- retry_delay = sts24->retry_delay & 0x3fff;
2511
- ql_dbg(ql_dbg_io, sp->vha, 0x3033,
2512
- "%s: scope=%#x retry_delay=%#x\n", __func__,
2513
- sts24->retry_delay >> 14, retry_delay);
2514
- }
2981
+ sts_qual = le16_to_cpu(sts24->status_qualifier);
25152982 } else {
25162983 if (scsi_status & SS_SENSE_LEN_VALID)
25172984 sense_len = le16_to_cpu(sts->req_sense_length);
....@@ -2549,9 +3016,9 @@
25493016 * Check retry_delay_timer value if we receive a busy or
25503017 * queue full.
25513018 */
2552
- if (lscsi_status == SAM_STAT_TASK_SET_FULL ||
2553
- lscsi_status == SAM_STAT_BUSY)
2554
- qla2x00_set_retry_delay_timestamp(fcport, retry_delay);
3019
+ if (unlikely(lscsi_status == SAM_STAT_TASK_SET_FULL ||
3020
+ lscsi_status == SAM_STAT_BUSY))
3021
+ qla2x00_set_retry_delay_timestamp(fcport, sts_qual);
25553022
25563023 /*
25573024 * Based on Host and scsi status generate status code for Linux
....@@ -2695,10 +3162,9 @@
26953162 "Port to be marked lost on fcport=%02x%02x%02x, current "
26963163 "port state= %s comp_status %x.\n", fcport->d_id.b.domain,
26973164 fcport->d_id.b.area, fcport->d_id.b.al_pa,
2698
- port_state_str[atomic_read(&fcport->state)],
3165
+ port_state_str[FCS_ONLINE],
26993166 comp_status);
27003167
2701
- qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
27023168 qlt_schedule_sess_for_deletion(fcport);
27033169 }
27043170
....@@ -2725,6 +3191,17 @@
27253191 cp->device->vendor);
27263192 break;
27273193
3194
+ case CS_DMA:
3195
+ ql_log(ql_log_info, fcport->vha, 0x3022,
3196
+ "CS_DMA error: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu portid=%06x oxid=0x%x cdb=%10phN len=0x%x rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n",
3197
+ comp_status, scsi_status, res, vha->host_no,
3198
+ cp->device->id, cp->device->lun, fcport->d_id.b24,
3199
+ ox_id, cp->cmnd, scsi_bufflen(cp), rsp_info_len,
3200
+ resid_len, fw_resid_len, sp, cp);
3201
+ ql_dump_buffer(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe0ee,
3202
+ pkt, sizeof(*sts24));
3203
+ res = DID_ERROR << 16;
3204
+ break;
27283205 default:
27293206 res = DID_ERROR << 16;
27303207 break;
....@@ -2848,6 +3325,7 @@
28483325 default:
28493326 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
28503327 if (sp) {
3328
+ qla_put_iocbs(sp->qpair, &sp->iores);
28513329 sp->done(sp, res);
28523330 return 0;
28533331 }
....@@ -2874,7 +3352,7 @@
28743352 {
28753353 uint16_t cnt;
28763354 uint32_t mboxes;
2877
- uint16_t __iomem *wptr;
3355
+ __le16 __iomem *wptr;
28783356 struct qla_hw_data *ha = vha->hw;
28793357 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
28803358
....@@ -2890,11 +3368,11 @@
28903368 ha->flags.mbox_int = 1;
28913369 ha->mailbox_out[0] = mb0;
28923370 mboxes >>= 1;
2893
- wptr = (uint16_t __iomem *)&reg->mailbox1;
3371
+ wptr = &reg->mailbox1;
28943372
28953373 for (cnt = 1; cnt < ha->mbx_count; cnt++) {
28963374 if (mboxes & BIT_0)
2897
- ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
3375
+ ha->mailbox_out[cnt] = rd_reg_word(wptr);
28983376
28993377 mboxes >>= 1;
29003378 wptr++;
....@@ -2914,7 +3392,7 @@
29143392 return;
29153393
29163394 abt = &sp->u.iocb_cmd;
2917
- abt->u.abt.comp_status = le16_to_cpu(pkt->nport_handle);
3395
+ abt->u.abt.comp_status = pkt->nport_handle;
29183396 sp->done(sp, 0);
29193397 }
29203398
....@@ -2943,12 +3421,16 @@
29433421 {
29443422 struct sts_entry_24xx *pkt;
29453423 struct qla_hw_data *ha = vha->hw;
3424
+ struct purex_entry_24xx *purex_entry;
3425
+ struct purex_item *pure_item;
29463426
29473427 if (!ha->flags.fw_started)
29483428 return;
29493429
2950
- if (rsp->qpair->cpuid != smp_processor_id())
3430
+ if (rsp->qpair->cpuid != smp_processor_id() || !rsp->qpair->rcv_intr) {
3431
+ rsp->qpair->rcv_intr = 1;
29513432 qla_cpu_update(rsp->qpair, smp_processor_id());
3433
+ }
29523434
29533435 while (rsp->ring_ptr->signature != RESPONSE_PROCESSED) {
29543436 pkt = (struct sts_entry_24xx *)rsp->ring_ptr;
....@@ -2993,7 +3475,16 @@
29933475 qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE);
29943476 break;
29953477 case ABTS_RECV_24XX:
2996
- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
3478
+ if (qla_ini_mode_enabled(vha)) {
3479
+ pure_item = qla24xx_copy_std_pkt(vha, pkt);
3480
+ if (!pure_item)
3481
+ break;
3482
+ qla24xx_queue_purex_item(vha, pure_item,
3483
+ qla24xx_process_abts);
3484
+ break;
3485
+ }
3486
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
3487
+ IS_QLA28XX(ha)) {
29973488 /* ensure that the ATIO queue is empty */
29983489 qlt_handle_abts_recv(vha, rsp,
29993490 (response_t *)pkt);
....@@ -3001,7 +3492,7 @@
30013492 } else {
30023493 qlt_24xx_process_atio_queue(vha, 1);
30033494 }
3004
- /* fall through */
3495
+ fallthrough;
30053496 case ABTS_RESP_24XX:
30063497 case CTIO_TYPE7:
30073498 case CTIO_CRC2:
....@@ -3036,12 +3527,41 @@
30363527 qla_ctrlvp_completed(vha, rsp->req,
30373528 (struct vp_ctrl_entry_24xx *)pkt);
30383529 break;
3530
+ case PUREX_IOCB_TYPE:
3531
+ purex_entry = (void *)pkt;
3532
+ switch (purex_entry->els_frame_payload[3]) {
3533
+ case ELS_RDP:
3534
+ pure_item = qla24xx_copy_std_pkt(vha, pkt);
3535
+ if (!pure_item)
3536
+ break;
3537
+ qla24xx_queue_purex_item(vha, pure_item,
3538
+ qla24xx_process_purex_rdp);
3539
+ break;
3540
+ case ELS_FPIN:
3541
+ if (!vha->hw->flags.scm_enabled) {
3542
+ ql_log(ql_log_warn, vha, 0x5094,
3543
+ "SCM not active for this port\n");
3544
+ break;
3545
+ }
3546
+ pure_item = qla27xx_copy_fpin_pkt(vha,
3547
+ (void **)&pkt, &rsp);
3548
+ if (!pure_item)
3549
+ break;
3550
+ qla24xx_queue_purex_item(vha, pure_item,
3551
+ qla27xx_process_purex_fpin);
3552
+ break;
3553
+
3554
+ default:
3555
+ ql_log(ql_log_warn, vha, 0x509c,
3556
+ "Discarding ELS Request opcode 0x%x\n",
3557
+ purex_entry->els_frame_payload[3]);
3558
+ }
3559
+ break;
30393560 default:
30403561 /* Type Not Supported. */
30413562 ql_dbg(ql_dbg_async, vha, 0x5042,
3042
- "Received unknown response pkt type %x "
3043
- "entry status=%x.\n",
3044
- pkt->entry_type, pkt->entry_status);
3563
+ "Received unknown response pkt type 0x%x entry status=%x.\n",
3564
+ pkt->entry_type, pkt->entry_status);
30453565 break;
30463566 }
30473567 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
....@@ -3051,9 +3571,10 @@
30513571 /* Adjust ring index */
30523572 if (IS_P3P_TYPE(ha)) {
30533573 struct device_reg_82xx __iomem *reg = &ha->iobase->isp82;
3054
- WRT_REG_DWORD(&reg->rsp_q_out[0], rsp->ring_index);
3574
+
3575
+ wrt_reg_dword(&reg->rsp_q_out[0], rsp->ring_index);
30553576 } else {
3056
- WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
3577
+ wrt_reg_dword(rsp->rsp_q_out, rsp->ring_index);
30573578 }
30583579 }
30593580
....@@ -3066,17 +3587,17 @@
30663587 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
30673588
30683589 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3069
- !IS_QLA27XX(ha))
3590
+ !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
30703591 return;
30713592
30723593 rval = QLA_SUCCESS;
3073
- WRT_REG_DWORD(&reg->iobase_addr, 0x7C00);
3074
- RD_REG_DWORD(&reg->iobase_addr);
3075
- WRT_REG_DWORD(&reg->iobase_window, 0x0001);
3076
- for (cnt = 10000; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
3594
+ wrt_reg_dword(&reg->iobase_addr, 0x7C00);
3595
+ rd_reg_dword(&reg->iobase_addr);
3596
+ wrt_reg_dword(&reg->iobase_window, 0x0001);
3597
+ for (cnt = 10000; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 &&
30773598 rval == QLA_SUCCESS; cnt--) {
30783599 if (cnt) {
3079
- WRT_REG_DWORD(&reg->iobase_window, 0x0001);
3600
+ wrt_reg_dword(&reg->iobase_window, 0x0001);
30803601 udelay(10);
30813602 } else
30823603 rval = QLA_FUNCTION_TIMEOUT;
....@@ -3085,11 +3606,11 @@
30853606 goto next_test;
30863607
30873608 rval = QLA_SUCCESS;
3088
- WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3089
- for (cnt = 100; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
3609
+ wrt_reg_dword(&reg->iobase_window, 0x0003);
3610
+ for (cnt = 100; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 &&
30903611 rval == QLA_SUCCESS; cnt--) {
30913612 if (cnt) {
3092
- WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3613
+ wrt_reg_dword(&reg->iobase_window, 0x0003);
30933614 udelay(10);
30943615 } else
30953616 rval = QLA_FUNCTION_TIMEOUT;
....@@ -3098,18 +3619,18 @@
30983619 goto done;
30993620
31003621 next_test:
3101
- if (RD_REG_DWORD(&reg->iobase_c8) & BIT_3)
3622
+ if (rd_reg_dword(&reg->iobase_c8) & BIT_3)
31023623 ql_log(ql_log_info, vha, 0x504c,
31033624 "Additional code -- 0x55AA.\n");
31043625
31053626 done:
3106
- WRT_REG_DWORD(&reg->iobase_window, 0x0000);
3107
- RD_REG_DWORD(&reg->iobase_window);
3627
+ wrt_reg_dword(&reg->iobase_window, 0x0000);
3628
+ rd_reg_dword(&reg->iobase_window);
31083629 }
31093630
31103631 /**
31113632 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx.
3112
- * @irq:
3633
+ * @irq: interrupt number
31133634 * @dev_id: SCSI driver HA context
31143635 *
31153636 * Called by system whenever the host adapter generates an interrupt.
....@@ -3148,14 +3669,14 @@
31483669 spin_lock_irqsave(&ha->hardware_lock, flags);
31493670 vha = pci_get_drvdata(ha->pdev);
31503671 for (iter = 50; iter--; ) {
3151
- stat = RD_REG_DWORD(&reg->host_status);
3672
+ stat = rd_reg_dword(&reg->host_status);
31523673 if (qla2x00_check_reg32_for_disconnect(vha, stat))
31533674 break;
31543675 if (stat & HSRX_RISC_PAUSED) {
31553676 if (unlikely(pci_channel_offline(ha->pdev)))
31563677 break;
31573678
3158
- hccr = RD_REG_DWORD(&reg->hccr);
3679
+ hccr = rd_reg_dword(&reg->hccr);
31593680
31603681 ql_log(ql_log_warn, vha, 0x504b,
31613682 "RISC paused -- HCCR=%x, Dumping firmware.\n",
....@@ -3163,7 +3684,7 @@
31633684
31643685 qla2xxx_check_risc_status(vha);
31653686
3166
- ha->isp_ops->fw_dump(vha, 1);
3687
+ ha->isp_ops->fw_dump(vha);
31673688 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
31683689 break;
31693690 } else if ((stat & HSRX_RISC_INT) == 0)
....@@ -3180,9 +3701,9 @@
31803701 break;
31813702 case INTR_ASYNC_EVENT:
31823703 mb[0] = MSW(stat);
3183
- mb[1] = RD_REG_WORD(&reg->mailbox1);
3184
- mb[2] = RD_REG_WORD(&reg->mailbox2);
3185
- mb[3] = RD_REG_WORD(&reg->mailbox3);
3704
+ mb[1] = rd_reg_word(&reg->mailbox1);
3705
+ mb[2] = rd_reg_word(&reg->mailbox2);
3706
+ mb[3] = rd_reg_word(&reg->mailbox3);
31863707 qla2x00_async_event(vha, rsp, mb);
31873708 break;
31883709 case INTR_RSP_QUE_UPDATE:
....@@ -3202,8 +3723,8 @@
32023723 "Unrecognized interrupt type (%d).\n", stat * 0xff);
32033724 break;
32043725 }
3205
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3206
- RD_REG_DWORD_RELAXED(&reg->hccr);
3726
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3727
+ rd_reg_dword_relaxed(&reg->hccr);
32073728 if (unlikely(IS_QLA83XX(ha) && (ha->pdev->revision == 1)))
32083729 ndelay(3500);
32093730 }
....@@ -3242,8 +3763,8 @@
32423763 vha = pci_get_drvdata(ha->pdev);
32433764 qla24xx_process_response_queue(vha, rsp);
32443765 if (!ha->flags.disable_msix_handshake) {
3245
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3246
- RD_REG_DWORD_RELAXED(&reg->hccr);
3766
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3767
+ rd_reg_dword_relaxed(&reg->hccr);
32473768 }
32483769 spin_unlock_irqrestore(&ha->hardware_lock, flags);
32493770
....@@ -3277,14 +3798,14 @@
32773798 spin_lock_irqsave(&ha->hardware_lock, flags);
32783799 vha = pci_get_drvdata(ha->pdev);
32793800 do {
3280
- stat = RD_REG_DWORD(&reg->host_status);
3801
+ stat = rd_reg_dword(&reg->host_status);
32813802 if (qla2x00_check_reg32_for_disconnect(vha, stat))
32823803 break;
32833804 if (stat & HSRX_RISC_PAUSED) {
32843805 if (unlikely(pci_channel_offline(ha->pdev)))
32853806 break;
32863807
3287
- hccr = RD_REG_DWORD(&reg->hccr);
3808
+ hccr = rd_reg_dword(&reg->hccr);
32883809
32893810 ql_log(ql_log_info, vha, 0x5050,
32903811 "RISC paused -- HCCR=%x, Dumping firmware.\n",
....@@ -3292,7 +3813,7 @@
32923813
32933814 qla2xxx_check_risc_status(vha);
32943815
3295
- ha->isp_ops->fw_dump(vha, 1);
3816
+ ha->isp_ops->fw_dump(vha);
32963817 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
32973818 break;
32983819 } else if ((stat & HSRX_RISC_INT) == 0)
....@@ -3309,9 +3830,9 @@
33093830 break;
33103831 case INTR_ASYNC_EVENT:
33113832 mb[0] = MSW(stat);
3312
- mb[1] = RD_REG_WORD(&reg->mailbox1);
3313
- mb[2] = RD_REG_WORD(&reg->mailbox2);
3314
- mb[3] = RD_REG_WORD(&reg->mailbox3);
3833
+ mb[1] = rd_reg_word(&reg->mailbox1);
3834
+ mb[2] = rd_reg_word(&reg->mailbox2);
3835
+ mb[3] = rd_reg_word(&reg->mailbox3);
33153836 qla2x00_async_event(vha, rsp, mb);
33163837 break;
33173838 case INTR_RSP_QUE_UPDATE:
....@@ -3331,7 +3852,7 @@
33313852 "Unrecognized interrupt type (%d).\n", stat & 0xff);
33323853 break;
33333854 }
3334
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3855
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
33353856 } while (0);
33363857 qla2x00_handle_mbx_completion(ha, status);
33373858 spin_unlock_irqrestore(&ha->hardware_lock, flags);
....@@ -3350,6 +3871,25 @@
33503871 {
33513872 struct qla_hw_data *ha;
33523873 struct qla_qpair *qpair;
3874
+
3875
+ qpair = dev_id;
3876
+ if (!qpair) {
3877
+ ql_log(ql_log_info, NULL, 0x505b,
3878
+ "%s: NULL response queue pointer.\n", __func__);
3879
+ return IRQ_NONE;
3880
+ }
3881
+ ha = qpair->hw;
3882
+
3883
+ queue_work_on(smp_processor_id(), ha->wq, &qpair->q_work);
3884
+
3885
+ return IRQ_HANDLED;
3886
+}
3887
+
3888
+irqreturn_t
3889
+qla2xxx_msix_rsp_q_hs(int irq, void *dev_id)
3890
+{
3891
+ struct qla_hw_data *ha;
3892
+ struct qla_qpair *qpair;
33533893 struct device_reg_24xx __iomem *reg;
33543894 unsigned long flags;
33553895
....@@ -3361,15 +3901,12 @@
33613901 }
33623902 ha = qpair->hw;
33633903
3364
- /* Clear the interrupt, if enabled, for this response queue */
3365
- if (unlikely(!ha->flags.disable_msix_handshake)) {
3366
- reg = &ha->iobase->isp24;
3367
- spin_lock_irqsave(&ha->hardware_lock, flags);
3368
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3369
- spin_unlock_irqrestore(&ha->hardware_lock, flags);
3370
- }
3904
+ reg = &ha->iobase->isp24;
3905
+ spin_lock_irqsave(&ha->hardware_lock, flags);
3906
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3907
+ spin_unlock_irqrestore(&ha->hardware_lock, flags);
33713908
3372
- queue_work(ha->wq, &qpair->q_work);
3909
+ queue_work_on(smp_processor_id(), ha->wq, &qpair->q_work);
33733910
33743911 return IRQ_HANDLED;
33753912 }
....@@ -3386,6 +3923,7 @@
33863923 { "rsp_q", qla24xx_msix_rsp_q },
33873924 { "atio_q", qla83xx_msix_atio_q },
33883925 { "qpair_multiq", qla2xxx_msix_rsp_q },
3926
+ { "qpair_multiq_hs", qla2xxx_msix_rsp_q_hs },
33893927 };
33903928
33913929 static const struct qla_init_msix_entry qla82xx_msix_entries[] = {
....@@ -3410,7 +3948,7 @@
34103948 min_vecs++;
34113949 }
34123950
3413
- if (USER_CTRL_IRQ(ha)) {
3951
+ if (USER_CTRL_IRQ(ha) || !ha->mqiobase) {
34143952 /* user wants to control IRQ setting for target mode */
34153953 ret = pci_alloc_irq_vectors(ha->pdev, min_vecs,
34163954 ha->msix_count, PCI_IRQ_MSIX);
....@@ -3444,6 +3982,7 @@
34443982 "Adjusted Max no of queues pairs: %d.\n", ha->max_qpairs);
34453983 }
34463984 }
3985
+ vha->irq_offset = desc.pre_vectors;
34473986 ha->msix_entries = kcalloc(ha->msix_count,
34483987 sizeof(struct qla_msix_entry),
34493988 GFP_KERNEL);
....@@ -3515,16 +4054,12 @@
35154054 }
35164055
35174056 /* Enable MSI-X vector for response queue update for queue 0 */
3518
- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
3519
- if (ha->msixbase && ha->mqiobase &&
3520
- (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
3521
- ql2xmqsupport))
3522
- ha->mqenable = 1;
3523
- } else
3524
- if (ha->mqiobase &&
3525
- (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
3526
- ql2xmqsupport))
3527
- ha->mqenable = 1;
4057
+ if (IS_MQUE_CAPABLE(ha) &&
4058
+ (ha->msixbase && ha->mqiobase && ha->max_qpairs))
4059
+ ha->mqenable = 1;
4060
+ else
4061
+ ha->mqenable = 0;
4062
+
35284063 ql_dbg(ql_dbg_multiq, vha, 0xc005,
35294064 "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n",
35304065 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
....@@ -3550,7 +4085,7 @@
35504085 /* If possible, enable MSI-X. */
35514086 if (ql2xenablemsix == 0 || (!IS_QLA2432(ha) && !IS_QLA2532(ha) &&
35524087 !IS_QLA8432(ha) && !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) &&
3553
- !IS_QLAFX00(ha) && !IS_QLA27XX(ha)))
4088
+ !IS_QLAFX00(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)))
35544089 goto skip_msi;
35554090
35564091 if (ql2xenablemsix == 2)
....@@ -3589,7 +4124,7 @@
35894124
35904125 if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
35914126 !IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha) &&
3592
- !IS_QLA27XX(ha))
4127
+ !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
35934128 goto skip_msi;
35944129
35954130 ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
....@@ -3618,6 +4153,8 @@
36184153 ql_dbg(ql_dbg_init, vha, 0x0125,
36194154 "INTa mode: Enabled.\n");
36204155 ha->flags.mr_intr_valid = 1;
4156
+ /* Set max_qpair to 0, as MSI-X and MSI in not enabled */
4157
+ ha->max_qpairs = 0;
36214158 }
36224159
36234160 clear_risc_ints:
....@@ -3625,7 +4162,7 @@
36254162 goto fail;
36264163
36274164 spin_lock_irq(&ha->hardware_lock);
3628
- WRT_REG_WORD(&reg->isp.semaphore, 0);
4165
+ wrt_reg_word(&reg->isp.semaphore, 0);
36294166 spin_unlock_irq(&ha->hardware_lock);
36304167
36314168 fail: