forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
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);
....@@ -124,12 +269,7 @@
124269 if (!test_and_set_bit(PFLG_DISCONNECTED, &vha->pci_flags) &&
125270 !test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags) &&
126271 !test_bit(PFLG_DRIVER_PROBING, &vha->pci_flags)) {
127
- /*
128
- * Schedule this (only once) on the default system
129
- * workqueue so that all the adapter workqueues and the
130
- * DPC thread can be shutdown cleanly.
131
- */
132
- schedule_work(&vha->hw->board_disable);
272
+ qla_schedule_eeh_work(vha);
133273 }
134274 return true;
135275 } else
....@@ -144,7 +284,7 @@
144284
145285 /**
146286 * qla2300_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
147
- * @irq:
287
+ * @irq: interrupt number
148288 * @dev_id: SCSI driver HA context
149289 *
150290 * Called by system whenever the host adapter generates an interrupt.
....@@ -160,7 +300,7 @@
160300 unsigned long iter;
161301 uint32_t stat;
162302 uint16_t hccr;
163
- uint16_t mb[4];
303
+ uint16_t mb[8];
164304 struct rsp_que *rsp;
165305 struct qla_hw_data *ha;
166306 unsigned long flags;
....@@ -179,14 +319,14 @@
179319 spin_lock_irqsave(&ha->hardware_lock, flags);
180320 vha = pci_get_drvdata(ha->pdev);
181321 for (iter = 50; iter--; ) {
182
- stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
322
+ stat = rd_reg_dword(&reg->u.isp2300.host_status);
183323 if (qla2x00_check_reg32_for_disconnect(vha, stat))
184324 break;
185325 if (stat & HSR_RISC_PAUSED) {
186326 if (unlikely(pci_channel_offline(ha->pdev)))
187327 break;
188328
189
- hccr = RD_REG_WORD(&reg->hccr);
329
+ hccr = rd_reg_word(&reg->hccr);
190330
191331 if (hccr & (BIT_15 | BIT_13 | BIT_11 | BIT_8))
192332 ql_log(ql_log_warn, vha, 0x5026,
....@@ -202,10 +342,10 @@
202342 * interrupt bit to be cleared. Schedule a big
203343 * hammer to get out of the RISC PAUSED state.
204344 */
205
- WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
206
- RD_REG_WORD(&reg->hccr);
345
+ wrt_reg_word(&reg->hccr, HCCR_RESET_RISC);
346
+ rd_reg_word(&reg->hccr);
207347
208
- ha->isp_ops->fw_dump(vha, 1);
348
+ ha->isp_ops->fw_dump(vha);
209349 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
210350 break;
211351 } else if ((stat & HSR_RISC_INT) == 0)
....@@ -220,7 +360,7 @@
220360 status |= MBX_INTERRUPT;
221361
222362 /* Release mailbox registers. */
223
- WRT_REG_WORD(&reg->semaphore, 0);
363
+ wrt_reg_word(&reg->semaphore, 0);
224364 break;
225365 case 0x12:
226366 mb[0] = MSW(stat);
....@@ -248,8 +388,8 @@
248388 "Unrecognized interrupt type (%d).\n", stat & 0xff);
249389 break;
250390 }
251
- WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
252
- RD_REG_WORD_RELAXED(&reg->hccr);
391
+ wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
392
+ rd_reg_word_relaxed(&reg->hccr);
253393 }
254394 qla2x00_handle_mbx_completion(ha, status);
255395 spin_unlock_irqrestore(&ha->hardware_lock, flags);
....@@ -267,7 +407,7 @@
267407 {
268408 uint16_t cnt;
269409 uint32_t mboxes;
270
- uint16_t __iomem *wptr;
410
+ __le16 __iomem *wptr;
271411 struct qla_hw_data *ha = vha->hw;
272412 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
273413
....@@ -283,15 +423,15 @@
283423 ha->flags.mbox_int = 1;
284424 ha->mailbox_out[0] = mb0;
285425 mboxes >>= 1;
286
- wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 1);
426
+ wptr = MAILBOX_REG(ha, reg, 1);
287427
288428 for (cnt = 1; cnt < ha->mbx_count; cnt++) {
289429 if (IS_QLA2200(ha) && cnt == 8)
290
- wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
430
+ wptr = MAILBOX_REG(ha, reg, 8);
291431 if ((cnt == 4 || cnt == 5) && (mboxes & BIT_0))
292432 ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
293433 else if (mboxes & BIT_0)
294
- ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
434
+ ha->mailbox_out[cnt] = rd_reg_word(wptr);
295435
296436 wptr++;
297437 mboxes >>= 1;
....@@ -306,19 +446,19 @@
306446 int rval;
307447 struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
308448 struct device_reg_82xx __iomem *reg82 = &vha->hw->iobase->isp82;
309
- uint16_t __iomem *wptr;
449
+ __le16 __iomem *wptr;
310450 uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
311451
312452 /* Seed data -- mailbox1 -> mailbox7. */
313453 if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw))
314
- wptr = (uint16_t __iomem *)&reg24->mailbox1;
454
+ wptr = &reg24->mailbox1;
315455 else if (IS_QLA8044(vha->hw))
316
- wptr = (uint16_t __iomem *)&reg82->mailbox_out[1];
456
+ wptr = &reg82->mailbox_out[1];
317457 else
318458 return;
319459
320460 for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
321
- mb[cnt] = RD_REG_WORD(wptr);
461
+ mb[cnt] = rd_reg_word(wptr);
322462
323463 ql_dbg(ql_dbg_async, vha, 0x5021,
324464 "Inter-Driver Communication %s -- "
....@@ -366,7 +506,7 @@
366506 static const char *const link_speeds[] = {
367507 "1", "2", "?", "4", "8", "16", "32", "10"
368508 };
369
-#define QLA_LAST_SPEED 7
509
+#define QLA_LAST_SPEED (ARRAY_SIZE(link_speeds) - 1)
370510
371511 if (IS_QLA2100(ha) || IS_QLA2200(ha))
372512 return link_speeds[0];
....@@ -611,6 +751,212 @@
611751 return NULL;
612752 }
613753
754
+/* Shall be called only on supported adapters. */
755
+static void
756
+qla27xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb)
757
+{
758
+ struct qla_hw_data *ha = vha->hw;
759
+ bool reset_isp_needed = 0;
760
+
761
+ ql_log(ql_log_warn, vha, 0x02f0,
762
+ "MPI Heartbeat stop. MPI reset is%s needed. "
763
+ "MB0[%xh] MB1[%xh] MB2[%xh] MB3[%xh]\n",
764
+ mb[1] & BIT_8 ? "" : " not",
765
+ mb[0], mb[1], mb[2], mb[3]);
766
+
767
+ if ((mb[1] & BIT_8) == 0)
768
+ return;
769
+
770
+ ql_log(ql_log_warn, vha, 0x02f1,
771
+ "MPI Heartbeat stop. FW dump needed\n");
772
+
773
+ if (ql2xfulldump_on_mpifail) {
774
+ ha->isp_ops->fw_dump(vha);
775
+ reset_isp_needed = 1;
776
+ }
777
+
778
+ ha->isp_ops->mpi_fw_dump(vha, 1);
779
+
780
+ if (reset_isp_needed) {
781
+ vha->hw->flags.fw_init_done = 0;
782
+ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
783
+ qla2xxx_wake_dpc(vha);
784
+ }
785
+}
786
+
787
+static struct purex_item *
788
+qla24xx_alloc_purex_item(scsi_qla_host_t *vha, uint16_t size)
789
+{
790
+ struct purex_item *item = NULL;
791
+ uint8_t item_hdr_size = sizeof(*item);
792
+
793
+ if (size > QLA_DEFAULT_PAYLOAD_SIZE) {
794
+ item = kzalloc(item_hdr_size +
795
+ (size - QLA_DEFAULT_PAYLOAD_SIZE), GFP_ATOMIC);
796
+ } else {
797
+ if (atomic_inc_return(&vha->default_item.in_use) == 1) {
798
+ item = &vha->default_item;
799
+ goto initialize_purex_header;
800
+ } else {
801
+ item = kzalloc(item_hdr_size, GFP_ATOMIC);
802
+ }
803
+ }
804
+ if (!item) {
805
+ ql_log(ql_log_warn, vha, 0x5092,
806
+ ">> Failed allocate purex list item.\n");
807
+
808
+ return NULL;
809
+ }
810
+
811
+initialize_purex_header:
812
+ item->vha = vha;
813
+ item->size = size;
814
+ return item;
815
+}
816
+
817
+static void
818
+qla24xx_queue_purex_item(scsi_qla_host_t *vha, struct purex_item *pkt,
819
+ void (*process_item)(struct scsi_qla_host *vha,
820
+ struct purex_item *pkt))
821
+{
822
+ struct purex_list *list = &vha->purex_list;
823
+ ulong flags;
824
+
825
+ pkt->process_item = process_item;
826
+
827
+ spin_lock_irqsave(&list->lock, flags);
828
+ list_add_tail(&pkt->list, &list->head);
829
+ spin_unlock_irqrestore(&list->lock, flags);
830
+
831
+ set_bit(PROCESS_PUREX_IOCB, &vha->dpc_flags);
832
+}
833
+
834
+/**
835
+ * qla24xx_copy_std_pkt() - Copy over purex ELS which is
836
+ * contained in a single IOCB.
837
+ * purex packet.
838
+ * @vha: SCSI driver HA context
839
+ * @pkt: ELS packet
840
+ */
841
+static struct purex_item
842
+*qla24xx_copy_std_pkt(struct scsi_qla_host *vha, void *pkt)
843
+{
844
+ struct purex_item *item;
845
+
846
+ item = qla24xx_alloc_purex_item(vha,
847
+ QLA_DEFAULT_PAYLOAD_SIZE);
848
+ if (!item)
849
+ return item;
850
+
851
+ memcpy(&item->iocb, pkt, sizeof(item->iocb));
852
+ return item;
853
+}
854
+
855
+/**
856
+ * qla27xx_copy_fpin_pkt() - Copy over fpin packets that can
857
+ * span over multiple IOCBs.
858
+ * @vha: SCSI driver HA context
859
+ * @pkt: ELS packet
860
+ * @rsp: Response queue
861
+ */
862
+static struct purex_item *
863
+qla27xx_copy_fpin_pkt(struct scsi_qla_host *vha, void **pkt,
864
+ struct rsp_que **rsp)
865
+{
866
+ struct purex_entry_24xx *purex = *pkt;
867
+ struct rsp_que *rsp_q = *rsp;
868
+ sts_cont_entry_t *new_pkt;
869
+ uint16_t no_bytes = 0, total_bytes = 0, pending_bytes = 0;
870
+ uint16_t buffer_copy_offset = 0;
871
+ uint16_t entry_count, entry_count_remaining;
872
+ struct purex_item *item;
873
+ void *fpin_pkt = NULL;
874
+
875
+ total_bytes = (le16_to_cpu(purex->frame_size) & 0x0FFF)
876
+ - PURX_ELS_HEADER_SIZE;
877
+ pending_bytes = total_bytes;
878
+ entry_count = entry_count_remaining = purex->entry_count;
879
+ no_bytes = (pending_bytes > sizeof(purex->els_frame_payload)) ?
880
+ sizeof(purex->els_frame_payload) : pending_bytes;
881
+ ql_log(ql_log_info, vha, 0x509a,
882
+ "FPIN ELS, frame_size 0x%x, entry count %d\n",
883
+ total_bytes, entry_count);
884
+
885
+ item = qla24xx_alloc_purex_item(vha, total_bytes);
886
+ if (!item)
887
+ return item;
888
+
889
+ fpin_pkt = &item->iocb;
890
+
891
+ memcpy(fpin_pkt, &purex->els_frame_payload[0], no_bytes);
892
+ buffer_copy_offset += no_bytes;
893
+ pending_bytes -= no_bytes;
894
+ --entry_count_remaining;
895
+
896
+ ((response_t *)purex)->signature = RESPONSE_PROCESSED;
897
+ wmb();
898
+
899
+ do {
900
+ while ((total_bytes > 0) && (entry_count_remaining > 0)) {
901
+ if (rsp_q->ring_ptr->signature == RESPONSE_PROCESSED) {
902
+ ql_dbg(ql_dbg_async, vha, 0x5084,
903
+ "Ran out of IOCBs, partial data 0x%x\n",
904
+ buffer_copy_offset);
905
+ cpu_relax();
906
+ continue;
907
+ }
908
+
909
+ new_pkt = (sts_cont_entry_t *)rsp_q->ring_ptr;
910
+ *pkt = new_pkt;
911
+
912
+ if (new_pkt->entry_type != STATUS_CONT_TYPE) {
913
+ ql_log(ql_log_warn, vha, 0x507a,
914
+ "Unexpected IOCB type, partial data 0x%x\n",
915
+ buffer_copy_offset);
916
+ break;
917
+ }
918
+
919
+ rsp_q->ring_index++;
920
+ if (rsp_q->ring_index == rsp_q->length) {
921
+ rsp_q->ring_index = 0;
922
+ rsp_q->ring_ptr = rsp_q->ring;
923
+ } else {
924
+ rsp_q->ring_ptr++;
925
+ }
926
+ no_bytes = (pending_bytes > sizeof(new_pkt->data)) ?
927
+ sizeof(new_pkt->data) : pending_bytes;
928
+ if ((buffer_copy_offset + no_bytes) <= total_bytes) {
929
+ memcpy(((uint8_t *)fpin_pkt +
930
+ buffer_copy_offset), new_pkt->data,
931
+ no_bytes);
932
+ buffer_copy_offset += no_bytes;
933
+ pending_bytes -= no_bytes;
934
+ --entry_count_remaining;
935
+ } else {
936
+ ql_log(ql_log_warn, vha, 0x5044,
937
+ "Attempt to copy more that we got, optimizing..%x\n",
938
+ buffer_copy_offset);
939
+ memcpy(((uint8_t *)fpin_pkt +
940
+ buffer_copy_offset), new_pkt->data,
941
+ total_bytes - buffer_copy_offset);
942
+ }
943
+
944
+ ((response_t *)new_pkt)->signature = RESPONSE_PROCESSED;
945
+ wmb();
946
+ }
947
+
948
+ if (pending_bytes != 0 || entry_count_remaining != 0) {
949
+ ql_log(ql_log_fatal, vha, 0x508b,
950
+ "Dropping partial FPIN, underrun bytes = 0x%x, entry cnts 0x%x\n",
951
+ total_bytes, entry_count_remaining);
952
+ qla24xx_free_purex_item(item);
953
+ return NULL;
954
+ }
955
+ } while (entry_count_remaining > 0);
956
+ host_to_fcp_swap((uint8_t *)&item->iocb, total_bytes);
957
+ return item;
958
+}
959
+
614960 /**
615961 * qla2x00_async_event() - Process aynchronous events.
616962 * @vha: SCSI driver HA context
....@@ -631,8 +977,12 @@
631977 unsigned long flags;
632978 fc_port_t *fcport = NULL;
633979
634
- if (!vha->hw->flags.fw_started)
980
+ if (!vha->hw->flags.fw_started) {
981
+ ql_log(ql_log_warn, vha, 0x50ff,
982
+ "Dropping AEN - %04x %04x %04x %04x.\n",
983
+ mb[0], mb[1], mb[2], mb[3]);
635984 return;
985
+ }
636986
637987 /* Setup to process RIO completion. */
638988 handle_cnt = 0;
....@@ -640,7 +990,7 @@
640990 goto skip_rio;
641991 switch (mb[0]) {
642992 case MBA_SCSI_COMPLETION:
643
- handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1]));
993
+ handles[0] = make_handle(mb[2], mb[1]);
644994 handle_cnt = 1;
645995 break;
646996 case MBA_CMPLT_1_16BIT:
....@@ -679,10 +1029,9 @@
6791029 mb[0] = MBA_SCSI_COMPLETION;
6801030 break;
6811031 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));
1032
+ handles[0] = make_handle(mb[2], mb[1]);
1033
+ handles[1] = make_handle(RD_MAILBOX_REG(ha, reg, 7),
1034
+ RD_MAILBOX_REG(ha, reg, 6));
6861035 handle_cnt = 2;
6871036 mb[0] = MBA_SCSI_COMPLETION;
6881037 break;
....@@ -708,13 +1057,28 @@
7081057 break;
7091058
7101059 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);
1060
+ mbx = 0;
1061
+ if (IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
1062
+ IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1063
+ u16 m[4];
7161064
717
- ha->isp_ops->fw_dump(vha, 1);
1065
+ m[0] = rd_reg_word(&reg24->mailbox4);
1066
+ m[1] = rd_reg_word(&reg24->mailbox5);
1067
+ m[2] = rd_reg_word(&reg24->mailbox6);
1068
+ mbx = m[3] = rd_reg_word(&reg24->mailbox7);
1069
+
1070
+ ql_log(ql_log_warn, vha, 0x5003,
1071
+ "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh mbx4=%xh mbx5=%xh mbx6=%xh mbx7=%xh.\n",
1072
+ mb[1], mb[2], mb[3], m[0], m[1], m[2], m[3]);
1073
+ } else
1074
+ ql_log(ql_log_warn, vha, 0x5003,
1075
+ "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n ",
1076
+ mb[1], mb[2], mb[3]);
1077
+
1078
+ if ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) &&
1079
+ rd_reg_word(&reg24->mailbox7) & BIT_8)
1080
+ ha->isp_ops->mpi_fw_dump(vha, 1);
1081
+ ha->isp_ops->fw_dump(vha);
7181082 ha->flags.fw_init_done = 0;
7191083 QLA_FW_STOPPED(ha);
7201084
....@@ -765,7 +1129,6 @@
7651129 case MBA_LOOP_INIT_ERR:
7661130 ql_log(ql_log_warn, vha, 0x5090,
7671131 "LOOP INIT ERROR (%x).\n", mb[1]);
768
- ha->isp_ops->fw_dump(vha, 1);
7691132 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
7701133 break;
7711134
....@@ -778,7 +1141,7 @@
7781141 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
7791142 atomic_set(&vha->loop_state, LOOP_DOWN);
7801143 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
781
- qla2x00_mark_all_devices_lost(vha, 1);
1144
+ qla2x00_mark_all_devices_lost(vha);
7821145 }
7831146
7841147 if (vha->vp_idx) {
....@@ -803,13 +1166,15 @@
8031166 "LOOP UP detected (%s Gbps).\n",
8041167 qla2x00_get_link_speed_str(ha, ha->link_data_rate));
8051168
1169
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1170
+ if (mb[2] & BIT_0)
1171
+ ql_log(ql_log_info, vha, 0x11a0,
1172
+ "FEC=enabled (link up).\n");
1173
+ }
1174
+
8061175 vha->flags.management_server_logged_in = 0;
8071176 qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate);
8081177
809
- if (AUTO_DETECT_SFP_SUPPORT(vha)) {
810
- set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags);
811
- qla2xxx_wake_dpc(vha);
812
- }
8131178 break;
8141179
8151180 case MBA_LOOP_DOWN: /* Loop Down Event */
....@@ -818,8 +1183,8 @@
8181183 ha->current_topology = 0;
8191184
8201185 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])
1186
+ ? rd_reg_word(&reg24->mailbox4) : 0;
1187
+ mbx = (IS_P3P_TYPE(ha)) ? rd_reg_word(&reg82->mailbox_out[4])
8231188 : mbx;
8241189 ql_log(ql_log_info, vha, 0x500b,
8251190 "LOOP DOWN detected (%x %x %x %x).\n",
....@@ -834,9 +1199,9 @@
8341199 * Restore for Physical Port only
8351200 */
8361201 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);
1202
+ if (ha->flags.fawwpn_enabled &&
1203
+ (ha->current_topology == ISP_CFG_F)) {
1204
+ memcpy(vha->port_name, ha->port_name, WWN_SIZE);
8401205 fc_host_port_name(vha->host) =
8411206 wwn_to_u64(vha->port_name);
8421207 ql_dbg(ql_dbg_init + ql_dbg_verbose,
....@@ -849,7 +1214,7 @@
8491214 }
8501215
8511216 vha->device_flags |= DFLG_NO_CABLE;
852
- qla2x00_mark_all_devices_lost(vha, 1);
1217
+ qla2x00_mark_all_devices_lost(vha);
8531218 }
8541219
8551220 if (vha->vp_idx) {
....@@ -869,7 +1234,7 @@
8691234 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
8701235 atomic_set(&vha->loop_state, LOOP_DOWN);
8711236 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
872
- qla2x00_mark_all_devices_lost(vha, 1);
1237
+ qla2x00_mark_all_devices_lost(vha);
8731238 }
8741239
8751240 if (vha->vp_idx) {
....@@ -912,7 +1277,7 @@
9121277 atomic_set(&vha->loop_down_timer,
9131278 LOOP_DOWN_TIME);
9141279 if (!N2N_TOPO(ha))
915
- qla2x00_mark_all_devices_lost(vha, 1);
1280
+ qla2x00_mark_all_devices_lost(vha);
9161281 }
9171282
9181283 if (vha->vp_idx) {
....@@ -941,7 +1306,7 @@
9411306 if (!atomic_read(&vha->loop_down_timer))
9421307 atomic_set(&vha->loop_down_timer,
9431308 LOOP_DOWN_TIME);
944
- qla2x00_mark_all_devices_lost(vha, 1);
1309
+ qla2x00_mark_all_devices_lost(vha);
9451310 }
9461311
9471312 if (vha->vp_idx) {
....@@ -1010,7 +1375,6 @@
10101375 "Marking port lost loopid=%04x portid=%06x.\n",
10111376 fcport->loop_id, fcport->d_id.b24);
10121377 if (qla_ini_mode_enabled(vha)) {
1013
- qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
10141378 fcport->logout_on_delete = 0;
10151379 qlt_schedule_sess_for_deletion(fcport);
10161380 }
....@@ -1022,14 +1386,14 @@
10221386 atomic_set(&vha->loop_down_timer,
10231387 LOOP_DOWN_TIME);
10241388 vha->device_flags |= DFLG_NO_CABLE;
1025
- qla2x00_mark_all_devices_lost(vha, 1);
1389
+ qla2x00_mark_all_devices_lost(vha);
10261390 }
10271391
10281392 if (vha->vp_idx) {
10291393 atomic_set(&vha->vp_state, VP_FAILED);
10301394 fc_vport_set_state(vha->fc_vport,
10311395 FC_VPORT_FAILED);
1032
- qla2x00_mark_all_devices_lost(vha, 1);
1396
+ qla2x00_mark_all_devices_lost(vha);
10331397 }
10341398
10351399 vha->flags.management_server_logged_in = 0;
....@@ -1102,11 +1466,23 @@
11021466 struct event_arg ea;
11031467
11041468 memset(&ea, 0, sizeof(ea));
1105
- ea.event = FCME_RSCN;
11061469 ea.id.b24 = rscn_entry;
11071470 ea.id.b.rsvd_1 = rscn_entry >> 24;
1108
- qla2x00_fcport_event_handler(vha, &ea);
1471
+ qla2x00_handle_rscn(vha, &ea);
11091472 qla2x00_post_aen_work(vha, FCH_EVT_RSCN, rscn_entry);
1473
+ }
1474
+ break;
1475
+ case MBA_CONGN_NOTI_RECV:
1476
+ if (!ha->flags.scm_enabled ||
1477
+ mb[1] != QLA_CON_PRIMITIVE_RECEIVED)
1478
+ break;
1479
+
1480
+ if (mb[2] == QLA_CONGESTION_ARB_WARNING) {
1481
+ ql_dbg(ql_dbg_async, vha, 0x509b,
1482
+ "Congestion Warning %04x %04x.\n", mb[1], mb[2]);
1483
+ } else if (mb[2] == QLA_CONGESTION_ARB_ALARM) {
1484
+ ql_log(ql_log_warn, vha, 0x509b,
1485
+ "Congestion Alarm %04x %04x.\n", mb[1], mb[2]);
11101486 }
11111487 break;
11121488 /* case MBA_RIO_RESPONSE: */
....@@ -1186,7 +1562,7 @@
11861562 break;
11871563 case MBA_IDC_NOTIFY:
11881564 if (IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
1189
- mb[4] = RD_REG_WORD(&reg24->mailbox4);
1565
+ mb[4] = rd_reg_word(&reg24->mailbox4);
11901566 if (((mb[2] & 0x7fff) == MBC_PORT_RESET ||
11911567 (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) &&
11921568 (mb[4] & INTERNAL_LOOPBACK_MASK) != 0) {
....@@ -1200,11 +1576,11 @@
12001576 qla2xxx_wake_dpc(vha);
12011577 }
12021578 }
1203
- /* fall through */
1579
+ fallthrough;
12041580 case MBA_IDC_COMPLETE:
12051581 if (ha->notify_lb_portup_comp && !vha->vp_idx)
12061582 complete(&ha->lb_portup_comp);
1207
- /* Fallthru */
1583
+ fallthrough;
12081584 case MBA_IDC_TIME_EXT:
12091585 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) ||
12101586 IS_QLA8044(ha))
....@@ -1212,32 +1588,66 @@
12121588 break;
12131589
12141590 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);
1591
+ if (IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1592
+ qla27xx_handle_8200_aen(vha, mb);
1593
+ } else if (IS_QLA83XX(ha)) {
1594
+ mb[4] = rd_reg_word(&reg24->mailbox4);
1595
+ mb[5] = rd_reg_word(&reg24->mailbox5);
1596
+ mb[6] = rd_reg_word(&reg24->mailbox6);
1597
+ mb[7] = rd_reg_word(&reg24->mailbox7);
1598
+ qla83xx_handle_8200_aen(vha, mb);
1599
+ } else {
1600
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1601
+ "skip Heartbeat processing mb0-3=[0x%04x] [0x%04x] [0x%04x] [0x%04x]\n",
1602
+ mb[0], mb[1], mb[2], mb[3]);
1603
+ }
12201604 break;
12211605
12221606 case MBA_DPORT_DIAGNOSTICS:
12231607 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");
1608
+ "D-Port Diagnostics: %04x %04x %04x %04x\n",
1609
+ mb[0], mb[1], mb[2], mb[3]);
1610
+ memcpy(vha->dport_data, mb, sizeof(vha->dport_data));
1611
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
1612
+ static char *results[] = {
1613
+ "start", "done(pass)", "done(error)", "undefined" };
1614
+ static char *types[] = {
1615
+ "none", "dynamic", "static", "other" };
1616
+ uint result = mb[1] >> 0 & 0x3;
1617
+ uint type = mb[1] >> 6 & 0x3;
1618
+ uint sw = mb[1] >> 15 & 0x1;
1619
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1620
+ "D-Port Diagnostics: result=%s type=%s [sw=%u]\n",
1621
+ results[result], types[type], sw);
1622
+ if (result == 2) {
1623
+ static char *reasons[] = {
1624
+ "reserved", "unexpected reject",
1625
+ "unexpected phase", "retry exceeded",
1626
+ "timed out", "not supported",
1627
+ "user stopped" };
1628
+ uint reason = mb[2] >> 0 & 0xf;
1629
+ uint phase = mb[2] >> 12 & 0xf;
1630
+ ql_dbg(ql_dbg_async, vha, 0x5052,
1631
+ "D-Port Diagnostics: reason=%s phase=%u \n",
1632
+ reason < 7 ? reasons[reason] : "other",
1633
+ phase >> 1);
1634
+ }
1635
+ }
12291636 break;
12301637
12311638 case MBA_TEMPERATURE_ALERT:
12321639 ql_dbg(ql_dbg_async, vha, 0x505e,
12331640 "TEMPERATURE ALERT: %04x %04x %04x\n", mb[1], mb[2], mb[3]);
1234
- if (mb[1] == 0x12)
1235
- schedule_work(&ha->board_disable);
12361641 break;
12371642
12381643 case MBA_TRANS_INSERT:
12391644 ql_dbg(ql_dbg_async, vha, 0x5091,
12401645 "Transceiver Insertion: %04x\n", mb[1]);
1646
+ set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags);
1647
+ break;
1648
+
1649
+ case MBA_TRANS_REMOVE:
1650
+ ql_dbg(ql_dbg_async, vha, 0x5091, "Transceiver Removal\n");
12411651 break;
12421652
12431653 default:
....@@ -1300,35 +1710,35 @@
13001710 {
13011711 struct qla_hw_data *ha = vha->hw;
13021712 sts_entry_t *pkt = iocb;
1303
- srb_t *sp = NULL;
1713
+ srb_t *sp;
13041714 uint16_t index;
13051715
13061716 index = LSW(pkt->handle);
13071717 if (index >= req->num_outstanding_cmds) {
13081718 ql_log(ql_log_warn, vha, 0x5031,
1309
- "Invalid command index (%x) type %8ph.\n",
1310
- index, iocb);
1719
+ "%s: Invalid command index (%x) type %8ph.\n",
1720
+ func, index, iocb);
13111721 if (IS_P3P_TYPE(ha))
13121722 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
13131723 else
13141724 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1315
- goto done;
1725
+ return NULL;
13161726 }
13171727 sp = req->outstanding_cmds[index];
13181728 if (!sp) {
13191729 ql_log(ql_log_warn, vha, 0x5032,
1320
- "Invalid completion handle (%x) -- timed-out.\n", index);
1321
- return sp;
1730
+ "%s: Invalid completion handle (%x) -- timed-out.\n",
1731
+ func, index);
1732
+ return NULL;
13221733 }
13231734 if (sp->handle != index) {
13241735 ql_log(ql_log_warn, vha, 0x5033,
1325
- "SRB handle (%x) mismatch %x.\n", sp->handle, index);
1736
+ "%s: SRB handle (%x) mismatch %x.\n", func,
1737
+ sp->handle, index);
13261738 return NULL;
13271739 }
13281740
13291741 req->outstanding_cmds[index] = NULL;
1330
-
1331
-done:
13321742 return sp;
13331743 }
13341744
....@@ -1367,7 +1777,7 @@
13671777 le16_to_cpu(mbx->status_flags));
13681778
13691779 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5029,
1370
- (uint8_t *)mbx, sizeof(*mbx));
1780
+ mbx, sizeof(*mbx));
13711781
13721782 goto logio_done;
13731783 }
....@@ -1423,6 +1833,7 @@
14231833 struct mbx_24xx_entry *pkt)
14241834 {
14251835 const char func[] = "MBX-IOCB2";
1836
+ struct qla_hw_data *ha = vha->hw;
14261837 srb_t *sp;
14271838 struct srb_iocb *si;
14281839 u16 sz, i;
....@@ -1432,11 +1843,23 @@
14321843 if (!sp)
14331844 return;
14341845
1846
+ if (sp->type == SRB_SCSI_CMD ||
1847
+ sp->type == SRB_NVME_CMD ||
1848
+ sp->type == SRB_TM_CMD) {
1849
+ ql_log(ql_log_warn, vha, 0x509d,
1850
+ "Inconsistent event entry type %d\n", sp->type);
1851
+ if (IS_P3P_TYPE(ha))
1852
+ set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1853
+ else
1854
+ set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1855
+ return;
1856
+ }
1857
+
14351858 si = &sp->u.iocb_cmd;
14361859 sz = min(ARRAY_SIZE(pkt->mb), ARRAY_SIZE(sp->u.iocb_cmd.u.mbx.in_mb));
14371860
14381861 for (i = 0; i < sz; i++)
1439
- si->u.mbx.in_mb[i] = le16_to_cpu(pkt->mb[i]);
1862
+ si->u.mbx.in_mb[i] = pkt->mb[i];
14401863
14411864 res = (si->u.mbx.in_mb[0] & MBS_MASK);
14421865
....@@ -1497,7 +1920,7 @@
14971920 if (comp_status == CS_DATA_UNDERRUN) {
14981921 res = DID_OK << 16;
14991922 bsg_reply->reply_payload_rcv_len =
1500
- le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len);
1923
+ le16_to_cpu(pkt->rsp_info_len);
15011924
15021925 ql_log(ql_log_warn, vha, 0x5048,
15031926 "CT pass-through-%s error comp_status=0x%x total_byte=0x%x.\n",
....@@ -1511,7 +1934,7 @@
15111934 bsg_reply->reply_payload_rcv_len = 0;
15121935 }
15131936 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035,
1514
- (uint8_t *)pkt, sizeof(*pkt));
1937
+ pkt, sizeof(*pkt));
15151938 } else {
15161939 res = DID_OK << 16;
15171940 bsg_reply->reply_payload_rcv_len =
....@@ -1537,6 +1960,7 @@
15371960 qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
15381961 struct sts_entry_24xx *pkt, int iocb_type)
15391962 {
1963
+ struct els_sts_entry_24xx *ese = (struct els_sts_entry_24xx *)pkt;
15401964 const char func[] = "ELS_CT_IOCB";
15411965 const char *type;
15421966 srb_t *sp;
....@@ -1586,33 +2010,31 @@
15862010 }
15872011
15882012 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);
2013
+ fw_status[1] = le32_to_cpu(ese->error_subcode_1);
2014
+ fw_status[2] = le32_to_cpu(ese->error_subcode_2);
15912015
15922016 if (iocb_type == ELS_IOCB_TYPE) {
15932017 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];
2018
+ els->u.els_plogi.fw_status[0] = cpu_to_le32(fw_status[0]);
2019
+ els->u.els_plogi.fw_status[1] = cpu_to_le32(fw_status[1]);
2020
+ els->u.els_plogi.fw_status[2] = cpu_to_le32(fw_status[2]);
2021
+ els->u.els_plogi.comp_status = cpu_to_le16(fw_status[0]);
15982022 if (comp_status == CS_COMPLETE) {
15992023 res = DID_OK << 16;
16002024 } else {
16012025 if (comp_status == CS_DATA_UNDERRUN) {
16022026 res = DID_OK << 16;
1603
- els->u.els_plogi.len =
1604
- le16_to_cpu(((struct els_sts_entry_24xx *)
1605
- pkt)->total_byte_count);
2027
+ els->u.els_plogi.len = cpu_to_le16(le32_to_cpu(
2028
+ ese->total_byte_count));
16062029 } else {
16072030 els->u.els_plogi.len = 0;
16082031 res = DID_ERROR << 16;
16092032 }
16102033 }
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",
2034
+ ql_dbg(ql_dbg_disc, vha, 0x503f,
2035
+ "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",
16132036 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));
2037
+ le32_to_cpu(ese->total_byte_count));
16162038 goto els_ct_done;
16172039 }
16182040
....@@ -1628,30 +2050,27 @@
16282050 if (comp_status == CS_DATA_UNDERRUN) {
16292051 res = DID_OK << 16;
16302052 bsg_reply->reply_payload_rcv_len =
1631
- le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->total_byte_count);
2053
+ le32_to_cpu(ese->total_byte_count);
16322054
16332055 ql_dbg(ql_dbg_user, vha, 0x503f,
16342056 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
16352057 "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
16362058 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));
2059
+ le32_to_cpu(ese->total_byte_count));
16392060 } else {
16402061 ql_dbg(ql_dbg_user, vha, 0x5040,
16412062 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
16422063 "error subcode 1=0x%x error subcode 2=0x%x.\n",
16432064 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));
2065
+ le32_to_cpu(ese->error_subcode_1),
2066
+ le32_to_cpu(ese->error_subcode_2));
16482067 res = DID_ERROR << 16;
16492068 bsg_reply->reply_payload_rcv_len = 0;
16502069 }
16512070 memcpy(bsg_job->reply + sizeof(struct fc_bsg_reply),
16522071 fw_status, sizeof(fw_status));
16532072 ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056,
1654
- (uint8_t *)pkt, sizeof(*pkt));
2073
+ pkt, sizeof(*pkt));
16552074 }
16562075 else {
16572076 res = DID_OK << 16;
....@@ -1695,21 +2114,28 @@
16952114 fcport->d_id.b.area, fcport->d_id.b.al_pa,
16962115 logio->entry_status);
16972116 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x504d,
1698
- (uint8_t *)logio, sizeof(*logio));
2117
+ logio, sizeof(*logio));
16992118
17002119 goto logio_done;
17012120 }
17022121
17032122 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,
2123
+ ql_dbg(ql_dbg_async, sp->vha, 0x5036,
2124
+ "Async-%s complete: handle=%x pid=%06x wwpn=%8phC iop0=%x\n",
2125
+ type, sp->handle, fcport->d_id.b24, fcport->port_name,
17092126 le32_to_cpu(logio->io_parameter[0]));
17102127
17112128 vha->hw->exch_starvation = 0;
17122129 data[0] = MBS_COMMAND_COMPLETE;
2130
+
2131
+ if (sp->type == SRB_PRLI_CMD) {
2132
+ lio->u.logio.iop[0] =
2133
+ le32_to_cpu(logio->io_parameter[0]);
2134
+ lio->u.logio.iop[1] =
2135
+ le32_to_cpu(logio->io_parameter[1]);
2136
+ goto logio_done;
2137
+ }
2138
+
17132139 if (sp->type != SRB_LOGIN_CMD)
17142140 goto logio_done;
17152141
....@@ -1769,17 +2195,15 @@
17692195 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
17702196 qla2xxx_wake_dpc(vha);
17712197 }
1772
- /* fall through */
2198
+ fallthrough;
17732199 default:
17742200 data[0] = MBS_COMMAND_ERROR;
17752201 break;
17762202 }
17772203
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,
2204
+ ql_dbg(ql_dbg_async, sp->vha, 0x5037,
2205
+ "Async-%s failed: handle=%x pid=%06x wwpn=%8phC comp_status=%x iop0=%x iop1=%x\n",
2206
+ type, sp->handle, fcport->d_id.b24, fcport->port_name,
17832207 le16_to_cpu(logio->comp_status),
17842208 le32_to_cpu(logio->io_parameter[0]),
17852209 le32_to_cpu(logio->io_parameter[1]));
....@@ -1819,6 +2243,7 @@
18192243 iocb->u.tmf.data = QLA_FUNCTION_FAILED;
18202244 } else if ((le16_to_cpu(sts->scsi_status) &
18212245 SS_RESPONSE_INFO_LEN_VALID)) {
2246
+ host_to_fcp_swap(sts->data, sizeof(sts->data));
18222247 if (le32_to_cpu(sts->rsp_data_len) < 4) {
18232248 ql_log(ql_log_warn, fcport->vha, 0x503b,
18242249 "Async-%s error - hdl=%x not enough response(%d).\n",
....@@ -1832,8 +2257,8 @@
18322257 }
18332258
18342259 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));
2260
+ ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, sp->vha, 0x5055,
2261
+ sts, sizeof(*sts));
18372262
18382263 sp->done(sp, 0);
18392264 }
....@@ -1846,16 +2271,24 @@
18462271 struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
18472272 uint16_t state_flags;
18482273 struct nvmefc_fcp_req *fd;
1849
- uint16_t ret = 0;
2274
+ uint16_t ret = QLA_SUCCESS;
2275
+ __le16 comp_status = sts->comp_status;
2276
+ int logit = 0;
18502277
18512278 iocb = &sp->u.iocb_cmd;
18522279 fcport = sp->fcport;
1853
- iocb->u.nvme.comp_status = le16_to_cpu(sts->comp_status);
2280
+ iocb->u.nvme.comp_status = comp_status;
18542281 state_flags = le16_to_cpu(sts->state_flags);
18552282 fd = iocb->u.nvme.desc;
18562283
18572284 if (unlikely(iocb->u.nvme.aen_op))
18582285 atomic_dec(&sp->vha->hw->nvme_active_aen_cnt);
2286
+
2287
+ if (unlikely(comp_status != CS_COMPLETE))
2288
+ logit = 1;
2289
+
2290
+ fd->transferred_length = fd->payload_length -
2291
+ le32_to_cpu(sts->residual_len);
18592292
18602293 /*
18612294 * State flags: Bit 6 and 0.
....@@ -1867,16 +2300,28 @@
18672300 */
18682301 if (!(state_flags & (SF_FCP_RSP_DMA | SF_NVME_ERSP))) {
18692302 iocb->u.nvme.rsp_pyld_len = 0;
2303
+ } else if ((state_flags & (SF_FCP_RSP_DMA | SF_NVME_ERSP)) ==
2304
+ (SF_FCP_RSP_DMA | SF_NVME_ERSP)) {
2305
+ /* Response already DMA'd to fd->rspaddr. */
2306
+ iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len;
18702307 } else if ((state_flags & SF_FCP_RSP_DMA)) {
1871
- iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len);
2308
+ /*
2309
+ * Non-zero value in first 12 bytes of NVMe_RSP IU, treat this
2310
+ * as an error.
2311
+ */
2312
+ iocb->u.nvme.rsp_pyld_len = 0;
2313
+ fd->transferred_length = 0;
2314
+ ql_dbg(ql_dbg_io, fcport->vha, 0x307a,
2315
+ "Unexpected values in NVMe_RSP IU.\n");
2316
+ logit = 1;
18722317 } else if (state_flags & SF_NVME_ERSP) {
18732318 uint32_t *inbuf, *outbuf;
18742319 uint16_t iter;
18752320
18762321 inbuf = (uint32_t *)&sts->nvme_ersp_data;
18772322 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 >
2323
+ iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len;
2324
+ if (unlikely(le16_to_cpu(iocb->u.nvme.rsp_pyld_len) >
18802325 sizeof(struct nvme_fc_ersp_iu))) {
18812326 if (ql_mask_match(ql_dbg_io)) {
18822327 WARN_ONCE(1, "Unexpected response payload length %u.\n",
....@@ -1886,42 +2331,61 @@
18862331 iocb->u.nvme.rsp_pyld_len);
18872332 }
18882333 iocb->u.nvme.rsp_pyld_len =
1889
- sizeof(struct nvme_fc_ersp_iu);
2334
+ cpu_to_le16(sizeof(struct nvme_fc_ersp_iu));
18902335 }
1891
- iter = iocb->u.nvme.rsp_pyld_len >> 2;
2336
+ iter = le16_to_cpu(iocb->u.nvme.rsp_pyld_len) >> 2;
18922337 for (; iter; iter--)
18932338 *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);
18982339 }
18992340
1900
- fd->transferred_length = fd->payload_length -
1901
- le32_to_cpu(sts->residual_len);
2341
+ if (state_flags & SF_NVME_ERSP) {
2342
+ struct nvme_fc_ersp_iu *rsp_iu = fd->rspaddr;
2343
+ u32 tgt_xfer_len;
19022344
1903
- switch (le16_to_cpu(sts->comp_status)) {
2345
+ tgt_xfer_len = be32_to_cpu(rsp_iu->xfrd_len);
2346
+ if (fd->transferred_length != tgt_xfer_len) {
2347
+ ql_dbg(ql_dbg_io, fcport->vha, 0x3079,
2348
+ "Dropped frame(s) detected (sent/rcvd=%u/%u).\n",
2349
+ tgt_xfer_len, fd->transferred_length);
2350
+ logit = 1;
2351
+ } else if (le16_to_cpu(comp_status) == CS_DATA_UNDERRUN) {
2352
+ /*
2353
+ * Do not log if this is just an underflow and there
2354
+ * is no data loss.
2355
+ */
2356
+ logit = 0;
2357
+ }
2358
+ }
2359
+
2360
+ if (unlikely(logit))
2361
+ ql_log(ql_log_warn, fcport->vha, 0x5060,
2362
+ "NVME-%s ERR Handling - hdl=%x status(%x) tr_len:%x resid=%x ox_id=%x\n",
2363
+ sp->name, sp->handle, comp_status,
2364
+ fd->transferred_length, le32_to_cpu(sts->residual_len),
2365
+ sts->ox_id);
2366
+
2367
+ /*
2368
+ * If transport error then Failure (HBA rejects request)
2369
+ * otherwise transport will handle.
2370
+ */
2371
+ switch (le16_to_cpu(comp_status)) {
19042372 case CS_COMPLETE:
1905
- ret = QLA_SUCCESS;
19062373 break;
1907
- case CS_ABORTED:
2374
+
19082375 case CS_RESET:
19092376 case CS_PORT_UNAVAILABLE:
19102377 case CS_PORT_LOGGED_OUT:
2378
+ fcport->nvme_flag |= NVME_FLAG_RESETTING;
2379
+ fallthrough;
2380
+ case CS_ABORTED:
19112381 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);
19162382 fd->transferred_length = 0;
19172383 iocb->u.nvme.rsp_pyld_len = 0;
19182384 ret = QLA_ABORTED;
19192385 break;
2386
+ case CS_DATA_UNDERRUN:
2387
+ break;
19202388 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);
19252389 ret = QLA_FUNCTION_FAILED;
19262390 break;
19272391 }
....@@ -1959,6 +2423,52 @@
19592423 sp->done(sp, rval);
19602424 }
19612425
2426
+/* Process a single response queue entry. */
2427
+static void qla2x00_process_response_entry(struct scsi_qla_host *vha,
2428
+ struct rsp_que *rsp,
2429
+ sts_entry_t *pkt)
2430
+{
2431
+ sts21_entry_t *sts21_entry;
2432
+ sts22_entry_t *sts22_entry;
2433
+ uint16_t handle_cnt;
2434
+ uint16_t cnt;
2435
+
2436
+ switch (pkt->entry_type) {
2437
+ case STATUS_TYPE:
2438
+ qla2x00_status_entry(vha, rsp, pkt);
2439
+ break;
2440
+ case STATUS_TYPE_21:
2441
+ sts21_entry = (sts21_entry_t *)pkt;
2442
+ handle_cnt = sts21_entry->handle_count;
2443
+ for (cnt = 0; cnt < handle_cnt; cnt++)
2444
+ qla2x00_process_completed_request(vha, rsp->req,
2445
+ sts21_entry->handle[cnt]);
2446
+ break;
2447
+ case STATUS_TYPE_22:
2448
+ sts22_entry = (sts22_entry_t *)pkt;
2449
+ handle_cnt = sts22_entry->handle_count;
2450
+ for (cnt = 0; cnt < handle_cnt; cnt++)
2451
+ qla2x00_process_completed_request(vha, rsp->req,
2452
+ sts22_entry->handle[cnt]);
2453
+ break;
2454
+ case STATUS_CONT_TYPE:
2455
+ qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt);
2456
+ break;
2457
+ case MBX_IOCB_TYPE:
2458
+ qla2x00_mbx_iocb_entry(vha, rsp->req, (struct mbx_entry *)pkt);
2459
+ break;
2460
+ case CT_IOCB_TYPE:
2461
+ qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE);
2462
+ break;
2463
+ default:
2464
+ /* Type Not Supported. */
2465
+ ql_log(ql_log_warn, vha, 0x504a,
2466
+ "Received unknown response pkt type %x entry status=%x.\n",
2467
+ pkt->entry_type, pkt->entry_status);
2468
+ break;
2469
+ }
2470
+}
2471
+
19622472 /**
19632473 * qla2x00_process_response_queue() - Process response queue entries.
19642474 * @rsp: response queue
....@@ -1970,8 +2480,6 @@
19702480 struct qla_hw_data *ha = rsp->hw;
19712481 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
19722482 sts_entry_t *pkt;
1973
- uint16_t handle_cnt;
1974
- uint16_t cnt;
19752483
19762484 vha = pci_get_drvdata(ha->pdev);
19772485
....@@ -1996,48 +2504,13 @@
19962504 continue;
19972505 }
19982506
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
- }
2507
+ qla2x00_process_response_entry(vha, rsp, pkt);
20352508 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
20362509 wmb();
20372510 }
20382511
20392512 /* Adjust ring index */
2040
- WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index);
2513
+ wrt_reg_word(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index);
20412514 }
20422515
20432516 static inline void
....@@ -2106,12 +2579,12 @@
21062579 * swab32 of the "data" field in the beginning of qla2x00_status_entry()
21072580 * would make guard field appear at offset 2
21082581 */
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));
2582
+ a_guard = get_unaligned_le16(ap + 2);
2583
+ a_app_tag = get_unaligned_le16(ap + 0);
2584
+ a_ref_tag = get_unaligned_le32(ap + 4);
2585
+ e_guard = get_unaligned_le16(ep + 2);
2586
+ e_app_tag = get_unaligned_le16(ep + 0);
2587
+ e_ref_tag = get_unaligned_le32(ep + 4);
21152588
21162589 ql_dbg(ql_dbg_io, vha, 0x3023,
21172590 "iocb(s) %p Returned STATUS.\n", sts24);
....@@ -2128,9 +2601,9 @@
21282601 * For type 3: ref & app tag is all 'f's
21292602 * For type 0,1,2: app tag is all 'f's
21302603 */
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))) {
2604
+ if (a_app_tag == be16_to_cpu(T10_PI_APP_ESCAPE) &&
2605
+ (scsi_get_prot_type(cmd) != SCSI_PROT_DIF_TYPE3 ||
2606
+ a_ref_tag == be32_to_cpu(T10_PI_REF_ESCAPE))) {
21342607 uint32_t blocks_done, resid;
21352608 sector_t lba_s = scsi_get_lba(cmd);
21362609
....@@ -2226,10 +2699,8 @@
22262699 struct bsg_job *bsg_job = NULL;
22272700 struct fc_bsg_request *bsg_request;
22282701 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;
2702
+ sts_entry_t *sts = pkt;
2703
+ struct sts_entry_24xx *sts24 = pkt;
22332704
22342705 /* Validate handle. */
22352706 if (index >= req->num_outstanding_cmds) {
....@@ -2375,8 +2846,8 @@
23752846 srb_t *sp;
23762847 fc_port_t *fcport;
23772848 struct scsi_cmnd *cp;
2378
- sts_entry_t *sts;
2379
- struct sts_entry_24xx *sts24;
2849
+ sts_entry_t *sts = pkt;
2850
+ struct sts_entry_24xx *sts24 = pkt;
23802851 uint16_t comp_status;
23812852 uint16_t scsi_status;
23822853 uint16_t ox_id;
....@@ -2392,10 +2863,8 @@
23922863 int logit = 1;
23932864 int res = 0;
23942865 uint16_t state_flags = 0;
2395
- uint16_t retry_delay = 0;
2866
+ uint16_t sts_qual = 0;
23962867
2397
- sts = (sts_entry_t *) pkt;
2398
- sts24 = (struct sts_entry_24xx *) pkt;
23992868 if (IS_FWI2_CAPABLE(ha)) {
24002869 comp_status = le16_to_cpu(sts24->comp_status);
24012870 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK;
....@@ -2440,6 +2909,7 @@
24402909 }
24412910 return;
24422911 }
2912
+ qla_put_iocbs(sp->qpair, &sp->iores);
24432913
24442914 if (sp->cmd_type != TYPE_SRB) {
24452915 req->outstanding_cmds[handle] = NULL;
....@@ -2505,13 +2975,7 @@
25052975 host_to_fcp_swap(sts24->data, sizeof(sts24->data));
25062976 ox_id = le16_to_cpu(sts24->ox_id);
25072977 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
- }
2978
+ sts_qual = le16_to_cpu(sts24->status_qualifier);
25152979 } else {
25162980 if (scsi_status & SS_SENSE_LEN_VALID)
25172981 sense_len = le16_to_cpu(sts->req_sense_length);
....@@ -2549,9 +3013,9 @@
25493013 * Check retry_delay_timer value if we receive a busy or
25503014 * queue full.
25513015 */
2552
- if (lscsi_status == SAM_STAT_TASK_SET_FULL ||
2553
- lscsi_status == SAM_STAT_BUSY)
2554
- qla2x00_set_retry_delay_timestamp(fcport, retry_delay);
3016
+ if (unlikely(lscsi_status == SAM_STAT_TASK_SET_FULL ||
3017
+ lscsi_status == SAM_STAT_BUSY))
3018
+ qla2x00_set_retry_delay_timestamp(fcport, sts_qual);
25553019
25563020 /*
25573021 * Based on Host and scsi status generate status code for Linux
....@@ -2672,7 +3136,6 @@
26723136 case CS_PORT_BUSY:
26733137 case CS_INCOMPLETE:
26743138 case CS_PORT_UNAVAILABLE:
2675
- case CS_TIMEOUT:
26763139 case CS_RESET:
26773140
26783141 /*
....@@ -2695,10 +3158,9 @@
26953158 "Port to be marked lost on fcport=%02x%02x%02x, current "
26963159 "port state= %s comp_status %x.\n", fcport->d_id.b.domain,
26973160 fcport->d_id.b.area, fcport->d_id.b.al_pa,
2698
- port_state_str[atomic_read(&fcport->state)],
3161
+ port_state_str[FCS_ONLINE],
26993162 comp_status);
27003163
2701
- qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
27023164 qlt_schedule_sess_for_deletion(fcport);
27033165 }
27043166
....@@ -2725,6 +3187,17 @@
27253187 cp->device->vendor);
27263188 break;
27273189
3190
+ case CS_DMA:
3191
+ ql_log(ql_log_info, fcport->vha, 0x3022,
3192
+ "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",
3193
+ comp_status, scsi_status, res, vha->host_no,
3194
+ cp->device->id, cp->device->lun, fcport->d_id.b24,
3195
+ ox_id, cp->cmnd, scsi_bufflen(cp), rsp_info_len,
3196
+ resid_len, fw_resid_len, sp, cp);
3197
+ ql_dump_buffer(ql_dbg_tgt + ql_dbg_verbose, vha, 0xe0ee,
3198
+ pkt, sizeof(*sts24));
3199
+ res = DID_ERROR << 16;
3200
+ break;
27283201 default:
27293202 res = DID_ERROR << 16;
27303203 break;
....@@ -2848,6 +3321,7 @@
28483321 default:
28493322 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
28503323 if (sp) {
3324
+ qla_put_iocbs(sp->qpair, &sp->iores);
28513325 sp->done(sp, res);
28523326 return 0;
28533327 }
....@@ -2874,7 +3348,7 @@
28743348 {
28753349 uint16_t cnt;
28763350 uint32_t mboxes;
2877
- uint16_t __iomem *wptr;
3351
+ __le16 __iomem *wptr;
28783352 struct qla_hw_data *ha = vha->hw;
28793353 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
28803354
....@@ -2890,11 +3364,11 @@
28903364 ha->flags.mbox_int = 1;
28913365 ha->mailbox_out[0] = mb0;
28923366 mboxes >>= 1;
2893
- wptr = (uint16_t __iomem *)&reg->mailbox1;
3367
+ wptr = &reg->mailbox1;
28943368
28953369 for (cnt = 1; cnt < ha->mbx_count; cnt++) {
28963370 if (mboxes & BIT_0)
2897
- ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
3371
+ ha->mailbox_out[cnt] = rd_reg_word(wptr);
28983372
28993373 mboxes >>= 1;
29003374 wptr++;
....@@ -2914,7 +3388,7 @@
29143388 return;
29153389
29163390 abt = &sp->u.iocb_cmd;
2917
- abt->u.abt.comp_status = le16_to_cpu(pkt->nport_handle);
3391
+ abt->u.abt.comp_status = pkt->nport_handle;
29183392 sp->done(sp, 0);
29193393 }
29203394
....@@ -2943,12 +3417,16 @@
29433417 {
29443418 struct sts_entry_24xx *pkt;
29453419 struct qla_hw_data *ha = vha->hw;
3420
+ struct purex_entry_24xx *purex_entry;
3421
+ struct purex_item *pure_item;
29463422
29473423 if (!ha->flags.fw_started)
29483424 return;
29493425
2950
- if (rsp->qpair->cpuid != smp_processor_id())
3426
+ if (rsp->qpair->cpuid != smp_processor_id() || !rsp->qpair->rcv_intr) {
3427
+ rsp->qpair->rcv_intr = 1;
29513428 qla_cpu_update(rsp->qpair, smp_processor_id());
3429
+ }
29523430
29533431 while (rsp->ring_ptr->signature != RESPONSE_PROCESSED) {
29543432 pkt = (struct sts_entry_24xx *)rsp->ring_ptr;
....@@ -2993,7 +3471,16 @@
29933471 qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE);
29943472 break;
29953473 case ABTS_RECV_24XX:
2996
- if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
3474
+ if (qla_ini_mode_enabled(vha)) {
3475
+ pure_item = qla24xx_copy_std_pkt(vha, pkt);
3476
+ if (!pure_item)
3477
+ break;
3478
+ qla24xx_queue_purex_item(vha, pure_item,
3479
+ qla24xx_process_abts);
3480
+ break;
3481
+ }
3482
+ if (IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
3483
+ IS_QLA28XX(ha)) {
29973484 /* ensure that the ATIO queue is empty */
29983485 qlt_handle_abts_recv(vha, rsp,
29993486 (response_t *)pkt);
....@@ -3001,7 +3488,7 @@
30013488 } else {
30023489 qlt_24xx_process_atio_queue(vha, 1);
30033490 }
3004
- /* fall through */
3491
+ fallthrough;
30053492 case ABTS_RESP_24XX:
30063493 case CTIO_TYPE7:
30073494 case CTIO_CRC2:
....@@ -3036,12 +3523,41 @@
30363523 qla_ctrlvp_completed(vha, rsp->req,
30373524 (struct vp_ctrl_entry_24xx *)pkt);
30383525 break;
3526
+ case PUREX_IOCB_TYPE:
3527
+ purex_entry = (void *)pkt;
3528
+ switch (purex_entry->els_frame_payload[3]) {
3529
+ case ELS_RDP:
3530
+ pure_item = qla24xx_copy_std_pkt(vha, pkt);
3531
+ if (!pure_item)
3532
+ break;
3533
+ qla24xx_queue_purex_item(vha, pure_item,
3534
+ qla24xx_process_purex_rdp);
3535
+ break;
3536
+ case ELS_FPIN:
3537
+ if (!vha->hw->flags.scm_enabled) {
3538
+ ql_log(ql_log_warn, vha, 0x5094,
3539
+ "SCM not active for this port\n");
3540
+ break;
3541
+ }
3542
+ pure_item = qla27xx_copy_fpin_pkt(vha,
3543
+ (void **)&pkt, &rsp);
3544
+ if (!pure_item)
3545
+ break;
3546
+ qla24xx_queue_purex_item(vha, pure_item,
3547
+ qla27xx_process_purex_fpin);
3548
+ break;
3549
+
3550
+ default:
3551
+ ql_log(ql_log_warn, vha, 0x509c,
3552
+ "Discarding ELS Request opcode 0x%x\n",
3553
+ purex_entry->els_frame_payload[3]);
3554
+ }
3555
+ break;
30393556 default:
30403557 /* Type Not Supported. */
30413558 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);
3559
+ "Received unknown response pkt type 0x%x entry status=%x.\n",
3560
+ pkt->entry_type, pkt->entry_status);
30453561 break;
30463562 }
30473563 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
....@@ -3051,9 +3567,10 @@
30513567 /* Adjust ring index */
30523568 if (IS_P3P_TYPE(ha)) {
30533569 struct device_reg_82xx __iomem *reg = &ha->iobase->isp82;
3054
- WRT_REG_DWORD(&reg->rsp_q_out[0], rsp->ring_index);
3570
+
3571
+ wrt_reg_dword(&reg->rsp_q_out[0], rsp->ring_index);
30553572 } else {
3056
- WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
3573
+ wrt_reg_dword(rsp->rsp_q_out, rsp->ring_index);
30573574 }
30583575 }
30593576
....@@ -3066,17 +3583,17 @@
30663583 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
30673584
30683585 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3069
- !IS_QLA27XX(ha))
3586
+ !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
30703587 return;
30713588
30723589 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 &&
3590
+ wrt_reg_dword(&reg->iobase_addr, 0x7C00);
3591
+ rd_reg_dword(&reg->iobase_addr);
3592
+ wrt_reg_dword(&reg->iobase_window, 0x0001);
3593
+ for (cnt = 10000; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 &&
30773594 rval == QLA_SUCCESS; cnt--) {
30783595 if (cnt) {
3079
- WRT_REG_DWORD(&reg->iobase_window, 0x0001);
3596
+ wrt_reg_dword(&reg->iobase_window, 0x0001);
30803597 udelay(10);
30813598 } else
30823599 rval = QLA_FUNCTION_TIMEOUT;
....@@ -3085,11 +3602,11 @@
30853602 goto next_test;
30863603
30873604 rval = QLA_SUCCESS;
3088
- WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3089
- for (cnt = 100; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
3605
+ wrt_reg_dword(&reg->iobase_window, 0x0003);
3606
+ for (cnt = 100; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 &&
30903607 rval == QLA_SUCCESS; cnt--) {
30913608 if (cnt) {
3092
- WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3609
+ wrt_reg_dword(&reg->iobase_window, 0x0003);
30933610 udelay(10);
30943611 } else
30953612 rval = QLA_FUNCTION_TIMEOUT;
....@@ -3098,18 +3615,18 @@
30983615 goto done;
30993616
31003617 next_test:
3101
- if (RD_REG_DWORD(&reg->iobase_c8) & BIT_3)
3618
+ if (rd_reg_dword(&reg->iobase_c8) & BIT_3)
31023619 ql_log(ql_log_info, vha, 0x504c,
31033620 "Additional code -- 0x55AA.\n");
31043621
31053622 done:
3106
- WRT_REG_DWORD(&reg->iobase_window, 0x0000);
3107
- RD_REG_DWORD(&reg->iobase_window);
3623
+ wrt_reg_dword(&reg->iobase_window, 0x0000);
3624
+ rd_reg_dword(&reg->iobase_window);
31083625 }
31093626
31103627 /**
31113628 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx.
3112
- * @irq:
3629
+ * @irq: interrupt number
31133630 * @dev_id: SCSI driver HA context
31143631 *
31153632 * Called by system whenever the host adapter generates an interrupt.
....@@ -3148,14 +3665,14 @@
31483665 spin_lock_irqsave(&ha->hardware_lock, flags);
31493666 vha = pci_get_drvdata(ha->pdev);
31503667 for (iter = 50; iter--; ) {
3151
- stat = RD_REG_DWORD(&reg->host_status);
3668
+ stat = rd_reg_dword(&reg->host_status);
31523669 if (qla2x00_check_reg32_for_disconnect(vha, stat))
31533670 break;
31543671 if (stat & HSRX_RISC_PAUSED) {
31553672 if (unlikely(pci_channel_offline(ha->pdev)))
31563673 break;
31573674
3158
- hccr = RD_REG_DWORD(&reg->hccr);
3675
+ hccr = rd_reg_dword(&reg->hccr);
31593676
31603677 ql_log(ql_log_warn, vha, 0x504b,
31613678 "RISC paused -- HCCR=%x, Dumping firmware.\n",
....@@ -3163,7 +3680,7 @@
31633680
31643681 qla2xxx_check_risc_status(vha);
31653682
3166
- ha->isp_ops->fw_dump(vha, 1);
3683
+ ha->isp_ops->fw_dump(vha);
31673684 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
31683685 break;
31693686 } else if ((stat & HSRX_RISC_INT) == 0)
....@@ -3180,9 +3697,9 @@
31803697 break;
31813698 case INTR_ASYNC_EVENT:
31823699 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);
3700
+ mb[1] = rd_reg_word(&reg->mailbox1);
3701
+ mb[2] = rd_reg_word(&reg->mailbox2);
3702
+ mb[3] = rd_reg_word(&reg->mailbox3);
31863703 qla2x00_async_event(vha, rsp, mb);
31873704 break;
31883705 case INTR_RSP_QUE_UPDATE:
....@@ -3202,8 +3719,8 @@
32023719 "Unrecognized interrupt type (%d).\n", stat * 0xff);
32033720 break;
32043721 }
3205
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3206
- RD_REG_DWORD_RELAXED(&reg->hccr);
3722
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3723
+ rd_reg_dword_relaxed(&reg->hccr);
32073724 if (unlikely(IS_QLA83XX(ha) && (ha->pdev->revision == 1)))
32083725 ndelay(3500);
32093726 }
....@@ -3242,8 +3759,8 @@
32423759 vha = pci_get_drvdata(ha->pdev);
32433760 qla24xx_process_response_queue(vha, rsp);
32443761 if (!ha->flags.disable_msix_handshake) {
3245
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3246
- RD_REG_DWORD_RELAXED(&reg->hccr);
3762
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3763
+ rd_reg_dword_relaxed(&reg->hccr);
32473764 }
32483765 spin_unlock_irqrestore(&ha->hardware_lock, flags);
32493766
....@@ -3277,14 +3794,14 @@
32773794 spin_lock_irqsave(&ha->hardware_lock, flags);
32783795 vha = pci_get_drvdata(ha->pdev);
32793796 do {
3280
- stat = RD_REG_DWORD(&reg->host_status);
3797
+ stat = rd_reg_dword(&reg->host_status);
32813798 if (qla2x00_check_reg32_for_disconnect(vha, stat))
32823799 break;
32833800 if (stat & HSRX_RISC_PAUSED) {
32843801 if (unlikely(pci_channel_offline(ha->pdev)))
32853802 break;
32863803
3287
- hccr = RD_REG_DWORD(&reg->hccr);
3804
+ hccr = rd_reg_dword(&reg->hccr);
32883805
32893806 ql_log(ql_log_info, vha, 0x5050,
32903807 "RISC paused -- HCCR=%x, Dumping firmware.\n",
....@@ -3292,7 +3809,7 @@
32923809
32933810 qla2xxx_check_risc_status(vha);
32943811
3295
- ha->isp_ops->fw_dump(vha, 1);
3812
+ ha->isp_ops->fw_dump(vha);
32963813 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
32973814 break;
32983815 } else if ((stat & HSRX_RISC_INT) == 0)
....@@ -3309,9 +3826,9 @@
33093826 break;
33103827 case INTR_ASYNC_EVENT:
33113828 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);
3829
+ mb[1] = rd_reg_word(&reg->mailbox1);
3830
+ mb[2] = rd_reg_word(&reg->mailbox2);
3831
+ mb[3] = rd_reg_word(&reg->mailbox3);
33153832 qla2x00_async_event(vha, rsp, mb);
33163833 break;
33173834 case INTR_RSP_QUE_UPDATE:
....@@ -3331,7 +3848,7 @@
33313848 "Unrecognized interrupt type (%d).\n", stat & 0xff);
33323849 break;
33333850 }
3334
- WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3851
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
33353852 } while (0);
33363853 qla2x00_handle_mbx_completion(ha, status);
33373854 spin_unlock_irqrestore(&ha->hardware_lock, flags);
....@@ -3350,6 +3867,25 @@
33503867 {
33513868 struct qla_hw_data *ha;
33523869 struct qla_qpair *qpair;
3870
+
3871
+ qpair = dev_id;
3872
+ if (!qpair) {
3873
+ ql_log(ql_log_info, NULL, 0x505b,
3874
+ "%s: NULL response queue pointer.\n", __func__);
3875
+ return IRQ_NONE;
3876
+ }
3877
+ ha = qpair->hw;
3878
+
3879
+ queue_work_on(smp_processor_id(), ha->wq, &qpair->q_work);
3880
+
3881
+ return IRQ_HANDLED;
3882
+}
3883
+
3884
+irqreturn_t
3885
+qla2xxx_msix_rsp_q_hs(int irq, void *dev_id)
3886
+{
3887
+ struct qla_hw_data *ha;
3888
+ struct qla_qpair *qpair;
33533889 struct device_reg_24xx __iomem *reg;
33543890 unsigned long flags;
33553891
....@@ -3361,15 +3897,12 @@
33613897 }
33623898 ha = qpair->hw;
33633899
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
- }
3900
+ reg = &ha->iobase->isp24;
3901
+ spin_lock_irqsave(&ha->hardware_lock, flags);
3902
+ wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
3903
+ spin_unlock_irqrestore(&ha->hardware_lock, flags);
33713904
3372
- queue_work(ha->wq, &qpair->q_work);
3905
+ queue_work_on(smp_processor_id(), ha->wq, &qpair->q_work);
33733906
33743907 return IRQ_HANDLED;
33753908 }
....@@ -3386,6 +3919,7 @@
33863919 { "rsp_q", qla24xx_msix_rsp_q },
33873920 { "atio_q", qla83xx_msix_atio_q },
33883921 { "qpair_multiq", qla2xxx_msix_rsp_q },
3922
+ { "qpair_multiq_hs", qla2xxx_msix_rsp_q_hs },
33893923 };
33903924
33913925 static const struct qla_init_msix_entry qla82xx_msix_entries[] = {
....@@ -3410,7 +3944,7 @@
34103944 min_vecs++;
34113945 }
34123946
3413
- if (USER_CTRL_IRQ(ha)) {
3947
+ if (USER_CTRL_IRQ(ha) || !ha->mqiobase) {
34143948 /* user wants to control IRQ setting for target mode */
34153949 ret = pci_alloc_irq_vectors(ha->pdev, min_vecs,
34163950 ha->msix_count, PCI_IRQ_MSIX);
....@@ -3444,6 +3978,7 @@
34443978 "Adjusted Max no of queues pairs: %d.\n", ha->max_qpairs);
34453979 }
34463980 }
3981
+ vha->irq_offset = desc.pre_vectors;
34473982 ha->msix_entries = kcalloc(ha->msix_count,
34483983 sizeof(struct qla_msix_entry),
34493984 GFP_KERNEL);
....@@ -3515,16 +4050,12 @@
35154050 }
35164051
35174052 /* 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;
4053
+ if (IS_MQUE_CAPABLE(ha) &&
4054
+ (ha->msixbase && ha->mqiobase && ha->max_qpairs))
4055
+ ha->mqenable = 1;
4056
+ else
4057
+ ha->mqenable = 0;
4058
+
35284059 ql_dbg(ql_dbg_multiq, vha, 0xc005,
35294060 "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n",
35304061 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
....@@ -3550,7 +4081,7 @@
35504081 /* If possible, enable MSI-X. */
35514082 if (ql2xenablemsix == 0 || (!IS_QLA2432(ha) && !IS_QLA2532(ha) &&
35524083 !IS_QLA8432(ha) && !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) &&
3553
- !IS_QLAFX00(ha) && !IS_QLA27XX(ha)))
4084
+ !IS_QLAFX00(ha) && !IS_QLA27XX(ha) && !IS_QLA28XX(ha)))
35544085 goto skip_msi;
35554086
35564087 if (ql2xenablemsix == 2)
....@@ -3589,7 +4120,7 @@
35894120
35904121 if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
35914122 !IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha) &&
3592
- !IS_QLA27XX(ha))
4123
+ !IS_QLA27XX(ha) && !IS_QLA28XX(ha))
35934124 goto skip_msi;
35944125
35954126 ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
....@@ -3618,6 +4149,8 @@
36184149 ql_dbg(ql_dbg_init, vha, 0x0125,
36194150 "INTa mode: Enabled.\n");
36204151 ha->flags.mr_intr_valid = 1;
4152
+ /* Set max_qpair to 0, as MSI-X and MSI in not enabled */
4153
+ ha->max_qpairs = 0;
36214154 }
36224155
36234156 clear_risc_ints:
....@@ -3625,7 +4158,7 @@
36254158 goto fail;
36264159
36274160 spin_lock_irq(&ha->hardware_lock);
3628
- WRT_REG_WORD(&reg->isp.semaphore, 0);
4161
+ wrt_reg_word(&reg->isp.semaphore, 0);
36294162 spin_unlock_irq(&ha->hardware_lock);
36304163
36314164 fail: