GNU Linux-libre 4.14.262-gnu1
[releases.git] / drivers / scsi / qla2xxx / qla_isr.c
1 /*
2  * QLogic Fibre Channel HBA Driver
3  * Copyright (c)  2003-2014 QLogic Corporation
4  *
5  * See LICENSE.qla2xxx for copyright and licensing details.
6  */
7 #include "qla_def.h"
8 #include "qla_target.h"
9
10 #include <linux/delay.h>
11 #include <linux/slab.h>
12 #include <linux/cpu.h>
13 #include <linux/t10-pi.h>
14 #include <scsi/scsi_tcq.h>
15 #include <scsi/scsi_bsg_fc.h>
16 #include <scsi/scsi_eh.h>
17 #include <scsi/fc/fc_fs.h>
18 #include <linux/nvme-fc-driver.h>
19
20 static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
21 static void qla2x00_status_entry(scsi_qla_host_t *, struct rsp_que *, void *);
22 static void qla2x00_status_cont_entry(struct rsp_que *, sts_cont_entry_t *);
23 static int qla2x00_error_entry(scsi_qla_host_t *, struct rsp_que *,
24         sts_entry_t *);
25
26 /**
27  * qla2100_intr_handler() - Process interrupts for the ISP2100 and ISP2200.
28  * @irq:
29  * @dev_id: SCSI driver HA context
30  *
31  * Called by system whenever the host adapter generates an interrupt.
32  *
33  * Returns handled flag.
34  */
35 irqreturn_t
36 qla2100_intr_handler(int irq, void *dev_id)
37 {
38         scsi_qla_host_t *vha;
39         struct qla_hw_data *ha;
40         struct device_reg_2xxx __iomem *reg;
41         int             status;
42         unsigned long   iter;
43         uint16_t        hccr;
44         uint16_t        mb[4];
45         struct rsp_que *rsp;
46         unsigned long   flags;
47
48         rsp = (struct rsp_que *) dev_id;
49         if (!rsp) {
50                 ql_log(ql_log_info, NULL, 0x505d,
51                     "%s: NULL response queue pointer.\n", __func__);
52                 return (IRQ_NONE);
53         }
54
55         ha = rsp->hw;
56         reg = &ha->iobase->isp;
57         status = 0;
58
59         spin_lock_irqsave(&ha->hardware_lock, flags);
60         vha = pci_get_drvdata(ha->pdev);
61         for (iter = 50; iter--; ) {
62                 hccr = RD_REG_WORD(&reg->hccr);
63                 if (qla2x00_check_reg16_for_disconnect(vha, hccr))
64                         break;
65                 if (hccr & HCCR_RISC_PAUSE) {
66                         if (pci_channel_offline(ha->pdev))
67                                 break;
68
69                         /*
70                          * Issue a "HARD" reset in order for the RISC interrupt
71                          * bit to be cleared.  Schedule a big hammer to get
72                          * out of the RISC PAUSED state.
73                          */
74                         WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
75                         RD_REG_WORD(&reg->hccr);
76
77                         ha->isp_ops->fw_dump(vha, 1);
78                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
79                         break;
80                 } else if ((RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) == 0)
81                         break;
82
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);
86
87                         /* Get mailbox data. */
88                         mb[0] = RD_MAILBOX_REG(ha, reg, 0);
89                         if (mb[0] > 0x3fff && mb[0] < 0x8000) {
90                                 qla2x00_mbx_completion(vha, mb[0]);
91                                 status |= MBX_INTERRUPT;
92                         } else if (mb[0] > 0x7fff && mb[0] < 0xc000) {
93                                 mb[1] = RD_MAILBOX_REG(ha, reg, 1);
94                                 mb[2] = RD_MAILBOX_REG(ha, reg, 2);
95                                 mb[3] = RD_MAILBOX_REG(ha, reg, 3);
96                                 qla2x00_async_event(vha, rsp, mb);
97                         } else {
98                                 /*EMPTY*/
99                                 ql_dbg(ql_dbg_async, vha, 0x5025,
100                                     "Unrecognized interrupt type (%d).\n",
101                                     mb[0]);
102                         }
103                         /* Release mailbox registers. */
104                         WRT_REG_WORD(&reg->semaphore, 0);
105                         RD_REG_WORD(&reg->semaphore);
106                 } else {
107                         qla2x00_process_response_queue(rsp);
108
109                         WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
110                         RD_REG_WORD(&reg->hccr);
111                 }
112         }
113         qla2x00_handle_mbx_completion(ha, status);
114         spin_unlock_irqrestore(&ha->hardware_lock, flags);
115
116         return (IRQ_HANDLED);
117 }
118
119 bool
120 qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *vha, uint32_t reg)
121 {
122         /* Check for PCI disconnection */
123         if (reg == 0xffffffff && !pci_channel_offline(vha->hw->pdev)) {
124                 if (!test_and_set_bit(PFLG_DISCONNECTED, &vha->pci_flags) &&
125                     !test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags) &&
126                     !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);
133                 }
134                 return true;
135         } else
136                 return false;
137 }
138
139 bool
140 qla2x00_check_reg16_for_disconnect(scsi_qla_host_t *vha, uint16_t reg)
141 {
142         return qla2x00_check_reg32_for_disconnect(vha, 0xffff0000 | reg);
143 }
144
145 /**
146  * qla2300_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
147  * @irq:
148  * @dev_id: SCSI driver HA context
149  *
150  * Called by system whenever the host adapter generates an interrupt.
151  *
152  * Returns handled flag.
153  */
154 irqreturn_t
155 qla2300_intr_handler(int irq, void *dev_id)
156 {
157         scsi_qla_host_t *vha;
158         struct device_reg_2xxx __iomem *reg;
159         int             status;
160         unsigned long   iter;
161         uint32_t        stat;
162         uint16_t        hccr;
163         uint16_t        mb[4];
164         struct rsp_que *rsp;
165         struct qla_hw_data *ha;
166         unsigned long   flags;
167
168         rsp = (struct rsp_que *) dev_id;
169         if (!rsp) {
170                 ql_log(ql_log_info, NULL, 0x5058,
171                     "%s: NULL response queue pointer.\n", __func__);
172                 return (IRQ_NONE);
173         }
174
175         ha = rsp->hw;
176         reg = &ha->iobase->isp;
177         status = 0;
178
179         spin_lock_irqsave(&ha->hardware_lock, flags);
180         vha = pci_get_drvdata(ha->pdev);
181         for (iter = 50; iter--; ) {
182                 stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
183                 if (qla2x00_check_reg32_for_disconnect(vha, stat))
184                         break;
185                 if (stat & HSR_RISC_PAUSED) {
186                         if (unlikely(pci_channel_offline(ha->pdev)))
187                                 break;
188
189                         hccr = RD_REG_WORD(&reg->hccr);
190
191                         if (hccr & (BIT_15 | BIT_13 | BIT_11 | BIT_8))
192                                 ql_log(ql_log_warn, vha, 0x5026,
193                                     "Parity error -- HCCR=%x, Dumping "
194                                     "firmware.\n", hccr);
195                         else
196                                 ql_log(ql_log_warn, vha, 0x5027,
197                                     "RISC paused -- HCCR=%x, Dumping "
198                                     "firmware.\n", hccr);
199
200                         /*
201                          * Issue a "HARD" reset in order for the RISC
202                          * interrupt bit to be cleared.  Schedule a big
203                          * hammer to get out of the RISC PAUSED state.
204                          */
205                         WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
206                         RD_REG_WORD(&reg->hccr);
207
208                         ha->isp_ops->fw_dump(vha, 1);
209                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
210                         break;
211                 } else if ((stat & HSR_RISC_INT) == 0)
212                         break;
213
214                 switch (stat & 0xff) {
215                 case 0x1:
216                 case 0x2:
217                 case 0x10:
218                 case 0x11:
219                         qla2x00_mbx_completion(vha, MSW(stat));
220                         status |= MBX_INTERRUPT;
221
222                         /* Release mailbox registers. */
223                         WRT_REG_WORD(&reg->semaphore, 0);
224                         break;
225                 case 0x12:
226                         mb[0] = MSW(stat);
227                         mb[1] = RD_MAILBOX_REG(ha, reg, 1);
228                         mb[2] = RD_MAILBOX_REG(ha, reg, 2);
229                         mb[3] = RD_MAILBOX_REG(ha, reg, 3);
230                         qla2x00_async_event(vha, rsp, mb);
231                         break;
232                 case 0x13:
233                         qla2x00_process_response_queue(rsp);
234                         break;
235                 case 0x15:
236                         mb[0] = MBA_CMPLT_1_16BIT;
237                         mb[1] = MSW(stat);
238                         qla2x00_async_event(vha, rsp, mb);
239                         break;
240                 case 0x16:
241                         mb[0] = MBA_SCSI_COMPLETION;
242                         mb[1] = MSW(stat);
243                         mb[2] = RD_MAILBOX_REG(ha, reg, 2);
244                         qla2x00_async_event(vha, rsp, mb);
245                         break;
246                 default:
247                         ql_dbg(ql_dbg_async, vha, 0x5028,
248                             "Unrecognized interrupt type (%d).\n", stat & 0xff);
249                         break;
250                 }
251                 WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
252                 RD_REG_WORD_RELAXED(&reg->hccr);
253         }
254         qla2x00_handle_mbx_completion(ha, status);
255         spin_unlock_irqrestore(&ha->hardware_lock, flags);
256
257         return (IRQ_HANDLED);
258 }
259
260 /**
261  * qla2x00_mbx_completion() - Process mailbox command completions.
262  * @ha: SCSI driver HA context
263  * @mb0: Mailbox0 register
264  */
265 static void
266 qla2x00_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
267 {
268         uint16_t        cnt;
269         uint32_t        mboxes;
270         uint16_t __iomem *wptr;
271         struct qla_hw_data *ha = vha->hw;
272         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
273
274         /* Read all mbox registers? */
275         WARN_ON_ONCE(ha->mbx_count > 32);
276         mboxes = (1ULL << ha->mbx_count) - 1;
277         if (!ha->mcp)
278                 ql_dbg(ql_dbg_async, vha, 0x5001, "MBX pointer ERROR.\n");
279         else
280                 mboxes = ha->mcp->in_mb;
281
282         /* Load return mailbox registers. */
283         ha->flags.mbox_int = 1;
284         ha->mailbox_out[0] = mb0;
285         mboxes >>= 1;
286         wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 1);
287
288         for (cnt = 1; cnt < ha->mbx_count; cnt++) {
289                 if (IS_QLA2200(ha) && cnt == 8)
290                         wptr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
291                 if ((cnt == 4 || cnt == 5) && (mboxes & BIT_0))
292                         ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr);
293                 else if (mboxes & BIT_0)
294                         ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
295
296                 wptr++;
297                 mboxes >>= 1;
298         }
299 }
300
301 static void
302 qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
303 {
304         static char *event[] =
305                 { "Complete", "Request Notification", "Time Extension" };
306         int rval;
307         struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24;
308         struct device_reg_82xx __iomem *reg82 = &vha->hw->iobase->isp82;
309         uint16_t __iomem *wptr;
310         uint16_t cnt, timeout, mb[QLA_IDC_ACK_REGS];
311
312         /* Seed data -- mailbox1 -> mailbox7. */
313         if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw))
314                 wptr = (uint16_t __iomem *)&reg24->mailbox1;
315         else if (IS_QLA8044(vha->hw))
316                 wptr = (uint16_t __iomem *)&reg82->mailbox_out[1];
317         else
318                 return;
319
320         for (cnt = 0; cnt < QLA_IDC_ACK_REGS; cnt++, wptr++)
321                 mb[cnt] = RD_REG_WORD(wptr);
322
323         ql_dbg(ql_dbg_async, vha, 0x5021,
324             "Inter-Driver Communication %s -- "
325             "%04x %04x %04x %04x %04x %04x %04x.\n",
326             event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
327             mb[4], mb[5], mb[6]);
328         switch (aen) {
329         /* Handle IDC Error completion case. */
330         case MBA_IDC_COMPLETE:
331                 if (mb[1] >> 15) {
332                         vha->hw->flags.idc_compl_status = 1;
333                         if (vha->hw->notify_dcbx_comp && !vha->vp_idx)
334                                 complete(&vha->hw->dcbx_comp);
335                 }
336                 break;
337
338         case MBA_IDC_NOTIFY:
339                 /* Acknowledgement needed? [Notify && non-zero timeout]. */
340                 timeout = (descr >> 8) & 0xf;
341                 ql_dbg(ql_dbg_async, vha, 0x5022,
342                     "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
343                     vha->host_no, event[aen & 0xff], timeout);
344
345                 if (!timeout)
346                         return;
347                 rval = qla2x00_post_idc_ack_work(vha, mb);
348                 if (rval != QLA_SUCCESS)
349                         ql_log(ql_log_warn, vha, 0x5023,
350                             "IDC failed to post ACK.\n");
351                 break;
352         case MBA_IDC_TIME_EXT:
353                 vha->hw->idc_extend_tmo = descr;
354                 ql_dbg(ql_dbg_async, vha, 0x5087,
355                     "%lu Inter-Driver Communication %s -- "
356                     "Extend timeout by=%d.\n",
357                     vha->host_no, event[aen & 0xff], vha->hw->idc_extend_tmo);
358                 break;
359         }
360 }
361
362 #define LS_UNKNOWN      2
363 const char *
364 qla2x00_get_link_speed_str(struct qla_hw_data *ha, uint16_t speed)
365 {
366         static const char *const link_speeds[] = {
367                 "1", "2", "?", "4", "8", "16", "32", "10"
368         };
369 #define QLA_LAST_SPEED  7
370
371         if (IS_QLA2100(ha) || IS_QLA2200(ha))
372                 return link_speeds[0];
373         else if (speed == 0x13)
374                 return link_speeds[QLA_LAST_SPEED];
375         else if (speed < QLA_LAST_SPEED)
376                 return link_speeds[speed];
377         else
378                 return link_speeds[LS_UNKNOWN];
379 }
380
381 static void
382 qla83xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb)
383 {
384         struct qla_hw_data *ha = vha->hw;
385
386         /*
387          * 8200 AEN Interpretation:
388          * mb[0] = AEN code
389          * mb[1] = AEN Reason code
390          * mb[2] = LSW of Peg-Halt Status-1 Register
391          * mb[6] = MSW of Peg-Halt Status-1 Register
392          * mb[3] = LSW of Peg-Halt Status-2 register
393          * mb[7] = MSW of Peg-Halt Status-2 register
394          * mb[4] = IDC Device-State Register value
395          * mb[5] = IDC Driver-Presence Register value
396          */
397         ql_dbg(ql_dbg_async, vha, 0x506b, "AEN Code: mb[0] = 0x%x AEN reason: "
398             "mb[1] = 0x%x PH-status1: mb[2] = 0x%x PH-status1: mb[6] = 0x%x.\n",
399             mb[0], mb[1], mb[2], mb[6]);
400         ql_dbg(ql_dbg_async, vha, 0x506c, "PH-status2: mb[3] = 0x%x "
401             "PH-status2: mb[7] = 0x%x Device-State: mb[4] = 0x%x "
402             "Drv-Presence: mb[5] = 0x%x.\n", mb[3], mb[7], mb[4], mb[5]);
403
404         if (mb[1] & (IDC_PEG_HALT_STATUS_CHANGE | IDC_NIC_FW_REPORTED_FAILURE |
405                                 IDC_HEARTBEAT_FAILURE)) {
406                 ha->flags.nic_core_hung = 1;
407                 ql_log(ql_log_warn, vha, 0x5060,
408                     "83XX: F/W Error Reported: Check if reset required.\n");
409
410                 if (mb[1] & IDC_PEG_HALT_STATUS_CHANGE) {
411                         uint32_t protocol_engine_id, fw_err_code, err_level;
412
413                         /*
414                          * IDC_PEG_HALT_STATUS_CHANGE interpretation:
415                          *  - PEG-Halt Status-1 Register:
416                          *      (LSW = mb[2], MSW = mb[6])
417                          *      Bits 0-7   = protocol-engine ID
418                          *      Bits 8-28  = f/w error code
419                          *      Bits 29-31 = Error-level
420                          *          Error-level 0x1 = Non-Fatal error
421                          *          Error-level 0x2 = Recoverable Fatal error
422                          *          Error-level 0x4 = UnRecoverable Fatal error
423                          *  - PEG-Halt Status-2 Register:
424                          *      (LSW = mb[3], MSW = mb[7])
425                          */
426                         protocol_engine_id = (mb[2] & 0xff);
427                         fw_err_code = (((mb[2] & 0xff00) >> 8) |
428                             ((mb[6] & 0x1fff) << 8));
429                         err_level = ((mb[6] & 0xe000) >> 13);
430                         ql_log(ql_log_warn, vha, 0x5061, "PegHalt Status-1 "
431                             "Register: protocol_engine_id=0x%x "
432                             "fw_err_code=0x%x err_level=0x%x.\n",
433                             protocol_engine_id, fw_err_code, err_level);
434                         ql_log(ql_log_warn, vha, 0x5062, "PegHalt Status-2 "
435                             "Register: 0x%x%x.\n", mb[7], mb[3]);
436                         if (err_level == ERR_LEVEL_NON_FATAL) {
437                                 ql_log(ql_log_warn, vha, 0x5063,
438                                     "Not a fatal error, f/w has recovered itself.\n");
439                         } else if (err_level == ERR_LEVEL_RECOVERABLE_FATAL) {
440                                 ql_log(ql_log_fatal, vha, 0x5064,
441                                     "Recoverable Fatal error: Chip reset "
442                                     "required.\n");
443                                 qla83xx_schedule_work(vha,
444                                     QLA83XX_NIC_CORE_RESET);
445                         } else if (err_level == ERR_LEVEL_UNRECOVERABLE_FATAL) {
446                                 ql_log(ql_log_fatal, vha, 0x5065,
447                                     "Unrecoverable Fatal error: Set FAILED "
448                                     "state, reboot required.\n");
449                                 qla83xx_schedule_work(vha,
450                                     QLA83XX_NIC_CORE_UNRECOVERABLE);
451                         }
452                 }
453
454                 if (mb[1] & IDC_NIC_FW_REPORTED_FAILURE) {
455                         uint16_t peg_fw_state, nw_interface_link_up;
456                         uint16_t nw_interface_signal_detect, sfp_status;
457                         uint16_t htbt_counter, htbt_monitor_enable;
458                         uint16_t sfp_additional_info, sfp_multirate;
459                         uint16_t sfp_tx_fault, link_speed, dcbx_status;
460
461                         /*
462                          * IDC_NIC_FW_REPORTED_FAILURE interpretation:
463                          *  - PEG-to-FC Status Register:
464                          *      (LSW = mb[2], MSW = mb[6])
465                          *      Bits 0-7   = Peg-Firmware state
466                          *      Bit 8      = N/W Interface Link-up
467                          *      Bit 9      = N/W Interface signal detected
468                          *      Bits 10-11 = SFP Status
469                          *        SFP Status 0x0 = SFP+ transceiver not expected
470                          *        SFP Status 0x1 = SFP+ transceiver not present
471                          *        SFP Status 0x2 = SFP+ transceiver invalid
472                          *        SFP Status 0x3 = SFP+ transceiver present and
473                          *        valid
474                          *      Bits 12-14 = Heartbeat Counter
475                          *      Bit 15     = Heartbeat Monitor Enable
476                          *      Bits 16-17 = SFP Additional Info
477                          *        SFP info 0x0 = Unregocnized transceiver for
478                          *        Ethernet
479                          *        SFP info 0x1 = SFP+ brand validation failed
480                          *        SFP info 0x2 = SFP+ speed validation failed
481                          *        SFP info 0x3 = SFP+ access error
482                          *      Bit 18     = SFP Multirate
483                          *      Bit 19     = SFP Tx Fault
484                          *      Bits 20-22 = Link Speed
485                          *      Bits 23-27 = Reserved
486                          *      Bits 28-30 = DCBX Status
487                          *        DCBX Status 0x0 = DCBX Disabled
488                          *        DCBX Status 0x1 = DCBX Enabled
489                          *        DCBX Status 0x2 = DCBX Exchange error
490                          *      Bit 31     = Reserved
491                          */
492                         peg_fw_state = (mb[2] & 0x00ff);
493                         nw_interface_link_up = ((mb[2] & 0x0100) >> 8);
494                         nw_interface_signal_detect = ((mb[2] & 0x0200) >> 9);
495                         sfp_status = ((mb[2] & 0x0c00) >> 10);
496                         htbt_counter = ((mb[2] & 0x7000) >> 12);
497                         htbt_monitor_enable = ((mb[2] & 0x8000) >> 15);
498                         sfp_additional_info = (mb[6] & 0x0003);
499                         sfp_multirate = ((mb[6] & 0x0004) >> 2);
500                         sfp_tx_fault = ((mb[6] & 0x0008) >> 3);
501                         link_speed = ((mb[6] & 0x0070) >> 4);
502                         dcbx_status = ((mb[6] & 0x7000) >> 12);
503
504                         ql_log(ql_log_warn, vha, 0x5066,
505                             "Peg-to-Fc Status Register:\n"
506                             "peg_fw_state=0x%x, nw_interface_link_up=0x%x, "
507                             "nw_interface_signal_detect=0x%x"
508                             "\nsfp_statis=0x%x.\n ", peg_fw_state,
509                             nw_interface_link_up, nw_interface_signal_detect,
510                             sfp_status);
511                         ql_log(ql_log_warn, vha, 0x5067,
512                             "htbt_counter=0x%x, htbt_monitor_enable=0x%x, "
513                             "sfp_additional_info=0x%x, sfp_multirate=0x%x.\n ",
514                             htbt_counter, htbt_monitor_enable,
515                             sfp_additional_info, sfp_multirate);
516                         ql_log(ql_log_warn, vha, 0x5068,
517                             "sfp_tx_fault=0x%x, link_state=0x%x, "
518                             "dcbx_status=0x%x.\n", sfp_tx_fault, link_speed,
519                             dcbx_status);
520
521                         qla83xx_schedule_work(vha, QLA83XX_NIC_CORE_RESET);
522                 }
523
524                 if (mb[1] & IDC_HEARTBEAT_FAILURE) {
525                         ql_log(ql_log_warn, vha, 0x5069,
526                             "Heartbeat Failure encountered, chip reset "
527                             "required.\n");
528
529                         qla83xx_schedule_work(vha, QLA83XX_NIC_CORE_RESET);
530                 }
531         }
532
533         if (mb[1] & IDC_DEVICE_STATE_CHANGE) {
534                 ql_log(ql_log_info, vha, 0x506a,
535                     "IDC Device-State changed = 0x%x.\n", mb[4]);
536                 if (ha->flags.nic_core_reset_owner)
537                         return;
538                 qla83xx_schedule_work(vha, MBA_IDC_AEN);
539         }
540 }
541
542 int
543 qla2x00_is_a_vp_did(scsi_qla_host_t *vha, uint32_t rscn_entry)
544 {
545         struct qla_hw_data *ha = vha->hw;
546         scsi_qla_host_t *vp;
547         uint32_t vp_did;
548         unsigned long flags;
549         int ret = 0;
550
551         if (!ha->num_vhosts)
552                 return ret;
553
554         spin_lock_irqsave(&ha->vport_slock, flags);
555         list_for_each_entry(vp, &ha->vp_list, list) {
556                 vp_did = vp->d_id.b24;
557                 if (vp_did == rscn_entry) {
558                         ret = 1;
559                         break;
560                 }
561         }
562         spin_unlock_irqrestore(&ha->vport_slock, flags);
563
564         return ret;
565 }
566
567 fc_port_t *
568 qla2x00_find_fcport_by_loopid(scsi_qla_host_t *vha, uint16_t loop_id)
569 {
570         fc_port_t *f, *tf;
571
572         f = tf = NULL;
573         list_for_each_entry_safe(f, tf, &vha->vp_fcports, list)
574                 if (f->loop_id == loop_id)
575                         return f;
576         return NULL;
577 }
578
579 fc_port_t *
580 qla2x00_find_fcport_by_wwpn(scsi_qla_host_t *vha, u8 *wwpn, u8 incl_deleted)
581 {
582         fc_port_t *f, *tf;
583
584         f = tf = NULL;
585         list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) {
586                 if (memcmp(f->port_name, wwpn, WWN_SIZE) == 0) {
587                         if (incl_deleted)
588                                 return f;
589                         else if (f->deleted == 0)
590                                 return f;
591                 }
592         }
593         return NULL;
594 }
595
596 fc_port_t *
597 qla2x00_find_fcport_by_nportid(scsi_qla_host_t *vha, port_id_t *id,
598         u8 incl_deleted)
599 {
600         fc_port_t *f, *tf;
601
602         f = tf = NULL;
603         list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) {
604                 if (f->d_id.b24 == id->b24) {
605                         if (incl_deleted)
606                                 return f;
607                         else if (f->deleted == 0)
608                                 return f;
609                 }
610         }
611         return NULL;
612 }
613
614 /**
615  * qla2x00_async_event() - Process aynchronous events.
616  * @ha: SCSI driver HA context
617  * @mb: Mailbox registers (0 - 3)
618  */
619 void
620 qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
621 {
622         uint16_t        handle_cnt;
623         uint16_t        cnt, mbx;
624         uint32_t        handles[5];
625         struct qla_hw_data *ha = vha->hw;
626         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
627         struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
628         struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
629         uint32_t        rscn_entry, host_pid;
630         unsigned long   flags;
631         fc_port_t       *fcport = NULL;
632
633         /* Setup to process RIO completion. */
634         handle_cnt = 0;
635         if (IS_CNA_CAPABLE(ha))
636                 goto skip_rio;
637         switch (mb[0]) {
638         case MBA_SCSI_COMPLETION:
639                 handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1]));
640                 handle_cnt = 1;
641                 break;
642         case MBA_CMPLT_1_16BIT:
643                 handles[0] = mb[1];
644                 handle_cnt = 1;
645                 mb[0] = MBA_SCSI_COMPLETION;
646                 break;
647         case MBA_CMPLT_2_16BIT:
648                 handles[0] = mb[1];
649                 handles[1] = mb[2];
650                 handle_cnt = 2;
651                 mb[0] = MBA_SCSI_COMPLETION;
652                 break;
653         case MBA_CMPLT_3_16BIT:
654                 handles[0] = mb[1];
655                 handles[1] = mb[2];
656                 handles[2] = mb[3];
657                 handle_cnt = 3;
658                 mb[0] = MBA_SCSI_COMPLETION;
659                 break;
660         case MBA_CMPLT_4_16BIT:
661                 handles[0] = mb[1];
662                 handles[1] = mb[2];
663                 handles[2] = mb[3];
664                 handles[3] = (uint32_t)RD_MAILBOX_REG(ha, reg, 6);
665                 handle_cnt = 4;
666                 mb[0] = MBA_SCSI_COMPLETION;
667                 break;
668         case MBA_CMPLT_5_16BIT:
669                 handles[0] = mb[1];
670                 handles[1] = mb[2];
671                 handles[2] = mb[3];
672                 handles[3] = (uint32_t)RD_MAILBOX_REG(ha, reg, 6);
673                 handles[4] = (uint32_t)RD_MAILBOX_REG(ha, reg, 7);
674                 handle_cnt = 5;
675                 mb[0] = MBA_SCSI_COMPLETION;
676                 break;
677         case MBA_CMPLT_2_32BIT:
678                 handles[0] = le32_to_cpu((uint32_t)((mb[2] << 16) | mb[1]));
679                 handles[1] = le32_to_cpu(
680                     ((uint32_t)(RD_MAILBOX_REG(ha, reg, 7) << 16)) |
681                     RD_MAILBOX_REG(ha, reg, 6));
682                 handle_cnt = 2;
683                 mb[0] = MBA_SCSI_COMPLETION;
684                 break;
685         default:
686                 break;
687         }
688 skip_rio:
689         switch (mb[0]) {
690         case MBA_SCSI_COMPLETION:       /* Fast Post */
691                 if (!vha->flags.online)
692                         break;
693
694                 for (cnt = 0; cnt < handle_cnt; cnt++)
695                         qla2x00_process_completed_request(vha, rsp->req,
696                                 handles[cnt]);
697                 break;
698
699         case MBA_RESET:                 /* Reset */
700                 ql_dbg(ql_dbg_async, vha, 0x5002,
701                     "Asynchronous RESET.\n");
702
703                 set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
704                 break;
705
706         case MBA_SYSTEM_ERR:            /* System Error */
707                 mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ?
708                         RD_REG_WORD(&reg24->mailbox7) : 0;
709                 ql_log(ql_log_warn, vha, 0x5003,
710                     "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh "
711                     "mbx7=%xh.\n", mb[1], mb[2], mb[3], mbx);
712
713                 ha->isp_ops->fw_dump(vha, 1);
714                 ha->flags.fw_init_done = 0;
715                 QLA_FW_STOPPED(ha);
716
717                 if (IS_FWI2_CAPABLE(ha)) {
718                         if (mb[1] == 0 && mb[2] == 0) {
719                                 ql_log(ql_log_fatal, vha, 0x5004,
720                                     "Unrecoverable Hardware Error: adapter "
721                                     "marked OFFLINE!\n");
722                                 vha->flags.online = 0;
723                                 vha->device_flags |= DFLG_DEV_FAILED;
724                         } else {
725                                 /* Check to see if MPI timeout occurred */
726                                 if ((mbx & MBX_3) && (ha->port_no == 0))
727                                         set_bit(MPI_RESET_NEEDED,
728                                             &vha->dpc_flags);
729
730                                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
731                         }
732                 } else if (mb[1] == 0) {
733                         ql_log(ql_log_fatal, vha, 0x5005,
734                             "Unrecoverable Hardware Error: adapter marked "
735                             "OFFLINE!\n");
736                         vha->flags.online = 0;
737                         vha->device_flags |= DFLG_DEV_FAILED;
738                 } else
739                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
740                 break;
741
742         case MBA_REQ_TRANSFER_ERR:      /* Request Transfer Error */
743                 ql_log(ql_log_warn, vha, 0x5006,
744                     "ISP Request Transfer Error (%x).\n",  mb[1]);
745
746                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
747                 break;
748
749         case MBA_RSP_TRANSFER_ERR:      /* Response Transfer Error */
750                 ql_log(ql_log_warn, vha, 0x5007,
751                     "ISP Response Transfer Error (%x).\n", mb[1]);
752
753                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
754                 break;
755
756         case MBA_WAKEUP_THRES:          /* Request Queue Wake-up */
757                 ql_dbg(ql_dbg_async, vha, 0x5008,
758                     "Asynchronous WAKEUP_THRES (%x).\n", mb[1]);
759                 break;
760
761         case MBA_LOOP_INIT_ERR:
762                 ql_log(ql_log_warn, vha, 0x5090,
763                     "LOOP INIT ERROR (%x).\n", mb[1]);
764                 ha->isp_ops->fw_dump(vha, 1);
765                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
766                 break;
767
768         case MBA_LIP_OCCURRED:          /* Loop Initialization Procedure */
769                 ha->flags.lip_ae = 1;
770                 ha->flags.n2n_ae = 0;
771
772                 ql_dbg(ql_dbg_async, vha, 0x5009,
773                     "LIP occurred (%x).\n", mb[1]);
774
775                 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
776                         atomic_set(&vha->loop_state, LOOP_DOWN);
777                         atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
778                         qla2x00_mark_all_devices_lost(vha, 1);
779                 }
780
781                 if (vha->vp_idx) {
782                         atomic_set(&vha->vp_state, VP_FAILED);
783                         fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
784                 }
785
786                 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags);
787                 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
788
789                 vha->flags.management_server_logged_in = 0;
790                 qla2x00_post_aen_work(vha, FCH_EVT_LIP, mb[1]);
791                 break;
792
793         case MBA_LOOP_UP:               /* Loop Up Event */
794                 if (IS_QLA2100(ha) || IS_QLA2200(ha))
795                         ha->link_data_rate = PORT_SPEED_1GB;
796                 else
797                         ha->link_data_rate = mb[1];
798
799                 ql_log(ql_log_info, vha, 0x500a,
800                     "LOOP UP detected (%s Gbps).\n",
801                     qla2x00_get_link_speed_str(ha, ha->link_data_rate));
802
803                 vha->flags.management_server_logged_in = 0;
804                 qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate);
805
806                 if (AUTO_DETECT_SFP_SUPPORT(vha)) {
807                         set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags);
808                         qla2xxx_wake_dpc(vha);
809                 }
810                 break;
811
812         case MBA_LOOP_DOWN:             /* Loop Down Event */
813                 ha->flags.n2n_ae = 0;
814                 ha->flags.lip_ae = 0;
815                 ha->current_topology = 0;
816
817                 mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha))
818                         ? RD_REG_WORD(&reg24->mailbox4) : 0;
819                 mbx = (IS_P3P_TYPE(ha)) ? RD_REG_WORD(&reg82->mailbox_out[4])
820                         : mbx;
821                 ql_log(ql_log_info, vha, 0x500b,
822                     "LOOP DOWN detected (%x %x %x %x).\n",
823                     mb[1], mb[2], mb[3], mbx);
824
825                 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
826                         atomic_set(&vha->loop_state, LOOP_DOWN);
827                         atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
828                         /*
829                          * In case of loop down, restore WWPN from
830                          * NVRAM in case of FA-WWPN capable ISP
831                          * Restore for Physical Port only
832                          */
833                         if (!vha->vp_idx) {
834                                 if (ha->flags.fawwpn_enabled) {
835                                         void *wwpn = ha->init_cb->port_name;
836                                         memcpy(vha->port_name, wwpn, WWN_SIZE);
837                                         fc_host_port_name(vha->host) =
838                                             wwn_to_u64(vha->port_name);
839                                         ql_dbg(ql_dbg_init + ql_dbg_verbose,
840                                             vha, 0x00d8, "LOOP DOWN detected,"
841                                             "restore WWPN %016llx\n",
842                                             wwn_to_u64(vha->port_name));
843                                 }
844
845                                 clear_bit(VP_CONFIG_OK, &vha->vp_flags);
846                         }
847
848                         vha->device_flags |= DFLG_NO_CABLE;
849                         qla2x00_mark_all_devices_lost(vha, 1);
850                 }
851
852                 if (vha->vp_idx) {
853                         atomic_set(&vha->vp_state, VP_FAILED);
854                         fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
855                 }
856
857                 vha->flags.management_server_logged_in = 0;
858                 ha->link_data_rate = PORT_SPEED_UNKNOWN;
859                 qla2x00_post_aen_work(vha, FCH_EVT_LINKDOWN, 0);
860                 break;
861
862         case MBA_LIP_RESET:             /* LIP reset occurred */
863                 ql_dbg(ql_dbg_async, vha, 0x500c,
864                     "LIP reset occurred (%x).\n", mb[1]);
865
866                 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
867                         atomic_set(&vha->loop_state, LOOP_DOWN);
868                         atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
869                         qla2x00_mark_all_devices_lost(vha, 1);
870                 }
871
872                 if (vha->vp_idx) {
873                         atomic_set(&vha->vp_state, VP_FAILED);
874                         fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
875                 }
876
877                 set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
878
879                 ha->operating_mode = LOOP;
880                 vha->flags.management_server_logged_in = 0;
881                 qla2x00_post_aen_work(vha, FCH_EVT_LIPRESET, mb[1]);
882                 break;
883
884         /* case MBA_DCBX_COMPLETE: */
885         case MBA_POINT_TO_POINT:        /* Point-to-Point */
886                 ha->flags.lip_ae = 0;
887                 ha->flags.n2n_ae = 1;
888
889                 if (IS_QLA2100(ha))
890                         break;
891
892                 if (IS_CNA_CAPABLE(ha)) {
893                         ql_dbg(ql_dbg_async, vha, 0x500d,
894                             "DCBX Completed -- %04x %04x %04x.\n",
895                             mb[1], mb[2], mb[3]);
896                         if (ha->notify_dcbx_comp && !vha->vp_idx)
897                                 complete(&ha->dcbx_comp);
898
899                 } else
900                         ql_dbg(ql_dbg_async, vha, 0x500e,
901                             "Asynchronous P2P MODE received.\n");
902
903                 /*
904                  * Until there's a transition from loop down to loop up, treat
905                  * this as loop down only.
906                  */
907                 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
908                         atomic_set(&vha->loop_state, LOOP_DOWN);
909                         if (!atomic_read(&vha->loop_down_timer))
910                                 atomic_set(&vha->loop_down_timer,
911                                     LOOP_DOWN_TIME);
912                         qla2x00_mark_all_devices_lost(vha, 1);
913                 }
914
915                 if (vha->vp_idx) {
916                         atomic_set(&vha->vp_state, VP_FAILED);
917                         fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
918                 }
919
920                 if (!(test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)))
921                         set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
922
923                 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags);
924                 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags);
925
926                 ha->flags.gpsc_supported = 1;
927                 vha->flags.management_server_logged_in = 0;
928                 break;
929
930         case MBA_CHG_IN_CONNECTION:     /* Change in connection mode */
931                 if (IS_QLA2100(ha))
932                         break;
933
934                 ql_dbg(ql_dbg_async, vha, 0x500f,
935                     "Configuration change detected: value=%x.\n", mb[1]);
936
937                 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
938                         atomic_set(&vha->loop_state, LOOP_DOWN);
939                         if (!atomic_read(&vha->loop_down_timer))
940                                 atomic_set(&vha->loop_down_timer,
941                                     LOOP_DOWN_TIME);
942                         qla2x00_mark_all_devices_lost(vha, 1);
943                 }
944
945                 if (vha->vp_idx) {
946                         atomic_set(&vha->vp_state, VP_FAILED);
947                         fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED);
948                 }
949
950                 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
951                 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
952                 break;
953
954         case MBA_PORT_UPDATE:           /* Port database update */
955                 /*
956                  * Handle only global and vn-port update events
957                  *
958                  * Relevant inputs:
959                  * mb[1] = N_Port handle of changed port
960                  * OR 0xffff for global event
961                  * mb[2] = New login state
962                  * 7 = Port logged out
963                  * mb[3] = LSB is vp_idx, 0xff = all vps
964                  *
965                  * Skip processing if:
966                  *       Event is global, vp_idx is NOT all vps,
967                  *           vp_idx does not match
968                  *       Event is not global, vp_idx does not match
969                  */
970                 if (IS_QLA2XXX_MIDTYPE(ha) &&
971                     ((mb[1] == 0xffff && (mb[3] & 0xff) != 0xff) ||
972                         (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff))
973                         break;
974
975                 if (mb[2] == 0x7) {
976                         ql_dbg(ql_dbg_async, vha, 0x5010,
977                             "Port %s %04x %04x %04x.\n",
978                             mb[1] == 0xffff ? "unavailable" : "logout",
979                             mb[1], mb[2], mb[3]);
980
981                         if (mb[1] == 0xffff)
982                                 goto global_port_update;
983
984                         if (mb[1] == NPH_SNS_LID(ha)) {
985                                 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
986                                 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
987                                 break;
988                         }
989
990                         /* use handle_cnt for loop id/nport handle */
991                         if (IS_FWI2_CAPABLE(ha))
992                                 handle_cnt = NPH_SNS;
993                         else
994                                 handle_cnt = SIMPLE_NAME_SERVER;
995                         if (mb[1] == handle_cnt) {
996                                 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
997                                 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
998                                 break;
999                         }
1000
1001                         /* Port logout */
1002                         fcport = qla2x00_find_fcport_by_loopid(vha, mb[1]);
1003                         if (!fcport)
1004                                 break;
1005                         if (atomic_read(&fcport->state) != FCS_ONLINE)
1006                                 break;
1007                         ql_dbg(ql_dbg_async, vha, 0x508a,
1008                             "Marking port lost loopid=%04x portid=%06x.\n",
1009                             fcport->loop_id, fcport->d_id.b24);
1010                         if (qla_ini_mode_enabled(vha)) {
1011                                 qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
1012                                 fcport->logout_on_delete = 0;
1013                                 qlt_schedule_sess_for_deletion_lock(fcport);
1014                         }
1015                         break;
1016
1017 global_port_update:
1018                         if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
1019                                 atomic_set(&vha->loop_state, LOOP_DOWN);
1020                                 atomic_set(&vha->loop_down_timer,
1021                                     LOOP_DOWN_TIME);
1022                                 vha->device_flags |= DFLG_NO_CABLE;
1023                                 qla2x00_mark_all_devices_lost(vha, 1);
1024                         }
1025
1026                         if (vha->vp_idx) {
1027                                 atomic_set(&vha->vp_state, VP_FAILED);
1028                                 fc_vport_set_state(vha->fc_vport,
1029                                     FC_VPORT_FAILED);
1030                                 qla2x00_mark_all_devices_lost(vha, 1);
1031                         }
1032
1033                         vha->flags.management_server_logged_in = 0;
1034                         ha->link_data_rate = PORT_SPEED_UNKNOWN;
1035                         break;
1036                 }
1037
1038                 /*
1039                  * If PORT UPDATE is global (received LIP_OCCURRED/LIP_RESET
1040                  * event etc. earlier indicating loop is down) then process
1041                  * it.  Otherwise ignore it and Wait for RSCN to come in.
1042                  */
1043                 atomic_set(&vha->loop_down_timer, 0);
1044                 if (atomic_read(&vha->loop_state) != LOOP_DOWN &&
1045                     atomic_read(&vha->loop_state) != LOOP_DEAD) {
1046                         ql_dbg(ql_dbg_async, vha, 0x5011,
1047                             "Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
1048                             mb[1], mb[2], mb[3]);
1049                         break;
1050                 }
1051
1052                 ql_dbg(ql_dbg_async, vha, 0x5012,
1053                     "Port database changed %04x %04x %04x.\n",
1054                     mb[1], mb[2], mb[3]);
1055
1056                 /*
1057                  * Mark all devices as missing so we will login again.
1058                  */
1059                 atomic_set(&vha->loop_state, LOOP_UP);
1060
1061                 qla2x00_mark_all_devices_lost(vha, 1);
1062
1063                 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
1064                 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
1065                 set_bit(VP_CONFIG_OK, &vha->vp_flags);
1066                 break;
1067
1068         case MBA_RSCN_UPDATE:           /* State Change Registration */
1069                 /* Check if the Vport has issued a SCR */
1070                 if (vha->vp_idx && test_bit(VP_SCR_NEEDED, &vha->vp_flags))
1071                         break;
1072                 /* Only handle SCNs for our Vport index. */
1073                 if (ha->flags.npiv_supported && vha->vp_idx != (mb[3] & 0xff))
1074                         break;
1075
1076                 ql_dbg(ql_dbg_async, vha, 0x5013,
1077                     "RSCN database changed -- %04x %04x %04x.\n",
1078                     mb[1], mb[2], mb[3]);
1079
1080                 rscn_entry = ((mb[1] & 0xff) << 16) | mb[2];
1081                 host_pid = (vha->d_id.b.domain << 16) | (vha->d_id.b.area << 8)
1082                                 | vha->d_id.b.al_pa;
1083                 if (rscn_entry == host_pid) {
1084                         ql_dbg(ql_dbg_async, vha, 0x5014,
1085                             "Ignoring RSCN update to local host "
1086                             "port ID (%06x).\n", host_pid);
1087                         break;
1088                 }
1089
1090                 /* Ignore reserved bits from RSCN-payload. */
1091                 rscn_entry = ((mb[1] & 0x3ff) << 16) | mb[2];
1092
1093                 /* Skip RSCNs for virtual ports on the same physical port */
1094                 if (qla2x00_is_a_vp_did(vha, rscn_entry))
1095                         break;
1096
1097                 atomic_set(&vha->loop_down_timer, 0);
1098                 vha->flags.management_server_logged_in = 0;
1099                 {
1100                         struct event_arg ea;
1101
1102                         memset(&ea, 0, sizeof(ea));
1103                         ea.event = FCME_RSCN;
1104                         ea.id.b24 = rscn_entry;
1105                         ea.id.b.rsvd_1 = rscn_entry >> 24;
1106                         qla2x00_fcport_event_handler(vha, &ea);
1107                         qla2x00_post_aen_work(vha, FCH_EVT_RSCN, rscn_entry);
1108                 }
1109                 break;
1110         /* case MBA_RIO_RESPONSE: */
1111         case MBA_ZIO_RESPONSE:
1112                 ql_dbg(ql_dbg_async, vha, 0x5015,
1113                     "[R|Z]IO update completion.\n");
1114
1115                 if (IS_FWI2_CAPABLE(ha))
1116                         qla24xx_process_response_queue(vha, rsp);
1117                 else
1118                         qla2x00_process_response_queue(rsp);
1119                 break;
1120
1121         case MBA_DISCARD_RND_FRAME:
1122                 ql_dbg(ql_dbg_async, vha, 0x5016,
1123                     "Discard RND Frame -- %04x %04x %04x.\n",
1124                     mb[1], mb[2], mb[3]);
1125                 break;
1126
1127         case MBA_TRACE_NOTIFICATION:
1128                 ql_dbg(ql_dbg_async, vha, 0x5017,
1129                     "Trace Notification -- %04x %04x.\n", mb[1], mb[2]);
1130                 break;
1131
1132         case MBA_ISP84XX_ALERT:
1133                 ql_dbg(ql_dbg_async, vha, 0x5018,
1134                     "ISP84XX Alert Notification -- %04x %04x %04x.\n",
1135                     mb[1], mb[2], mb[3]);
1136
1137                 spin_lock_irqsave(&ha->cs84xx->access_lock, flags);
1138                 switch (mb[1]) {
1139                 case A84_PANIC_RECOVERY:
1140                         ql_log(ql_log_info, vha, 0x5019,
1141                             "Alert 84XX: panic recovery %04x %04x.\n",
1142                             mb[2], mb[3]);
1143                         break;
1144                 case A84_OP_LOGIN_COMPLETE:
1145                         ha->cs84xx->op_fw_version = mb[3] << 16 | mb[2];
1146                         ql_log(ql_log_info, vha, 0x501a,
1147                             "Alert 84XX: firmware version %x.\n",
1148                             ha->cs84xx->op_fw_version);
1149                         break;
1150                 case A84_DIAG_LOGIN_COMPLETE:
1151                         ha->cs84xx->diag_fw_version = mb[3] << 16 | mb[2];
1152                         ql_log(ql_log_info, vha, 0x501b,
1153                             "Alert 84XX: diagnostic firmware version %x.\n",
1154                             ha->cs84xx->diag_fw_version);
1155                         break;
1156                 case A84_GOLD_LOGIN_COMPLETE:
1157                         ha->cs84xx->diag_fw_version = mb[3] << 16 | mb[2];
1158                         ha->cs84xx->fw_update = 1;
1159                         ql_log(ql_log_info, vha, 0x501c,
1160                             "Alert 84XX: gold firmware version %x.\n",
1161                             ha->cs84xx->gold_fw_version);
1162                         break;
1163                 default:
1164                         ql_log(ql_log_warn, vha, 0x501d,
1165                             "Alert 84xx: Invalid Alert %04x %04x %04x.\n",
1166                             mb[1], mb[2], mb[3]);
1167                 }
1168                 spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags);
1169                 break;
1170         case MBA_DCBX_START:
1171                 ql_dbg(ql_dbg_async, vha, 0x501e,
1172                     "DCBX Started -- %04x %04x %04x.\n",
1173                     mb[1], mb[2], mb[3]);
1174                 break;
1175         case MBA_DCBX_PARAM_UPDATE:
1176                 ql_dbg(ql_dbg_async, vha, 0x501f,
1177                     "DCBX Parameters Updated -- %04x %04x %04x.\n",
1178                     mb[1], mb[2], mb[3]);
1179                 break;
1180         case MBA_FCF_CONF_ERR:
1181                 ql_dbg(ql_dbg_async, vha, 0x5020,
1182                     "FCF Configuration Error -- %04x %04x %04x.\n",
1183                     mb[1], mb[2], mb[3]);
1184                 break;
1185         case MBA_IDC_NOTIFY:
1186                 if (IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
1187                         mb[4] = RD_REG_WORD(&reg24->mailbox4);
1188                         if (((mb[2] & 0x7fff) == MBC_PORT_RESET ||
1189                             (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) &&
1190                             (mb[4] & INTERNAL_LOOPBACK_MASK) != 0) {
1191                                 set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
1192                                 /*
1193                                  * Extend loop down timer since port is active.
1194                                  */
1195                                 if (atomic_read(&vha->loop_state) == LOOP_DOWN)
1196                                         atomic_set(&vha->loop_down_timer,
1197                                             LOOP_DOWN_TIME);
1198                                 qla2xxx_wake_dpc(vha);
1199                         }
1200                 }
1201         case MBA_IDC_COMPLETE:
1202                 if (ha->notify_lb_portup_comp && !vha->vp_idx)
1203                         complete(&ha->lb_portup_comp);
1204                 /* Fallthru */
1205         case MBA_IDC_TIME_EXT:
1206                 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) ||
1207                     IS_QLA8044(ha))
1208                         qla81xx_idc_event(vha, mb[0], mb[1]);
1209                 break;
1210
1211         case MBA_IDC_AEN:
1212                 mb[4] = RD_REG_WORD(&reg24->mailbox4);
1213                 mb[5] = RD_REG_WORD(&reg24->mailbox5);
1214                 mb[6] = RD_REG_WORD(&reg24->mailbox6);
1215                 mb[7] = RD_REG_WORD(&reg24->mailbox7);
1216                 qla83xx_handle_8200_aen(vha, mb);
1217                 break;
1218
1219         case MBA_DPORT_DIAGNOSTICS:
1220                 ql_dbg(ql_dbg_async, vha, 0x5052,
1221                     "D-Port Diagnostics: %04x result=%s\n",
1222                     mb[0],
1223                     mb[1] == 0 ? "start" :
1224                     mb[1] == 1 ? "done (pass)" :
1225                     mb[1] == 2 ? "done (error)" : "other");
1226                 break;
1227
1228         case MBA_TEMPERATURE_ALERT:
1229                 ql_dbg(ql_dbg_async, vha, 0x505e,
1230                     "TEMPERATURE ALERT: %04x %04x %04x\n", mb[1], mb[2], mb[3]);
1231                 if (mb[1] == 0x12)
1232                         schedule_work(&ha->board_disable);
1233                 break;
1234
1235         case MBA_TRANS_INSERT:
1236                 ql_dbg(ql_dbg_async, vha, 0x5091,
1237                     "Transceiver Insertion: %04x\n", mb[1]);
1238                 break;
1239
1240         default:
1241                 ql_dbg(ql_dbg_async, vha, 0x5057,
1242                     "Unknown AEN:%04x %04x %04x %04x\n",
1243                     mb[0], mb[1], mb[2], mb[3]);
1244         }
1245
1246         qlt_async_event(mb[0], vha, mb);
1247
1248         if (!vha->vp_idx && ha->num_vhosts)
1249                 qla2x00_alert_all_vps(rsp, mb);
1250 }
1251
1252 /**
1253  * qla2x00_process_completed_request() - Process a Fast Post response.
1254  * @ha: SCSI driver HA context
1255  * @index: SRB index
1256  */
1257 void
1258 qla2x00_process_completed_request(struct scsi_qla_host *vha,
1259                                   struct req_que *req, uint32_t index)
1260 {
1261         srb_t *sp;
1262         struct qla_hw_data *ha = vha->hw;
1263
1264         /* Validate handle. */
1265         if (index >= req->num_outstanding_cmds) {
1266                 ql_log(ql_log_warn, vha, 0x3014,
1267                     "Invalid SCSI command index (%x).\n", index);
1268
1269                 if (IS_P3P_TYPE(ha))
1270                         set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1271                 else
1272                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1273                 return;
1274         }
1275
1276         sp = req->outstanding_cmds[index];
1277         if (sp) {
1278                 /* Free outstanding command slot. */
1279                 req->outstanding_cmds[index] = NULL;
1280
1281                 /* Save ISP completion status */
1282                 sp->done(sp, DID_OK << 16);
1283         } else {
1284                 ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n");
1285
1286                 if (IS_P3P_TYPE(ha))
1287                         set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1288                 else
1289                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1290         }
1291 }
1292
1293 srb_t *
1294 qla2x00_get_sp_from_handle(scsi_qla_host_t *vha, const char *func,
1295     struct req_que *req, void *iocb)
1296 {
1297         struct qla_hw_data *ha = vha->hw;
1298         sts_entry_t *pkt = iocb;
1299         srb_t *sp = NULL;
1300         uint16_t index;
1301
1302         index = LSW(pkt->handle);
1303         if (index >= req->num_outstanding_cmds) {
1304                 ql_log(ql_log_warn, vha, 0x5031,
1305                            "Invalid command index (%x) type %8ph.\n",
1306                            index, iocb);
1307                 if (IS_P3P_TYPE(ha))
1308                         set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1309                 else
1310                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1311                 goto done;
1312         }
1313         sp = req->outstanding_cmds[index];
1314         if (!sp) {
1315                 ql_log(ql_log_warn, vha, 0x5032,
1316                     "Invalid completion handle (%x) -- timed-out.\n", index);
1317                 return sp;
1318         }
1319         if (sp->handle != index) {
1320                 ql_log(ql_log_warn, vha, 0x5033,
1321                     "SRB handle (%x) mismatch %x.\n", sp->handle, index);
1322                 return NULL;
1323         }
1324
1325         req->outstanding_cmds[index] = NULL;
1326
1327 done:
1328         return sp;
1329 }
1330
1331 static void
1332 qla2x00_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1333     struct mbx_entry *mbx)
1334 {
1335         const char func[] = "MBX-IOCB";
1336         const char *type;
1337         fc_port_t *fcport;
1338         srb_t *sp;
1339         struct srb_iocb *lio;
1340         uint16_t *data;
1341         uint16_t status;
1342
1343         sp = qla2x00_get_sp_from_handle(vha, func, req, mbx);
1344         if (!sp)
1345                 return;
1346
1347         lio = &sp->u.iocb_cmd;
1348         type = sp->name;
1349         fcport = sp->fcport;
1350         data = lio->u.logio.data;
1351
1352         data[0] = MBS_COMMAND_ERROR;
1353         data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
1354             QLA_LOGIO_LOGIN_RETRIED : 0;
1355         if (mbx->entry_status) {
1356                 ql_dbg(ql_dbg_async, vha, 0x5043,
1357                     "Async-%s error entry - hdl=%x portid=%02x%02x%02x "
1358                     "entry-status=%x status=%x state-flag=%x "
1359                     "status-flags=%x.\n", type, sp->handle,
1360                     fcport->d_id.b.domain, fcport->d_id.b.area,
1361                     fcport->d_id.b.al_pa, mbx->entry_status,
1362                     le16_to_cpu(mbx->status), le16_to_cpu(mbx->state_flags),
1363                     le16_to_cpu(mbx->status_flags));
1364
1365                 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5029,
1366                     (uint8_t *)mbx, sizeof(*mbx));
1367
1368                 goto logio_done;
1369         }
1370
1371         status = le16_to_cpu(mbx->status);
1372         if (status == 0x30 && sp->type == SRB_LOGIN_CMD &&
1373             le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE)
1374                 status = 0;
1375         if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) {
1376                 ql_dbg(ql_dbg_async, vha, 0x5045,
1377                     "Async-%s complete - hdl=%x portid=%02x%02x%02x mbx1=%x.\n",
1378                     type, sp->handle, fcport->d_id.b.domain,
1379                     fcport->d_id.b.area, fcport->d_id.b.al_pa,
1380                     le16_to_cpu(mbx->mb1));
1381
1382                 data[0] = MBS_COMMAND_COMPLETE;
1383                 if (sp->type == SRB_LOGIN_CMD) {
1384                         fcport->port_type = FCT_TARGET;
1385                         if (le16_to_cpu(mbx->mb1) & BIT_0)
1386                                 fcport->port_type = FCT_INITIATOR;
1387                         else if (le16_to_cpu(mbx->mb1) & BIT_1)
1388                                 fcport->flags |= FCF_FCP2_DEVICE;
1389                 }
1390                 goto logio_done;
1391         }
1392
1393         data[0] = le16_to_cpu(mbx->mb0);
1394         switch (data[0]) {
1395         case MBS_PORT_ID_USED:
1396                 data[1] = le16_to_cpu(mbx->mb1);
1397                 break;
1398         case MBS_LOOP_ID_USED:
1399                 break;
1400         default:
1401                 data[0] = MBS_COMMAND_ERROR;
1402                 break;
1403         }
1404
1405         ql_log(ql_log_warn, vha, 0x5046,
1406             "Async-%s failed - hdl=%x portid=%02x%02x%02x status=%x "
1407             "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n", type, sp->handle,
1408             fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa,
1409             status, le16_to_cpu(mbx->mb0), le16_to_cpu(mbx->mb1),
1410             le16_to_cpu(mbx->mb2), le16_to_cpu(mbx->mb6),
1411             le16_to_cpu(mbx->mb7));
1412
1413 logio_done:
1414         sp->done(sp, 0);
1415 }
1416
1417 static void
1418 qla24xx_mbx_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1419     struct mbx_24xx_entry *pkt)
1420 {
1421         const char func[] = "MBX-IOCB2";
1422         srb_t *sp;
1423         struct srb_iocb *si;
1424         u16 sz, i;
1425         int res;
1426
1427         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1428         if (!sp)
1429                 return;
1430
1431         si = &sp->u.iocb_cmd;
1432         sz = min(ARRAY_SIZE(pkt->mb), ARRAY_SIZE(sp->u.iocb_cmd.u.mbx.in_mb));
1433
1434         for (i = 0; i < sz; i++)
1435                 si->u.mbx.in_mb[i] = le16_to_cpu(pkt->mb[i]);
1436
1437         res = (si->u.mbx.in_mb[0] & MBS_MASK);
1438
1439         sp->done(sp, res);
1440 }
1441
1442 static void
1443 qla24xxx_nack_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
1444     struct nack_to_isp *pkt)
1445 {
1446         const char func[] = "nack";
1447         srb_t *sp;
1448         int res = 0;
1449
1450         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1451         if (!sp)
1452                 return;
1453
1454         if (pkt->u.isp2x.status != cpu_to_le16(NOTIFY_ACK_SUCCESS))
1455                 res = QLA_FUNCTION_FAILED;
1456
1457         sp->done(sp, res);
1458 }
1459
1460 static void
1461 qla2x00_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1462     sts_entry_t *pkt, int iocb_type)
1463 {
1464         const char func[] = "CT_IOCB";
1465         const char *type;
1466         srb_t *sp;
1467         struct bsg_job *bsg_job;
1468         struct fc_bsg_reply *bsg_reply;
1469         uint16_t comp_status;
1470         int res = 0;
1471
1472         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1473         if (!sp)
1474                 return;
1475
1476         switch (sp->type) {
1477         case SRB_CT_CMD:
1478             bsg_job = sp->u.bsg_job;
1479             bsg_reply = bsg_job->reply;
1480
1481             type = "ct pass-through";
1482
1483             comp_status = le16_to_cpu(pkt->comp_status);
1484
1485             /*
1486              * return FC_CTELS_STATUS_OK and leave the decoding of the ELS/CT
1487              * fc payload  to the caller
1488              */
1489             bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
1490             bsg_job->reply_len = sizeof(struct fc_bsg_reply);
1491
1492             if (comp_status != CS_COMPLETE) {
1493                     if (comp_status == CS_DATA_UNDERRUN) {
1494                             res = DID_OK << 16;
1495                             bsg_reply->reply_payload_rcv_len =
1496                                 le16_to_cpu(((sts_entry_t *)pkt)->rsp_info_len);
1497
1498                             ql_log(ql_log_warn, vha, 0x5048,
1499                                 "CT pass-through-%s error comp_status=0x%x total_byte=0x%x.\n",
1500                                 type, comp_status,
1501                                 bsg_reply->reply_payload_rcv_len);
1502                     } else {
1503                             ql_log(ql_log_warn, vha, 0x5049,
1504                                 "CT pass-through-%s error comp_status=0x%x.\n",
1505                                 type, comp_status);
1506                             res = DID_ERROR << 16;
1507                             bsg_reply->reply_payload_rcv_len = 0;
1508                     }
1509                     ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5035,
1510                         (uint8_t *)pkt, sizeof(*pkt));
1511             } else {
1512                     res = DID_OK << 16;
1513                     bsg_reply->reply_payload_rcv_len =
1514                         bsg_job->reply_payload.payload_len;
1515                     bsg_job->reply_len = 0;
1516             }
1517             break;
1518         case SRB_CT_PTHRU_CMD:
1519             /*
1520              * borrowing sts_entry_24xx.comp_status.
1521              * same location as ct_entry_24xx.comp_status
1522              */
1523              res = qla2x00_chk_ms_status(vha, (ms_iocb_entry_t *)pkt,
1524                  (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp,
1525                  sp->name);
1526              break;
1527         }
1528
1529         sp->done(sp, res);
1530 }
1531
1532 static void
1533 qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req,
1534     struct sts_entry_24xx *pkt, int iocb_type)
1535 {
1536         const char func[] = "ELS_CT_IOCB";
1537         const char *type;
1538         srb_t *sp;
1539         struct bsg_job *bsg_job;
1540         struct fc_bsg_reply *bsg_reply;
1541         uint16_t comp_status;
1542         uint32_t fw_status[3];
1543         uint8_t* fw_sts_ptr;
1544         int res;
1545
1546         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
1547         if (!sp)
1548                 return;
1549
1550         type = NULL;
1551         switch (sp->type) {
1552         case SRB_ELS_CMD_RPT:
1553         case SRB_ELS_CMD_HST:
1554                 type = "els";
1555                 break;
1556         case SRB_CT_CMD:
1557                 type = "ct pass-through";
1558                 break;
1559         case SRB_ELS_DCMD:
1560                 type = "Driver ELS logo";
1561                 ql_dbg(ql_dbg_user, vha, 0x5047,
1562                     "Completing %s: (%p) type=%d.\n", type, sp, sp->type);
1563                 sp->done(sp, 0);
1564                 return;
1565         case SRB_CT_PTHRU_CMD:
1566                 /* borrowing sts_entry_24xx.comp_status.
1567                    same location as ct_entry_24xx.comp_status
1568                  */
1569                 res = qla2x00_chk_ms_status(sp->vha, (ms_iocb_entry_t *)pkt,
1570                         (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp,
1571                         sp->name);
1572                 sp->done(sp, res);
1573                 return;
1574         default:
1575                 ql_dbg(ql_dbg_user, vha, 0x503e,
1576                     "Unrecognized SRB: (%p) type=%d.\n", sp, sp->type);
1577                 return;
1578         }
1579
1580         comp_status = fw_status[0] = le16_to_cpu(pkt->comp_status);
1581         fw_status[1] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_1);
1582         fw_status[2] = le16_to_cpu(((struct els_sts_entry_24xx*)pkt)->error_subcode_2);
1583
1584         /* return FC_CTELS_STATUS_OK and leave the decoding of the ELS/CT
1585          * fc payload  to the caller
1586          */
1587         bsg_job = sp->u.bsg_job;
1588         bsg_reply = bsg_job->reply;
1589         bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
1590         bsg_job->reply_len = sizeof(struct fc_bsg_reply) + sizeof(fw_status);
1591
1592         if (comp_status != CS_COMPLETE) {
1593                 if (comp_status == CS_DATA_UNDERRUN) {
1594                         res = DID_OK << 16;
1595                         bsg_reply->reply_payload_rcv_len =
1596                             le16_to_cpu(((struct els_sts_entry_24xx *)pkt)->total_byte_count);
1597
1598                         ql_dbg(ql_dbg_user, vha, 0x503f,
1599                             "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
1600                             "error subcode 1=0x%x error subcode 2=0x%x total_byte = 0x%x.\n",
1601                             type, sp->handle, comp_status, fw_status[1], fw_status[2],
1602                             le16_to_cpu(((struct els_sts_entry_24xx *)
1603                                 pkt)->total_byte_count));
1604                         fw_sts_ptr = ((uint8_t*)scsi_req(bsg_job->req)->sense) +
1605                                 sizeof(struct fc_bsg_reply);
1606                         memcpy( fw_sts_ptr, fw_status, sizeof(fw_status));
1607                 }
1608                 else {
1609                         ql_dbg(ql_dbg_user, vha, 0x5040,
1610                             "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x "
1611                             "error subcode 1=0x%x error subcode 2=0x%x.\n",
1612                             type, sp->handle, comp_status,
1613                             le16_to_cpu(((struct els_sts_entry_24xx *)
1614                                 pkt)->error_subcode_1),
1615                             le16_to_cpu(((struct els_sts_entry_24xx *)
1616                                     pkt)->error_subcode_2));
1617                         res = DID_ERROR << 16;
1618                         bsg_reply->reply_payload_rcv_len = 0;
1619                         fw_sts_ptr = ((uint8_t*)scsi_req(bsg_job->req)->sense) +
1620                                         sizeof(struct fc_bsg_reply);
1621                         memcpy( fw_sts_ptr, fw_status, sizeof(fw_status));
1622                 }
1623                 ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056,
1624                                 (uint8_t *)pkt, sizeof(*pkt));
1625         }
1626         else {
1627                 res =  DID_OK << 16;
1628                 bsg_reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len;
1629                 bsg_job->reply_len = 0;
1630         }
1631
1632         sp->done(sp, res);
1633 }
1634
1635 static void
1636 qla24xx_logio_entry(scsi_qla_host_t *vha, struct req_que *req,
1637     struct logio_entry_24xx *logio)
1638 {
1639         const char func[] = "LOGIO-IOCB";
1640         const char *type;
1641         fc_port_t *fcport;
1642         srb_t *sp;
1643         struct srb_iocb *lio;
1644         uint16_t *data;
1645         uint32_t iop[2];
1646
1647         sp = qla2x00_get_sp_from_handle(vha, func, req, logio);
1648         if (!sp)
1649                 return;
1650
1651         lio = &sp->u.iocb_cmd;
1652         type = sp->name;
1653         fcport = sp->fcport;
1654         data = lio->u.logio.data;
1655
1656         data[0] = MBS_COMMAND_ERROR;
1657         data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
1658                 QLA_LOGIO_LOGIN_RETRIED : 0;
1659         if (logio->entry_status) {
1660                 ql_log(ql_log_warn, fcport->vha, 0x5034,
1661                     "Async-%s error entry - %8phC hdl=%x"
1662                     "portid=%02x%02x%02x entry-status=%x.\n",
1663                     type, fcport->port_name, sp->handle, fcport->d_id.b.domain,
1664                     fcport->d_id.b.area, fcport->d_id.b.al_pa,
1665                     logio->entry_status);
1666                 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x504d,
1667                     (uint8_t *)logio, sizeof(*logio));
1668
1669                 goto logio_done;
1670         }
1671
1672         if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) {
1673                 ql_dbg(ql_dbg_async, fcport->vha, 0x5036,
1674                     "Async-%s complete - %8phC hdl=%x portid=%02x%02x%02x "
1675                     "iop0=%x.\n", type, fcport->port_name, sp->handle,
1676                     fcport->d_id.b.domain,
1677                     fcport->d_id.b.area, fcport->d_id.b.al_pa,
1678                     le32_to_cpu(logio->io_parameter[0]));
1679
1680                 vha->hw->exch_starvation = 0;
1681                 data[0] = MBS_COMMAND_COMPLETE;
1682                 if (sp->type != SRB_LOGIN_CMD)
1683                         goto logio_done;
1684
1685                 iop[0] = le32_to_cpu(logio->io_parameter[0]);
1686                 if (iop[0] & BIT_4) {
1687                         fcport->port_type = FCT_TARGET;
1688                         if (iop[0] & BIT_8)
1689                                 fcport->flags |= FCF_FCP2_DEVICE;
1690                 } else if (iop[0] & BIT_5)
1691                         fcport->port_type = FCT_INITIATOR;
1692
1693                 if (iop[0] & BIT_7)
1694                         fcport->flags |= FCF_CONF_COMP_SUPPORTED;
1695
1696                 if (logio->io_parameter[7] || logio->io_parameter[8])
1697                         fcport->supported_classes |= FC_COS_CLASS2;
1698                 if (logio->io_parameter[9] || logio->io_parameter[10])
1699                         fcport->supported_classes |= FC_COS_CLASS3;
1700
1701                 goto logio_done;
1702         }
1703
1704         iop[0] = le32_to_cpu(logio->io_parameter[0]);
1705         iop[1] = le32_to_cpu(logio->io_parameter[1]);
1706         lio->u.logio.iop[0] = iop[0];
1707         lio->u.logio.iop[1] = iop[1];
1708         switch (iop[0]) {
1709         case LSC_SCODE_PORTID_USED:
1710                 data[0] = MBS_PORT_ID_USED;
1711                 data[1] = LSW(iop[1]);
1712                 break;
1713         case LSC_SCODE_NPORT_USED:
1714                 data[0] = MBS_LOOP_ID_USED;
1715                 break;
1716         case LSC_SCODE_CMD_FAILED:
1717                 if (iop[1] == 0x0606) {
1718                         /*
1719                          * PLOGI/PRLI Completed. We must have Recv PLOGI/PRLI,
1720                          * Target side acked.
1721                          */
1722                         data[0] = MBS_COMMAND_COMPLETE;
1723                         goto logio_done;
1724                 }
1725                 data[0] = MBS_COMMAND_ERROR;
1726                 break;
1727         case LSC_SCODE_NOXCB:
1728                 vha->hw->exch_starvation++;
1729                 if (vha->hw->exch_starvation > 5) {
1730                         ql_log(ql_log_warn, vha, 0xd046,
1731                             "Exchange starvation. Resetting RISC\n");
1732
1733                         vha->hw->exch_starvation = 0;
1734
1735                         if (IS_P3P_TYPE(vha->hw))
1736                                 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
1737                         else
1738                                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1739                         qla2xxx_wake_dpc(vha);
1740                 }
1741                 /* drop through */
1742         default:
1743                 data[0] = MBS_COMMAND_ERROR;
1744                 break;
1745         }
1746
1747         ql_dbg(ql_dbg_async, fcport->vha, 0x5037,
1748             "Async-%s failed - %8phC hdl=%x portid=%02x%02x%02x comp=%x "
1749             "iop0=%x iop1=%x.\n", type, fcport->port_name,
1750                 sp->handle, fcport->d_id.b.domain,
1751             fcport->d_id.b.area, fcport->d_id.b.al_pa,
1752             le16_to_cpu(logio->comp_status),
1753             le32_to_cpu(logio->io_parameter[0]),
1754             le32_to_cpu(logio->io_parameter[1]));
1755
1756 logio_done:
1757         sp->done(sp, 0);
1758 }
1759
1760 static void
1761 qla24xx_tm_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
1762 {
1763         const char func[] = "TMF-IOCB";
1764         const char *type;
1765         fc_port_t *fcport;
1766         srb_t *sp;
1767         struct srb_iocb *iocb;
1768         struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
1769
1770         sp = qla2x00_get_sp_from_handle(vha, func, req, tsk);
1771         if (!sp)
1772                 return;
1773
1774         iocb = &sp->u.iocb_cmd;
1775         type = sp->name;
1776         fcport = sp->fcport;
1777         iocb->u.tmf.data = QLA_SUCCESS;
1778
1779         if (sts->entry_status) {
1780                 ql_log(ql_log_warn, fcport->vha, 0x5038,
1781                     "Async-%s error - hdl=%x entry-status(%x).\n",
1782                     type, sp->handle, sts->entry_status);
1783                 iocb->u.tmf.data = QLA_FUNCTION_FAILED;
1784         } else if (sts->comp_status != cpu_to_le16(CS_COMPLETE)) {
1785                 ql_log(ql_log_warn, fcport->vha, 0x5039,
1786                     "Async-%s error - hdl=%x completion status(%x).\n",
1787                     type, sp->handle, sts->comp_status);
1788                 iocb->u.tmf.data = QLA_FUNCTION_FAILED;
1789         } else if ((le16_to_cpu(sts->scsi_status) &
1790             SS_RESPONSE_INFO_LEN_VALID)) {
1791                 if (le32_to_cpu(sts->rsp_data_len) < 4) {
1792                         ql_log(ql_log_warn, fcport->vha, 0x503b,
1793                             "Async-%s error - hdl=%x not enough response(%d).\n",
1794                             type, sp->handle, sts->rsp_data_len);
1795                 } else if (sts->data[3]) {
1796                         ql_log(ql_log_warn, fcport->vha, 0x503c,
1797                             "Async-%s error - hdl=%x response(%x).\n",
1798                             type, sp->handle, sts->data[3]);
1799                         iocb->u.tmf.data = QLA_FUNCTION_FAILED;
1800                 }
1801         }
1802
1803         if (iocb->u.tmf.data != QLA_SUCCESS)
1804                 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, vha, 0x5055,
1805                     (uint8_t *)sts, sizeof(*sts));
1806
1807         sp->done(sp, 0);
1808 }
1809
1810 static void
1811 qla24xx_nvme_iocb_entry(scsi_qla_host_t *vha, struct req_que *req, void *tsk)
1812 {
1813         const char func[] = "NVME-IOCB";
1814         fc_port_t *fcport;
1815         srb_t *sp;
1816         struct srb_iocb *iocb;
1817         struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
1818         uint16_t        state_flags;
1819         struct nvmefc_fcp_req *fd;
1820         uint16_t        ret = 0;
1821         struct srb_iocb *nvme;
1822
1823         sp = qla2x00_get_sp_from_handle(vha, func, req, tsk);
1824         if (!sp)
1825                 return;
1826
1827         iocb = &sp->u.iocb_cmd;
1828         fcport = sp->fcport;
1829         iocb->u.nvme.comp_status = le16_to_cpu(sts->comp_status);
1830         state_flags  = le16_to_cpu(sts->state_flags);
1831         fd = iocb->u.nvme.desc;
1832         nvme = &sp->u.iocb_cmd;
1833
1834         if (unlikely(nvme->u.nvme.aen_op))
1835                 atomic_dec(&sp->vha->hw->nvme_active_aen_cnt);
1836
1837         /*
1838          * State flags: Bit 6 and 0.
1839          * If 0 is set, we don't care about 6.
1840          * both cases resp was dma'd to host buffer
1841          * if both are 0, that is good path case.
1842          * if six is set and 0 is clear, we need to
1843          * copy resp data from status iocb to resp buffer.
1844          */
1845         if (!(state_flags & (SF_FCP_RSP_DMA | SF_NVME_ERSP))) {
1846                 iocb->u.nvme.rsp_pyld_len = 0;
1847         } else if ((state_flags & SF_FCP_RSP_DMA)) {
1848                 iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len);
1849         } else if (state_flags & SF_NVME_ERSP) {
1850                 uint32_t *inbuf, *outbuf;
1851                 uint16_t iter;
1852
1853                 inbuf = (uint32_t *)&sts->nvme_ersp_data;
1854                 outbuf = (uint32_t *)fd->rspaddr;
1855                 iocb->u.nvme.rsp_pyld_len = le16_to_cpu(sts->nvme_rsp_pyld_len);
1856                 if (unlikely(iocb->u.nvme.rsp_pyld_len >
1857                     sizeof(struct nvme_fc_ersp_iu))) {
1858                         if (ql_mask_match(ql_dbg_io)) {
1859                                 WARN_ONCE(1, "Unexpected response payload length %u.\n",
1860                                     iocb->u.nvme.rsp_pyld_len);
1861                                 ql_log(ql_log_warn, fcport->vha, 0x5100,
1862                                     "Unexpected response payload length %u.\n",
1863                                     iocb->u.nvme.rsp_pyld_len);
1864                         }
1865                         iocb->u.nvme.rsp_pyld_len =
1866                             sizeof(struct nvme_fc_ersp_iu);
1867                 }
1868                 iter = iocb->u.nvme.rsp_pyld_len >> 2;
1869                 for (; iter; iter--)
1870                         *outbuf++ = swab32(*inbuf++);
1871         } else { /* unhandled case */
1872             ql_log(ql_log_warn, fcport->vha, 0x503a,
1873                 "NVME-%s error. Unhandled state_flags of %x\n",
1874                 sp->name, state_flags);
1875         }
1876
1877         fd->transferred_length = fd->payload_length -
1878             le32_to_cpu(sts->residual_len);
1879
1880         /*
1881          * If transport error then Failure (HBA rejects request)
1882          * otherwise transport will handle.
1883          */
1884         if (sts->entry_status) {
1885                 ql_log(ql_log_warn, fcport->vha, 0x5038,
1886                     "NVME-%s error - hdl=%x entry-status(%x).\n",
1887                     sp->name, sp->handle, sts->entry_status);
1888                 ret = QLA_FUNCTION_FAILED;
1889         } else  {
1890                 switch (le16_to_cpu(sts->comp_status)) {
1891                         case CS_COMPLETE:
1892                                 ret = 0;
1893                         break;
1894
1895                         case CS_ABORTED:
1896                         case CS_RESET:
1897                         case CS_PORT_UNAVAILABLE:
1898                         case CS_PORT_LOGGED_OUT:
1899                         case CS_PORT_BUSY:
1900                                 ql_log(ql_log_warn, fcport->vha, 0x5060,
1901                                 "NVME-%s ERR Handling - hdl=%x completion status(%x) resid=%x  ox_id=%x\n",
1902                                 sp->name, sp->handle, sts->comp_status,
1903                                 le32_to_cpu(sts->residual_len), sts->ox_id);
1904                                 fd->transferred_length = fd->payload_length;
1905                                 ret = QLA_ABORTED;
1906                         break;
1907
1908                         default:
1909                                 ql_log(ql_log_warn, fcport->vha, 0x5060,
1910                                 "NVME-%s error - hdl=%x completion status(%x) resid=%x  ox_id=%x\n",
1911                                 sp->name, sp->handle, sts->comp_status,
1912                                 le32_to_cpu(sts->residual_len), sts->ox_id);
1913                                 ret = QLA_FUNCTION_FAILED;
1914                                 break;
1915                 }
1916         }
1917         sp->done(sp, ret);
1918 }
1919
1920 /**
1921  * qla2x00_process_response_queue() - Process response queue entries.
1922  * @ha: SCSI driver HA context
1923  */
1924 void
1925 qla2x00_process_response_queue(struct rsp_que *rsp)
1926 {
1927         struct scsi_qla_host *vha;
1928         struct qla_hw_data *ha = rsp->hw;
1929         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1930         sts_entry_t     *pkt;
1931         uint16_t        handle_cnt;
1932         uint16_t        cnt;
1933
1934         vha = pci_get_drvdata(ha->pdev);
1935
1936         if (!vha->flags.online)
1937                 return;
1938
1939         while (rsp->ring_ptr->signature != RESPONSE_PROCESSED) {
1940                 pkt = (sts_entry_t *)rsp->ring_ptr;
1941
1942                 rsp->ring_index++;
1943                 if (rsp->ring_index == rsp->length) {
1944                         rsp->ring_index = 0;
1945                         rsp->ring_ptr = rsp->ring;
1946                 } else {
1947                         rsp->ring_ptr++;
1948                 }
1949
1950                 if (pkt->entry_status != 0) {
1951                         qla2x00_error_entry(vha, rsp, pkt);
1952                         ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
1953                         wmb();
1954                         continue;
1955                 }
1956
1957                 switch (pkt->entry_type) {
1958                 case STATUS_TYPE:
1959                         qla2x00_status_entry(vha, rsp, pkt);
1960                         break;
1961                 case STATUS_TYPE_21:
1962                         handle_cnt = ((sts21_entry_t *)pkt)->handle_count;
1963                         for (cnt = 0; cnt < handle_cnt; cnt++) {
1964                                 qla2x00_process_completed_request(vha, rsp->req,
1965                                     ((sts21_entry_t *)pkt)->handle[cnt]);
1966                         }
1967                         break;
1968                 case STATUS_TYPE_22:
1969                         handle_cnt = ((sts22_entry_t *)pkt)->handle_count;
1970                         for (cnt = 0; cnt < handle_cnt; cnt++) {
1971                                 qla2x00_process_completed_request(vha, rsp->req,
1972                                     ((sts22_entry_t *)pkt)->handle[cnt]);
1973                         }
1974                         break;
1975                 case STATUS_CONT_TYPE:
1976                         qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt);
1977                         break;
1978                 case MBX_IOCB_TYPE:
1979                         qla2x00_mbx_iocb_entry(vha, rsp->req,
1980                             (struct mbx_entry *)pkt);
1981                         break;
1982                 case CT_IOCB_TYPE:
1983                         qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE);
1984                         break;
1985                 default:
1986                         /* Type Not Supported. */
1987                         ql_log(ql_log_warn, vha, 0x504a,
1988                             "Received unknown response pkt type %x "
1989                             "entry status=%x.\n",
1990                             pkt->entry_type, pkt->entry_status);
1991                         break;
1992                 }
1993                 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
1994                 wmb();
1995         }
1996
1997         /* Adjust ring index */
1998         WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index);
1999 }
2000
2001 static inline void
2002 qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
2003                      uint32_t sense_len, struct rsp_que *rsp, int res)
2004 {
2005         struct scsi_qla_host *vha = sp->vha;
2006         struct scsi_cmnd *cp = GET_CMD_SP(sp);
2007         uint32_t track_sense_len;
2008
2009         if (sense_len >= SCSI_SENSE_BUFFERSIZE)
2010                 sense_len = SCSI_SENSE_BUFFERSIZE;
2011
2012         SET_CMD_SENSE_LEN(sp, sense_len);
2013         SET_CMD_SENSE_PTR(sp, cp->sense_buffer);
2014         track_sense_len = sense_len;
2015
2016         if (sense_len > par_sense_len)
2017                 sense_len = par_sense_len;
2018
2019         memcpy(cp->sense_buffer, sense_data, sense_len);
2020
2021         SET_CMD_SENSE_PTR(sp, cp->sense_buffer + sense_len);
2022         track_sense_len -= sense_len;
2023         SET_CMD_SENSE_LEN(sp, track_sense_len);
2024
2025         if (track_sense_len != 0) {
2026                 rsp->status_srb = sp;
2027                 cp->result = res;
2028         }
2029
2030         if (sense_len) {
2031                 ql_dbg(ql_dbg_io + ql_dbg_buffer, vha, 0x301c,
2032                     "Check condition Sense data, nexus%ld:%d:%llu cmd=%p.\n",
2033                     sp->vha->host_no, cp->device->id, cp->device->lun,
2034                     cp);
2035                 ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302b,
2036                     cp->sense_buffer, sense_len);
2037         }
2038 }
2039
2040 struct scsi_dif_tuple {
2041         __be16 guard;       /* Checksum */
2042         __be16 app_tag;         /* APPL identifier */
2043         __be32 ref_tag;         /* Target LBA or indirect LBA */
2044 };
2045
2046 /*
2047  * Checks the guard or meta-data for the type of error
2048  * detected by the HBA. In case of errors, we set the
2049  * ASC/ASCQ fields in the sense buffer with ILLEGAL_REQUEST
2050  * to indicate to the kernel that the HBA detected error.
2051  */
2052 static inline int
2053 qla2x00_handle_dif_error(srb_t *sp, struct sts_entry_24xx *sts24)
2054 {
2055         struct scsi_qla_host *vha = sp->vha;
2056         struct scsi_cmnd *cmd = GET_CMD_SP(sp);
2057         uint8_t         *ap = &sts24->data[12];
2058         uint8_t         *ep = &sts24->data[20];
2059         uint32_t        e_ref_tag, a_ref_tag;
2060         uint16_t        e_app_tag, a_app_tag;
2061         uint16_t        e_guard, a_guard;
2062
2063         /*
2064          * swab32 of the "data" field in the beginning of qla2x00_status_entry()
2065          * would make guard field appear at offset 2
2066          */
2067         a_guard   = le16_to_cpu(*(uint16_t *)(ap + 2));
2068         a_app_tag = le16_to_cpu(*(uint16_t *)(ap + 0));
2069         a_ref_tag = le32_to_cpu(*(uint32_t *)(ap + 4));
2070         e_guard   = le16_to_cpu(*(uint16_t *)(ep + 2));
2071         e_app_tag = le16_to_cpu(*(uint16_t *)(ep + 0));
2072         e_ref_tag = le32_to_cpu(*(uint32_t *)(ep + 4));
2073
2074         ql_dbg(ql_dbg_io, vha, 0x3023,
2075             "iocb(s) %p Returned STATUS.\n", sts24);
2076
2077         ql_dbg(ql_dbg_io, vha, 0x3024,
2078             "DIF ERROR in cmd 0x%x lba 0x%llx act ref"
2079             " tag=0x%x, exp ref_tag=0x%x, act app tag=0x%x, exp app"
2080             " tag=0x%x, act guard=0x%x, exp guard=0x%x.\n",
2081             cmd->cmnd[0], (u64)scsi_get_lba(cmd), a_ref_tag, e_ref_tag,
2082             a_app_tag, e_app_tag, a_guard, e_guard);
2083
2084         /*
2085          * Ignore sector if:
2086          * For type     3: ref & app tag is all 'f's
2087          * For type 0,1,2: app tag is all 'f's
2088          */
2089         if ((a_app_tag == T10_PI_APP_ESCAPE) &&
2090             ((scsi_get_prot_type(cmd) != SCSI_PROT_DIF_TYPE3) ||
2091              (a_ref_tag == T10_PI_REF_ESCAPE))) {
2092                 uint32_t blocks_done, resid;
2093                 sector_t lba_s = scsi_get_lba(cmd);
2094
2095                 /* 2TB boundary case covered automatically with this */
2096                 blocks_done = e_ref_tag - (uint32_t)lba_s + 1;
2097
2098                 resid = scsi_bufflen(cmd) - (blocks_done *
2099                     cmd->device->sector_size);
2100
2101                 scsi_set_resid(cmd, resid);
2102                 cmd->result = DID_OK << 16;
2103
2104                 /* Update protection tag */
2105                 if (scsi_prot_sg_count(cmd)) {
2106                         uint32_t i, j = 0, k = 0, num_ent;
2107                         struct scatterlist *sg;
2108                         struct t10_pi_tuple *spt;
2109
2110                         /* Patch the corresponding protection tags */
2111                         scsi_for_each_prot_sg(cmd, sg,
2112                             scsi_prot_sg_count(cmd), i) {
2113                                 num_ent = sg_dma_len(sg) / 8;
2114                                 if (k + num_ent < blocks_done) {
2115                                         k += num_ent;
2116                                         continue;
2117                                 }
2118                                 j = blocks_done - k - 1;
2119                                 k = blocks_done;
2120                                 break;
2121                         }
2122
2123                         if (k != blocks_done) {
2124                                 ql_log(ql_log_warn, vha, 0x302f,
2125                                     "unexpected tag values tag:lba=%x:%llx)\n",
2126                                     e_ref_tag, (unsigned long long)lba_s);
2127                                 return 1;
2128                         }
2129
2130                         spt = page_address(sg_page(sg)) + sg->offset;
2131                         spt += j;
2132
2133                         spt->app_tag = T10_PI_APP_ESCAPE;
2134                         if (scsi_get_prot_type(cmd) == SCSI_PROT_DIF_TYPE3)
2135                                 spt->ref_tag = T10_PI_REF_ESCAPE;
2136                 }
2137
2138                 return 0;
2139         }
2140
2141         /* check guard */
2142         if (e_guard != a_guard) {
2143                 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
2144                     0x10, 0x1);
2145                 set_driver_byte(cmd, DRIVER_SENSE);
2146                 set_host_byte(cmd, DID_ABORT);
2147                 cmd->result |= SAM_STAT_CHECK_CONDITION << 1;
2148                 return 1;
2149         }
2150
2151         /* check ref tag */
2152         if (e_ref_tag != a_ref_tag) {
2153                 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
2154                     0x10, 0x3);
2155                 set_driver_byte(cmd, DRIVER_SENSE);
2156                 set_host_byte(cmd, DID_ABORT);
2157                 cmd->result |= SAM_STAT_CHECK_CONDITION << 1;
2158                 return 1;
2159         }
2160
2161         /* check appl tag */
2162         if (e_app_tag != a_app_tag) {
2163                 scsi_build_sense_buffer(1, cmd->sense_buffer, ILLEGAL_REQUEST,
2164                     0x10, 0x2);
2165                 set_driver_byte(cmd, DRIVER_SENSE);
2166                 set_host_byte(cmd, DID_ABORT);
2167                 cmd->result |= SAM_STAT_CHECK_CONDITION << 1;
2168                 return 1;
2169         }
2170
2171         return 1;
2172 }
2173
2174 static void
2175 qla25xx_process_bidir_status_iocb(scsi_qla_host_t *vha, void *pkt,
2176                                   struct req_que *req, uint32_t index)
2177 {
2178         struct qla_hw_data *ha = vha->hw;
2179         srb_t *sp;
2180         uint16_t        comp_status;
2181         uint16_t        scsi_status;
2182         uint16_t thread_id;
2183         uint32_t rval = EXT_STATUS_OK;
2184         struct bsg_job *bsg_job = NULL;
2185         struct fc_bsg_request *bsg_request;
2186         struct fc_bsg_reply *bsg_reply;
2187         sts_entry_t *sts;
2188         struct sts_entry_24xx *sts24;
2189         sts = (sts_entry_t *) pkt;
2190         sts24 = (struct sts_entry_24xx *) pkt;
2191
2192         /* Validate handle. */
2193         if (index >= req->num_outstanding_cmds) {
2194                 ql_log(ql_log_warn, vha, 0x70af,
2195                     "Invalid SCSI completion handle 0x%x.\n", index);
2196                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2197                 return;
2198         }
2199
2200         sp = req->outstanding_cmds[index];
2201         if (!sp) {
2202                 ql_log(ql_log_warn, vha, 0x70b0,
2203                     "Req:%d: Invalid ISP SCSI completion handle(0x%x)\n",
2204                     req->id, index);
2205
2206                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2207                 return;
2208         }
2209
2210         /* Free outstanding command slot. */
2211         req->outstanding_cmds[index] = NULL;
2212         bsg_job = sp->u.bsg_job;
2213         bsg_request = bsg_job->request;
2214         bsg_reply = bsg_job->reply;
2215
2216         if (IS_FWI2_CAPABLE(ha)) {
2217                 comp_status = le16_to_cpu(sts24->comp_status);
2218                 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK;
2219         } else {
2220                 comp_status = le16_to_cpu(sts->comp_status);
2221                 scsi_status = le16_to_cpu(sts->scsi_status) & SS_MASK;
2222         }
2223
2224         thread_id = bsg_request->rqst_data.h_vendor.vendor_cmd[1];
2225         switch (comp_status) {
2226         case CS_COMPLETE:
2227                 if (scsi_status == 0) {
2228                         bsg_reply->reply_payload_rcv_len =
2229                                         bsg_job->reply_payload.payload_len;
2230                         vha->qla_stats.input_bytes +=
2231                                 bsg_reply->reply_payload_rcv_len;
2232                         vha->qla_stats.input_requests++;
2233                         rval = EXT_STATUS_OK;
2234                 }
2235                 goto done;
2236
2237         case CS_DATA_OVERRUN:
2238                 ql_dbg(ql_dbg_user, vha, 0x70b1,
2239                     "Command completed with data overrun thread_id=%d\n",
2240                     thread_id);
2241                 rval = EXT_STATUS_DATA_OVERRUN;
2242                 break;
2243
2244         case CS_DATA_UNDERRUN:
2245                 ql_dbg(ql_dbg_user, vha, 0x70b2,
2246                     "Command completed with data underrun thread_id=%d\n",
2247                     thread_id);
2248                 rval = EXT_STATUS_DATA_UNDERRUN;
2249                 break;
2250         case CS_BIDIR_RD_OVERRUN:
2251                 ql_dbg(ql_dbg_user, vha, 0x70b3,
2252                     "Command completed with read data overrun thread_id=%d\n",
2253                     thread_id);
2254                 rval = EXT_STATUS_DATA_OVERRUN;
2255                 break;
2256
2257         case CS_BIDIR_RD_WR_OVERRUN:
2258                 ql_dbg(ql_dbg_user, vha, 0x70b4,
2259                     "Command completed with read and write data overrun "
2260                     "thread_id=%d\n", thread_id);
2261                 rval = EXT_STATUS_DATA_OVERRUN;
2262                 break;
2263
2264         case CS_BIDIR_RD_OVERRUN_WR_UNDERRUN:
2265                 ql_dbg(ql_dbg_user, vha, 0x70b5,
2266                     "Command completed with read data over and write data "
2267                     "underrun thread_id=%d\n", thread_id);
2268                 rval = EXT_STATUS_DATA_OVERRUN;
2269                 break;
2270
2271         case CS_BIDIR_RD_UNDERRUN:
2272                 ql_dbg(ql_dbg_user, vha, 0x70b6,
2273                     "Command completed with read data underrun "
2274                     "thread_id=%d\n", thread_id);
2275                 rval = EXT_STATUS_DATA_UNDERRUN;
2276                 break;
2277
2278         case CS_BIDIR_RD_UNDERRUN_WR_OVERRUN:
2279                 ql_dbg(ql_dbg_user, vha, 0x70b7,
2280                     "Command completed with read data under and write data "
2281                     "overrun thread_id=%d\n", thread_id);
2282                 rval = EXT_STATUS_DATA_UNDERRUN;
2283                 break;
2284
2285         case CS_BIDIR_RD_WR_UNDERRUN:
2286                 ql_dbg(ql_dbg_user, vha, 0x70b8,
2287                     "Command completed with read and write data underrun "
2288                     "thread_id=%d\n", thread_id);
2289                 rval = EXT_STATUS_DATA_UNDERRUN;
2290                 break;
2291
2292         case CS_BIDIR_DMA:
2293                 ql_dbg(ql_dbg_user, vha, 0x70b9,
2294                     "Command completed with data DMA error thread_id=%d\n",
2295                     thread_id);
2296                 rval = EXT_STATUS_DMA_ERR;
2297                 break;
2298
2299         case CS_TIMEOUT:
2300                 ql_dbg(ql_dbg_user, vha, 0x70ba,
2301                     "Command completed with timeout thread_id=%d\n",
2302                     thread_id);
2303                 rval = EXT_STATUS_TIMEOUT;
2304                 break;
2305         default:
2306                 ql_dbg(ql_dbg_user, vha, 0x70bb,
2307                     "Command completed with completion status=0x%x "
2308                     "thread_id=%d\n", comp_status, thread_id);
2309                 rval = EXT_STATUS_ERR;
2310                 break;
2311         }
2312         bsg_reply->reply_payload_rcv_len = 0;
2313
2314 done:
2315         /* Return the vendor specific reply to API */
2316         bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = rval;
2317         bsg_job->reply_len = sizeof(struct fc_bsg_reply);
2318         /* Always return DID_OK, bsg will send the vendor specific response
2319          * in this case only */
2320         sp->done(sp, DID_OK << 6);
2321
2322 }
2323
2324 /**
2325  * qla2x00_status_entry() - Process a Status IOCB entry.
2326  * @ha: SCSI driver HA context
2327  * @pkt: Entry pointer
2328  */
2329 static void
2330 qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
2331 {
2332         srb_t           *sp;
2333         fc_port_t       *fcport;
2334         struct scsi_cmnd *cp;
2335         sts_entry_t *sts;
2336         struct sts_entry_24xx *sts24;
2337         uint16_t        comp_status;
2338         uint16_t        scsi_status;
2339         uint16_t        ox_id;
2340         uint8_t         lscsi_status;
2341         int32_t         resid;
2342         uint32_t sense_len, par_sense_len, rsp_info_len, resid_len,
2343             fw_resid_len;
2344         uint8_t         *rsp_info, *sense_data;
2345         struct qla_hw_data *ha = vha->hw;
2346         uint32_t handle;
2347         uint16_t que;
2348         struct req_que *req;
2349         int logit = 1;
2350         int res = 0;
2351         uint16_t state_flags = 0;
2352         uint16_t retry_delay = 0;
2353
2354         sts = (sts_entry_t *) pkt;
2355         sts24 = (struct sts_entry_24xx *) pkt;
2356         if (IS_FWI2_CAPABLE(ha)) {
2357                 comp_status = le16_to_cpu(sts24->comp_status);
2358                 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK;
2359                 state_flags = le16_to_cpu(sts24->state_flags);
2360         } else {
2361                 comp_status = le16_to_cpu(sts->comp_status);
2362                 scsi_status = le16_to_cpu(sts->scsi_status) & SS_MASK;
2363         }
2364         handle = (uint32_t) LSW(sts->handle);
2365         que = MSW(sts->handle);
2366         req = ha->req_q_map[que];
2367
2368         /* Check for invalid queue pointer */
2369         if (req == NULL ||
2370             que >= find_first_zero_bit(ha->req_qid_map, ha->max_req_queues)) {
2371                 ql_dbg(ql_dbg_io, vha, 0x3059,
2372                     "Invalid status handle (0x%x): Bad req pointer. req=%p, "
2373                     "que=%u.\n", sts->handle, req, que);
2374                 return;
2375         }
2376
2377         /* Validate handle. */
2378         if (handle < req->num_outstanding_cmds) {
2379                 sp = req->outstanding_cmds[handle];
2380                 if (!sp) {
2381                         ql_dbg(ql_dbg_io, vha, 0x3075,
2382                             "%s(%ld): Already returned command for status handle (0x%x).\n",
2383                             __func__, vha->host_no, sts->handle);
2384                         return;
2385                 }
2386         } else {
2387                 ql_dbg(ql_dbg_io, vha, 0x3017,
2388                     "Invalid status handle, out of range (0x%x).\n",
2389                     sts->handle);
2390
2391                 if (!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) {
2392                         if (IS_P3P_TYPE(ha))
2393                                 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
2394                         else
2395                                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2396                         qla2xxx_wake_dpc(vha);
2397                 }
2398                 return;
2399         }
2400
2401         if (sp->cmd_type != TYPE_SRB) {
2402                 req->outstanding_cmds[handle] = NULL;
2403                 ql_dbg(ql_dbg_io, vha, 0x3015,
2404                     "Unknown sp->cmd_type %x %p).\n",
2405                     sp->cmd_type, sp);
2406                 return;
2407         }
2408
2409         /* NVME completion. */
2410         if (sp->type == SRB_NVME_CMD) {
2411                 qla24xx_nvme_iocb_entry(vha, req, pkt);
2412                 return;
2413         }
2414
2415         if (unlikely((state_flags & BIT_1) && (sp->type == SRB_BIDI_CMD))) {
2416                 qla25xx_process_bidir_status_iocb(vha, pkt, req, handle);
2417                 return;
2418         }
2419
2420         /* Task Management completion. */
2421         if (sp->type == SRB_TM_CMD) {
2422                 qla24xx_tm_iocb_entry(vha, req, pkt);
2423                 return;
2424         }
2425
2426         /* Fast path completion. */
2427         if (comp_status == CS_COMPLETE && scsi_status == 0) {
2428                 qla2x00_process_completed_request(vha, req, handle);
2429
2430                 return;
2431         }
2432
2433         req->outstanding_cmds[handle] = NULL;
2434         cp = GET_CMD_SP(sp);
2435         if (cp == NULL) {
2436                 ql_dbg(ql_dbg_io, vha, 0x3018,
2437                     "Command already returned (0x%x/%p).\n",
2438                     sts->handle, sp);
2439
2440                 return;
2441         }
2442
2443         lscsi_status = scsi_status & STATUS_MASK;
2444
2445         fcport = sp->fcport;
2446
2447         ox_id = 0;
2448         sense_len = par_sense_len = rsp_info_len = resid_len =
2449             fw_resid_len = 0;
2450         if (IS_FWI2_CAPABLE(ha)) {
2451                 if (scsi_status & SS_SENSE_LEN_VALID)
2452                         sense_len = le32_to_cpu(sts24->sense_len);
2453                 if (scsi_status & SS_RESPONSE_INFO_LEN_VALID)
2454                         rsp_info_len = le32_to_cpu(sts24->rsp_data_len);
2455                 if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER))
2456                         resid_len = le32_to_cpu(sts24->rsp_residual_count);
2457                 if (comp_status == CS_DATA_UNDERRUN)
2458                         fw_resid_len = le32_to_cpu(sts24->residual_len);
2459                 rsp_info = sts24->data;
2460                 sense_data = sts24->data;
2461                 host_to_fcp_swap(sts24->data, sizeof(sts24->data));
2462                 ox_id = le16_to_cpu(sts24->ox_id);
2463                 par_sense_len = sizeof(sts24->data);
2464                 /* Valid values of the retry delay timer are 0x1-0xffef */
2465                 if (sts24->retry_delay > 0 && sts24->retry_delay < 0xfff1) {
2466                         retry_delay = sts24->retry_delay & 0x3fff;
2467                         ql_dbg(ql_dbg_io, sp->vha, 0x3033,
2468                             "%s: scope=%#x retry_delay=%#x\n", __func__,
2469                             sts24->retry_delay >> 14, retry_delay);
2470                 }
2471         } else {
2472                 if (scsi_status & SS_SENSE_LEN_VALID)
2473                         sense_len = le16_to_cpu(sts->req_sense_length);
2474                 if (scsi_status & SS_RESPONSE_INFO_LEN_VALID)
2475                         rsp_info_len = le16_to_cpu(sts->rsp_info_len);
2476                 resid_len = le32_to_cpu(sts->residual_length);
2477                 rsp_info = sts->rsp_info;
2478                 sense_data = sts->req_sense_data;
2479                 par_sense_len = sizeof(sts->req_sense_data);
2480         }
2481
2482         /* Check for any FCP transport errors. */
2483         if (scsi_status & SS_RESPONSE_INFO_LEN_VALID) {
2484                 /* Sense data lies beyond any FCP RESPONSE data. */
2485                 if (IS_FWI2_CAPABLE(ha)) {
2486                         sense_data += rsp_info_len;
2487                         par_sense_len -= rsp_info_len;
2488                 }
2489                 if (rsp_info_len > 3 && rsp_info[3]) {
2490                         ql_dbg(ql_dbg_io, fcport->vha, 0x3019,
2491                             "FCP I/O protocol failure (0x%x/0x%x).\n",
2492                             rsp_info_len, rsp_info[3]);
2493
2494                         res = DID_BUS_BUSY << 16;
2495                         goto out;
2496                 }
2497         }
2498
2499         /* Check for overrun. */
2500         if (IS_FWI2_CAPABLE(ha) && comp_status == CS_COMPLETE &&
2501             scsi_status & SS_RESIDUAL_OVER)
2502                 comp_status = CS_DATA_OVERRUN;
2503
2504         /*
2505          * Check retry_delay_timer value if we receive a busy or
2506          * queue full.
2507          */
2508         if (lscsi_status == SAM_STAT_TASK_SET_FULL ||
2509             lscsi_status == SAM_STAT_BUSY)
2510                 qla2x00_set_retry_delay_timestamp(fcport, retry_delay);
2511
2512         /*
2513          * Based on Host and scsi status generate status code for Linux
2514          */
2515         switch (comp_status) {
2516         case CS_COMPLETE:
2517         case CS_QUEUE_FULL:
2518                 if (scsi_status == 0) {
2519                         res = DID_OK << 16;
2520                         break;
2521                 }
2522                 if (scsi_status & (SS_RESIDUAL_UNDER | SS_RESIDUAL_OVER)) {
2523                         resid = resid_len;
2524                         scsi_set_resid(cp, resid);
2525
2526                         if (!lscsi_status &&
2527                             ((unsigned)(scsi_bufflen(cp) - resid) <
2528                              cp->underflow)) {
2529                                 ql_dbg(ql_dbg_io, fcport->vha, 0x301a,
2530                                     "Mid-layer underflow detected (0x%x of 0x%x bytes).\n",
2531                                     resid, scsi_bufflen(cp));
2532
2533                                 res = DID_ERROR << 16;
2534                                 break;
2535                         }
2536                 }
2537                 res = DID_OK << 16 | lscsi_status;
2538
2539                 if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
2540                         ql_dbg(ql_dbg_io, fcport->vha, 0x301b,
2541                             "QUEUE FULL detected.\n");
2542                         break;
2543                 }
2544                 logit = 0;
2545                 if (lscsi_status != SS_CHECK_CONDITION)
2546                         break;
2547
2548                 memset(cp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
2549                 if (!(scsi_status & SS_SENSE_LEN_VALID))
2550                         break;
2551
2552                 qla2x00_handle_sense(sp, sense_data, par_sense_len, sense_len,
2553                     rsp, res);
2554                 break;
2555
2556         case CS_DATA_UNDERRUN:
2557                 /* Use F/W calculated residual length. */
2558                 resid = IS_FWI2_CAPABLE(ha) ? fw_resid_len : resid_len;
2559                 scsi_set_resid(cp, resid);
2560                 if (scsi_status & SS_RESIDUAL_UNDER) {
2561                         if (IS_FWI2_CAPABLE(ha) && fw_resid_len != resid_len) {
2562                                 ql_dbg(ql_dbg_io, fcport->vha, 0x301d,
2563                                     "Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
2564                                     resid, scsi_bufflen(cp));
2565
2566                                 res = DID_ERROR << 16 | lscsi_status;
2567                                 goto check_scsi_status;
2568                         }
2569
2570                         if (!lscsi_status &&
2571                             ((unsigned)(scsi_bufflen(cp) - resid) <
2572                             cp->underflow)) {
2573                                 ql_dbg(ql_dbg_io, fcport->vha, 0x301e,
2574                                     "Mid-layer underflow detected (0x%x of 0x%x bytes).\n",
2575                                     resid, scsi_bufflen(cp));
2576
2577                                 res = DID_ERROR << 16;
2578                                 break;
2579                         }
2580                 } else if (lscsi_status != SAM_STAT_TASK_SET_FULL &&
2581                             lscsi_status != SAM_STAT_BUSY) {
2582                         /*
2583                          * scsi status of task set and busy are considered to be
2584                          * task not completed.
2585                          */
2586
2587                         ql_dbg(ql_dbg_io, fcport->vha, 0x301f,
2588                             "Dropped frame(s) detected (0x%x of 0x%x bytes).\n",
2589                             resid, scsi_bufflen(cp));
2590
2591                         res = DID_ERROR << 16 | lscsi_status;
2592                         goto check_scsi_status;
2593                 } else {
2594                         ql_dbg(ql_dbg_io, fcport->vha, 0x3030,
2595                             "scsi_status: 0x%x, lscsi_status: 0x%x\n",
2596                             scsi_status, lscsi_status);
2597                 }
2598
2599                 res = DID_OK << 16 | lscsi_status;
2600                 logit = 0;
2601
2602 check_scsi_status:
2603                 /*
2604                  * Check to see if SCSI Status is non zero. If so report SCSI
2605                  * Status.
2606                  */
2607                 if (lscsi_status != 0) {
2608                         if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
2609                                 ql_dbg(ql_dbg_io, fcport->vha, 0x3020,
2610                                     "QUEUE FULL detected.\n");
2611                                 logit = 1;
2612                                 break;
2613                         }
2614                         if (lscsi_status != SS_CHECK_CONDITION)
2615                                 break;
2616
2617                         memset(cp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
2618                         if (!(scsi_status & SS_SENSE_LEN_VALID))
2619                                 break;
2620
2621                         qla2x00_handle_sense(sp, sense_data, par_sense_len,
2622                             sense_len, rsp, res);
2623                 }
2624                 break;
2625
2626         case CS_PORT_LOGGED_OUT:
2627         case CS_PORT_CONFIG_CHG:
2628         case CS_PORT_BUSY:
2629         case CS_INCOMPLETE:
2630         case CS_PORT_UNAVAILABLE:
2631         case CS_TIMEOUT:
2632         case CS_RESET:
2633
2634                 /*
2635                  * We are going to have the fc class block the rport
2636                  * while we try to recover so instruct the mid layer
2637                  * to requeue until the class decides how to handle this.
2638                  */
2639                 res = DID_TRANSPORT_DISRUPTED << 16;
2640
2641                 if (comp_status == CS_TIMEOUT) {
2642                         if (IS_FWI2_CAPABLE(ha))
2643                                 break;
2644                         else if ((le16_to_cpu(sts->status_flags) &
2645                             SF_LOGOUT_SENT) == 0)
2646                                 break;
2647                 }
2648
2649                 if (atomic_read(&fcport->state) == FCS_ONLINE) {
2650                         ql_dbg(ql_dbg_disc, fcport->vha, 0x3021,
2651                                 "Port to be marked lost on fcport=%02x%02x%02x, current "
2652                                 "port state= %s comp_status %x.\n", fcport->d_id.b.domain,
2653                                 fcport->d_id.b.area, fcport->d_id.b.al_pa,
2654                                 port_state_str[atomic_read(&fcport->state)],
2655                                 comp_status);
2656
2657                         qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
2658                         qlt_schedule_sess_for_deletion_lock(fcport);
2659                 }
2660
2661                 break;
2662
2663         case CS_ABORTED:
2664                 res = DID_RESET << 16;
2665                 break;
2666
2667         case CS_DIF_ERROR:
2668                 logit = qla2x00_handle_dif_error(sp, sts24);
2669                 res = cp->result;
2670                 break;
2671
2672         case CS_TRANSPORT:
2673                 res = DID_ERROR << 16;
2674
2675                 if (!IS_PI_SPLIT_DET_CAPABLE(ha))
2676                         break;
2677
2678                 if (state_flags & BIT_4)
2679                         scmd_printk(KERN_WARNING, cp,
2680                             "Unsupported device '%s' found.\n",
2681                             cp->device->vendor);
2682                 break;
2683
2684         default:
2685                 res = DID_ERROR << 16;
2686                 break;
2687         }
2688
2689 out:
2690         if (logit)
2691                 ql_dbg(ql_dbg_io, fcport->vha, 0x3022,
2692                     "FCP command status: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu "
2693                     "portid=%02x%02x%02x oxid=0x%x cdb=%10phN len=0x%x "
2694                     "rsp_info=0x%x resid=0x%x fw_resid=0x%x sp=%p cp=%p.\n",
2695                     comp_status, scsi_status, res, vha->host_no,
2696                     cp->device->id, cp->device->lun, fcport->d_id.b.domain,
2697                     fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id,
2698                     cp->cmnd, scsi_bufflen(cp), rsp_info_len,
2699                     resid_len, fw_resid_len, sp, cp);
2700
2701         if (rsp->status_srb == NULL)
2702                 sp->done(sp, res);
2703 }
2704
2705 /**
2706  * qla2x00_status_cont_entry() - Process a Status Continuations entry.
2707  * @ha: SCSI driver HA context
2708  * @pkt: Entry pointer
2709  *
2710  * Extended sense data.
2711  */
2712 static void
2713 qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
2714 {
2715         uint8_t sense_sz = 0;
2716         struct qla_hw_data *ha = rsp->hw;
2717         struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev);
2718         srb_t *sp = rsp->status_srb;
2719         struct scsi_cmnd *cp;
2720         uint32_t sense_len;
2721         uint8_t *sense_ptr;
2722
2723         if (!sp || !GET_CMD_SENSE_LEN(sp))
2724                 return;
2725
2726         sense_len = GET_CMD_SENSE_LEN(sp);
2727         sense_ptr = GET_CMD_SENSE_PTR(sp);
2728
2729         cp = GET_CMD_SP(sp);
2730         if (cp == NULL) {
2731                 ql_log(ql_log_warn, vha, 0x3025,
2732                     "cmd is NULL: already returned to OS (sp=%p).\n", sp);
2733
2734                 rsp->status_srb = NULL;
2735                 return;
2736         }
2737
2738         if (sense_len > sizeof(pkt->data))
2739                 sense_sz = sizeof(pkt->data);
2740         else
2741                 sense_sz = sense_len;
2742
2743         /* Move sense data. */
2744         if (IS_FWI2_CAPABLE(ha))
2745                 host_to_fcp_swap(pkt->data, sizeof(pkt->data));
2746         memcpy(sense_ptr, pkt->data, sense_sz);
2747         ql_dump_buffer(ql_dbg_io + ql_dbg_buffer, vha, 0x302c,
2748                 sense_ptr, sense_sz);
2749
2750         sense_len -= sense_sz;
2751         sense_ptr += sense_sz;
2752
2753         SET_CMD_SENSE_PTR(sp, sense_ptr);
2754         SET_CMD_SENSE_LEN(sp, sense_len);
2755
2756         /* Place command on done queue. */
2757         if (sense_len == 0) {
2758                 rsp->status_srb = NULL;
2759                 sp->done(sp, cp->result);
2760         }
2761 }
2762
2763 /**
2764  * qla2x00_error_entry() - Process an error entry.
2765  * @ha: SCSI driver HA context
2766  * @pkt: Entry pointer
2767  * return : 1=allow further error analysis. 0=no additional error analysis.
2768  */
2769 static int
2770 qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
2771 {
2772         srb_t *sp;
2773         struct qla_hw_data *ha = vha->hw;
2774         const char func[] = "ERROR-IOCB";
2775         uint16_t que = MSW(pkt->handle);
2776         struct req_que *req = NULL;
2777         int res = DID_ERROR << 16;
2778
2779         ql_dbg(ql_dbg_async, vha, 0x502a,
2780             "iocb type %xh with error status %xh, handle %xh, rspq id %d\n",
2781             pkt->entry_type, pkt->entry_status, pkt->handle, rsp->id);
2782
2783         if (que >= ha->max_req_queues || !ha->req_q_map[que])
2784                 goto fatal;
2785
2786         req = ha->req_q_map[que];
2787
2788         if (pkt->entry_status & RF_BUSY)
2789                 res = DID_BUS_BUSY << 16;
2790
2791         if ((pkt->handle & ~QLA_TGT_HANDLE_MASK) == QLA_TGT_SKIP_HANDLE)
2792                 return 0;
2793
2794         switch (pkt->entry_type) {
2795         case NOTIFY_ACK_TYPE:
2796         case STATUS_TYPE:
2797         case STATUS_CONT_TYPE:
2798         case LOGINOUT_PORT_IOCB_TYPE:
2799         case CT_IOCB_TYPE:
2800         case ELS_IOCB_TYPE:
2801         case ABORT_IOCB_TYPE:
2802         case MBX_IOCB_TYPE:
2803         default:
2804                 sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
2805                 if (sp) {
2806                         sp->done(sp, res);
2807                         return 0;
2808                 }
2809                 break;
2810
2811         case ABTS_RESP_24XX:
2812         case CTIO_TYPE7:
2813         case CTIO_CRC2:
2814                 return 1;
2815         }
2816 fatal:
2817         ql_log(ql_log_warn, vha, 0x5030,
2818             "Error entry - invalid handle/queue (%04x).\n", que);
2819         return 0;
2820 }
2821
2822 /**
2823  * qla24xx_mbx_completion() - Process mailbox command completions.
2824  * @ha: SCSI driver HA context
2825  * @mb0: Mailbox0 register
2826  */
2827 static void
2828 qla24xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
2829 {
2830         uint16_t        cnt;
2831         uint32_t        mboxes;
2832         uint16_t __iomem *wptr;
2833         struct qla_hw_data *ha = vha->hw;
2834         struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
2835
2836         /* Read all mbox registers? */
2837         WARN_ON_ONCE(ha->mbx_count > 32);
2838         mboxes = (1ULL << ha->mbx_count) - 1;
2839         if (!ha->mcp)
2840                 ql_dbg(ql_dbg_async, vha, 0x504e, "MBX pointer ERROR.\n");
2841         else
2842                 mboxes = ha->mcp->in_mb;
2843
2844         /* Load return mailbox registers. */
2845         ha->flags.mbox_int = 1;
2846         ha->mailbox_out[0] = mb0;
2847         mboxes >>= 1;
2848         wptr = (uint16_t __iomem *)&reg->mailbox1;
2849
2850         for (cnt = 1; cnt < ha->mbx_count; cnt++) {
2851                 if (mboxes & BIT_0)
2852                         ha->mailbox_out[cnt] = RD_REG_WORD(wptr);
2853
2854                 mboxes >>= 1;
2855                 wptr++;
2856         }
2857 }
2858
2859 static void
2860 qla24xx_abort_iocb_entry(scsi_qla_host_t *vha, struct req_que *req,
2861         struct abort_entry_24xx *pkt)
2862 {
2863         const char func[] = "ABT_IOCB";
2864         srb_t *sp;
2865         struct srb_iocb *abt;
2866
2867         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
2868         if (!sp)
2869                 return;
2870
2871         abt = &sp->u.iocb_cmd;
2872         abt->u.abt.comp_status = le16_to_cpu(pkt->nport_handle);
2873         sp->done(sp, 0);
2874 }
2875
2876 void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *vha,
2877     struct pt_ls4_request *pkt, struct req_que *req)
2878 {
2879         srb_t *sp;
2880         const char func[] = "LS4_IOCB";
2881         uint16_t comp_status;
2882
2883         sp = qla2x00_get_sp_from_handle(vha, func, req, pkt);
2884         if (!sp)
2885                 return;
2886
2887         comp_status = le16_to_cpu(pkt->status);
2888         sp->done(sp, comp_status);
2889 }
2890
2891 /**
2892  * qla24xx_process_response_queue() - Process response queue entries.
2893  * @ha: SCSI driver HA context
2894  */
2895 void qla24xx_process_response_queue(struct scsi_qla_host *vha,
2896         struct rsp_que *rsp)
2897 {
2898         struct sts_entry_24xx *pkt;
2899         struct qla_hw_data *ha = vha->hw;
2900
2901         if (!ha->flags.fw_started)
2902                 return;
2903
2904         if (rsp->qpair->cpuid != smp_processor_id())
2905                 qla_cpu_update(rsp->qpair, smp_processor_id());
2906
2907         while (rsp->ring_ptr->signature != RESPONSE_PROCESSED) {
2908                 pkt = (struct sts_entry_24xx *)rsp->ring_ptr;
2909
2910                 rsp->ring_index++;
2911                 if (rsp->ring_index == rsp->length) {
2912                         rsp->ring_index = 0;
2913                         rsp->ring_ptr = rsp->ring;
2914                 } else {
2915                         rsp->ring_ptr++;
2916                 }
2917
2918                 if (pkt->entry_status != 0) {
2919                         if (qla2x00_error_entry(vha, rsp, (sts_entry_t *) pkt))
2920                                 goto process_err;
2921
2922                         ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
2923                         wmb();
2924                         continue;
2925                 }
2926 process_err:
2927
2928                 switch (pkt->entry_type) {
2929                 case STATUS_TYPE:
2930                         qla2x00_status_entry(vha, rsp, pkt);
2931                         break;
2932                 case STATUS_CONT_TYPE:
2933                         qla2x00_status_cont_entry(rsp, (sts_cont_entry_t *)pkt);
2934                         break;
2935                 case VP_RPT_ID_IOCB_TYPE:
2936                         qla24xx_report_id_acquisition(vha,
2937                             (struct vp_rpt_id_entry_24xx *)pkt);
2938                         break;
2939                 case LOGINOUT_PORT_IOCB_TYPE:
2940                         qla24xx_logio_entry(vha, rsp->req,
2941                             (struct logio_entry_24xx *)pkt);
2942                         break;
2943                 case CT_IOCB_TYPE:
2944                         qla24xx_els_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE);
2945                         break;
2946                 case ELS_IOCB_TYPE:
2947                         qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE);
2948                         break;
2949                 case ABTS_RECV_24XX:
2950                         if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
2951                                 /* ensure that the ATIO queue is empty */
2952                                 qlt_handle_abts_recv(vha, rsp,
2953                                     (response_t *)pkt);
2954                                 break;
2955                         } else {
2956                                 /* drop through */
2957                                 qlt_24xx_process_atio_queue(vha, 1);
2958                         }
2959                 case ABTS_RESP_24XX:
2960                 case CTIO_TYPE7:
2961                 case CTIO_CRC2:
2962                         qlt_response_pkt_all_vps(vha, rsp, (response_t *)pkt);
2963                         break;
2964                 case PT_LS4_REQUEST:
2965                         qla24xx_nvme_ls4_iocb(vha, (struct pt_ls4_request *)pkt,
2966                             rsp->req);
2967                         break;
2968                 case NOTIFY_ACK_TYPE:
2969                         if (pkt->handle == QLA_TGT_SKIP_HANDLE)
2970                                 qlt_response_pkt_all_vps(vha, rsp,
2971                                     (response_t *)pkt);
2972                         else
2973                                 qla24xxx_nack_iocb_entry(vha, rsp->req,
2974                                         (struct nack_to_isp *)pkt);
2975                         break;
2976                 case MARKER_TYPE:
2977                         /* Do nothing in this case, this check is to prevent it
2978                          * from falling into default case
2979                          */
2980                         break;
2981                 case ABORT_IOCB_TYPE:
2982                         qla24xx_abort_iocb_entry(vha, rsp->req,
2983                             (struct abort_entry_24xx *)pkt);
2984                         break;
2985                 case MBX_IOCB_TYPE:
2986                         qla24xx_mbx_iocb_entry(vha, rsp->req,
2987                             (struct mbx_24xx_entry *)pkt);
2988                         break;
2989                 default:
2990                         /* Type Not Supported. */
2991                         ql_dbg(ql_dbg_async, vha, 0x5042,
2992                             "Received unknown response pkt type %x "
2993                             "entry status=%x.\n",
2994                             pkt->entry_type, pkt->entry_status);
2995                         break;
2996                 }
2997                 ((response_t *)pkt)->signature = RESPONSE_PROCESSED;
2998                 wmb();
2999         }
3000
3001         /* Adjust ring index */
3002         if (IS_P3P_TYPE(ha)) {
3003                 struct device_reg_82xx __iomem *reg = &ha->iobase->isp82;
3004                 WRT_REG_DWORD(&reg->rsp_q_out[0], rsp->ring_index);
3005         } else {
3006                 WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
3007         }
3008 }
3009
3010 static void
3011 qla2xxx_check_risc_status(scsi_qla_host_t *vha)
3012 {
3013         int rval;
3014         uint32_t cnt;
3015         struct qla_hw_data *ha = vha->hw;
3016         struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
3017
3018         if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
3019             !IS_QLA27XX(ha))
3020                 return;
3021
3022         rval = QLA_SUCCESS;
3023         WRT_REG_DWORD(&reg->iobase_addr, 0x7C00);
3024         RD_REG_DWORD(&reg->iobase_addr);
3025         WRT_REG_DWORD(&reg->iobase_window, 0x0001);
3026         for (cnt = 10000; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
3027             rval == QLA_SUCCESS; cnt--) {
3028                 if (cnt) {
3029                         WRT_REG_DWORD(&reg->iobase_window, 0x0001);
3030                         udelay(10);
3031                 } else
3032                         rval = QLA_FUNCTION_TIMEOUT;
3033         }
3034         if (rval == QLA_SUCCESS)
3035                 goto next_test;
3036
3037         rval = QLA_SUCCESS;
3038         WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3039         for (cnt = 100; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
3040             rval == QLA_SUCCESS; cnt--) {
3041                 if (cnt) {
3042                         WRT_REG_DWORD(&reg->iobase_window, 0x0003);
3043                         udelay(10);
3044                 } else
3045                         rval = QLA_FUNCTION_TIMEOUT;
3046         }
3047         if (rval != QLA_SUCCESS)
3048                 goto done;
3049
3050 next_test:
3051         if (RD_REG_DWORD(&reg->iobase_c8) & BIT_3)
3052                 ql_log(ql_log_info, vha, 0x504c,
3053                     "Additional code -- 0x55AA.\n");
3054
3055 done:
3056         WRT_REG_DWORD(&reg->iobase_window, 0x0000);
3057         RD_REG_DWORD(&reg->iobase_window);
3058 }
3059
3060 /**
3061  * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx.
3062  * @irq:
3063  * @dev_id: SCSI driver HA context
3064  *
3065  * Called by system whenever the host adapter generates an interrupt.
3066  *
3067  * Returns handled flag.
3068  */
3069 irqreturn_t
3070 qla24xx_intr_handler(int irq, void *dev_id)
3071 {
3072         scsi_qla_host_t *vha;
3073         struct qla_hw_data *ha;
3074         struct device_reg_24xx __iomem *reg;
3075         int             status;
3076         unsigned long   iter;
3077         uint32_t        stat;
3078         uint32_t        hccr;
3079         uint16_t        mb[8];
3080         struct rsp_que *rsp;
3081         unsigned long   flags;
3082
3083         rsp = (struct rsp_que *) dev_id;
3084         if (!rsp) {
3085                 ql_log(ql_log_info, NULL, 0x5059,
3086                     "%s: NULL response queue pointer.\n", __func__);
3087                 return IRQ_NONE;
3088         }
3089
3090         ha = rsp->hw;
3091         reg = &ha->iobase->isp24;
3092         status = 0;
3093
3094         if (unlikely(pci_channel_offline(ha->pdev)))
3095                 return IRQ_HANDLED;
3096
3097         spin_lock_irqsave(&ha->hardware_lock, flags);
3098         vha = pci_get_drvdata(ha->pdev);
3099         for (iter = 50; iter--; ) {
3100                 stat = RD_REG_DWORD(&reg->host_status);
3101                 if (qla2x00_check_reg32_for_disconnect(vha, stat))
3102                         break;
3103                 if (stat & HSRX_RISC_PAUSED) {
3104                         if (unlikely(pci_channel_offline(ha->pdev)))
3105                                 break;
3106
3107                         hccr = RD_REG_DWORD(&reg->hccr);
3108
3109                         ql_log(ql_log_warn, vha, 0x504b,
3110                             "RISC paused -- HCCR=%x, Dumping firmware.\n",
3111                             hccr);
3112
3113                         qla2xxx_check_risc_status(vha);
3114
3115                         ha->isp_ops->fw_dump(vha, 1);
3116                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
3117                         break;
3118                 } else if ((stat & HSRX_RISC_INT) == 0)
3119                         break;
3120
3121                 switch (stat & 0xff) {
3122                 case INTR_ROM_MB_SUCCESS:
3123                 case INTR_ROM_MB_FAILED:
3124                 case INTR_MB_SUCCESS:
3125                 case INTR_MB_FAILED:
3126                         qla24xx_mbx_completion(vha, MSW(stat));
3127                         status |= MBX_INTERRUPT;
3128
3129                         break;
3130                 case INTR_ASYNC_EVENT:
3131                         mb[0] = MSW(stat);
3132                         mb[1] = RD_REG_WORD(&reg->mailbox1);
3133                         mb[2] = RD_REG_WORD(&reg->mailbox2);
3134                         mb[3] = RD_REG_WORD(&reg->mailbox3);
3135                         qla2x00_async_event(vha, rsp, mb);
3136                         break;
3137                 case INTR_RSP_QUE_UPDATE:
3138                 case INTR_RSP_QUE_UPDATE_83XX:
3139                         qla24xx_process_response_queue(vha, rsp);
3140                         break;
3141                 case INTR_ATIO_QUE_UPDATE:{
3142                         unsigned long flags2;
3143                         spin_lock_irqsave(&ha->tgt.atio_lock, flags2);
3144                         qlt_24xx_process_atio_queue(vha, 1);
3145                         spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2);
3146                         break;
3147                 }
3148                 case INTR_ATIO_RSP_QUE_UPDATE: {
3149                         unsigned long flags2;
3150                         spin_lock_irqsave(&ha->tgt.atio_lock, flags2);
3151                         qlt_24xx_process_atio_queue(vha, 1);
3152                         spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2);
3153
3154                         qla24xx_process_response_queue(vha, rsp);
3155                         break;
3156                 }
3157                 default:
3158                         ql_dbg(ql_dbg_async, vha, 0x504f,
3159                             "Unrecognized interrupt type (%d).\n", stat * 0xff);
3160                         break;
3161                 }
3162                 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3163                 RD_REG_DWORD_RELAXED(&reg->hccr);
3164                 if (unlikely(IS_QLA83XX(ha) && (ha->pdev->revision == 1)))
3165                         ndelay(3500);
3166         }
3167         qla2x00_handle_mbx_completion(ha, status);
3168         spin_unlock_irqrestore(&ha->hardware_lock, flags);
3169
3170         return IRQ_HANDLED;
3171 }
3172
3173 static irqreturn_t
3174 qla24xx_msix_rsp_q(int irq, void *dev_id)
3175 {
3176         struct qla_hw_data *ha;
3177         struct rsp_que *rsp;
3178         struct device_reg_24xx __iomem *reg;
3179         struct scsi_qla_host *vha;
3180         unsigned long flags;
3181
3182         rsp = (struct rsp_que *) dev_id;
3183         if (!rsp) {
3184                 ql_log(ql_log_info, NULL, 0x505a,
3185                     "%s: NULL response queue pointer.\n", __func__);
3186                 return IRQ_NONE;
3187         }
3188         ha = rsp->hw;
3189         reg = &ha->iobase->isp24;
3190
3191         spin_lock_irqsave(&ha->hardware_lock, flags);
3192
3193         vha = pci_get_drvdata(ha->pdev);
3194         qla24xx_process_response_queue(vha, rsp);
3195         if (!ha->flags.disable_msix_handshake) {
3196                 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3197                 RD_REG_DWORD_RELAXED(&reg->hccr);
3198         }
3199         spin_unlock_irqrestore(&ha->hardware_lock, flags);
3200
3201         return IRQ_HANDLED;
3202 }
3203
3204 static irqreturn_t
3205 qla24xx_msix_default(int irq, void *dev_id)
3206 {
3207         scsi_qla_host_t *vha;
3208         struct qla_hw_data *ha;
3209         struct rsp_que *rsp;
3210         struct device_reg_24xx __iomem *reg;
3211         int             status;
3212         uint32_t        stat;
3213         uint32_t        hccr;
3214         uint16_t        mb[8];
3215         unsigned long flags;
3216
3217         rsp = (struct rsp_que *) dev_id;
3218         if (!rsp) {
3219                 ql_log(ql_log_info, NULL, 0x505c,
3220                     "%s: NULL response queue pointer.\n", __func__);
3221                 return IRQ_NONE;
3222         }
3223         ha = rsp->hw;
3224         reg = &ha->iobase->isp24;
3225         status = 0;
3226
3227         spin_lock_irqsave(&ha->hardware_lock, flags);
3228         vha = pci_get_drvdata(ha->pdev);
3229         do {
3230                 stat = RD_REG_DWORD(&reg->host_status);
3231                 if (qla2x00_check_reg32_for_disconnect(vha, stat))
3232                         break;
3233                 if (stat & HSRX_RISC_PAUSED) {
3234                         if (unlikely(pci_channel_offline(ha->pdev)))
3235                                 break;
3236
3237                         hccr = RD_REG_DWORD(&reg->hccr);
3238
3239                         ql_log(ql_log_info, vha, 0x5050,
3240                             "RISC paused -- HCCR=%x, Dumping firmware.\n",
3241                             hccr);
3242
3243                         qla2xxx_check_risc_status(vha);
3244
3245                         ha->isp_ops->fw_dump(vha, 1);
3246                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
3247                         break;
3248                 } else if ((stat & HSRX_RISC_INT) == 0)
3249                         break;
3250
3251                 switch (stat & 0xff) {
3252                 case INTR_ROM_MB_SUCCESS:
3253                 case INTR_ROM_MB_FAILED:
3254                 case INTR_MB_SUCCESS:
3255                 case INTR_MB_FAILED:
3256                         qla24xx_mbx_completion(vha, MSW(stat));
3257                         status |= MBX_INTERRUPT;
3258
3259                         break;
3260                 case INTR_ASYNC_EVENT:
3261                         mb[0] = MSW(stat);
3262                         mb[1] = RD_REG_WORD(&reg->mailbox1);
3263                         mb[2] = RD_REG_WORD(&reg->mailbox2);
3264                         mb[3] = RD_REG_WORD(&reg->mailbox3);
3265                         qla2x00_async_event(vha, rsp, mb);
3266                         break;
3267                 case INTR_RSP_QUE_UPDATE:
3268                 case INTR_RSP_QUE_UPDATE_83XX:
3269                         qla24xx_process_response_queue(vha, rsp);
3270                         break;
3271                 case INTR_ATIO_QUE_UPDATE:{
3272                         unsigned long flags2;
3273                         spin_lock_irqsave(&ha->tgt.atio_lock, flags2);
3274                         qlt_24xx_process_atio_queue(vha, 1);
3275                         spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2);
3276                         break;
3277                 }
3278                 case INTR_ATIO_RSP_QUE_UPDATE: {
3279                         unsigned long flags2;
3280                         spin_lock_irqsave(&ha->tgt.atio_lock, flags2);
3281                         qlt_24xx_process_atio_queue(vha, 1);
3282                         spin_unlock_irqrestore(&ha->tgt.atio_lock, flags2);
3283
3284                         qla24xx_process_response_queue(vha, rsp);
3285                         break;
3286                 }
3287                 default:
3288                         ql_dbg(ql_dbg_async, vha, 0x5051,
3289                             "Unrecognized interrupt type (%d).\n", stat & 0xff);
3290                         break;
3291                 }
3292                 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3293         } while (0);
3294         qla2x00_handle_mbx_completion(ha, status);
3295         spin_unlock_irqrestore(&ha->hardware_lock, flags);
3296
3297         return IRQ_HANDLED;
3298 }
3299
3300 irqreturn_t
3301 qla2xxx_msix_rsp_q(int irq, void *dev_id)
3302 {
3303         struct qla_hw_data *ha;
3304         struct qla_qpair *qpair;
3305         struct device_reg_24xx __iomem *reg;
3306         unsigned long flags;
3307
3308         qpair = dev_id;
3309         if (!qpair) {
3310                 ql_log(ql_log_info, NULL, 0x505b,
3311                     "%s: NULL response queue pointer.\n", __func__);
3312                 return IRQ_NONE;
3313         }
3314         ha = qpair->hw;
3315
3316         /* Clear the interrupt, if enabled, for this response queue */
3317         if (unlikely(!ha->flags.disable_msix_handshake)) {
3318                 reg = &ha->iobase->isp24;
3319                 spin_lock_irqsave(&ha->hardware_lock, flags);
3320                 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
3321                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
3322         }
3323
3324         queue_work(ha->wq, &qpair->q_work);
3325
3326         return IRQ_HANDLED;
3327 }
3328
3329 /* Interrupt handling helpers. */
3330
3331 struct qla_init_msix_entry {
3332         const char *name;
3333         irq_handler_t handler;
3334 };
3335
3336 static const struct qla_init_msix_entry msix_entries[] = {
3337         { "default", qla24xx_msix_default },
3338         { "rsp_q", qla24xx_msix_rsp_q },
3339         { "atio_q", qla83xx_msix_atio_q },
3340         { "qpair_multiq", qla2xxx_msix_rsp_q },
3341 };
3342
3343 static const struct qla_init_msix_entry qla82xx_msix_entries[] = {
3344         { "qla2xxx (default)", qla82xx_msix_default },
3345         { "qla2xxx (rsp_q)", qla82xx_msix_rsp_q },
3346 };
3347
3348 static int
3349 qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
3350 {
3351         int i, ret;
3352         struct qla_msix_entry *qentry;
3353         scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
3354         int min_vecs = QLA_BASE_VECTORS;
3355         struct irq_affinity desc = {
3356                 .pre_vectors = QLA_BASE_VECTORS,
3357         };
3358
3359         if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) {
3360                 desc.pre_vectors++;
3361                 min_vecs++;
3362         }
3363
3364         if (USER_CTRL_IRQ(ha)) {
3365                 /* user wants to control IRQ setting for target mode */
3366                 ret = pci_alloc_irq_vectors(ha->pdev, min_vecs,
3367                     ha->msix_count, PCI_IRQ_MSIX);
3368         } else
3369                 ret = pci_alloc_irq_vectors_affinity(ha->pdev, min_vecs,
3370                     ha->msix_count, PCI_IRQ_MSIX | PCI_IRQ_AFFINITY,
3371                     &desc);
3372
3373         if (ret < 0) {
3374                 ql_log(ql_log_fatal, vha, 0x00c7,
3375                     "MSI-X: Failed to enable support, "
3376                     "giving   up -- %d/%d.\n",
3377                     ha->msix_count, ret);
3378                 goto msix_out;
3379         } else if (ret < ha->msix_count) {
3380                 ql_log(ql_log_info, vha, 0x00c6,
3381                     "MSI-X: Using %d vectors\n", ret);
3382                 ha->msix_count = ret;
3383                 /* Recalculate queue values */
3384                 if (ha->mqiobase && ql2xmqsupport) {
3385                         ha->max_req_queues = ha->msix_count - 1;
3386
3387                         /* ATIOQ needs 1 vector. That's 1 less QPair */
3388                         if (QLA_TGT_MODE_ENABLED())
3389                                 ha->max_req_queues--;
3390
3391                         ha->max_rsp_queues = ha->max_req_queues;
3392
3393                         ha->max_qpairs = ha->max_req_queues - 1;
3394                         ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190,
3395                             "Adjusted Max no of queues pairs: %d.\n", ha->max_qpairs);
3396                 }
3397         }
3398         ha->msix_entries = kzalloc(sizeof(struct qla_msix_entry) *
3399                                 ha->msix_count, GFP_KERNEL);
3400         if (!ha->msix_entries) {
3401                 ql_log(ql_log_fatal, vha, 0x00c8,
3402                     "Failed to allocate memory for ha->msix_entries.\n");
3403                 ret = -ENOMEM;
3404                 goto free_irqs;
3405         }
3406         ha->flags.msix_enabled = 1;
3407
3408         for (i = 0; i < ha->msix_count; i++) {
3409                 qentry = &ha->msix_entries[i];
3410                 qentry->vector = pci_irq_vector(ha->pdev, i);
3411                 qentry->entry = i;
3412                 qentry->have_irq = 0;
3413                 qentry->in_use = 0;
3414                 qentry->handle = NULL;
3415         }
3416
3417         /* Enable MSI-X vectors for the base queue */
3418         for (i = 0; i < QLA_BASE_VECTORS; i++) {
3419                 qentry = &ha->msix_entries[i];
3420                 qentry->handle = rsp;
3421                 rsp->msix = qentry;
3422                 scnprintf(qentry->name, sizeof(qentry->name),
3423                     "qla2xxx%lu_%s", vha->host_no, msix_entries[i].name);
3424                 if (IS_P3P_TYPE(ha))
3425                         ret = request_irq(qentry->vector,
3426                                 qla82xx_msix_entries[i].handler,
3427                                 0, qla82xx_msix_entries[i].name, rsp);
3428                 else
3429                         ret = request_irq(qentry->vector,
3430                                 msix_entries[i].handler,
3431                                 0, qentry->name, rsp);
3432                 if (ret)
3433                         goto msix_register_fail;
3434                 qentry->have_irq = 1;
3435                 qentry->in_use = 1;
3436         }
3437
3438         /*
3439          * If target mode is enable, also request the vector for the ATIO
3440          * queue.
3441          */
3442         if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) {
3443                 qentry = &ha->msix_entries[QLA_ATIO_VECTOR];
3444                 rsp->msix = qentry;
3445                 qentry->handle = rsp;
3446                 scnprintf(qentry->name, sizeof(qentry->name),
3447                     "qla2xxx%lu_%s", vha->host_no,
3448                     msix_entries[QLA_ATIO_VECTOR].name);
3449                 qentry->in_use = 1;
3450                 ret = request_irq(qentry->vector,
3451                         msix_entries[QLA_ATIO_VECTOR].handler,
3452                         0, qentry->name, rsp);
3453                 qentry->have_irq = 1;
3454         }
3455
3456 msix_register_fail:
3457         if (ret) {
3458                 ql_log(ql_log_fatal, vha, 0x00cb,
3459                     "MSI-X: unable to register handler -- %x/%d.\n",
3460                     qentry->vector, ret);
3461                 qla2x00_free_irqs(vha);
3462                 ha->mqenable = 0;
3463                 goto msix_out;
3464         }
3465
3466         /* Enable MSI-X vector for response queue update for queue 0 */
3467         if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
3468                 if (ha->msixbase && ha->mqiobase &&
3469                     (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
3470                      ql2xmqsupport))
3471                         ha->mqenable = 1;
3472         } else
3473                 if (ha->mqiobase &&
3474                     (ha->max_rsp_queues > 1 || ha->max_req_queues > 1 ||
3475                      ql2xmqsupport))
3476                         ha->mqenable = 1;
3477         ql_dbg(ql_dbg_multiq, vha, 0xc005,
3478             "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n",
3479             ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
3480         ql_dbg(ql_dbg_init, vha, 0x0055,
3481             "mqiobase=%p, max_rsp_queues=%d, max_req_queues=%d.\n",
3482             ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues);
3483
3484 msix_out:
3485         return ret;
3486
3487 free_irqs:
3488         pci_free_irq_vectors(ha->pdev);
3489         goto msix_out;
3490 }
3491
3492 int
3493 qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
3494 {
3495         int ret = QLA_FUNCTION_FAILED;
3496         device_reg_t *reg = ha->iobase;
3497         scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
3498
3499         /* If possible, enable MSI-X. */
3500         if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
3501             !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && !IS_QLAFX00(ha) &&
3502             !IS_QLA27XX(ha))
3503                 goto skip_msi;
3504
3505         if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
3506                 (ha->pdev->subsystem_device == 0x7040 ||
3507                 ha->pdev->subsystem_device == 0x7041 ||
3508                 ha->pdev->subsystem_device == 0x1705)) {
3509                 ql_log(ql_log_warn, vha, 0x0034,
3510                     "MSI-X: Unsupported ISP 2432 SSVID/SSDID (0x%X,0x%X).\n",
3511                         ha->pdev->subsystem_vendor,
3512                         ha->pdev->subsystem_device);
3513                 goto skip_msi;
3514         }
3515
3516         if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX)) {
3517                 ql_log(ql_log_warn, vha, 0x0035,
3518                     "MSI-X; Unsupported ISP2432 (0x%X, 0x%X).\n",
3519                     ha->pdev->revision, QLA_MSIX_CHIP_REV_24XX);
3520                 goto skip_msix;
3521         }
3522
3523         ret = qla24xx_enable_msix(ha, rsp);
3524         if (!ret) {
3525                 ql_dbg(ql_dbg_init, vha, 0x0036,
3526                     "MSI-X: Enabled (0x%X, 0x%X).\n",
3527                     ha->chip_revision, ha->fw_attributes);
3528                 goto clear_risc_ints;
3529         }
3530
3531 skip_msix:
3532
3533         ql_log(ql_log_info, vha, 0x0037,
3534             "Falling back-to MSI mode -- ret=%d.\n", ret);
3535
3536         if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
3537             !IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha) &&
3538             !IS_QLA27XX(ha))
3539                 goto skip_msi;
3540
3541         ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI);
3542         if (ret > 0) {
3543                 ql_dbg(ql_dbg_init, vha, 0x0038,
3544                     "MSI: Enabled.\n");
3545                 ha->flags.msi_enabled = 1;
3546         } else
3547                 ql_log(ql_log_warn, vha, 0x0039,
3548                     "Falling back-to INTa mode -- ret=%d.\n", ret);
3549 skip_msi:
3550
3551         /* Skip INTx on ISP82xx. */
3552         if (!ha->flags.msi_enabled && IS_QLA82XX(ha))
3553                 return QLA_FUNCTION_FAILED;
3554
3555         ret = request_irq(ha->pdev->irq, ha->isp_ops->intr_handler,
3556             ha->flags.msi_enabled ? 0 : IRQF_SHARED,
3557             QLA2XXX_DRIVER_NAME, rsp);
3558         if (ret) {
3559                 ql_log(ql_log_warn, vha, 0x003a,
3560                     "Failed to reserve interrupt %d already in use.\n",
3561                     ha->pdev->irq);
3562                 goto fail;
3563         } else if (!ha->flags.msi_enabled) {
3564                 ql_dbg(ql_dbg_init, vha, 0x0125,
3565                     "INTa mode: Enabled.\n");
3566                 ha->flags.mr_intr_valid = 1;
3567         }
3568
3569 clear_risc_ints:
3570         if (IS_FWI2_CAPABLE(ha) || IS_QLAFX00(ha))
3571                 goto fail;
3572
3573         spin_lock_irq(&ha->hardware_lock);
3574         WRT_REG_WORD(&reg->isp.semaphore, 0);
3575         spin_unlock_irq(&ha->hardware_lock);
3576
3577 fail:
3578         return ret;
3579 }
3580
3581 void
3582 qla2x00_free_irqs(scsi_qla_host_t *vha)
3583 {
3584         struct qla_hw_data *ha = vha->hw;
3585         struct rsp_que *rsp;
3586         struct qla_msix_entry *qentry;
3587         int i;
3588
3589         /*
3590          * We need to check that ha->rsp_q_map is valid in case we are called
3591          * from a probe failure context.
3592          */
3593         if (!ha->rsp_q_map || !ha->rsp_q_map[0])
3594                 goto free_irqs;
3595         rsp = ha->rsp_q_map[0];
3596
3597         if (ha->flags.msix_enabled) {
3598                 for (i = 0; i < ha->msix_count; i++) {
3599                         qentry = &ha->msix_entries[i];
3600                         if (qentry->have_irq) {
3601                                 irq_set_affinity_notifier(qentry->vector, NULL);
3602                                 free_irq(pci_irq_vector(ha->pdev, i), qentry->handle);
3603                         }
3604                 }
3605                 kfree(ha->msix_entries);
3606                 ha->msix_entries = NULL;
3607                 ha->flags.msix_enabled = 0;
3608                 ql_dbg(ql_dbg_init, vha, 0x0042,
3609                         "Disabled MSI-X.\n");
3610         } else {
3611                 free_irq(pci_irq_vector(ha->pdev, 0), rsp);
3612         }
3613
3614 free_irqs:
3615         pci_free_irq_vectors(ha->pdev);
3616 }
3617
3618 int qla25xx_request_irq(struct qla_hw_data *ha, struct qla_qpair *qpair,
3619         struct qla_msix_entry *msix, int vector_type)
3620 {
3621         const struct qla_init_msix_entry *intr = &msix_entries[vector_type];
3622         scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
3623         int ret;
3624
3625         scnprintf(msix->name, sizeof(msix->name),
3626             "qla2xxx%lu_qpair%d", vha->host_no, qpair->id);
3627         ret = request_irq(msix->vector, intr->handler, 0, msix->name, qpair);
3628         if (ret) {
3629                 ql_log(ql_log_fatal, vha, 0x00e6,
3630                     "MSI-X: Unable to register handler -- %x/%d.\n",
3631                     msix->vector, ret);
3632                 return ret;
3633         }
3634         msix->have_irq = 1;
3635         msix->handle = qpair;
3636         return ret;
3637 }