Lines Matching +full:ese +full:- +full:present

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (c) 2003-2014 QLogic Corporation
13 #include <linux/t10-pi.h>
18 #include <linux/nvme-fc-driver.h>
37 void *pkt = &item->iocb; in qla27xx_process_purex_fpin()
38 uint16_t pkt_size = item->size; in qla27xx_process_purex_fpin()
44 "-------- ELS REQ -------\n"); in qla27xx_process_purex_fpin()
48 fc_host_fpin_rcv(vha->host, pkt_size, (char *)pkt, 0); in qla27xx_process_purex_fpin()
79 (struct abts_entry_24xx *)&pkt->iocb; in qla24xx_process_abts()
80 struct qla_hw_data *ha = vha->hw; in qla24xx_process_abts()
91 abts->rx_xch_addr_to_abort, abts->ox_id, abts->rx_id, in qla24xx_process_abts()
92 abts->seq_id, abts->seq_cnt); in qla24xx_process_abts()
94 "-------- ABTS RCV -------\n"); in qla24xx_process_abts()
98 rsp_els = dma_alloc_coherent(&ha->pdev->dev, sizeof(*rsp_els), &dma, in qla24xx_process_abts()
107 rsp_els->entry_type = ELS_IOCB_TYPE; in qla24xx_process_abts()
108 rsp_els->entry_count = 1; in qla24xx_process_abts()
109 rsp_els->nport_handle = cpu_to_le16(~0); in qla24xx_process_abts()
110 rsp_els->rx_xchg_address = abts->rx_xch_addr_to_abort; in qla24xx_process_abts()
111 rsp_els->control_flags = cpu_to_le16(EPD_RX_XCHG); in qla24xx_process_abts()
114 abts->rx_xch_addr_to_abort); in qla24xx_process_abts()
116 "-------- ELS RSP -------\n"); in qla24xx_process_abts()
122 "%s: iocb failed to execute -> %x\n", __func__, rval); in qla24xx_process_abts()
123 } else if (rsp_els->comp_status) { in qla24xx_process_abts()
125 "%s: iocb failed to complete -> completion=%#x subcode=(%#x,%#x)\n", in qla24xx_process_abts()
126 __func__, rsp_els->comp_status, in qla24xx_process_abts()
127 rsp_els->error_subcode_1, rsp_els->error_subcode_2); in qla24xx_process_abts()
136 abts_rsp->entry_type = ABTS_RSP_TYPE; in qla24xx_process_abts()
137 abts_rsp->entry_count = 1; in qla24xx_process_abts()
138 abts_rsp->nport_handle = abts->nport_handle; in qla24xx_process_abts()
139 abts_rsp->vp_idx = abts->vp_idx; in qla24xx_process_abts()
140 abts_rsp->sof_type = abts->sof_type & 0xf0; in qla24xx_process_abts()
141 abts_rsp->rx_xch_addr = abts->rx_xch_addr; in qla24xx_process_abts()
142 abts_rsp->d_id[0] = abts->s_id[0]; in qla24xx_process_abts()
143 abts_rsp->d_id[1] = abts->s_id[1]; in qla24xx_process_abts()
144 abts_rsp->d_id[2] = abts->s_id[2]; in qla24xx_process_abts()
145 abts_rsp->r_ctl = FC_ROUTING_BLD | FC_R_CTL_BLD_BA_ACC; in qla24xx_process_abts()
146 abts_rsp->s_id[0] = abts->d_id[0]; in qla24xx_process_abts()
147 abts_rsp->s_id[1] = abts->d_id[1]; in qla24xx_process_abts()
148 abts_rsp->s_id[2] = abts->d_id[2]; in qla24xx_process_abts()
149 abts_rsp->cs_ctl = abts->cs_ctl; in qla24xx_process_abts()
151 fctl = ~(abts->f_ctl[2] | 0x7F) << 16 | in qla24xx_process_abts()
153 abts_rsp->f_ctl[0] = fctl >> 0 & 0xff; in qla24xx_process_abts()
154 abts_rsp->f_ctl[1] = fctl >> 8 & 0xff; in qla24xx_process_abts()
155 abts_rsp->f_ctl[2] = fctl >> 16 & 0xff; in qla24xx_process_abts()
156 abts_rsp->type = FC_TYPE_BLD; in qla24xx_process_abts()
157 abts_rsp->rx_id = abts->rx_id; in qla24xx_process_abts()
158 abts_rsp->ox_id = abts->ox_id; in qla24xx_process_abts()
159 abts_rsp->payload.ba_acc.aborted_rx_id = abts->rx_id; in qla24xx_process_abts()
160 abts_rsp->payload.ba_acc.aborted_ox_id = abts->ox_id; in qla24xx_process_abts()
161 abts_rsp->payload.ba_acc.high_seq_cnt = cpu_to_le16(~0); in qla24xx_process_abts()
162 abts_rsp->rx_xch_addr_to_abort = abts->rx_xch_addr_to_abort; in qla24xx_process_abts()
165 abts->rx_xch_addr_to_abort); in qla24xx_process_abts()
167 "-------- ELS RSP -------\n"); in qla24xx_process_abts()
173 "%s: iocb failed to execute -> %x\n", __func__, rval); in qla24xx_process_abts()
174 } else if (abts_rsp->comp_status) { in qla24xx_process_abts()
176 "%s: iocb failed to complete -> completion=%#x subcode=(%#x,%#x)\n", in qla24xx_process_abts()
177 __func__, abts_rsp->comp_status, in qla24xx_process_abts()
178 abts_rsp->payload.error.subcode1, in qla24xx_process_abts()
179 abts_rsp->payload.error.subcode2); in qla24xx_process_abts()
185 dma_free_coherent(&ha->pdev->dev, sizeof(*rsp_els), rsp_els, dma); in qla24xx_process_abts()
189 * __qla_consume_iocb - this routine is used to tell fw driver has processed
207 entry_count_remaining = purex->entry_count; in __qla_consume_iocb()
209 new_pkt = rsp_q->ring_ptr; in __qla_consume_iocb()
212 rsp_q->ring_index++; in __qla_consume_iocb()
213 if (rsp_q->ring_index == rsp_q->length) { in __qla_consume_iocb()
214 rsp_q->ring_index = 0; in __qla_consume_iocb()
215 rsp_q->ring_ptr = rsp_q->ring; in __qla_consume_iocb()
217 rsp_q->ring_ptr++; in __qla_consume_iocb()
220 new_pkt->signature = RESPONSE_PROCESSED; in __qla_consume_iocb()
223 --entry_count_remaining; in __qla_consume_iocb()
228 * __qla_copy_purex_to_buffer - extract ELS payload from Purex IOCB
247 entry_count_remaining = purex->entry_count; in __qla_copy_purex_to_buffer()
248 total_bytes = (le16_to_cpu(purex->frame_size) & 0x0FFF) in __qla_copy_purex_to_buffer()
249 - PURX_ELS_HEADER_SIZE; in __qla_copy_purex_to_buffer()
262 return -EIO; in __qla_copy_purex_to_buffer()
266 no_bytes = (pending_bytes > sizeof(purex->els_frame_payload)) ? in __qla_copy_purex_to_buffer()
267 sizeof(purex->els_frame_payload) : pending_bytes; in __qla_copy_purex_to_buffer()
269 memcpy(buf, &purex->els_frame_payload[0], no_bytes); in __qla_copy_purex_to_buffer()
271 pending_bytes -= no_bytes; in __qla_copy_purex_to_buffer()
272 --entry_count_remaining; in __qla_copy_purex_to_buffer()
274 ((response_t *)purex)->signature = RESPONSE_PROCESSED; in __qla_copy_purex_to_buffer()
280 new_pkt = (sts_cont_entry_t *)rsp_q->ring_ptr; in __qla_copy_purex_to_buffer()
283 if (new_pkt->entry_type != STATUS_CONT_TYPE) { in __qla_copy_purex_to_buffer()
290 rsp_q->ring_index++; in __qla_copy_purex_to_buffer()
291 if (rsp_q->ring_index == rsp_q->length) { in __qla_copy_purex_to_buffer()
292 rsp_q->ring_index = 0; in __qla_copy_purex_to_buffer()
293 rsp_q->ring_ptr = rsp_q->ring; in __qla_copy_purex_to_buffer()
295 rsp_q->ring_ptr++; in __qla_copy_purex_to_buffer()
297 no_bytes = (pending_bytes > sizeof(new_pkt->data)) ? in __qla_copy_purex_to_buffer()
298 sizeof(new_pkt->data) : pending_bytes; in __qla_copy_purex_to_buffer()
300 memcpy((buf + buffer_copy_offset), new_pkt->data, in __qla_copy_purex_to_buffer()
303 pending_bytes -= no_bytes; in __qla_copy_purex_to_buffer()
304 --entry_count_remaining; in __qla_copy_purex_to_buffer()
309 memcpy((buf + buffer_copy_offset), new_pkt->data, in __qla_copy_purex_to_buffer()
310 total_bytes - buffer_copy_offset); in __qla_copy_purex_to_buffer()
313 ((response_t *)new_pkt)->signature = RESPONSE_PROCESSED; in __qla_copy_purex_to_buffer()
322 return -EIO; in __qla_copy_purex_to_buffer()
332 * qla2100_intr_handler() - Process interrupts for the ISP2100 and ISP2200.
360 ha = rsp->hw; in qla2100_intr_handler()
361 reg = &ha->iobase->isp; in qla2100_intr_handler()
364 spin_lock_irqsave(&ha->hardware_lock, flags); in qla2100_intr_handler()
365 vha = pci_get_drvdata(ha->pdev); in qla2100_intr_handler()
366 for (iter = 50; iter--; ) { in qla2100_intr_handler()
367 hccr = rd_reg_word(&reg->hccr); in qla2100_intr_handler()
371 if (pci_channel_offline(ha->pdev)) in qla2100_intr_handler()
379 wrt_reg_word(&reg->hccr, HCCR_RESET_RISC); in qla2100_intr_handler()
380 rd_reg_word(&reg->hccr); in qla2100_intr_handler()
382 ha->isp_ops->fw_dump(vha); in qla2100_intr_handler()
383 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2100_intr_handler()
385 } else if ((rd_reg_word(&reg->istatus) & ISR_RISC_INT) == 0) in qla2100_intr_handler()
388 if (rd_reg_word(&reg->semaphore) & BIT_0) { in qla2100_intr_handler()
389 wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT); in qla2100_intr_handler()
390 rd_reg_word(&reg->hccr); in qla2100_intr_handler()
409 wrt_reg_word(&reg->semaphore, 0); in qla2100_intr_handler()
410 rd_reg_word(&reg->semaphore); in qla2100_intr_handler()
414 wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT); in qla2100_intr_handler()
415 rd_reg_word(&reg->hccr); in qla2100_intr_handler()
419 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla2100_intr_handler()
428 if (reg == 0xffffffff && !pci_channel_offline(vha->hw->pdev)) { in qla2x00_check_reg32_for_disconnect()
429 if (!test_and_set_bit(PFLG_DISCONNECTED, &vha->pci_flags) && in qla2x00_check_reg32_for_disconnect()
430 !test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags) && in qla2x00_check_reg32_for_disconnect()
431 !test_bit(PFLG_DRIVER_PROBING, &vha->pci_flags)) { in qla2x00_check_reg32_for_disconnect()
446 * qla2300_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
475 ha = rsp->hw; in qla2300_intr_handler()
476 reg = &ha->iobase->isp; in qla2300_intr_handler()
479 spin_lock_irqsave(&ha->hardware_lock, flags); in qla2300_intr_handler()
480 vha = pci_get_drvdata(ha->pdev); in qla2300_intr_handler()
481 for (iter = 50; iter--; ) { in qla2300_intr_handler()
482 stat = rd_reg_dword(&reg->u.isp2300.host_status); in qla2300_intr_handler()
486 if (unlikely(pci_channel_offline(ha->pdev))) in qla2300_intr_handler()
489 hccr = rd_reg_word(&reg->hccr); in qla2300_intr_handler()
493 "Parity error -- HCCR=%x, Dumping " in qla2300_intr_handler()
497 "RISC paused -- HCCR=%x, Dumping " in qla2300_intr_handler()
505 wrt_reg_word(&reg->hccr, HCCR_RESET_RISC); in qla2300_intr_handler()
506 rd_reg_word(&reg->hccr); in qla2300_intr_handler()
508 ha->isp_ops->fw_dump(vha); in qla2300_intr_handler()
509 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2300_intr_handler()
523 wrt_reg_word(&reg->semaphore, 0); in qla2300_intr_handler()
551 wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT); in qla2300_intr_handler()
552 rd_reg_word_relaxed(&reg->hccr); in qla2300_intr_handler()
555 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla2300_intr_handler()
561 * qla2x00_mbx_completion() - Process mailbox command completions.
571 struct qla_hw_data *ha = vha->hw; in qla2x00_mbx_completion()
572 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; in qla2x00_mbx_completion()
575 WARN_ON_ONCE(ha->mbx_count > 32); in qla2x00_mbx_completion()
576 mboxes = (1ULL << ha->mbx_count) - 1; in qla2x00_mbx_completion()
577 if (!ha->mcp) in qla2x00_mbx_completion()
580 mboxes = ha->mcp->in_mb; in qla2x00_mbx_completion()
583 ha->flags.mbox_int = 1; in qla2x00_mbx_completion()
584 ha->mailbox_out[0] = mb0; in qla2x00_mbx_completion()
588 for (cnt = 1; cnt < ha->mbx_count; cnt++) { in qla2x00_mbx_completion()
592 ha->mailbox_out[cnt] = qla2x00_debounce_register(wptr); in qla2x00_mbx_completion()
594 ha->mailbox_out[cnt] = rd_reg_word(wptr); in qla2x00_mbx_completion()
607 struct device_reg_24xx __iomem *reg24 = &vha->hw->iobase->isp24; in qla81xx_idc_event()
608 struct device_reg_82xx __iomem *reg82 = &vha->hw->iobase->isp82; in qla81xx_idc_event()
612 /* Seed data -- mailbox1 -> mailbox7. */ in qla81xx_idc_event()
613 if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) in qla81xx_idc_event()
614 wptr = &reg24->mailbox1; in qla81xx_idc_event()
615 else if (IS_QLA8044(vha->hw)) in qla81xx_idc_event()
616 wptr = &reg82->mailbox_out[1]; in qla81xx_idc_event()
624 "Inter-Driver Communication %s -- " in qla81xx_idc_event()
632 vha->hw->flags.idc_compl_status = 1; in qla81xx_idc_event()
633 if (vha->hw->notify_dcbx_comp && !vha->vp_idx) in qla81xx_idc_event()
634 complete(&vha->hw->dcbx_comp); in qla81xx_idc_event()
639 /* Acknowledgement needed? [Notify && non-zero timeout]. */ in qla81xx_idc_event()
642 "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n", in qla81xx_idc_event()
643 vha->host_no, event[aen & 0xff], timeout); in qla81xx_idc_event()
653 vha->hw->idc_extend_tmo = descr; in qla81xx_idc_event()
655 "%lu Inter-Driver Communication %s -- " in qla81xx_idc_event()
657 vha->host_no, event[aen & 0xff], vha->hw->idc_extend_tmo); in qla81xx_idc_event()
669 #define QLA_LAST_SPEED (ARRAY_SIZE(link_speeds) - 1) in qla2x00_get_link_speed_str()
684 struct qla_hw_data *ha = vha->hw; in qla83xx_handle_8200_aen()
690 * mb[2] = LSW of Peg-Halt Status-1 Register in qla83xx_handle_8200_aen()
691 * mb[6] = MSW of Peg-Halt Status-1 Register in qla83xx_handle_8200_aen()
692 * mb[3] = LSW of Peg-Halt Status-2 register in qla83xx_handle_8200_aen()
693 * mb[7] = MSW of Peg-Halt Status-2 register in qla83xx_handle_8200_aen()
694 * mb[4] = IDC Device-State Register value in qla83xx_handle_8200_aen()
695 * mb[5] = IDC Driver-Presence Register value in qla83xx_handle_8200_aen()
698 "mb[1] = 0x%x PH-status1: mb[2] = 0x%x PH-status1: mb[6] = 0x%x.\n", in qla83xx_handle_8200_aen()
700 ql_dbg(ql_dbg_async, vha, 0x506c, "PH-status2: mb[3] = 0x%x " in qla83xx_handle_8200_aen()
701 "PH-status2: mb[7] = 0x%x Device-State: mb[4] = 0x%x " in qla83xx_handle_8200_aen()
702 "Drv-Presence: mb[5] = 0x%x.\n", mb[3], mb[7], mb[4], mb[5]); in qla83xx_handle_8200_aen()
706 ha->flags.nic_core_hung = 1; in qla83xx_handle_8200_aen()
715 * - PEG-Halt Status-1 Register: in qla83xx_handle_8200_aen()
717 * Bits 0-7 = protocol-engine ID in qla83xx_handle_8200_aen()
718 * Bits 8-28 = f/w error code in qla83xx_handle_8200_aen()
719 * Bits 29-31 = Error-level in qla83xx_handle_8200_aen()
720 * Error-level 0x1 = Non-Fatal error in qla83xx_handle_8200_aen()
721 * Error-level 0x2 = Recoverable Fatal error in qla83xx_handle_8200_aen()
722 * Error-level 0x4 = UnRecoverable Fatal error in qla83xx_handle_8200_aen()
723 * - PEG-Halt Status-2 Register: in qla83xx_handle_8200_aen()
730 ql_log(ql_log_warn, vha, 0x5061, "PegHalt Status-1 " in qla83xx_handle_8200_aen()
734 ql_log(ql_log_warn, vha, 0x5062, "PegHalt Status-2 " in qla83xx_handle_8200_aen()
763 * - PEG-to-FC Status Register: in qla83xx_handle_8200_aen()
765 * Bits 0-7 = Peg-Firmware state in qla83xx_handle_8200_aen()
766 * Bit 8 = N/W Interface Link-up in qla83xx_handle_8200_aen()
768 * Bits 10-11 = SFP Status in qla83xx_handle_8200_aen()
770 * SFP Status 0x1 = SFP+ transceiver not present in qla83xx_handle_8200_aen()
772 * SFP Status 0x3 = SFP+ transceiver present and in qla83xx_handle_8200_aen()
774 * Bits 12-14 = Heartbeat Counter in qla83xx_handle_8200_aen()
776 * Bits 16-17 = SFP Additional Info in qla83xx_handle_8200_aen()
784 * Bits 20-22 = Link Speed in qla83xx_handle_8200_aen()
785 * Bits 23-27 = Reserved in qla83xx_handle_8200_aen()
786 * Bits 28-30 = DCBX Status in qla83xx_handle_8200_aen()
805 "Peg-to-Fc Status Register:\n" in qla83xx_handle_8200_aen()
835 "IDC Device-State changed = 0x%x.\n", mb[4]); in qla83xx_handle_8200_aen()
836 if (ha->flags.nic_core_reset_owner) in qla83xx_handle_8200_aen()
843 * qla27xx_copy_multiple_pkt() - Copy over purex/purls packets that can
848 * @is_purls: True, for Unsolicited Received FC-NVMe LS rsp IOCB
869 total_bytes = (le16_to_cpu(purls->frame_size) & 0x0FFF) - in qla27xx_copy_multiple_pkt()
871 entry_count = entry_count_remaining = purls->entry_count; in qla27xx_copy_multiple_pkt()
872 payload_size = sizeof(purls->payload); in qla27xx_copy_multiple_pkt()
875 total_bytes = (le16_to_cpu(purex->frame_size) & 0x0FFF) - in qla27xx_copy_multiple_pkt()
877 entry_count = entry_count_remaining = purex->entry_count; in qla27xx_copy_multiple_pkt()
878 payload_size = sizeof(purex->els_frame_payload); in qla27xx_copy_multiple_pkt()
892 iocb_pkt = &item->iocb; in qla27xx_copy_multiple_pkt()
895 memcpy(iocb_pkt, &purls->payload[0], no_bytes); in qla27xx_copy_multiple_pkt()
897 memcpy(iocb_pkt, &purex->els_frame_payload[0], no_bytes); in qla27xx_copy_multiple_pkt()
899 pending_bytes -= no_bytes; in qla27xx_copy_multiple_pkt()
900 --entry_count_remaining; in qla27xx_copy_multiple_pkt()
903 ((response_t *)purls)->signature = RESPONSE_PROCESSED; in qla27xx_copy_multiple_pkt()
905 ((response_t *)purex)->signature = RESPONSE_PROCESSED; in qla27xx_copy_multiple_pkt()
910 if (rsp_q->ring_ptr->signature == RESPONSE_PROCESSED) { in qla27xx_copy_multiple_pkt()
918 new_pkt = (sts_cont_entry_t *)rsp_q->ring_ptr; in qla27xx_copy_multiple_pkt()
921 if (new_pkt->entry_type != STATUS_CONT_TYPE) { in qla27xx_copy_multiple_pkt()
928 rsp_q->ring_index++; in qla27xx_copy_multiple_pkt()
929 if (rsp_q->ring_index == rsp_q->length) { in qla27xx_copy_multiple_pkt()
930 rsp_q->ring_index = 0; in qla27xx_copy_multiple_pkt()
931 rsp_q->ring_ptr = rsp_q->ring; in qla27xx_copy_multiple_pkt()
933 rsp_q->ring_ptr++; in qla27xx_copy_multiple_pkt()
935 no_bytes = (pending_bytes > sizeof(new_pkt->data)) ? in qla27xx_copy_multiple_pkt()
936 sizeof(new_pkt->data) : pending_bytes; in qla27xx_copy_multiple_pkt()
939 new_pkt->data, no_bytes); in qla27xx_copy_multiple_pkt()
941 pending_bytes -= no_bytes; in qla27xx_copy_multiple_pkt()
942 --entry_count_remaining; in qla27xx_copy_multiple_pkt()
948 new_pkt->data, in qla27xx_copy_multiple_pkt()
949 total_bytes - buffer_copy_offset); in qla27xx_copy_multiple_pkt()
952 ((response_t *)new_pkt)->signature = RESPONSE_PROCESSED; in qla27xx_copy_multiple_pkt()
966 host_to_fcp_swap((uint8_t *)&item->iocb, total_bytes); in qla27xx_copy_multiple_pkt()
974 struct qla_hw_data *ha = vha->hw; in qla2x00_is_a_vp_did()
980 if (!ha->num_vhosts) in qla2x00_is_a_vp_did()
983 spin_lock_irqsave(&ha->vport_slock, flags); in qla2x00_is_a_vp_did()
984 list_for_each_entry(vp, &ha->vp_list, list) { in qla2x00_is_a_vp_did()
985 vp_did = vp->d_id.b24; in qla2x00_is_a_vp_did()
991 spin_unlock_irqrestore(&ha->vport_slock, flags); in qla2x00_is_a_vp_did()
1002 list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) in qla2x00_find_fcport_by_loopid()
1003 if (f->loop_id == loop_id) in qla2x00_find_fcport_by_loopid()
1014 list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) { in qla2x00_find_fcport_by_wwpn()
1015 if (memcmp(f->port_name, wwpn, WWN_SIZE) == 0) { in qla2x00_find_fcport_by_wwpn()
1018 else if (f->deleted == 0) in qla2x00_find_fcport_by_wwpn()
1032 list_for_each_entry_safe(f, tf, &vha->vp_fcports, list) { in qla2x00_find_fcport_by_nportid()
1033 if (f->d_id.b24 == id->b24) { in qla2x00_find_fcport_by_nportid()
1036 else if (f->deleted == 0) in qla2x00_find_fcport_by_nportid()
1047 struct qla_hw_data *ha = vha->hw; in qla27xx_handle_8200_aen()
1063 ha->isp_ops->fw_dump(vha); in qla27xx_handle_8200_aen()
1067 ha->isp_ops->mpi_fw_dump(vha, 1); in qla27xx_handle_8200_aen()
1070 vha->hw->flags.fw_init_done = 0; in qla27xx_handle_8200_aen()
1071 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla27xx_handle_8200_aen()
1084 (size - QLA_DEFAULT_PAYLOAD_SIZE), GFP_ATOMIC); in qla24xx_alloc_purex_item()
1086 if (atomic_inc_return(&vha->default_item.in_use) == 1) { in qla24xx_alloc_purex_item()
1087 item = &vha->default_item; in qla24xx_alloc_purex_item()
1101 item->vha = vha; in qla24xx_alloc_purex_item()
1102 item->size = size; in qla24xx_alloc_purex_item()
1111 struct purex_list *list = &vha->purex_list; in qla24xx_queue_purex_item()
1114 pkt->process_item = process_item; in qla24xx_queue_purex_item()
1116 spin_lock_irqsave(&list->lock, flags); in qla24xx_queue_purex_item()
1117 list_add_tail(&pkt->list, &list->head); in qla24xx_queue_purex_item()
1118 spin_unlock_irqrestore(&list->lock, flags); in qla24xx_queue_purex_item()
1120 set_bit(PROCESS_PUREX_IOCB, &vha->dpc_flags); in qla24xx_queue_purex_item()
1124 * qla24xx_copy_std_pkt() - Copy over purex ELS which is
1140 memcpy(&item->iocb, pkt, sizeof(item->iocb)); in qla24xx_copy_std_pkt()
1145 * qla27xx_copy_fpin_pkt() - Copy over fpin packets that can
1164 total_bytes = (le16_to_cpu(purex->frame_size) & 0x0FFF) in qla27xx_copy_fpin_pkt()
1165 - PURX_ELS_HEADER_SIZE; in qla27xx_copy_fpin_pkt()
1167 entry_count = entry_count_remaining = purex->entry_count; in qla27xx_copy_fpin_pkt()
1168 no_bytes = (pending_bytes > sizeof(purex->els_frame_payload)) ? in qla27xx_copy_fpin_pkt()
1169 sizeof(purex->els_frame_payload) : pending_bytes; in qla27xx_copy_fpin_pkt()
1178 fpin_pkt = &item->iocb; in qla27xx_copy_fpin_pkt()
1180 memcpy(fpin_pkt, &purex->els_frame_payload[0], no_bytes); in qla27xx_copy_fpin_pkt()
1182 pending_bytes -= no_bytes; in qla27xx_copy_fpin_pkt()
1183 --entry_count_remaining; in qla27xx_copy_fpin_pkt()
1185 ((response_t *)purex)->signature = RESPONSE_PROCESSED; in qla27xx_copy_fpin_pkt()
1190 if (rsp_q->ring_ptr->signature == RESPONSE_PROCESSED) { in qla27xx_copy_fpin_pkt()
1198 new_pkt = (sts_cont_entry_t *)rsp_q->ring_ptr; in qla27xx_copy_fpin_pkt()
1201 if (new_pkt->entry_type != STATUS_CONT_TYPE) { in qla27xx_copy_fpin_pkt()
1208 rsp_q->ring_index++; in qla27xx_copy_fpin_pkt()
1209 if (rsp_q->ring_index == rsp_q->length) { in qla27xx_copy_fpin_pkt()
1210 rsp_q->ring_index = 0; in qla27xx_copy_fpin_pkt()
1211 rsp_q->ring_ptr = rsp_q->ring; in qla27xx_copy_fpin_pkt()
1213 rsp_q->ring_ptr++; in qla27xx_copy_fpin_pkt()
1215 no_bytes = (pending_bytes > sizeof(new_pkt->data)) ? in qla27xx_copy_fpin_pkt()
1216 sizeof(new_pkt->data) : pending_bytes; in qla27xx_copy_fpin_pkt()
1219 buffer_copy_offset), new_pkt->data, in qla27xx_copy_fpin_pkt()
1222 pending_bytes -= no_bytes; in qla27xx_copy_fpin_pkt()
1223 --entry_count_remaining; in qla27xx_copy_fpin_pkt()
1229 buffer_copy_offset), new_pkt->data, in qla27xx_copy_fpin_pkt()
1230 total_bytes - buffer_copy_offset); in qla27xx_copy_fpin_pkt()
1233 ((response_t *)new_pkt)->signature = RESPONSE_PROCESSED; in qla27xx_copy_fpin_pkt()
1245 host_to_fcp_swap((uint8_t *)&item->iocb, total_bytes); in qla27xx_copy_fpin_pkt()
1250 * qla2x00_async_event() - Process aynchronous events.
1253 * @mb: Mailbox registers (0 - 3)
1261 struct qla_hw_data *ha = vha->hw; in qla2x00_async_event()
1262 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; in qla2x00_async_event()
1263 struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24; in qla2x00_async_event()
1264 struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; in qla2x00_async_event()
1269 if (!vha->hw->flags.fw_started) { in qla2x00_async_event()
1271 "Dropping AEN - %04x %04x %04x %04x.\n", in qla2x00_async_event()
1333 if (!vha->flags.online) in qla2x00_async_event()
1337 qla2x00_process_completed_request(vha, rsp->req, in qla2x00_async_event()
1345 set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1351 vha->hw_err_cnt++; in qla2x00_async_event()
1357 m[0] = rd_reg_word(&reg24->mailbox4); in qla2x00_async_event()
1358 m[1] = rd_reg_word(&reg24->mailbox5); in qla2x00_async_event()
1359 m[2] = rd_reg_word(&reg24->mailbox6); in qla2x00_async_event()
1360 mbx = m[3] = rd_reg_word(&reg24->mailbox7); in qla2x00_async_event()
1363 "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh mbx4=%xh mbx5=%xh mbx6=%xh mbx7=%xh.\n", in qla2x00_async_event()
1367 "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n ", in qla2x00_async_event()
1371 rd_reg_word(&reg24->mailbox7) & BIT_8) in qla2x00_async_event()
1372 ha->isp_ops->mpi_fw_dump(vha, 1); in qla2x00_async_event()
1373 ha->isp_ops->fw_dump(vha); in qla2x00_async_event()
1374 ha->flags.fw_init_done = 0; in qla2x00_async_event()
1382 vha->flags.online = 0; in qla2x00_async_event()
1383 vha->device_flags |= DFLG_DEV_FAILED; in qla2x00_async_event()
1386 if ((mbx & MBX_3) && (ha->port_no == 0)) in qla2x00_async_event()
1388 &vha->dpc_flags); in qla2x00_async_event()
1390 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1396 vha->flags.online = 0; in qla2x00_async_event()
1397 vha->device_flags |= DFLG_DEV_FAILED; in qla2x00_async_event()
1399 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1406 vha->hw_err_cnt++; in qla2x00_async_event()
1408 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1415 vha->hw_err_cnt++; in qla2x00_async_event()
1417 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1420 case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ in qla2x00_async_event()
1428 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1432 ha->flags.lip_ae = 1; in qla2x00_async_event()
1437 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1438 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1439 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); in qla2x00_async_event()
1443 if (vha->vp_idx) { in qla2x00_async_event()
1444 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1445 fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); in qla2x00_async_event()
1448 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1449 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1451 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1457 ha->link_data_rate = PORT_SPEED_1GB; in qla2x00_async_event()
1459 ha->link_data_rate = mb[1]; in qla2x00_async_event()
1463 qla2x00_get_link_speed_str(ha, ha->link_data_rate)); in qla2x00_async_event()
1471 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1472 qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate); in qla2x00_async_event()
1474 if (vha->link_down_time < vha->hw->port_down_retry_count) { in qla2x00_async_event()
1475 vha->short_link_down_cnt++; in qla2x00_async_event()
1476 vha->link_down_time = QLA2XX_MAX_LINK_DOWN_TIME; in qla2x00_async_event()
1483 ha->flags.lip_ae = 0; in qla2x00_async_event()
1484 ha->current_topology = 0; in qla2x00_async_event()
1485 vha->link_down_time = 0; in qla2x00_async_event()
1488 ? rd_reg_word(&reg24->mailbox4) : 0; in qla2x00_async_event()
1489 mbx = (IS_P3P_TYPE(ha)) ? rd_reg_word(&reg82->mailbox_out[4]) in qla2x00_async_event()
1495 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1496 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1497 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); in qla2x00_async_event()
1500 * NVRAM in case of FA-WWPN capable ISP in qla2x00_async_event()
1503 if (!vha->vp_idx) { in qla2x00_async_event()
1504 if (ha->flags.fawwpn_enabled && in qla2x00_async_event()
1505 (ha->current_topology == ISP_CFG_F)) { in qla2x00_async_event()
1506 memcpy(vha->port_name, ha->port_name, WWN_SIZE); in qla2x00_async_event()
1507 fc_host_port_name(vha->host) = in qla2x00_async_event()
1508 wwn_to_u64(vha->port_name); in qla2x00_async_event()
1512 wwn_to_u64(vha->port_name)); in qla2x00_async_event()
1515 clear_bit(VP_CONFIG_OK, &vha->vp_flags); in qla2x00_async_event()
1518 vha->device_flags |= DFLG_NO_CABLE; in qla2x00_async_event()
1522 if (vha->vp_idx) { in qla2x00_async_event()
1523 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1524 fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); in qla2x00_async_event()
1527 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1528 ha->link_data_rate = PORT_SPEED_UNKNOWN; in qla2x00_async_event()
1536 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1537 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1538 atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME); in qla2x00_async_event()
1542 if (vha->vp_idx) { in qla2x00_async_event()
1543 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1544 fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); in qla2x00_async_event()
1547 set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1549 ha->operating_mode = LOOP; in qla2x00_async_event()
1550 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1555 case MBA_POINT_TO_POINT: /* Point-to-Point */ in qla2x00_async_event()
1556 ha->flags.lip_ae = 0; in qla2x00_async_event()
1563 "DCBX Completed -- %04x %04x %04x.\n", in qla2x00_async_event()
1565 if (ha->notify_dcbx_comp && !vha->vp_idx) in qla2x00_async_event()
1566 complete(&ha->dcbx_comp); in qla2x00_async_event()
1576 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1577 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1578 if (!atomic_read(&vha->loop_down_timer)) in qla2x00_async_event()
1579 atomic_set(&vha->loop_down_timer, in qla2x00_async_event()
1585 if (vha->vp_idx) { in qla2x00_async_event()
1586 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1587 fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); in qla2x00_async_event()
1590 if (!(test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags))) in qla2x00_async_event()
1591 set_bit(RESET_MARKER_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1593 set_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1594 set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1596 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1606 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1607 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1608 if (!atomic_read(&vha->loop_down_timer)) in qla2x00_async_event()
1609 atomic_set(&vha->loop_down_timer, in qla2x00_async_event()
1614 if (vha->vp_idx) { in qla2x00_async_event()
1615 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1616 fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); in qla2x00_async_event()
1619 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1620 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla2x00_async_event()
1625 * Handle only global and vn-port update events in qla2x00_async_event()
1641 (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff)) in qla2x00_async_event()
1654 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1655 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla2x00_async_event()
1665 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1666 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla2x00_async_event()
1674 if (atomic_read(&fcport->state) != FCS_ONLINE) in qla2x00_async_event()
1678 fcport->loop_id, fcport->d_id.b24); in qla2x00_async_event()
1680 fcport->logout_on_delete = 0; in qla2x00_async_event()
1686 if (atomic_read(&vha->loop_state) != LOOP_DOWN) { in qla2x00_async_event()
1687 atomic_set(&vha->loop_state, LOOP_DOWN); in qla2x00_async_event()
1688 atomic_set(&vha->loop_down_timer, in qla2x00_async_event()
1690 vha->device_flags |= DFLG_NO_CABLE; in qla2x00_async_event()
1694 if (vha->vp_idx) { in qla2x00_async_event()
1695 atomic_set(&vha->vp_state, VP_FAILED); in qla2x00_async_event()
1696 fc_vport_set_state(vha->fc_vport, in qla2x00_async_event()
1701 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1702 ha->link_data_rate = PORT_SPEED_UNKNOWN; in qla2x00_async_event()
1711 atomic_set(&vha->loop_down_timer, 0); in qla2x00_async_event()
1712 if (atomic_read(&vha->loop_state) != LOOP_DOWN && in qla2x00_async_event()
1713 !ha->flags.n2n_ae && in qla2x00_async_event()
1714 atomic_read(&vha->loop_state) != LOOP_DEAD) { in qla2x00_async_event()
1728 atomic_set(&vha->loop_state, LOOP_UP); in qla2x00_async_event()
1729 vha->scan.scan_retry = 0; in qla2x00_async_event()
1731 set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1732 set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); in qla2x00_async_event()
1733 set_bit(VP_CONFIG_OK, &vha->vp_flags); in qla2x00_async_event()
1738 if (vha->vp_idx && test_bit(VP_SCR_NEEDED, &vha->vp_flags)) in qla2x00_async_event()
1741 if (ha->flags.npiv_supported && vha->vp_idx != (mb[3] & 0xff)) in qla2x00_async_event()
1745 "RSCN database changed -- %04x %04x %04x.\n", in qla2x00_async_event()
1749 host_pid = (vha->d_id.b.domain << 16) | (vha->d_id.b.area << 8) in qla2x00_async_event()
1750 | vha->d_id.b.al_pa; in qla2x00_async_event()
1758 /* Ignore reserved bits from RSCN-payload. */ in qla2x00_async_event()
1765 atomic_set(&vha->loop_down_timer, 0); in qla2x00_async_event()
1766 vha->flags.management_server_logged_in = 0; in qla2x00_async_event()
1778 if (!ha->flags.scm_enabled || in qla2x00_async_event()
1803 "Discard RND Frame -- %04x %04x %04x.\n", in qla2x00_async_event()
1805 vha->interface_err_cnt++; in qla2x00_async_event()
1810 "Trace Notification -- %04x %04x.\n", mb[1], mb[2]); in qla2x00_async_event()
1815 "ISP84XX Alert Notification -- %04x %04x %04x.\n", in qla2x00_async_event()
1818 spin_lock_irqsave(&ha->cs84xx->access_lock, flags); in qla2x00_async_event()
1826 ha->cs84xx->op_fw_version = mb[3] << 16 | mb[2]; in qla2x00_async_event()
1829 ha->cs84xx->op_fw_version); in qla2x00_async_event()
1832 ha->cs84xx->diag_fw_version = mb[3] << 16 | mb[2]; in qla2x00_async_event()
1835 ha->cs84xx->diag_fw_version); in qla2x00_async_event()
1838 ha->cs84xx->diag_fw_version = mb[3] << 16 | mb[2]; in qla2x00_async_event()
1839 ha->cs84xx->fw_update = 1; in qla2x00_async_event()
1842 ha->cs84xx->gold_fw_version); in qla2x00_async_event()
1849 spin_unlock_irqrestore(&ha->cs84xx->access_lock, flags); in qla2x00_async_event()
1853 "DCBX Started -- %04x %04x %04x.\n", in qla2x00_async_event()
1858 "DCBX Parameters Updated -- %04x %04x %04x.\n", in qla2x00_async_event()
1863 "FCF Configuration Error -- %04x %04x %04x.\n", in qla2x00_async_event()
1867 if (IS_QLA8031(vha->hw) || IS_QLA8044(ha)) { in qla2x00_async_event()
1868 mb[4] = rd_reg_word(&reg24->mailbox4); in qla2x00_async_event()
1872 set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags); in qla2x00_async_event()
1876 if (atomic_read(&vha->loop_state) == LOOP_DOWN) in qla2x00_async_event()
1877 atomic_set(&vha->loop_down_timer, in qla2x00_async_event()
1884 if (ha->notify_lb_portup_comp && !vha->vp_idx) in qla2x00_async_event()
1885 complete(&ha->lb_portup_comp); in qla2x00_async_event()
1888 if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) || in qla2x00_async_event()
1895 vha->hw_err_cnt++; in qla2x00_async_event()
1898 mb[4] = rd_reg_word(&reg24->mailbox4); in qla2x00_async_event()
1899 mb[5] = rd_reg_word(&reg24->mailbox5); in qla2x00_async_event()
1900 mb[6] = rd_reg_word(&reg24->mailbox6); in qla2x00_async_event()
1901 mb[7] = rd_reg_word(&reg24->mailbox7); in qla2x00_async_event()
1905 "skip Heartbeat processing mb0-3=[0x%04x] [0x%04x] [0x%04x] [0x%04x]\n", in qla2x00_async_event()
1913 vha->dport_status &= ~DPORT_DIAG_IN_PROGRESS; in qla2x00_async_event()
1915 "D-Port Diagnostics: %04x %04x %04x %04x\n", in qla2x00_async_event()
1917 memcpy(vha->dport_data, mb, sizeof(vha->dport_data)); in qla2x00_async_event()
1927 "D-Port Diagnostics: result=%s type=%s [sw=%u]\n", in qla2x00_async_event()
1938 "D-Port Diagnostics: reason=%s phase=%u \n", in qla2x00_async_event()
1955 set_bit(DETECT_SFP_CHANGE, &vha->dpc_flags); in qla2x00_async_event()
1970 if (!vha->vp_idx && ha->num_vhosts) in qla2x00_async_event()
1975 * qla2x00_process_completed_request() - Process a Fast Post response.
1985 struct qla_hw_data *ha = vha->hw; in qla2x00_process_completed_request()
1988 if (index >= req->num_outstanding_cmds) { in qla2x00_process_completed_request()
1993 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla2x00_process_completed_request()
1995 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_process_completed_request()
1999 sp = req->outstanding_cmds[index]; in qla2x00_process_completed_request()
2002 req->outstanding_cmds[index] = NULL; in qla2x00_process_completed_request()
2005 sp->done(sp, DID_OK << 16); in qla2x00_process_completed_request()
2010 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla2x00_process_completed_request()
2012 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_process_completed_request()
2020 struct qla_hw_data *ha = vha->hw; in qla_get_sp_from_handle()
2025 if (pkt->handle == QLA_SKIP_HANDLE) in qla_get_sp_from_handle()
2028 index = LSW(pkt->handle); in qla_get_sp_from_handle()
2029 if (index >= req->num_outstanding_cmds) { in qla_get_sp_from_handle()
2034 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla_get_sp_from_handle()
2036 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla_get_sp_from_handle()
2039 sp = req->outstanding_cmds[index]; in qla_get_sp_from_handle()
2042 "%s: Invalid completion handle (%x) -- timed-out.\n", in qla_get_sp_from_handle()
2046 if (sp->handle != index) { in qla_get_sp_from_handle()
2049 sp->handle, index); in qla_get_sp_from_handle()
2054 qla_put_fw_resources(sp->qpair, &sp->iores); in qla_get_sp_from_handle()
2067 req->outstanding_cmds[index] = NULL; in qla2x00_get_sp_from_handle()
2076 const char func[] = "MBX-IOCB"; in qla2x00_mbx_iocb_entry()
2088 lio = &sp->u.iocb_cmd; in qla2x00_mbx_iocb_entry()
2089 type = sp->name; in qla2x00_mbx_iocb_entry()
2090 fcport = sp->fcport; in qla2x00_mbx_iocb_entry()
2091 data = lio->u.logio.data; in qla2x00_mbx_iocb_entry()
2094 data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ? in qla2x00_mbx_iocb_entry()
2096 if (mbx->entry_status) { in qla2x00_mbx_iocb_entry()
2098 "Async-%s error entry - hdl=%x portid=%02x%02x%02x " in qla2x00_mbx_iocb_entry()
2099 "entry-status=%x status=%x state-flag=%x " in qla2x00_mbx_iocb_entry()
2100 "status-flags=%x.\n", type, sp->handle, in qla2x00_mbx_iocb_entry()
2101 fcport->d_id.b.domain, fcport->d_id.b.area, in qla2x00_mbx_iocb_entry()
2102 fcport->d_id.b.al_pa, mbx->entry_status, in qla2x00_mbx_iocb_entry()
2103 le16_to_cpu(mbx->status), le16_to_cpu(mbx->state_flags), in qla2x00_mbx_iocb_entry()
2104 le16_to_cpu(mbx->status_flags)); in qla2x00_mbx_iocb_entry()
2112 status = le16_to_cpu(mbx->status); in qla2x00_mbx_iocb_entry()
2113 if (status == 0x30 && sp->type == SRB_LOGIN_CMD && in qla2x00_mbx_iocb_entry()
2114 le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) in qla2x00_mbx_iocb_entry()
2116 if (!status && le16_to_cpu(mbx->mb0) == MBS_COMMAND_COMPLETE) { in qla2x00_mbx_iocb_entry()
2118 "Async-%s complete - hdl=%x portid=%02x%02x%02x mbx1=%x.\n", in qla2x00_mbx_iocb_entry()
2119 type, sp->handle, fcport->d_id.b.domain, in qla2x00_mbx_iocb_entry()
2120 fcport->d_id.b.area, fcport->d_id.b.al_pa, in qla2x00_mbx_iocb_entry()
2121 le16_to_cpu(mbx->mb1)); in qla2x00_mbx_iocb_entry()
2124 if (sp->type == SRB_LOGIN_CMD) { in qla2x00_mbx_iocb_entry()
2125 fcport->port_type = FCT_TARGET; in qla2x00_mbx_iocb_entry()
2126 if (le16_to_cpu(mbx->mb1) & BIT_0) in qla2x00_mbx_iocb_entry()
2127 fcport->port_type = FCT_INITIATOR; in qla2x00_mbx_iocb_entry()
2128 else if (le16_to_cpu(mbx->mb1) & BIT_1) in qla2x00_mbx_iocb_entry()
2129 fcport->flags |= FCF_FCP2_DEVICE; in qla2x00_mbx_iocb_entry()
2134 data[0] = le16_to_cpu(mbx->mb0); in qla2x00_mbx_iocb_entry()
2137 data[1] = le16_to_cpu(mbx->mb1); in qla2x00_mbx_iocb_entry()
2147 "Async-%s failed - hdl=%x portid=%02x%02x%02x status=%x " in qla2x00_mbx_iocb_entry()
2148 "mb0=%x mb1=%x mb2=%x mb6=%x mb7=%x.\n", type, sp->handle, in qla2x00_mbx_iocb_entry()
2149 fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa, in qla2x00_mbx_iocb_entry()
2150 status, le16_to_cpu(mbx->mb0), le16_to_cpu(mbx->mb1), in qla2x00_mbx_iocb_entry()
2151 le16_to_cpu(mbx->mb2), le16_to_cpu(mbx->mb6), in qla2x00_mbx_iocb_entry()
2152 le16_to_cpu(mbx->mb7)); in qla2x00_mbx_iocb_entry()
2155 sp->done(sp, 0); in qla2x00_mbx_iocb_entry()
2162 const char func[] = "MBX-IOCB2"; in qla24xx_mbx_iocb_entry()
2163 struct qla_hw_data *ha = vha->hw; in qla24xx_mbx_iocb_entry()
2173 if (sp->type == SRB_SCSI_CMD || in qla24xx_mbx_iocb_entry()
2174 sp->type == SRB_NVME_CMD || in qla24xx_mbx_iocb_entry()
2175 sp->type == SRB_TM_CMD) { in qla24xx_mbx_iocb_entry()
2177 "Inconsistent event entry type %d\n", sp->type); in qla24xx_mbx_iocb_entry()
2179 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla24xx_mbx_iocb_entry()
2181 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla24xx_mbx_iocb_entry()
2185 si = &sp->u.iocb_cmd; in qla24xx_mbx_iocb_entry()
2186 sz = min(ARRAY_SIZE(pkt->mb), ARRAY_SIZE(sp->u.iocb_cmd.u.mbx.in_mb)); in qla24xx_mbx_iocb_entry()
2189 si->u.mbx.in_mb[i] = pkt->mb[i]; in qla24xx_mbx_iocb_entry()
2191 res = (si->u.mbx.in_mb[0] & MBS_MASK); in qla24xx_mbx_iocb_entry()
2193 sp->done(sp, res); in qla24xx_mbx_iocb_entry()
2208 if (pkt->u.isp2x.status != cpu_to_le16(NOTIFY_ACK_SUCCESS)) in qla24xxx_nack_iocb_entry()
2211 sp->done(sp, res); in qla24xxx_nack_iocb_entry()
2230 switch (sp->type) { in qla2x00_ct_entry()
2232 bsg_job = sp->u.bsg_job; in qla2x00_ct_entry()
2233 bsg_reply = bsg_job->reply; in qla2x00_ct_entry()
2235 type = "ct pass-through"; in qla2x00_ct_entry()
2237 comp_status = le16_to_cpu(pkt->comp_status); in qla2x00_ct_entry()
2243 bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; in qla2x00_ct_entry()
2244 bsg_job->reply_len = sizeof(struct fc_bsg_reply); in qla2x00_ct_entry()
2249 bsg_reply->reply_payload_rcv_len = in qla2x00_ct_entry()
2250 le16_to_cpu(pkt->rsp_info_len); in qla2x00_ct_entry()
2253 "CT pass-through-%s error comp_status=0x%x total_byte=0x%x.\n", in qla2x00_ct_entry()
2255 bsg_reply->reply_payload_rcv_len); in qla2x00_ct_entry()
2258 "CT pass-through-%s error comp_status=0x%x.\n", in qla2x00_ct_entry()
2261 bsg_reply->reply_payload_rcv_len = 0; in qla2x00_ct_entry()
2267 bsg_reply->reply_payload_rcv_len = in qla2x00_ct_entry()
2268 bsg_job->reply_payload.payload_len; in qla2x00_ct_entry()
2269 bsg_job->reply_len = 0; in qla2x00_ct_entry()
2278 (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp, in qla2x00_ct_entry()
2279 sp->name); in qla2x00_ct_entry()
2283 sp->done(sp, res); in qla2x00_ct_entry()
2290 struct els_sts_entry_24xx *ese = (struct els_sts_entry_24xx *)pkt; in qla24xx_els_ct_entry() local
2307 bsg_job = sp->u.bsg_job; in qla24xx_els_ct_entry()
2308 vha = sp->vha; in qla24xx_els_ct_entry()
2312 comp_status = fw_status[0] = le16_to_cpu(pkt->comp_status); in qla24xx_els_ct_entry()
2313 fw_status[1] = le32_to_cpu(((struct els_sts_entry_24xx *)pkt)->error_subcode_1); in qla24xx_els_ct_entry()
2314 fw_status[2] = le32_to_cpu(((struct els_sts_entry_24xx *)pkt)->error_subcode_2); in qla24xx_els_ct_entry()
2316 switch (sp->type) { in qla24xx_els_ct_entry()
2326 (struct qla_bsg_auth_els_request *)bsg_job->request; in qla24xx_els_ct_entry()
2330 __func__, sc_to_str(p->e.sub_cmd), in qla24xx_els_ct_entry()
2331 e->d_id[2], e->d_id[1], e->d_id[0], in qla24xx_els_ct_entry()
2332 comp_status, p->e.extra_rx_xchg_address, bsg_job); in qla24xx_els_ct_entry()
2334 if (!(le16_to_cpu(els->control_flags) & ECF_PAYLOAD_DESCR_MASK)) { in qla24xx_els_ct_entry()
2335 if (sp->remap.remapped) { in qla24xx_els_ct_entry()
2336 n = sg_copy_from_buffer(bsg_job->reply_payload.sg_list, in qla24xx_els_ct_entry()
2337 bsg_job->reply_payload.sg_cnt, in qla24xx_els_ct_entry()
2338 sp->remap.rsp.buf, in qla24xx_els_ct_entry()
2339 sp->remap.rsp.len); in qla24xx_els_ct_entry()
2342 __func__, n, sp->remap.rsp.len); in qla24xx_els_ct_entry()
2352 type = "ct pass-through"; in qla24xx_els_ct_entry()
2359 type, sp, sp->type); in qla24xx_els_ct_entry()
2360 sp->done(sp, 0); in qla24xx_els_ct_entry()
2368 res = qla2x00_chk_ms_status(sp->vha, (ms_iocb_entry_t *)pkt, in qla24xx_els_ct_entry()
2369 (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp, in qla24xx_els_ct_entry()
2370 sp->name); in qla24xx_els_ct_entry()
2371 sp->done(sp, res); in qla24xx_els_ct_entry()
2375 "Unrecognized SRB: (%p) type=%d.\n", sp, sp->type); in qla24xx_els_ct_entry()
2380 els = &sp->u.iocb_cmd; in qla24xx_els_ct_entry()
2381 els->u.els_plogi.fw_status[0] = cpu_to_le32(fw_status[0]); in qla24xx_els_ct_entry()
2382 els->u.els_plogi.fw_status[1] = cpu_to_le32(fw_status[1]); in qla24xx_els_ct_entry()
2383 els->u.els_plogi.fw_status[2] = cpu_to_le32(fw_status[2]); in qla24xx_els_ct_entry()
2384 els->u.els_plogi.comp_status = cpu_to_le16(fw_status[0]); in qla24xx_els_ct_entry()
2390 els->u.els_plogi.len = cpu_to_le16(le32_to_cpu( in qla24xx_els_ct_entry()
2391 ese->total_byte_count)); in qla24xx_els_ct_entry()
2393 if (sp->remap.remapped && in qla24xx_els_ct_entry()
2394 ((u8 *)sp->remap.rsp.buf)[0] == ELS_LS_ACC) { in qla24xx_els_ct_entry()
2396 "%s IOCB Done LS_ACC %02x%02x%02x -> %02x%02x%02x", in qla24xx_els_ct_entry()
2397 __func__, e->s_id[0], e->s_id[2], e->s_id[1], in qla24xx_els_ct_entry()
2398 e->d_id[2], e->d_id[1], e->d_id[0]); in qla24xx_els_ct_entry()
2407 els->u.els_plogi.len = 0; in qla24xx_els_ct_entry()
2409 qlt_schedule_sess_for_deletion(sp->fcport); in qla24xx_els_ct_entry()
2411 els->u.els_plogi.len = 0; in qla24xx_els_ct_entry()
2415 if (sp->remap.remapped && in qla24xx_els_ct_entry()
2416 ((u8 *)sp->remap.rsp.buf)[0] == ELS_LS_RJT) { in qla24xx_els_ct_entry()
2420 type, sp->handle, comp_status); in qla24xx_els_ct_entry()
2423 "subcode 1=0x%x subcode 2=0x%x bytes=0x%x %02x%02x%02x -> %02x%02x%02x\n", in qla24xx_els_ct_entry()
2426 pkt)->total_byte_count), in qla24xx_els_ct_entry()
2427 e->s_id[0], e->s_id[2], e->s_id[1], in qla24xx_els_ct_entry()
2428 e->d_id[2], e->d_id[1], e->d_id[0]); in qla24xx_els_ct_entry()
2430 if (sp->fcport && sp->fcport->flags & FCF_FCSP_DEVICE && in qla24xx_els_ct_entry()
2431 sp->type == SRB_ELS_CMD_HST_NOLOGIN) { in qla24xx_els_ct_entry()
2434 qlt_schedule_sess_for_deletion(sp->fcport); in qla24xx_els_ct_entry()
2439 type, sp->handle, comp_status); in qla24xx_els_ct_entry()
2441 "subcode 1=0x%x subcode 2=0x%x bytes=0x%x %02x%02x%02x -> %02x%02x%02x\n", in qla24xx_els_ct_entry()
2444 pkt)->total_byte_count), in qla24xx_els_ct_entry()
2445 e->s_id[0], e->s_id[2], e->s_id[1], in qla24xx_els_ct_entry()
2446 e->d_id[2], e->d_id[1], e->d_id[0]); in qla24xx_els_ct_entry()
2455 bsg_job = sp->u.bsg_job; in qla24xx_els_ct_entry()
2456 bsg_reply = bsg_job->reply; in qla24xx_els_ct_entry()
2457 bsg_reply->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK; in qla24xx_els_ct_entry()
2458 bsg_job->reply_len = sizeof(struct fc_bsg_reply) + sizeof(fw_status); in qla24xx_els_ct_entry()
2463 bsg_reply->reply_payload_rcv_len = in qla24xx_els_ct_entry()
2464 le32_to_cpu(ese->total_byte_count); in qla24xx_els_ct_entry()
2467 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " in qla24xx_els_ct_entry()
2469 type, sp->handle, comp_status, fw_status[1], fw_status[2], in qla24xx_els_ct_entry()
2470 le32_to_cpu(ese->total_byte_count)); in qla24xx_els_ct_entry()
2473 "ELS-CT pass-through-%s error hdl=%x comp_status-status=0x%x " in qla24xx_els_ct_entry()
2475 type, sp->handle, comp_status, in qla24xx_els_ct_entry()
2476 le32_to_cpu(ese->error_subcode_1), in qla24xx_els_ct_entry()
2477 le32_to_cpu(ese->error_subcode_2)); in qla24xx_els_ct_entry()
2479 bsg_reply->reply_payload_rcv_len = 0; in qla24xx_els_ct_entry()
2481 memcpy(bsg_job->reply + sizeof(struct fc_bsg_reply), in qla24xx_els_ct_entry()
2488 bsg_reply->reply_payload_rcv_len = bsg_job->reply_payload.payload_len; in qla24xx_els_ct_entry()
2489 bsg_job->reply_len = 0; in qla24xx_els_ct_entry()
2493 sp->done(sp, res); in qla24xx_els_ct_entry()
2500 const char func[] = "LOGIO-IOCB"; in qla24xx_logio_entry()
2513 lio = &sp->u.iocb_cmd; in qla24xx_logio_entry()
2514 type = sp->name; in qla24xx_logio_entry()
2515 fcport = sp->fcport; in qla24xx_logio_entry()
2516 data = lio->u.logio.data; in qla24xx_logio_entry()
2519 data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ? in qla24xx_logio_entry()
2521 if (logio->entry_status) { in qla24xx_logio_entry()
2522 ql_log(ql_log_warn, fcport->vha, 0x5034, in qla24xx_logio_entry()
2523 "Async-%s error entry - %8phC hdl=%x" in qla24xx_logio_entry()
2524 "portid=%02x%02x%02x entry-status=%x.\n", in qla24xx_logio_entry()
2525 type, fcport->port_name, sp->handle, fcport->d_id.b.domain, in qla24xx_logio_entry()
2526 fcport->d_id.b.area, fcport->d_id.b.al_pa, in qla24xx_logio_entry()
2527 logio->entry_status); in qla24xx_logio_entry()
2534 if (le16_to_cpu(logio->comp_status) == CS_COMPLETE) { in qla24xx_logio_entry()
2535 ql_dbg(ql_dbg_async, sp->vha, 0x5036, in qla24xx_logio_entry()
2536 "Async-%s complete: handle=%x pid=%06x wwpn=%8phC iop0=%x\n", in qla24xx_logio_entry()
2537 type, sp->handle, fcport->d_id.b24, fcport->port_name, in qla24xx_logio_entry()
2538 le32_to_cpu(logio->io_parameter[0])); in qla24xx_logio_entry()
2540 vha->hw->exch_starvation = 0; in qla24xx_logio_entry()
2543 if (sp->type == SRB_PRLI_CMD) { in qla24xx_logio_entry()
2544 lio->u.logio.iop[0] = in qla24xx_logio_entry()
2545 le32_to_cpu(logio->io_parameter[0]); in qla24xx_logio_entry()
2546 lio->u.logio.iop[1] = in qla24xx_logio_entry()
2547 le32_to_cpu(logio->io_parameter[1]); in qla24xx_logio_entry()
2551 if (sp->type != SRB_LOGIN_CMD) in qla24xx_logio_entry()
2554 lio->u.logio.iop[1] = le32_to_cpu(logio->io_parameter[5]); in qla24xx_logio_entry()
2555 if (le32_to_cpu(logio->io_parameter[5]) & LIO_COMM_FEAT_FCSP) in qla24xx_logio_entry()
2556 fcport->flags |= FCF_FCSP_DEVICE; in qla24xx_logio_entry()
2558 iop[0] = le32_to_cpu(logio->io_parameter[0]); in qla24xx_logio_entry()
2560 fcport->port_type = FCT_TARGET; in qla24xx_logio_entry()
2562 fcport->flags |= FCF_FCP2_DEVICE; in qla24xx_logio_entry()
2564 fcport->port_type = FCT_INITIATOR; in qla24xx_logio_entry()
2567 fcport->flags |= FCF_CONF_COMP_SUPPORTED; in qla24xx_logio_entry()
2569 if (logio->io_parameter[7] || logio->io_parameter[8]) in qla24xx_logio_entry()
2570 fcport->supported_classes |= FC_COS_CLASS2; in qla24xx_logio_entry()
2571 if (logio->io_parameter[9] || logio->io_parameter[10]) in qla24xx_logio_entry()
2572 fcport->supported_classes |= FC_COS_CLASS3; in qla24xx_logio_entry()
2577 iop[0] = le32_to_cpu(logio->io_parameter[0]); in qla24xx_logio_entry()
2578 iop[1] = le32_to_cpu(logio->io_parameter[1]); in qla24xx_logio_entry()
2579 lio->u.logio.iop[0] = iop[0]; in qla24xx_logio_entry()
2580 lio->u.logio.iop[1] = iop[1]; in qla24xx_logio_entry()
2603 vha->hw->exch_starvation++; in qla24xx_logio_entry()
2604 if (vha->hw->exch_starvation > 5) { in qla24xx_logio_entry()
2608 vha->hw->exch_starvation = 0; in qla24xx_logio_entry()
2610 if (IS_P3P_TYPE(vha->hw)) in qla24xx_logio_entry()
2611 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla24xx_logio_entry()
2613 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla24xx_logio_entry()
2623 ql_log(ql_log_warn, sp->vha, 0x5037, "Async-%s failed: " in qla24xx_logio_entry()
2625 type, sp->handle, fcport->d_id.b24, fcport->port_name, in qla24xx_logio_entry()
2626 le16_to_cpu(logio->comp_status), in qla24xx_logio_entry()
2627 le32_to_cpu(logio->io_parameter[0]), in qla24xx_logio_entry()
2628 le32_to_cpu(logio->io_parameter[1])); in qla24xx_logio_entry()
2630 ql_dbg(ql_dbg_disc, sp->vha, 0x5037, "Async-%s failed: " in qla24xx_logio_entry()
2632 type, sp->handle, fcport->d_id.b24, fcport->port_name, in qla24xx_logio_entry()
2633 le16_to_cpu(logio->comp_status), in qla24xx_logio_entry()
2634 le32_to_cpu(logio->io_parameter[0]), in qla24xx_logio_entry()
2635 le32_to_cpu(logio->io_parameter[1])); in qla24xx_logio_entry()
2638 sp->done(sp, 0); in qla24xx_logio_entry()
2644 const char func[] = "TMF-IOCB"; in qla24xx_tm_iocb_entry()
2656 comp_status = le16_to_cpu(sts->comp_status); in qla24xx_tm_iocb_entry()
2657 iocb = &sp->u.iocb_cmd; in qla24xx_tm_iocb_entry()
2658 type = sp->name; in qla24xx_tm_iocb_entry()
2659 fcport = sp->fcport; in qla24xx_tm_iocb_entry()
2660 iocb->u.tmf.data = QLA_SUCCESS; in qla24xx_tm_iocb_entry()
2662 if (sts->entry_status) { in qla24xx_tm_iocb_entry()
2663 ql_log(ql_log_warn, fcport->vha, 0x5038, in qla24xx_tm_iocb_entry()
2664 "Async-%s error - hdl=%x entry-status(%x).\n", in qla24xx_tm_iocb_entry()
2665 type, sp->handle, sts->entry_status); in qla24xx_tm_iocb_entry()
2666 iocb->u.tmf.data = QLA_FUNCTION_FAILED; in qla24xx_tm_iocb_entry()
2667 } else if (sts->comp_status != cpu_to_le16(CS_COMPLETE)) { in qla24xx_tm_iocb_entry()
2668 ql_log(ql_log_warn, fcport->vha, 0x5039, in qla24xx_tm_iocb_entry()
2669 "Async-%s error - hdl=%x completion status(%x).\n", in qla24xx_tm_iocb_entry()
2670 type, sp->handle, comp_status); in qla24xx_tm_iocb_entry()
2671 iocb->u.tmf.data = QLA_FUNCTION_FAILED; in qla24xx_tm_iocb_entry()
2672 } else if ((le16_to_cpu(sts->scsi_status) & in qla24xx_tm_iocb_entry()
2674 host_to_fcp_swap(sts->data, sizeof(sts->data)); in qla24xx_tm_iocb_entry()
2675 if (le32_to_cpu(sts->rsp_data_len) < 4) { in qla24xx_tm_iocb_entry()
2676 ql_log(ql_log_warn, fcport->vha, 0x503b, in qla24xx_tm_iocb_entry()
2677 "Async-%s error - hdl=%x not enough response(%d).\n", in qla24xx_tm_iocb_entry()
2678 type, sp->handle, sts->rsp_data_len); in qla24xx_tm_iocb_entry()
2679 } else if (sts->data[3]) { in qla24xx_tm_iocb_entry()
2680 ql_log(ql_log_warn, fcport->vha, 0x503c, in qla24xx_tm_iocb_entry()
2681 "Async-%s error - hdl=%x response(%x).\n", in qla24xx_tm_iocb_entry()
2682 type, sp->handle, sts->data[3]); in qla24xx_tm_iocb_entry()
2683 iocb->u.tmf.data = QLA_FUNCTION_FAILED; in qla24xx_tm_iocb_entry()
2694 if (atomic_read(&fcport->state) == FCS_ONLINE) { in qla24xx_tm_iocb_entry()
2695 ql_dbg(ql_dbg_disc, fcport->vha, 0x3021, in qla24xx_tm_iocb_entry()
2696 … "-Port to be marked lost on fcport=%02x%02x%02x, current port state= %s comp_status %x.\n", in qla24xx_tm_iocb_entry()
2697 fcport->d_id.b.domain, fcport->d_id.b.area, in qla24xx_tm_iocb_entry()
2698 fcport->d_id.b.al_pa, in qla24xx_tm_iocb_entry()
2710 if (iocb->u.tmf.data != QLA_SUCCESS) in qla24xx_tm_iocb_entry()
2711 ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, sp->vha, 0x5055, in qla24xx_tm_iocb_entry()
2714 sp->done(sp, 0); in qla24xx_tm_iocb_entry()
2726 __le16 comp_status = sts->comp_status; in qla24xx_nvme_iocb_entry()
2729 iocb = &sp->u.iocb_cmd; in qla24xx_nvme_iocb_entry()
2730 fcport = sp->fcport; in qla24xx_nvme_iocb_entry()
2731 iocb->u.nvme.comp_status = comp_status; in qla24xx_nvme_iocb_entry()
2732 state_flags = le16_to_cpu(sts->state_flags); in qla24xx_nvme_iocb_entry()
2733 fd = iocb->u.nvme.desc; in qla24xx_nvme_iocb_entry()
2735 if (unlikely(iocb->u.nvme.aen_op)) in qla24xx_nvme_iocb_entry()
2736 atomic_dec(&sp->vha->hw->nvme_active_aen_cnt); in qla24xx_nvme_iocb_entry()
2738 sp->qpair->cmd_completion_cnt++; in qla24xx_nvme_iocb_entry()
2743 fd->transferred_length = fd->payload_length - in qla24xx_nvme_iocb_entry()
2744 le32_to_cpu(sts->residual_len); in qla24xx_nvme_iocb_entry()
2755 iocb->u.nvme.rsp_pyld_len = 0; in qla24xx_nvme_iocb_entry()
2758 /* Response already DMA'd to fd->rspaddr. */ in qla24xx_nvme_iocb_entry()
2759 iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len; in qla24xx_nvme_iocb_entry()
2762 * Non-zero value in first 12 bytes of NVMe_RSP IU, treat this in qla24xx_nvme_iocb_entry()
2765 iocb->u.nvme.rsp_pyld_len = 0; in qla24xx_nvme_iocb_entry()
2766 fd->transferred_length = 0; in qla24xx_nvme_iocb_entry()
2767 ql_dbg(ql_dbg_io, fcport->vha, 0x307a, in qla24xx_nvme_iocb_entry()
2774 inbuf = (uint32_t *)&sts->nvme_ersp_data; in qla24xx_nvme_iocb_entry()
2775 outbuf = (uint32_t *)fd->rspaddr; in qla24xx_nvme_iocb_entry()
2776 iocb->u.nvme.rsp_pyld_len = sts->nvme_rsp_pyld_len; in qla24xx_nvme_iocb_entry()
2777 if (unlikely(le16_to_cpu(iocb->u.nvme.rsp_pyld_len) > in qla24xx_nvme_iocb_entry()
2781 iocb->u.nvme.rsp_pyld_len); in qla24xx_nvme_iocb_entry()
2782 ql_log(ql_log_warn, fcport->vha, 0x5100, in qla24xx_nvme_iocb_entry()
2784 iocb->u.nvme.rsp_pyld_len); in qla24xx_nvme_iocb_entry()
2786 iocb->u.nvme.rsp_pyld_len = in qla24xx_nvme_iocb_entry()
2789 iter = le16_to_cpu(iocb->u.nvme.rsp_pyld_len) >> 2; in qla24xx_nvme_iocb_entry()
2790 for (; iter; iter--) in qla24xx_nvme_iocb_entry()
2795 struct nvme_fc_ersp_iu *rsp_iu = fd->rspaddr; in qla24xx_nvme_iocb_entry()
2798 tgt_xfer_len = be32_to_cpu(rsp_iu->xfrd_len); in qla24xx_nvme_iocb_entry()
2799 if (fd->transferred_length != tgt_xfer_len) { in qla24xx_nvme_iocb_entry()
2800 ql_log(ql_log_warn, fcport->vha, 0x3079, in qla24xx_nvme_iocb_entry()
2802 tgt_xfer_len, fd->transferred_length); in qla24xx_nvme_iocb_entry()
2814 ql_dbg(ql_dbg_io, fcport->vha, 0x5060, in qla24xx_nvme_iocb_entry()
2815 "NVME-%s ERR Handling - hdl=%x status(%x) tr_len:%x resid=%x ox_id=%x\n", in qla24xx_nvme_iocb_entry()
2816 sp->name, sp->handle, comp_status, in qla24xx_nvme_iocb_entry()
2817 fd->transferred_length, le32_to_cpu(sts->residual_len), in qla24xx_nvme_iocb_entry()
2818 sts->ox_id); in qla24xx_nvme_iocb_entry()
2831 fcport->nvme_flag |= NVME_FLAG_RESETTING; in qla24xx_nvme_iocb_entry()
2832 if (atomic_read(&fcport->state) == FCS_ONLINE) { in qla24xx_nvme_iocb_entry()
2833 ql_dbg(ql_dbg_disc, fcport->vha, 0x3021, in qla24xx_nvme_iocb_entry()
2836 fcport->d_id.b24, port_state_str[FCS_ONLINE], in qla24xx_nvme_iocb_entry()
2844 fd->transferred_length = 0; in qla24xx_nvme_iocb_entry()
2845 iocb->u.nvme.rsp_pyld_len = 0; in qla24xx_nvme_iocb_entry()
2854 sp->done(sp, ret); in qla24xx_nvme_iocb_entry()
2860 const char func[] = "CTRLVP-IOCB"; in qla_ctrlvp_completed()
2868 if (vce->entry_status != 0) { in qla_ctrlvp_completed()
2870 "%s: Failed to complete IOCB -- error status (%x)\n", in qla_ctrlvp_completed()
2871 sp->name, vce->entry_status); in qla_ctrlvp_completed()
2873 } else if (vce->comp_status != cpu_to_le16(CS_COMPLETE)) { in qla_ctrlvp_completed()
2875 "%s: Failed to complete IOCB -- completion status (%x) vpidx %x\n", in qla_ctrlvp_completed()
2876 sp->name, le16_to_cpu(vce->comp_status), in qla_ctrlvp_completed()
2877 le16_to_cpu(vce->vp_idx_failed)); in qla_ctrlvp_completed()
2884 sp->rc = rval; in qla_ctrlvp_completed()
2885 sp->done(sp, rval); in qla_ctrlvp_completed()
2898 switch (pkt->entry_type) { in qla2x00_process_response_entry()
2904 handle_cnt = sts21_entry->handle_count; in qla2x00_process_response_entry()
2906 qla2x00_process_completed_request(vha, rsp->req, in qla2x00_process_response_entry()
2907 sts21_entry->handle[cnt]); in qla2x00_process_response_entry()
2911 handle_cnt = sts22_entry->handle_count; in qla2x00_process_response_entry()
2913 qla2x00_process_completed_request(vha, rsp->req, in qla2x00_process_response_entry()
2914 sts22_entry->handle[cnt]); in qla2x00_process_response_entry()
2920 qla2x00_mbx_iocb_entry(vha, rsp->req, (struct mbx_entry *)pkt); in qla2x00_process_response_entry()
2923 qla2x00_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE); in qla2x00_process_response_entry()
2929 pkt->entry_type, pkt->entry_status); in qla2x00_process_response_entry()
2935 * qla2x00_process_response_queue() - Process response queue entries.
2942 struct qla_hw_data *ha = rsp->hw; in qla2x00_process_response_queue()
2943 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; in qla2x00_process_response_queue()
2946 vha = pci_get_drvdata(ha->pdev); in qla2x00_process_response_queue()
2948 if (!vha->flags.online) in qla2x00_process_response_queue()
2951 while (rsp->ring_ptr->signature != RESPONSE_PROCESSED) { in qla2x00_process_response_queue()
2952 pkt = (sts_entry_t *)rsp->ring_ptr; in qla2x00_process_response_queue()
2954 rsp->ring_index++; in qla2x00_process_response_queue()
2955 if (rsp->ring_index == rsp->length) { in qla2x00_process_response_queue()
2956 rsp->ring_index = 0; in qla2x00_process_response_queue()
2957 rsp->ring_ptr = rsp->ring; in qla2x00_process_response_queue()
2959 rsp->ring_ptr++; in qla2x00_process_response_queue()
2962 if (pkt->entry_status != 0) { in qla2x00_process_response_queue()
2964 ((response_t *)pkt)->signature = RESPONSE_PROCESSED; in qla2x00_process_response_queue()
2970 ((response_t *)pkt)->signature = RESPONSE_PROCESSED; in qla2x00_process_response_queue()
2975 wrt_reg_word(ISP_RSP_Q_OUT(ha, reg), rsp->ring_index); in qla2x00_process_response_queue()
2982 struct scsi_qla_host *vha = sp->vha; in qla2x00_handle_sense()
2990 SET_CMD_SENSE_PTR(sp, cp->sense_buffer); in qla2x00_handle_sense()
2996 memcpy(cp->sense_buffer, sense_data, sense_len); in qla2x00_handle_sense()
2998 SET_CMD_SENSE_PTR(sp, cp->sense_buffer + sense_len); in qla2x00_handle_sense()
2999 track_sense_len -= sense_len; in qla2x00_handle_sense()
3003 rsp->status_srb = sp; in qla2x00_handle_sense()
3004 cp->result = res; in qla2x00_handle_sense()
3010 sp->vha->host_no, cp->device->id, cp->device->lun, in qla2x00_handle_sense()
3013 cp->sense_buffer, sense_len); in qla2x00_handle_sense()
3018 * Checks the guard or meta-data for the type of error
3026 struct scsi_qla_host *vha = sp->vha; in qla2x00_handle_dif_error()
3028 uint8_t *ap = &sts24->data[12]; in qla2x00_handle_dif_error()
3029 uint8_t *ep = &sts24->data[20]; in qla2x00_handle_dif_error()
3052 cmd->cmnd[0], (u64)scsi_get_lba(cmd), a_ref_tag, e_ref_tag, in qla2x00_handle_dif_error()
3067 blocks_done = e_ref_tag - (uint32_t)lba_s + 1; in qla2x00_handle_dif_error()
3069 resid = scsi_bufflen(cmd) - (blocks_done * in qla2x00_handle_dif_error()
3070 cmd->device->sector_size); in qla2x00_handle_dif_error()
3073 cmd->result = DID_OK << 16; in qla2x00_handle_dif_error()
3089 j = blocks_done - k - 1; in qla2x00_handle_dif_error()
3101 spt = page_address(sg_page(sg)) + sg->offset; in qla2x00_handle_dif_error()
3104 spt->app_tag = T10_PI_APP_ESCAPE; in qla2x00_handle_dif_error()
3106 spt->ref_tag = T10_PI_REF_ESCAPE; in qla2x00_handle_dif_error()
3140 struct qla_hw_data *ha = vha->hw; in qla25xx_process_bidir_status_iocb()
3153 if (index >= req->num_outstanding_cmds) { in qla25xx_process_bidir_status_iocb()
3156 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla25xx_process_bidir_status_iocb()
3160 sp = req->outstanding_cmds[index]; in qla25xx_process_bidir_status_iocb()
3164 req->id, index); in qla25xx_process_bidir_status_iocb()
3166 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla25xx_process_bidir_status_iocb()
3171 req->outstanding_cmds[index] = NULL; in qla25xx_process_bidir_status_iocb()
3172 bsg_job = sp->u.bsg_job; in qla25xx_process_bidir_status_iocb()
3173 bsg_request = bsg_job->request; in qla25xx_process_bidir_status_iocb()
3174 bsg_reply = bsg_job->reply; in qla25xx_process_bidir_status_iocb()
3177 comp_status = le16_to_cpu(sts24->comp_status); in qla25xx_process_bidir_status_iocb()
3178 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK; in qla25xx_process_bidir_status_iocb()
3180 comp_status = le16_to_cpu(sts->comp_status); in qla25xx_process_bidir_status_iocb()
3181 scsi_status = le16_to_cpu(sts->scsi_status) & SS_MASK; in qla25xx_process_bidir_status_iocb()
3184 thread_id = bsg_request->rqst_data.h_vendor.vendor_cmd[1]; in qla25xx_process_bidir_status_iocb()
3188 bsg_reply->reply_payload_rcv_len = in qla25xx_process_bidir_status_iocb()
3189 bsg_job->reply_payload.payload_len; in qla25xx_process_bidir_status_iocb()
3190 vha->qla_stats.input_bytes += in qla25xx_process_bidir_status_iocb()
3191 bsg_reply->reply_payload_rcv_len; in qla25xx_process_bidir_status_iocb()
3192 vha->qla_stats.input_requests++; in qla25xx_process_bidir_status_iocb()
3272 bsg_reply->reply_payload_rcv_len = 0; in qla25xx_process_bidir_status_iocb()
3276 bsg_reply->reply_data.vendor_reply.vendor_rsp[0] = rval; in qla25xx_process_bidir_status_iocb()
3277 bsg_job->reply_len = sizeof(struct fc_bsg_reply); in qla25xx_process_bidir_status_iocb()
3280 sp->done(sp, DID_OK << 16); in qla25xx_process_bidir_status_iocb()
3285 * qla2x00_status_entry() - Process a Status IOCB entry.
3306 struct qla_hw_data *ha = vha->hw; in qla2x00_status_entry()
3316 comp_status = le16_to_cpu(sts24->comp_status); in qla2x00_status_entry()
3317 scsi_status = le16_to_cpu(sts24->scsi_status) & SS_MASK; in qla2x00_status_entry()
3318 state_flags = le16_to_cpu(sts24->state_flags); in qla2x00_status_entry()
3320 comp_status = le16_to_cpu(sts->comp_status); in qla2x00_status_entry()
3321 scsi_status = le16_to_cpu(sts->scsi_status) & SS_MASK; in qla2x00_status_entry()
3323 handle = (uint32_t) LSW(sts->handle); in qla2x00_status_entry()
3324 que = MSW(sts->handle); in qla2x00_status_entry()
3325 req = ha->req_q_map[que]; in qla2x00_status_entry()
3329 que >= find_first_zero_bit(ha->req_qid_map, ha->max_req_queues)) { in qla2x00_status_entry()
3332 "que=%u.\n", sts->handle, req, que); in qla2x00_status_entry()
3337 if (handle < req->num_outstanding_cmds) { in qla2x00_status_entry()
3338 sp = req->outstanding_cmds[handle]; in qla2x00_status_entry()
3342 __func__, vha->host_no, sts->handle); in qla2x00_status_entry()
3348 sts->handle); in qla2x00_status_entry()
3350 if (!test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) { in qla2x00_status_entry()
3352 set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); in qla2x00_status_entry()
3354 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla2x00_status_entry()
3359 qla_put_fw_resources(sp->qpair, &sp->iores); in qla2x00_status_entry()
3361 if (sp->cmd_type != TYPE_SRB) { in qla2x00_status_entry()
3362 req->outstanding_cmds[handle] = NULL; in qla2x00_status_entry()
3364 "Unknown sp->cmd_type %x %p).\n", in qla2x00_status_entry()
3365 sp->cmd_type, sp); in qla2x00_status_entry()
3370 if (sp->type == SRB_NVME_CMD) { in qla2x00_status_entry()
3371 req->outstanding_cmds[handle] = NULL; in qla2x00_status_entry()
3376 if (unlikely((state_flags & BIT_1) && (sp->type == SRB_BIDI_CMD))) { in qla2x00_status_entry()
3382 if (sp->type == SRB_TM_CMD) { in qla2x00_status_entry()
3389 sp->qpair->cmd_completion_cnt++; in qla2x00_status_entry()
3401 sts->handle, sp); in qla2x00_status_entry()
3403 req->outstanding_cmds[handle] = NULL; in qla2x00_status_entry()
3409 fcport = sp->fcport; in qla2x00_status_entry()
3416 sense_len = le32_to_cpu(sts24->sense_len); in qla2x00_status_entry()
3418 rsp_info_len = le32_to_cpu(sts24->rsp_data_len); in qla2x00_status_entry()
3420 resid_len = le32_to_cpu(sts24->rsp_residual_count); in qla2x00_status_entry()
3422 fw_resid_len = le32_to_cpu(sts24->residual_len); in qla2x00_status_entry()
3423 rsp_info = sts24->data; in qla2x00_status_entry()
3424 sense_data = sts24->data; in qla2x00_status_entry()
3425 host_to_fcp_swap(sts24->data, sizeof(sts24->data)); in qla2x00_status_entry()
3426 ox_id = le16_to_cpu(sts24->ox_id); in qla2x00_status_entry()
3427 par_sense_len = sizeof(sts24->data); in qla2x00_status_entry()
3428 sts_qual = le16_to_cpu(sts24->status_qualifier); in qla2x00_status_entry()
3431 sense_len = le16_to_cpu(sts->req_sense_length); in qla2x00_status_entry()
3433 rsp_info_len = le16_to_cpu(sts->rsp_info_len); in qla2x00_status_entry()
3434 resid_len = le32_to_cpu(sts->residual_length); in qla2x00_status_entry()
3435 rsp_info = sts->rsp_info; in qla2x00_status_entry()
3436 sense_data = sts->req_sense_data; in qla2x00_status_entry()
3437 par_sense_len = sizeof(sts->req_sense_data); in qla2x00_status_entry()
3445 par_sense_len -= rsp_info_len; in qla2x00_status_entry()
3448 ql_dbg(ql_dbg_io, fcport->vha, 0x3019, in qla2x00_status_entry()
3485 ((unsigned)(scsi_bufflen(cp) - resid) < in qla2x00_status_entry()
3486 cp->underflow)) { in qla2x00_status_entry()
3487 ql_dbg(ql_dbg_io, fcport->vha, 0x301a, in qla2x00_status_entry()
3488 "Mid-layer underflow detected (0x%x of 0x%x bytes).\n", in qla2x00_status_entry()
3498 ql_dbg(ql_dbg_io, fcport->vha, 0x301b, in qla2x00_status_entry()
3506 memset(cp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in qla2x00_status_entry()
3520 ql_log(ql_log_warn, fcport->vha, 0x301d, in qla2x00_status_entry()
3529 ((unsigned)(scsi_bufflen(cp) - resid) < in qla2x00_status_entry()
3530 cp->underflow)) { in qla2x00_status_entry()
3531 ql_dbg(ql_dbg_io, fcport->vha, 0x301e, in qla2x00_status_entry()
3532 "Mid-layer underflow detected (0x%x of 0x%x bytes).\n", in qla2x00_status_entry()
3545 ql_log(ql_log_warn, fcport->vha, 0x301f, in qla2x00_status_entry()
3549 vha->interface_err_cnt++; in qla2x00_status_entry()
3554 ql_dbg(ql_dbg_io, fcport->vha, 0x3030, in qla2x00_status_entry()
3569 ql_dbg(ql_dbg_io, fcport->vha, 0x3020, in qla2x00_status_entry()
3577 memset(cp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in qla2x00_status_entry()
3605 else if ((le16_to_cpu(sts->status_flags) & in qla2x00_status_entry()
3610 if (atomic_read(&fcport->state) == FCS_ONLINE) { in qla2x00_status_entry()
3611 ql_dbg(ql_dbg_disc, fcport->vha, 0x3021, in qla2x00_status_entry()
3613 "port state= %s comp_status %x.\n", fcport->d_id.b.domain, in qla2x00_status_entry()
3614 fcport->d_id.b.area, fcport->d_id.b.al_pa, in qla2x00_status_entry()
3629 res = cp->result; in qla2x00_status_entry()
3634 vha->hw_err_cnt++; in qla2x00_status_entry()
3642 cp->device->vendor); in qla2x00_status_entry()
3646 ql_log(ql_log_info, fcport->vha, 0x3022, in qla2x00_status_entry()
3647 …"CS_DMA error: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu portid=%06x oxid=0x%x cdb=%10phN len=0x%x rsp_in… in qla2x00_status_entry()
3648 comp_status, scsi_status, res, vha->host_no, in qla2x00_status_entry()
3649 cp->device->id, cp->device->lun, fcport->d_id.b24, in qla2x00_status_entry()
3650 ox_id, cp->cmnd, scsi_bufflen(cp), rsp_info_len, in qla2x00_status_entry()
3655 vha->hw_err_cnt++; in qla2x00_status_entry()
3664 ql_dbg(ql_dbg_io, fcport->vha, 0x3022, in qla2x00_status_entry()
3665 …"FCP command status: 0x%x-0x%x (0x%x) nexus=%ld:%d:%llu portid=%02x%02x%02x oxid=0x%x cdb=%10phN l… in qla2x00_status_entry()
3666 comp_status, scsi_status, res, vha->host_no, in qla2x00_status_entry()
3667 cp->device->id, cp->device->lun, fcport->d_id.b.domain, in qla2x00_status_entry()
3668 fcport->d_id.b.area, fcport->d_id.b.al_pa, ox_id, in qla2x00_status_entry()
3669 cp->cmnd, scsi_bufflen(cp), rsp_info_len, in qla2x00_status_entry()
3672 if (rsp->status_srb == NULL) in qla2x00_status_entry()
3673 sp->done(sp, res); in qla2x00_status_entry()
3676 req->outstanding_cmds[handle] = NULL; in qla2x00_status_entry()
3680 * qla2x00_status_cont_entry() - Process a Status Continuations entry.
3690 struct qla_hw_data *ha = rsp->hw; in qla2x00_status_cont_entry()
3691 struct scsi_qla_host *vha = pci_get_drvdata(ha->pdev); in qla2x00_status_cont_entry()
3692 srb_t *sp = rsp->status_srb; in qla2x00_status_cont_entry()
3708 rsp->status_srb = NULL; in qla2x00_status_cont_entry()
3712 if (sense_len > sizeof(pkt->data)) in qla2x00_status_cont_entry()
3713 sense_sz = sizeof(pkt->data); in qla2x00_status_cont_entry()
3719 host_to_fcp_swap(pkt->data, sizeof(pkt->data)); in qla2x00_status_cont_entry()
3720 memcpy(sense_ptr, pkt->data, sense_sz); in qla2x00_status_cont_entry()
3724 sense_len -= sense_sz; in qla2x00_status_cont_entry()
3732 rsp->status_srb = NULL; in qla2x00_status_cont_entry()
3733 sp->done(sp, cp->result); in qla2x00_status_cont_entry()
3738 * qla2x00_error_entry() - Process an error entry.
3748 struct qla_hw_data *ha = vha->hw; in qla2x00_error_entry()
3749 const char func[] = "ERROR-IOCB"; in qla2x00_error_entry()
3750 uint16_t que = MSW(pkt->handle); in qla2x00_error_entry()
3757 pkt->entry_type, pkt->entry_status, pkt->handle, rsp->id); in qla2x00_error_entry()
3759 if (que >= ha->max_req_queues || !ha->req_q_map[que]) in qla2x00_error_entry()
3762 req = ha->req_q_map[que]; in qla2x00_error_entry()
3764 if (pkt->entry_status & RF_BUSY) in qla2x00_error_entry()
3767 if ((pkt->handle & ~QLA_TGT_HANDLE_MASK) == QLA_TGT_SKIP_HANDLE) in qla2x00_error_entry()
3770 switch (pkt->entry_type) { in qla2x00_error_entry()
3781 sp->done(sp, res); in qla2x00_error_entry()
3794 sp->done(sp, res); in qla2x00_error_entry()
3795 req->outstanding_cmds[index] = NULL; in qla2x00_error_entry()
3802 "Error entry - invalid handle/queue (%04x).\n", que); in qla2x00_error_entry()
3807 * qla24xx_mbx_completion() - Process mailbox command completions.
3817 struct qla_hw_data *ha = vha->hw; in qla24xx_mbx_completion()
3818 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; in qla24xx_mbx_completion()
3821 WARN_ON_ONCE(ha->mbx_count > 32); in qla24xx_mbx_completion()
3822 mboxes = (1ULL << ha->mbx_count) - 1; in qla24xx_mbx_completion()
3823 if (!ha->mcp) in qla24xx_mbx_completion()
3826 mboxes = ha->mcp->in_mb; in qla24xx_mbx_completion()
3829 ha->flags.mbox_int = 1; in qla24xx_mbx_completion()
3830 ha->mailbox_out[0] = mb0; in qla24xx_mbx_completion()
3832 wptr = &reg->mailbox1; in qla24xx_mbx_completion()
3834 for (cnt = 1; cnt < ha->mbx_count; cnt++) { in qla24xx_mbx_completion()
3836 ha->mailbox_out[cnt] = rd_reg_word(wptr); in qla24xx_mbx_completion()
3856 abt = &sp->u.iocb_cmd; in qla24xx_abort_iocb_entry()
3857 abt->u.abt.comp_status = pkt->comp_status; in qla24xx_abort_iocb_entry()
3858 orig_sp = sp->cmd_sp; in qla24xx_abort_iocb_entry()
3863 sp->done(sp, 0); in qla24xx_abort_iocb_entry()
3877 comp_status = le16_to_cpu(pkt->status); in qla24xx_nvme_ls4_iocb()
3878 sp->done(sp, comp_status); in qla24xx_nvme_ls4_iocb()
3882 * qla_chk_cont_iocb_avail - check for all continuation iocbs are available
3887 * Return: 0 all iocbs has arrived, xx- all iocbs have not arrived.
3896 if (pkt->entry_count == 1) in qla_chk_cont_iocb_avail()
3899 /* ring_index was pre-increment. set it back to current pkt */ in qla_chk_cont_iocb_avail()
3900 if (rsp->ring_index == 0) in qla_chk_cont_iocb_avail()
3901 start_pkt_ring_index = rsp->length - 1; in qla_chk_cont_iocb_avail()
3903 start_pkt_ring_index = rsp->ring_index - 1; in qla_chk_cont_iocb_avail()
3907 iocb_cnt = rsp->length - start_pkt_ring_index + rsp_q_in; in qla_chk_cont_iocb_avail()
3909 iocb_cnt = rsp_q_in - start_pkt_ring_index; in qla_chk_cont_iocb_avail()
3911 if (iocb_cnt < pkt->entry_count) in qla_chk_cont_iocb_avail()
3912 rc = -EIO; in qla_chk_cont_iocb_avail()
3915 "%s - ring %p pkt %p entry count %d iocb_cnt %d rsp_q_in %d rc %d\n", in qla_chk_cont_iocb_avail()
3916 __func__, rsp->ring, pkt, pkt->entry_count, iocb_cnt, rsp_q_in, rc); in qla_chk_cont_iocb_avail()
3924 const char func[] = "MRK-IOCB"; in qla_marker_iocb_entry()
3928 if (!IS_FWI2_CAPABLE(vha->hw)) in qla_marker_iocb_entry()
3935 if (pkt->entry_status) { in qla_marker_iocb_entry()
3939 sp->u.iocb_cmd.u.tmf.data = res; in qla_marker_iocb_entry()
3940 sp->done(sp, res); in qla_marker_iocb_entry()
3944 * qla24xx_process_response_queue() - Process response queue entries.
3952 struct qla_hw_data *ha = vha->hw; in qla24xx_process_response_queue()
3959 if (!ha->flags.fw_started) in qla24xx_process_response_queue()
3962 if (rsp->qpair->cpuid != raw_smp_processor_id() || !rsp->qpair->rcv_intr) { in qla24xx_process_response_queue()
3963 rsp->qpair->rcv_intr = 1; in qla24xx_process_response_queue()
3965 if (!rsp->qpair->cpu_mapped) in qla24xx_process_response_queue()
3966 qla_cpu_update(rsp->qpair, raw_smp_processor_id()); in qla24xx_process_response_queue()
3971 _rsp_in = _is_shadow_hba ? *(_rsp)->in_ptr : \ in qla24xx_process_response_queue()
3972 rd_reg_dword_relaxed((_rsp)->rsp_q_in); \ in qla24xx_process_response_queue()
3979 while (rsp->ring_index != rsp_in && in qla24xx_process_response_queue()
3980 rsp->ring_ptr->signature != RESPONSE_PROCESSED) { in qla24xx_process_response_queue()
3981 pkt = (struct sts_entry_24xx *)rsp->ring_ptr; in qla24xx_process_response_queue()
3982 cur_ring_index = rsp->ring_index; in qla24xx_process_response_queue()
3984 rsp->ring_index++; in qla24xx_process_response_queue()
3985 if (rsp->ring_index == rsp->length) { in qla24xx_process_response_queue()
3986 rsp->ring_index = 0; in qla24xx_process_response_queue()
3987 rsp->ring_ptr = rsp->ring; in qla24xx_process_response_queue()
3989 rsp->ring_ptr++; in qla24xx_process_response_queue()
3992 if (pkt->entry_status != 0) { in qla24xx_process_response_queue()
3996 ((response_t *)pkt)->signature = RESPONSE_PROCESSED; in qla24xx_process_response_queue()
4002 switch (pkt->entry_type) { in qla24xx_process_response_queue()
4014 qla24xx_logio_entry(vha, rsp->req, in qla24xx_process_response_queue()
4018 qla24xx_els_ct_entry(vha, rsp->req, pkt, CT_IOCB_TYPE); in qla24xx_process_response_queue()
4021 qla24xx_els_ct_entry(vha, rsp->req, pkt, ELS_IOCB_TYPE); in qla24xx_process_response_queue()
4049 rsp->req); in qla24xx_process_response_queue()
4052 if (pkt->handle == QLA_TGT_SKIP_HANDLE) in qla24xx_process_response_queue()
4056 qla24xxx_nack_iocb_entry(vha, rsp->req, in qla24xx_process_response_queue()
4060 qla_marker_iocb_entry(vha, rsp->req, (struct mrk_entry_24xx *)pkt); in qla24xx_process_response_queue()
4063 qla24xx_abort_iocb_entry(vha, rsp->req, in qla24xx_process_response_queue()
4067 qla24xx_mbx_iocb_entry(vha, rsp->req, in qla24xx_process_response_queue()
4071 qla_ctrlvp_completed(vha, rsp->req, in qla24xx_process_response_queue()
4076 switch (purex_entry->els_frame_payload[3]) { in qla24xx_process_response_queue()
4085 if (!vha->hw->flags.scm_enabled) { in qla24xx_process_response_queue()
4103 * pre-incremented above. Reset them in qla24xx_process_response_queue()
4106 * and re-process. in qla24xx_process_response_queue()
4108 rsp->ring_ptr = (response_t *)pkt; in qla24xx_process_response_queue()
4109 rsp->ring_index = cur_ring_index; in qla24xx_process_response_queue()
4113 purex_entry->els_frame_payload[3]); in qla24xx_process_response_queue()
4121 purex_entry->els_frame_payload[3]); in qla24xx_process_response_queue()
4125 qla28xx_sa_update_iocb_entry(vha, rsp->req, in qla24xx_process_response_queue()
4131 rsp->ring_ptr = (response_t *)pkt; in qla24xx_process_response_queue()
4132 rsp->ring_index = cur_ring_index; in qla24xx_process_response_queue()
4136 p->payload[0]); in qla24xx_process_response_queue()
4145 pkt->entry_type, pkt->entry_status); in qla24xx_process_response_queue()
4148 ((response_t *)pkt)->signature = RESPONSE_PROCESSED; in qla24xx_process_response_queue()
4154 struct device_reg_82xx __iomem *reg = &ha->iobase->isp82; in qla24xx_process_response_queue()
4156 wrt_reg_dword(&reg->rsp_q_out[0], rsp->ring_index); in qla24xx_process_response_queue()
4158 wrt_reg_dword(rsp->rsp_q_out, rsp->ring_index); in qla24xx_process_response_queue()
4167 struct qla_hw_data *ha = vha->hw; in qla2xxx_check_risc_status()
4168 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; in qla2xxx_check_risc_status()
4175 wrt_reg_dword(&reg->iobase_addr, 0x7C00); in qla2xxx_check_risc_status()
4176 rd_reg_dword(&reg->iobase_addr); in qla2xxx_check_risc_status()
4177 wrt_reg_dword(&reg->iobase_window, 0x0001); in qla2xxx_check_risc_status()
4178 for (cnt = 10000; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 && in qla2xxx_check_risc_status()
4179 rval == QLA_SUCCESS; cnt--) { in qla2xxx_check_risc_status()
4181 wrt_reg_dword(&reg->iobase_window, 0x0001); in qla2xxx_check_risc_status()
4190 wrt_reg_dword(&reg->iobase_window, 0x0003); in qla2xxx_check_risc_status()
4191 for (cnt = 100; (rd_reg_dword(&reg->iobase_window) & BIT_0) == 0 && in qla2xxx_check_risc_status()
4192 rval == QLA_SUCCESS; cnt--) { in qla2xxx_check_risc_status()
4194 wrt_reg_dword(&reg->iobase_window, 0x0003); in qla2xxx_check_risc_status()
4203 if (rd_reg_dword(&reg->iobase_c8) & BIT_3) in qla2xxx_check_risc_status()
4205 "Additional code -- 0x55AA.\n"); in qla2xxx_check_risc_status()
4208 wrt_reg_dword(&reg->iobase_window, 0x0000); in qla2xxx_check_risc_status()
4209 rd_reg_dword(&reg->iobase_window); in qla2xxx_check_risc_status()
4213 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP24xx.
4243 ha = rsp->hw; in qla24xx_intr_handler()
4244 reg = &ha->iobase->isp24; in qla24xx_intr_handler()
4247 if (unlikely(pci_channel_offline(ha->pdev))) in qla24xx_intr_handler()
4250 spin_lock_irqsave(&ha->hardware_lock, flags); in qla24xx_intr_handler()
4251 vha = pci_get_drvdata(ha->pdev); in qla24xx_intr_handler()
4252 for (iter = 50; iter--; ) { in qla24xx_intr_handler()
4253 stat = rd_reg_dword(&reg->host_status); in qla24xx_intr_handler()
4257 if (unlikely(pci_channel_offline(ha->pdev))) in qla24xx_intr_handler()
4260 hccr = rd_reg_dword(&reg->hccr); in qla24xx_intr_handler()
4263 "RISC paused -- HCCR=%x, Dumping firmware.\n", in qla24xx_intr_handler()
4268 ha->isp_ops->fw_dump(vha); in qla24xx_intr_handler()
4269 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla24xx_intr_handler()
4285 mb[1] = rd_reg_word(&reg->mailbox1); in qla24xx_intr_handler()
4286 mb[2] = rd_reg_word(&reg->mailbox2); in qla24xx_intr_handler()
4287 mb[3] = rd_reg_word(&reg->mailbox3); in qla24xx_intr_handler()
4307 wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT); in qla24xx_intr_handler()
4308 rd_reg_dword_relaxed(&reg->hccr); in qla24xx_intr_handler()
4309 if (unlikely(IS_QLA83XX(ha) && (ha->pdev->revision == 1))) in qla24xx_intr_handler()
4313 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla24xx_intr_handler()
4316 spin_lock_irqsave(&ha->tgt.atio_lock, flags); in qla24xx_intr_handler()
4318 spin_unlock_irqrestore(&ha->tgt.atio_lock, flags); in qla24xx_intr_handler()
4339 ha = rsp->hw; in qla24xx_msix_rsp_q()
4340 reg = &ha->iobase->isp24; in qla24xx_msix_rsp_q()
4342 spin_lock_irqsave(&ha->hardware_lock, flags); in qla24xx_msix_rsp_q()
4344 vha = pci_get_drvdata(ha->pdev); in qla24xx_msix_rsp_q()
4346 if (!ha->flags.disable_msix_handshake) { in qla24xx_msix_rsp_q()
4347 wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT); in qla24xx_msix_rsp_q()
4348 rd_reg_dword_relaxed(&reg->hccr); in qla24xx_msix_rsp_q()
4350 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla24xx_msix_rsp_q()
4375 ha = rsp->hw; in qla24xx_msix_default()
4376 reg = &ha->iobase->isp24; in qla24xx_msix_default()
4379 spin_lock_irqsave(&ha->hardware_lock, flags); in qla24xx_msix_default()
4380 vha = pci_get_drvdata(ha->pdev); in qla24xx_msix_default()
4382 stat = rd_reg_dword(&reg->host_status); in qla24xx_msix_default()
4386 if (unlikely(pci_channel_offline(ha->pdev))) in qla24xx_msix_default()
4389 hccr = rd_reg_dword(&reg->hccr); in qla24xx_msix_default()
4392 "RISC paused -- HCCR=%x, Dumping firmware.\n", in qla24xx_msix_default()
4396 vha->hw_err_cnt++; in qla24xx_msix_default()
4398 ha->isp_ops->fw_dump(vha); in qla24xx_msix_default()
4399 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); in qla24xx_msix_default()
4415 mb[1] = rd_reg_word(&reg->mailbox1); in qla24xx_msix_default()
4416 mb[2] = rd_reg_word(&reg->mailbox2); in qla24xx_msix_default()
4417 mb[3] = rd_reg_word(&reg->mailbox3); in qla24xx_msix_default()
4437 wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT); in qla24xx_msix_default()
4440 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla24xx_msix_default()
4443 spin_lock_irqsave(&ha->tgt.atio_lock, flags); in qla24xx_msix_default()
4445 spin_unlock_irqrestore(&ha->tgt.atio_lock, flags); in qla24xx_msix_default()
4463 ha = qpair->hw; in qla2xxx_msix_rsp_q()
4465 queue_work(ha->wq, &qpair->q_work); in qla2xxx_msix_rsp_q()
4484 ha = qpair->hw; in qla2xxx_msix_rsp_q_hs()
4486 reg = &ha->iobase->isp24; in qla2xxx_msix_rsp_q_hs()
4487 spin_lock_irqsave(&ha->hardware_lock, flags); in qla2xxx_msix_rsp_q_hs()
4488 wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT); in qla2xxx_msix_rsp_q_hs()
4489 spin_unlock_irqrestore(&ha->hardware_lock, flags); in qla2xxx_msix_rsp_q_hs()
4491 queue_work(ha->wq, &qpair->q_work); in qla2xxx_msix_rsp_q_hs()
4521 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); in qla24xx_enable_msix()
4533 if (USER_CTRL_IRQ(ha) || !ha->mqiobase) { in qla24xx_enable_msix()
4535 ret = pci_alloc_irq_vectors(ha->pdev, min_vecs, in qla24xx_enable_msix()
4536 min((u16)ha->msix_count, (u16)(num_online_cpus() + min_vecs)), in qla24xx_enable_msix()
4539 ret = pci_alloc_irq_vectors_affinity(ha->pdev, min_vecs, in qla24xx_enable_msix()
4540 min((u16)ha->msix_count, (u16)(num_online_cpus() + min_vecs)), in qla24xx_enable_msix()
4546 "MSI-X: Failed to enable support, " in qla24xx_enable_msix()
4547 "giving up -- %d/%d.\n", in qla24xx_enable_msix()
4548 ha->msix_count, ret); in qla24xx_enable_msix()
4550 } else if (ret < ha->msix_count) { in qla24xx_enable_msix()
4552 "MSI-X: Using %d vectors\n", ret); in qla24xx_enable_msix()
4553 ha->msix_count = ret; in qla24xx_enable_msix()
4555 if (ha->mqiobase && (ql2xmqsupport || ql2xnvmeenable)) { in qla24xx_enable_msix()
4556 ha->max_req_queues = ha->msix_count - 1; in qla24xx_enable_msix()
4560 ha->max_req_queues--; in qla24xx_enable_msix()
4562 ha->max_rsp_queues = ha->max_req_queues; in qla24xx_enable_msix()
4564 ha->max_qpairs = ha->max_req_queues - 1; in qla24xx_enable_msix()
4565 ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190, in qla24xx_enable_msix()
4566 "Adjusted Max no of queues pairs: %d.\n", ha->max_qpairs); in qla24xx_enable_msix()
4569 vha->irq_offset = desc.pre_vectors; in qla24xx_enable_msix()
4570 ha->msix_entries = kcalloc(ha->msix_count, in qla24xx_enable_msix()
4573 if (!ha->msix_entries) { in qla24xx_enable_msix()
4575 "Failed to allocate memory for ha->msix_entries.\n"); in qla24xx_enable_msix()
4576 ret = -ENOMEM; in qla24xx_enable_msix()
4579 ha->flags.msix_enabled = 1; in qla24xx_enable_msix()
4581 for (i = 0; i < ha->msix_count; i++) { in qla24xx_enable_msix()
4582 qentry = &ha->msix_entries[i]; in qla24xx_enable_msix()
4583 qentry->vector = pci_irq_vector(ha->pdev, i); in qla24xx_enable_msix()
4584 qentry->vector_base0 = i; in qla24xx_enable_msix()
4585 qentry->entry = i; in qla24xx_enable_msix()
4586 qentry->have_irq = 0; in qla24xx_enable_msix()
4587 qentry->in_use = 0; in qla24xx_enable_msix()
4588 qentry->handle = NULL; in qla24xx_enable_msix()
4591 /* Enable MSI-X vectors for the base queue */ in qla24xx_enable_msix()
4593 qentry = &ha->msix_entries[i]; in qla24xx_enable_msix()
4594 qentry->handle = rsp; in qla24xx_enable_msix()
4595 rsp->msix = qentry; in qla24xx_enable_msix()
4596 scnprintf(qentry->name, sizeof(qentry->name), in qla24xx_enable_msix()
4597 "qla2xxx%lu_%s", vha->host_no, msix_entries[i].name); in qla24xx_enable_msix()
4599 ret = request_irq(qentry->vector, in qla24xx_enable_msix()
4603 ret = request_irq(qentry->vector, in qla24xx_enable_msix()
4605 0, qentry->name, rsp); in qla24xx_enable_msix()
4608 qentry->have_irq = 1; in qla24xx_enable_msix()
4609 qentry->in_use = 1; in qla24xx_enable_msix()
4618 qentry = &ha->msix_entries[QLA_ATIO_VECTOR]; in qla24xx_enable_msix()
4619 rsp->msix = qentry; in qla24xx_enable_msix()
4620 qentry->handle = rsp; in qla24xx_enable_msix()
4621 scnprintf(qentry->name, sizeof(qentry->name), in qla24xx_enable_msix()
4622 "qla2xxx%lu_%s", vha->host_no, in qla24xx_enable_msix()
4624 qentry->in_use = 1; in qla24xx_enable_msix()
4625 ret = request_irq(qentry->vector, in qla24xx_enable_msix()
4627 0, qentry->name, rsp); in qla24xx_enable_msix()
4628 qentry->have_irq = 1; in qla24xx_enable_msix()
4634 "MSI-X: unable to register handler -- %x/%d.\n", in qla24xx_enable_msix()
4635 qentry->vector, ret); in qla24xx_enable_msix()
4637 ha->mqenable = 0; in qla24xx_enable_msix()
4641 /* Enable MSI-X vector for response queue update for queue 0 */ in qla24xx_enable_msix()
4643 (ha->msixbase && ha->mqiobase && ha->max_qpairs)) in qla24xx_enable_msix()
4644 ha->mqenable = 1; in qla24xx_enable_msix()
4646 ha->mqenable = 0; in qla24xx_enable_msix()
4650 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues); in qla24xx_enable_msix()
4653 ha->mqiobase, ha->max_rsp_queues, ha->max_req_queues); in qla24xx_enable_msix()
4659 pci_free_irq_vectors(ha->pdev); in qla24xx_enable_msix()
4667 device_reg_t *reg = ha->iobase; in qla2x00_request_irqs()
4668 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); in qla2x00_request_irqs()
4670 /* If possible, enable MSI-X. */ in qla2x00_request_irqs()
4679 if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && in qla2x00_request_irqs()
4680 (ha->pdev->subsystem_device == 0x7040 || in qla2x00_request_irqs()
4681 ha->pdev->subsystem_device == 0x7041 || in qla2x00_request_irqs()
4682 ha->pdev->subsystem_device == 0x1705)) { in qla2x00_request_irqs()
4684 "MSI-X: Unsupported ISP 2432 SSVID/SSDID (0x%X,0x%X).\n", in qla2x00_request_irqs()
4685 ha->pdev->subsystem_vendor, in qla2x00_request_irqs()
4686 ha->pdev->subsystem_device); in qla2x00_request_irqs()
4690 if (IS_QLA2432(ha) && (ha->pdev->revision < QLA_MSIX_CHIP_REV_24XX)) { in qla2x00_request_irqs()
4692 "MSI-X; Unsupported ISP2432 (0x%X, 0x%X).\n", in qla2x00_request_irqs()
4693 ha->pdev->revision, QLA_MSIX_CHIP_REV_24XX); in qla2x00_request_irqs()
4700 "MSI-X: Enabled (0x%X, 0x%X).\n", in qla2x00_request_irqs()
4701 ha->chip_revision, ha->fw_attributes); in qla2x00_request_irqs()
4708 "Falling back-to MSI mode -- ret=%d.\n", ret); in qla2x00_request_irqs()
4715 ret = pci_alloc_irq_vectors(ha->pdev, 1, 1, PCI_IRQ_MSI); in qla2x00_request_irqs()
4719 ha->flags.msi_enabled = 1; in qla2x00_request_irqs()
4722 "Falling back-to INTa mode -- ret=%d.\n", ret); in qla2x00_request_irqs()
4726 if (!ha->flags.msi_enabled && IS_QLA82XX(ha)) in qla2x00_request_irqs()
4729 ret = request_irq(ha->pdev->irq, ha->isp_ops->intr_handler, in qla2x00_request_irqs()
4730 ha->flags.msi_enabled ? 0 : IRQF_SHARED, in qla2x00_request_irqs()
4735 ha->pdev->irq); in qla2x00_request_irqs()
4737 } else if (!ha->flags.msi_enabled) { in qla2x00_request_irqs()
4740 ha->flags.mr_intr_valid = 1; in qla2x00_request_irqs()
4741 /* Set max_qpair to 0, as MSI-X and MSI in not enabled */ in qla2x00_request_irqs()
4742 ha->max_qpairs = 0; in qla2x00_request_irqs()
4749 spin_lock_irq(&ha->hardware_lock); in qla2x00_request_irqs()
4750 wrt_reg_word(&reg->isp.semaphore, 0); in qla2x00_request_irqs()
4751 spin_unlock_irq(&ha->hardware_lock); in qla2x00_request_irqs()
4760 struct qla_hw_data *ha = vha->hw; in qla2x00_free_irqs()
4766 * We need to check that ha->rsp_q_map is valid in case we are called in qla2x00_free_irqs()
4769 if (!ha->rsp_q_map || !ha->rsp_q_map[0]) in qla2x00_free_irqs()
4771 rsp = ha->rsp_q_map[0]; in qla2x00_free_irqs()
4773 if (ha->flags.msix_enabled) { in qla2x00_free_irqs()
4774 for (i = 0; i < ha->msix_count; i++) { in qla2x00_free_irqs()
4775 qentry = &ha->msix_entries[i]; in qla2x00_free_irqs()
4776 if (qentry->have_irq) { in qla2x00_free_irqs()
4777 irq_set_affinity_notifier(qentry->vector, NULL); in qla2x00_free_irqs()
4778 free_irq(pci_irq_vector(ha->pdev, i), qentry->handle); in qla2x00_free_irqs()
4781 kfree(ha->msix_entries); in qla2x00_free_irqs()
4782 ha->msix_entries = NULL; in qla2x00_free_irqs()
4783 ha->flags.msix_enabled = 0; in qla2x00_free_irqs()
4785 "Disabled MSI-X.\n"); in qla2x00_free_irqs()
4787 free_irq(pci_irq_vector(ha->pdev, 0), rsp); in qla2x00_free_irqs()
4791 pci_free_irq_vectors(ha->pdev); in qla2x00_free_irqs()
4798 scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); in qla25xx_request_irq()
4801 scnprintf(msix->name, sizeof(msix->name), in qla25xx_request_irq()
4802 "qla2xxx%lu_qpair%d", vha->host_no, qpair->id); in qla25xx_request_irq()
4803 ret = request_irq(msix->vector, intr->handler, 0, msix->name, qpair); in qla25xx_request_irq()
4806 "MSI-X: Unable to register handler -- %x/%d.\n", in qla25xx_request_irq()
4807 msix->vector, ret); in qla25xx_request_irq()
4810 msix->have_irq = 1; in qla25xx_request_irq()
4811 msix->handle = qpair; in qla25xx_request_irq()