Lines Matching +full:io +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-only
22 #define snic_cmd_tag(sc) (scsi_cmd_to_rq(sc)->tag)
100 u32 hash = snic_cmd_tag(sc) & (SNIC_IO_LOCKS - 1); in snic_io_lock_hash()
102 return &snic->io_req_lock[hash]; in snic_io_lock_hash()
108 return &snic->io_req_lock[tag & (SNIC_IO_LOCKS - 1)]; in snic_io_lock_tag()
128 SNIC_SCSI_DBG(snic->shost, in snic_release_req_buf()
130 sc, snic_cmd_tag(sc), rqi, rqi->req, rqi->abort_req, in snic_release_req_buf()
131 rqi->dr_req, snic_ioreq_state_to_str(CMD_STATE(sc)), in snic_release_req_buf()
134 if (req->u.icmnd.sense_addr) in snic_release_req_buf()
135 dma_unmap_single(&snic->pdev->dev, in snic_release_req_buf()
136 le64_to_cpu(req->u.icmnd.sense_addr), in snic_release_req_buf()
164 sgd = (struct snic_sg_desc *) req_to_sgl(rqi->req); in snic_queue_icmnd_req()
167 sgd->addr = cpu_to_le64(sg_dma_address(sg)); in snic_queue_icmnd_req()
168 sgd->len = cpu_to_le32(sg_dma_len(sg)); in snic_queue_icmnd_req()
169 sgd->_resvd = 0; in snic_queue_icmnd_req()
174 pa = dma_map_single(&snic->pdev->dev, in snic_queue_icmnd_req()
175 sc->sense_buffer, in snic_queue_icmnd_req()
178 if (dma_mapping_error(&snic->pdev->dev, pa)) { in snic_queue_icmnd_req()
179 SNIC_HOST_ERR(snic->shost, in snic_queue_icmnd_req()
181 sc->sense_buffer, snic_cmd_tag(sc)); in snic_queue_icmnd_req()
182 ret = -ENOMEM; in snic_queue_icmnd_req()
187 int_to_scsilun(sc->device->lun, &lun); in snic_queue_icmnd_req()
188 if (sc->sc_data_direction == DMA_FROM_DEVICE) in snic_queue_icmnd_req()
190 if (sc->sc_data_direction == DMA_TO_DEVICE) in snic_queue_icmnd_req()
194 snic_icmnd_init(rqi->req, in snic_queue_icmnd_req()
196 snic->config.hid, /* hid */ in snic_queue_icmnd_req()
199 rqi->tgt_id, in snic_queue_icmnd_req()
201 sc->cmnd, in snic_queue_icmnd_req()
202 sc->cmd_len, in snic_queue_icmnd_req()
205 (ulong) req_to_sgl(rqi->req), in snic_queue_icmnd_req()
209 atomic64_inc(&snic->s_stats.io.active); in snic_queue_icmnd_req()
210 ret = snic_queue_wq_desc(snic, rqi->req, rqi->req_len); in snic_queue_icmnd_req()
212 atomic64_dec(&snic->s_stats.io.active); in snic_queue_icmnd_req()
213 SNIC_HOST_ERR(snic->shost, in snic_queue_icmnd_req()
217 snic_stats_update_active_ios(&snic->s_stats); in snic_queue_icmnd_req()
223 * snic_issue_scsi_req : Prepares IO request and Issues to FW.
242 SNIC_TRC((u16)snic->shost->host_no, tag, (ulong) sc, 0, in snic_issue_scsi_req()
243 sc->cmnd[0], sg_cnt, CMD_STATE(sc)); in snic_issue_scsi_req()
245 SNIC_HOST_ERR(snic->shost, "issue_sc:Failed to map SG List.\n"); in snic_issue_scsi_req()
246 ret = -ENOMEM; in snic_issue_scsi_req()
254 ret = -ENOMEM; in snic_issue_scsi_req()
259 rqi->tgt_id = tgt->id; in snic_issue_scsi_req()
260 rqi->sc = sc; in snic_issue_scsi_req()
272 SNIC_HOST_ERR(snic->shost, in snic_issue_scsi_req()
286 SNIC_TRC(snic->shost->host_no, tag, (ulong) sc, 0, 0, 0, in snic_issue_scsi_req()
290 u32 qtime = jiffies - rqi->start_time; in snic_issue_scsi_req()
291 struct snic_io_stats *iostats = &snic->s_stats.io; in snic_issue_scsi_req()
293 if (io_sz > atomic64_read(&iostats->max_io_sz)) in snic_issue_scsi_req()
294 atomic64_set(&iostats->max_io_sz, io_sz); in snic_issue_scsi_req()
296 if (qtime > atomic64_read(&iostats->max_qtime)) in snic_issue_scsi_req()
297 atomic64_set(&iostats->max_qtime, qtime); in snic_issue_scsi_req()
299 SNIC_SCSI_DBG(snic->shost, in snic_issue_scsi_req()
303 SNIC_TRC(snic->shost->host_no, tag, (ulong) sc, (ulong) rqi, in snic_issue_scsi_req()
325 tgt = starget_to_tgt(scsi_target(sc->device)); in snic_queuecommand()
328 SNIC_HOST_ERR(shost, "Tgt %p id %d Not Ready.\n", tgt, tgt->id); in snic_queuecommand()
329 atomic64_inc(&snic->s_stats.misc.tgt_not_rdy); in snic_queuecommand()
330 sc->result = ret; in snic_queuecommand()
342 atomic_inc(&snic->ios_inflight); in snic_queuecommand()
345 sc, snic_cmd_tag(sc), sc->cmnd[0], sc->device->lun); in snic_queuecommand()
353 atomic_dec(&snic->ios_inflight); in snic_queuecommand()
360 * caller should hold IO lock
392 * Processes IO's error states
404 atomic64_inc(&snic->s_stats.misc.io_tmo); in snic_process_io_failed_state()
409 atomic64_inc(&snic->s_stats.misc.io_aborted); in snic_process_io_failed_state()
414 atomic64_inc(&snic->s_stats.misc.data_cnt_mismat); in snic_process_io_failed_state()
415 scsi_set_resid(sc, le32_to_cpu(icmnd_cmpl->resid)); in snic_process_io_failed_state()
420 atomic64_inc(&snic->s_stats.fw.out_of_res); in snic_process_io_failed_state()
425 atomic64_inc(&snic->s_stats.io.io_not_found); in snic_process_io_failed_state()
430 atomic64_inc(&snic->s_stats.misc.sgl_inval); in snic_process_io_failed_state()
435 atomic64_inc(&snic->s_stats.fw.io_errs); in snic_process_io_failed_state()
440 atomic64_inc(&snic->s_stats.fw.scsi_errs); in snic_process_io_failed_state()
454 SNIC_SCSI_DBG(snic->shost, in snic_process_io_failed_state()
460 SNIC_HOST_ERR(snic->shost, "fw returns failed status %s flags 0x%llx\n", in snic_process_io_failed_state()
463 /* Set sc->result */ in snic_process_io_failed_state()
464 sc->result = (res << 16) | icmnd_cmpl->scsi_status; in snic_process_io_failed_state()
489 u8 scsi_stat = icmnd_cmpl->scsi_status; in snic_process_icmnd_cmpl_status()
492 /* Mark the IO as complete */ in snic_process_icmnd_cmpl_status()
496 sc->result = (DID_OK << 16) | scsi_stat; in snic_process_icmnd_cmpl_status()
499 scsi_set_resid(sc, le32_to_cpu(icmnd_cmpl->resid)); in snic_process_icmnd_cmpl_status()
501 if (icmnd_cmpl->flags & SNIC_ICMND_CMPL_UNDR_RUN) in snic_process_icmnd_cmpl_status()
502 atomic64_inc(&snic->s_stats.misc.io_under_run); in snic_process_icmnd_cmpl_status()
504 if (icmnd_cmpl->scsi_status == SAM_STAT_TASK_SET_FULL) in snic_process_icmnd_cmpl_status()
505 atomic64_inc(&snic->s_stats.misc.qfull); in snic_process_icmnd_cmpl_status()
510 atomic64_inc(&snic->s_stats.io.fail); in snic_process_icmnd_cmpl_status()
511 SNIC_HOST_ERR(snic->shost, in snic_process_icmnd_cmpl_status()
512 "icmnd_cmpl: IO Failed : Hdr Status %s flags 0x%llx\n", in snic_process_icmnd_cmpl_status()
539 snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx); in snic_icmnd_cmpl_handler()
540 icmnd_cmpl = &fwreq->u.icmnd_cmpl; in snic_icmnd_cmpl_handler()
541 sc_stat = icmnd_cmpl->scsi_status; in snic_icmnd_cmpl_handler()
543 SNIC_SCSI_DBG(snic->shost, in snic_icmnd_cmpl_handler()
547 if (cmnd_id >= snic->max_tag_id) { in snic_icmnd_cmpl_handler()
548 SNIC_HOST_ERR(snic->shost, in snic_icmnd_cmpl_handler()
554 sc = scsi_host_find_tag(snic->shost, cmnd_id); in snic_icmnd_cmpl_handler()
558 atomic64_inc(&snic->s_stats.io.sc_null); in snic_icmnd_cmpl_handler()
559 SNIC_HOST_ERR(snic->shost, in snic_icmnd_cmpl_handler()
565 SNIC_TRC(snic->shost->host_no, cmnd_id, 0, in snic_icmnd_cmpl_handler()
567 (u64)sc_stat << 8 | (u64)icmnd_cmpl->flags), in snic_icmnd_cmpl_handler()
568 (ulong) fwreq, le32_to_cpu(icmnd_cmpl->resid), ctx); in snic_icmnd_cmpl_handler()
577 SNIC_SCSI_DBG(snic->shost, in snic_icmnd_cmpl_handler()
579 sc->device->lun, sc, sc->cmnd[0], snic_cmd_tag(sc), in snic_icmnd_cmpl_handler()
591 atomic64_inc(&snic->s_stats.io.req_null); in snic_icmnd_cmpl_handler()
595 SNIC_HOST_ERR(snic->shost, in snic_icmnd_cmpl_handler()
603 start_time = rqi->start_time; in snic_icmnd_cmpl_handler()
605 /* firmware completed the io */ in snic_icmnd_cmpl_handler()
606 rqi->io_cmpl = 1; in snic_icmnd_cmpl_handler()
609 * if SCSI-ML has already issued abort on this command, in snic_icmnd_cmpl_handler()
610 * ignore completion of the IO. The abts path will clean it up in snic_icmnd_cmpl_handler()
616 snic_stats_update_io_cmpl(&snic->s_stats); in snic_icmnd_cmpl_handler()
622 SNIC_SCSI_DBG(snic->shost, in snic_icmnd_cmpl_handler()
626 sc, sc_stat, le32_to_cpu(icmnd_cmpl->resid), in snic_icmnd_cmpl_handler()
629 SNIC_TRC(snic->shost->host_no, cmnd_id, (ulong) sc, in snic_icmnd_cmpl_handler()
630 jiffies_to_msecs(jiffies - start_time), (ulong) fwreq, in snic_icmnd_cmpl_handler()
638 SNIC_HOST_ERR(snic->shost, in snic_icmnd_cmpl_handler()
639 "icmnd_cmpl:IO Failed, sc 0x%p Tag %d Cmd %x Hdr Status %s flags 0x%llx\n", in snic_icmnd_cmpl_handler()
640 sc, sc->cmnd[0], cmnd_id, in snic_icmnd_cmpl_handler()
650 /* For now, consider only successful IO. */ in snic_icmnd_cmpl_handler()
655 SNIC_TRC(snic->shost->host_no, cmnd_id, (ulong) sc, in snic_icmnd_cmpl_handler()
656 jiffies_to_msecs(jiffies - start_time), (ulong) fwreq, in snic_icmnd_cmpl_handler()
662 snic_stats_update_io_cmpl(&snic->s_stats); in snic_icmnd_cmpl_handler()
673 u32 start_time = rqi->start_time; in snic_proc_dr_cmpl_locked()
677 SNIC_SCSI_DBG(snic->shost, "itmf_cmpl: Cmd State = %s\n", in snic_proc_dr_cmpl_locked()
683 SNIC_TRC(snic->shost->host_no, cmnd_id, (ulong) sc, in snic_proc_dr_cmpl_locked()
684 jiffies_to_msecs(jiffies - start_time), in snic_proc_dr_cmpl_locked()
687 SNIC_SCSI_DBG(snic->shost, in snic_proc_dr_cmpl_locked()
688 "itmf_cmpl: Terminate Pending Dev Reset Cmpl Recvd.id %x, status %s flags 0x%llx\n", in snic_proc_dr_cmpl_locked()
698 SNIC_TRC(snic->shost->host_no, cmnd_id, (ulong) sc, in snic_proc_dr_cmpl_locked()
699 jiffies_to_msecs(jiffies - start_time), in snic_proc_dr_cmpl_locked()
702 SNIC_SCSI_DBG(snic->shost, in snic_proc_dr_cmpl_locked()
703 … "itmf_cmpl:Dev Reset Completion Received after timeout. id %d cmpl status %s flags 0x%llx\n", in snic_proc_dr_cmpl_locked()
714 SNIC_SCSI_DBG(snic->shost, in snic_proc_dr_cmpl_locked()
715 "itmf_cmpl:Dev Reset Cmpl Recvd id %d cmpl status %s flags 0x%llx\n", in snic_proc_dr_cmpl_locked()
720 if (rqi->dr_done) in snic_proc_dr_cmpl_locked()
721 complete(rqi->dr_done); in snic_proc_dr_cmpl_locked()
730 struct snic_abort_stats *abt_stats = &snic->s_stats.abts; in snic_update_abort_stats()
732 SNIC_SCSI_DBG(snic->shost, "Updating Abort stats.\n"); in snic_update_abort_stats()
739 atomic64_inc(&abt_stats->fw_tmo); in snic_update_abort_stats()
743 atomic64_inc(&abt_stats->io_not_found); in snic_update_abort_stats()
747 atomic64_inc(&abt_stats->fail); in snic_update_abort_stats()
777 atomic64_inc(&snic->s_stats.io.req_null); in snic_process_itmf_cmpl()
780 SNIC_HOST_ERR(snic->shost, in snic_process_itmf_cmpl()
791 start_time = rqi->start_time; in snic_process_itmf_cmpl()
801 ret = -1; in snic_process_itmf_cmpl()
810 SNIC_SCSI_DBG(snic->shost, in snic_process_itmf_cmpl()
818 * signal completion to it. IO will be cleaned in the thread, in snic_process_itmf_cmpl()
821 if (rqi->abts_done) { in snic_process_itmf_cmpl()
822 complete(rqi->abts_done); in snic_process_itmf_cmpl()
829 sc->result = (DID_ERROR << 16); in snic_process_itmf_cmpl()
830 SNIC_SCSI_DBG(snic->shost, in snic_process_itmf_cmpl()
831 "itmf_cmpl: Completing IO. sc %p flags 0x%llx\n", in snic_process_itmf_cmpl()
838 SNIC_TRC(snic->shost->host_no, cmnd_id, (ulong) sc, in snic_process_itmf_cmpl()
839 jiffies_to_msecs(jiffies - start_time), in snic_process_itmf_cmpl()
856 /* Abort and terminate completion of device reset req */ in snic_process_itmf_cmpl()
862 SNIC_SCSI_DBG(snic->shost, in snic_process_itmf_cmpl()
863 "itmf_cmpl:dev reset abts cmpl recvd. id %d status %s flags 0x%llx\n", in snic_process_itmf_cmpl()
867 if (rqi->abts_done) in snic_process_itmf_cmpl()
868 complete(rqi->abts_done); in snic_process_itmf_cmpl()
876 SNIC_HOST_ERR(snic->shost, in snic_process_itmf_cmpl()
879 SNIC_HOST_ERR(snic->shost, in snic_process_itmf_cmpl()
880 "itmf_cmpl:Unexpected itmf io stat %s Tag = 0x%x flags 0x%llx\n", in snic_process_itmf_cmpl()
884 ret = -1; in snic_process_itmf_cmpl()
909 snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx); in snic_itmf_cmpl_handler()
910 SNIC_SCSI_DBG(snic->shost, in snic_itmf_cmpl_handler()
914 itmf_cmpl = &fwreq->u.itmf_cmpl; in snic_itmf_cmpl_handler()
915 SNIC_SCSI_DBG(snic->shost, in snic_itmf_cmpl_handler()
917 le32_to_cpu(itmf_cmpl->nterminated), itmf_cmpl->flags); in snic_itmf_cmpl_handler()
919 /* spl case, dev reset issued through ioctl */ in snic_itmf_cmpl_handler()
922 sc = rqi->sc; in snic_itmf_cmpl_handler()
927 if ((cmnd_id & SNIC_TAG_MASK) >= snic->max_tag_id) { in snic_itmf_cmpl_handler()
928 SNIC_HOST_ERR(snic->shost, in snic_itmf_cmpl_handler()
936 sc = scsi_host_find_tag(snic->shost, cmnd_id & SNIC_TAG_MASK); in snic_itmf_cmpl_handler()
941 atomic64_inc(&snic->s_stats.io.sc_null); in snic_itmf_cmpl_handler()
942 SNIC_HOST_ERR(snic->shost, in snic_itmf_cmpl_handler()
943 "Itmf_cmpl: sc is NULL - Hdr Stat %s Tag 0x%x\n", in snic_itmf_cmpl_handler()
957 struct snic_stats *st = &snic->s_stats; in snic_hba_reset_scsi_cleanup()
960 SNIC_SCSI_DBG(snic->shost, "HBA Reset scsi cleanup.\n"); in snic_hba_reset_scsi_cleanup()
964 act_ios = atomic64_read(&st->io.active); in snic_hba_reset_scsi_cleanup()
965 atomic64_add(act_ios, &st->io.compl); in snic_hba_reset_scsi_cleanup()
966 atomic64_sub(act_ios, &st->io.active); in snic_hba_reset_scsi_cleanup()
968 act_fwreqs = atomic64_read(&st->fw.actv_reqs); in snic_hba_reset_scsi_cleanup()
969 atomic64_sub(act_fwreqs, &st->fw.actv_reqs); in snic_hba_reset_scsi_cleanup()
993 snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx); in snic_hba_reset_cmpl_handler()
994 SNIC_HOST_INFO(snic->shost, in snic_hba_reset_cmpl_handler()
995 "reset_cmpl:Tag %d ctx %lx cmpl status %s HBA Reset Completion received.\n", in snic_hba_reset_cmpl_handler()
998 SNIC_SCSI_DBG(snic->shost, in snic_hba_reset_cmpl_handler()
1002 /* spl case, host reset issued through ioctl */ in snic_hba_reset_cmpl_handler()
1005 SNIC_HOST_INFO(snic->shost, in snic_hba_reset_cmpl_handler()
1008 sc = rqi->sc; in snic_hba_reset_cmpl_handler()
1013 if (cmnd_id >= snic->max_tag_id) { in snic_hba_reset_cmpl_handler()
1014 SNIC_HOST_ERR(snic->shost, in snic_hba_reset_cmpl_handler()
1022 sc = scsi_host_find_tag(snic->shost, cmnd_id); in snic_hba_reset_cmpl_handler()
1025 atomic64_inc(&snic->s_stats.io.sc_null); in snic_hba_reset_cmpl_handler()
1026 SNIC_HOST_ERR(snic->shost, in snic_hba_reset_cmpl_handler()
1027 "reset_cmpl: sc is NULL - Hdr Stat %s Tag 0x%x\n", in snic_hba_reset_cmpl_handler()
1034 SNIC_HOST_INFO(snic->shost, in snic_hba_reset_cmpl_handler()
1041 if (!snic->remove_wait) { in snic_hba_reset_cmpl_handler()
1043 SNIC_HOST_ERR(snic->shost, in snic_hba_reset_cmpl_handler()
1044 "reset_cmpl:host reset completed after timeout\n"); in snic_hba_reset_cmpl_handler()
1054 atomic64_inc(&snic->s_stats.io.req_null); in snic_hba_reset_cmpl_handler()
1057 SNIC_HOST_ERR(snic->shost, in snic_hba_reset_cmpl_handler()
1075 /* Careful locking between snic_lock and io lock */ in snic_hba_reset_cmpl_handler()
1077 spin_lock_irqsave(&snic->snic_lock, gflags); in snic_hba_reset_cmpl_handler()
1080 spin_unlock_irqrestore(&snic->snic_lock, gflags); in snic_hba_reset_cmpl_handler()
1082 if (snic->remove_wait) in snic_hba_reset_cmpl_handler()
1083 complete(snic->remove_wait); in snic_hba_reset_cmpl_handler()
1086 atomic64_inc(&snic->s_stats.reset.hba_reset_cmpl); in snic_hba_reset_cmpl_handler()
1090 if (snic->config.xpt_type == SNIC_DAS) in snic_hba_reset_cmpl_handler()
1093 SNIC_SCSI_DBG(snic->shost, "reset_cmpl: Queuing discovery work.\n"); in snic_hba_reset_cmpl_handler()
1094 queue_work(snic_glob->event_q, &snic->disc_work); in snic_hba_reset_cmpl_handler()
1102 SNIC_HOST_INFO(snic->shost, "Message Ack Received.\n"); in snic_msg_ack_handler()
1113 struct snic_async_evnotify *aen = &fwreq->u.async_ev; in snic_aen_handler()
1116 snic_io_hdr_dec(&fwreq->hdr, &typ, &hdr_stat, &cmnd_id, &hid, &ctx); in snic_aen_handler()
1117 SNIC_SCSI_DBG(snic->shost, in snic_aen_handler()
1121 event_id = le32_to_cpu(aen->ev_id); in snic_aen_handler()
1125 SNIC_HOST_INFO(snic->shost, "aen:TGT_OFFLINE Event Recvd.\n"); in snic_aen_handler()
1129 SNIC_HOST_INFO(snic->shost, "aen:TGT_ONLINE Event Recvd.\n"); in snic_aen_handler()
1133 SNIC_HOST_INFO(snic->shost, "aen:LUN_OFFLINE Event Recvd.\n"); in snic_aen_handler()
1137 SNIC_HOST_INFO(snic->shost, "aen:LUN_ONLINE Event Recvd.\n"); in snic_aen_handler()
1141 SNIC_HOST_INFO(snic->shost, "aen:Config Change Event Recvd.\n"); in snic_aen_handler()
1145 SNIC_HOST_INFO(snic->shost, "aen:TGT_ADD Event Recvd.\n"); in snic_aen_handler()
1149 SNIC_HOST_INFO(snic->shost, "aen:TGT_DEL Event Recvd.\n"); in snic_aen_handler()
1153 SNIC_HOST_INFO(snic->shost, "aen:LUN_ADD Event Recvd.\n"); in snic_aen_handler()
1157 SNIC_HOST_INFO(snic->shost, "aen:LUN_DEL Event Recvd.\n"); in snic_aen_handler()
1161 SNIC_HOST_INFO(snic->shost, "aen:DISC_CMPL Event Recvd.\n"); in snic_aen_handler()
1165 SNIC_HOST_INFO(snic->shost, "aen:Unknown Event Recvd.\n"); in snic_aen_handler()
1175 * Routine to process CQ entries(IO Completions) posted by fw.
1188 if ((fwreq->hdr.type >= SNIC_RSP_REPORT_TGTS_CMPL) && in snic_io_cmpl_handler()
1189 (fwreq->hdr.type <= SNIC_RSP_BOOT_LUNS_CMPL)) in snic_io_cmpl_handler()
1190 atomic64_dec(&snic->s_stats.fw.actv_reqs); in snic_io_cmpl_handler()
1192 SNIC_BUG_ON((fwreq->hdr.type > SNIC_RSP_BOOT_LUNS_CMPL) && in snic_io_cmpl_handler()
1193 (fwreq->hdr.type < SNIC_MSG_ASYNC_EVNOTIFY)); in snic_io_cmpl_handler()
1196 switch (fwreq->hdr.status) { in snic_io_cmpl_handler()
1198 SNIC_HOST_ERR(snic->shost, in snic_io_cmpl_handler()
1203 SNIC_HOST_ERR(snic->shost, in snic_io_cmpl_handler()
1208 switch (fwreq->hdr.type) { in snic_io_cmpl_handler()
1239 SNIC_SCSI_DBG(snic->shost, in snic_io_cmpl_handler()
1241 fwreq->hdr.type); in snic_io_cmpl_handler()
1246 cmpl_time = jiffies - start; in snic_io_cmpl_handler()
1247 if (cmpl_time > atomic64_read(&snic->s_stats.io.max_cmpl_time)) in snic_io_cmpl_handler()
1248 atomic64_set(&snic->s_stats.io.max_cmpl_time, cmpl_time); in snic_io_cmpl_handler()
1264 struct snic_misc_stats *misc_stats = &snic->s_stats.misc; in snic_fwcq_cmpl_handler()
1266 for (cq_idx = snic->wq_count; cq_idx < snic->cq_count; cq_idx++) { in snic_fwcq_cmpl_handler()
1267 nent_per_cq = vnic_cq_fw_service(&snic->cq[cq_idx], in snic_fwcq_cmpl_handler()
1272 if (nent_per_cq > atomic64_read(&misc_stats->max_cq_ents)) in snic_fwcq_cmpl_handler()
1273 atomic64_set(&misc_stats->max_cq_ents, nent_per_cq); in snic_fwcq_cmpl_handler()
1281 * Use rqi->tm_tag for passing special tags.
1282 * @req_id : aborted request's tag, -1 for lun reset.
1293 int tm_tag = snic_cmd_tag(sc) | rqi->tm_tag; in snic_queue_itmf_req()
1297 SNIC_BUG_ON(!rqi->tm_tag); in snic_queue_itmf_req()
1300 int_to_scsilun(sc->device->lun, &lun); in snic_queue_itmf_req()
1305 snic->config.hid, in snic_queue_itmf_req()
1309 rqi->tgt_id, in snic_queue_itmf_req()
1317 * prior.SNIC_BUG_ON(completion_done(&rqi->done)); in snic_queue_itmf_req()
1322 SNIC_HOST_ERR(snic->shost, in snic_queue_itmf_req()
1326 SNIC_SCSI_DBG(snic->shost, in snic_queue_itmf_req()
1327 "qitmf:Queuing ITMF(%d) Req sc %p, rqi %p, req_id %d, tag %d (req_id)- Success.", in snic_queue_itmf_req()
1344 return -EBUSY; in snic_issue_tm_req()
1346 atomic_inc(&snic->ios_inflight); in snic_issue_tm_req()
1348 SNIC_SCSI_DBG(snic->shost, in snic_issue_tm_req()
1362 ret = -ENOMEM; in snic_issue_tm_req()
1371 SNIC_HOST_ERR(snic->shost, in snic_issue_tm_req()
1375 SNIC_SCSI_DBG(snic->shost, in snic_issue_tm_req()
1376 "issu_tmreq: Queueing ITMF(%d) Req, sc %p, rqi %p, req_id %d tag %x - Success.\n", in snic_issue_tm_req()
1380 atomic_dec(&snic->ios_inflight); in snic_issue_tm_req()
1394 SNIC_SCSI_DBG(snic->shost, "q_abtreq: sc %p, rqi %p, tag %x, tmf %d\n", in snic_queue_abort_req()
1398 rqi->tm_tag |= SNIC_TAG_ABORT; in snic_queue_abort_req()
1418 atomic64_inc(&snic->s_stats.io.req_null); in snic_abort_finish()
1421 SNIC_SCSI_DBG(snic->shost, in snic_abort_finish()
1429 rqi->abts_done = NULL; in snic_abort_finish()
1438 atomic64_inc(&snic->s_stats.abts.drv_tmo); in snic_abort_finish()
1439 SNIC_SCSI_DBG(snic->shost, in snic_abort_finish()
1452 * the # IO timeouts == 2, will cause the LUN offline. in snic_abort_finish()
1453 * Call scsi_done to complete the IO. in snic_abort_finish()
1455 sc->result = (DID_ERROR << 16); in snic_abort_finish()
1467 SNIC_HOST_INFO(snic->shost, in snic_abort_finish()
1494 tgt = starget_to_tgt(scsi_target(sc->device)); in snic_send_abort_and_wait()
1495 if ((snic_tgt_chkready(tgt) != 0) && (tgt->tdata.typ == SNIC_TGT_SAN)) in snic_send_abort_and_wait()
1521 SNIC_HOST_ERR(snic->shost, in snic_send_abort_and_wait()
1530 rqi->abts_done = &tm_done; in snic_send_abort_and_wait()
1537 SNIC_BUG_ON(!rqi->abts_done); in snic_send_abort_and_wait()
1545 * the completion won't be done till mid-layer, since abot in snic_send_abort_and_wait()
1551 SNIC_SCSI_DBG(snic->shost, "send_abt_cmd: TAG 0x%x\n", tag); in snic_send_abort_and_wait()
1558 atomic64_inc(&snic->s_stats.abts.q_fail); in snic_send_abort_and_wait()
1559 SNIC_HOST_ERR(snic->shost, in snic_send_abort_and_wait()
1560 "send_abt_cmd: IO w/ Tag 0x%x fail w/ err %d flags 0x%llx\n", in snic_send_abort_and_wait()
1568 rqi->abts_done = NULL; in snic_send_abort_and_wait()
1578 atomic64_inc(&snic->s_stats.abts.num); in snic_send_abort_and_wait()
1585 SNIC_SCSI_DBG(snic->shost, in snic_send_abort_and_wait()
1594 * Queued an abort IO, wait for its completion. in snic_send_abort_and_wait()
1606 * A SCSI IO is represent by snic_ioreq in the driver.
1607 * The snic_ioreq is linked to the SCSI Cmd, thus a link with the ULP'S IO
1612 struct snic *snic = shost_priv(sc->device->host); in snic_abort_cmd()
1616 SNIC_SCSI_DBG(snic->shost, "abt_cmd:sc %p :0x%x :req = %p :tag = %d\n", in snic_abort_cmd()
1617 sc, sc->cmnd[0], scsi_cmd_to_rq(sc), tag); in snic_abort_cmd()
1620 SNIC_HOST_ERR(snic->shost, in snic_abort_cmd()
1636 SNIC_TRC(snic->shost->host_no, tag, (ulong) sc, in snic_abort_cmd()
1637 jiffies_to_msecs(jiffies - start_time), 0, in snic_abort_cmd()
1640 SNIC_SCSI_DBG(snic->shost, in snic_abort_cmd()
1661 lr_sdev = lr_sc->device; in snic_is_abts_pending()
1664 for (tag = 0; tag < snic->max_tag_id; tag++) { in snic_is_abts_pending()
1668 sc = scsi_host_find_tag(snic->shost, tag); in snic_is_abts_pending()
1670 if (!sc || (lr_sc && (sc->device != lr_sdev || sc == lr_sc))) { in snic_is_abts_pending()
1684 * Found IO that is still pending w/ firmware and belongs to in snic_is_abts_pending()
1685 * the LUN that is under reset, if lr_sc != NULL in snic_is_abts_pending()
1687 SNIC_SCSI_DBG(snic->shost, "Found IO in %s on LUN\n", in snic_is_abts_pending()
1718 sc = scsi_host_find_tag(snic->shost, tag); in snic_dr_clean_single_req()
1720 /* Ignore Cmd that don't belong to Lun Reset device */ in snic_dr_clean_single_req()
1721 if (!sc || sc->device != lr_sdev) in snic_dr_clean_single_req()
1737 SNIC_SCSI_DBG(snic->shost, in snic_dr_clean_single_req()
1744 SNIC_SCSI_DBG(snic->shost, in snic_dr_clean_single_req()
1745 "clean_single_req: Found IO in %s on lun\n", in snic_dr_clean_single_req()
1752 * Any pending IO issued prior to reset is expected to be in snic_dr_clean_single_req()
1754 * to indicate the IO is abort pending. in snic_dr_clean_single_req()
1755 * When IO is completed, the IO will be handed over and handled in snic_dr_clean_single_req()
1760 SNIC_BUG_ON(rqi->abts_done); in snic_dr_clean_single_req()
1763 rqi->tm_tag = SNIC_TAG_DEV_RST; in snic_dr_clean_single_req()
1765 SNIC_SCSI_DBG(snic->shost, in snic_dr_clean_single_req()
1770 rqi->abts_done = &tm_done; in snic_dr_clean_single_req()
1773 tgt = starget_to_tgt(scsi_target(sc->device)); in snic_dr_clean_single_req()
1774 if ((snic_tgt_chkready(tgt) != 0) && (tgt->tdata.typ == SNIC_TGT_SAN)) in snic_dr_clean_single_req()
1782 SNIC_HOST_ERR(snic->shost, in snic_dr_clean_single_req()
1784 sc, tag, rqi->tm_tag, CMD_FLAGS(sc)); in snic_dr_clean_single_req()
1789 rqi->abts_done = NULL; in snic_dr_clean_single_req()
1815 rqi->abts_done = NULL; in snic_dr_clean_single_req()
1819 SNIC_HOST_ERR(snic->shost, in snic_dr_clean_single_req()
1821 sc, tag, rqi->tm_tag, CMD_FLAGS(sc)); in snic_dr_clean_single_req()
1835 sc->result = (DID_ERROR << 16); in snic_dr_clean_single_req()
1851 struct scsi_device *lr_sdev = lr_sc->device; in snic_dr_clean_pending_req()
1855 for (tag = 0; tag < snic->max_tag_id; tag++) { in snic_dr_clean_pending_req()
1861 SNIC_HOST_ERR(snic->shost, "clean_err:tag = %d\n", tag); in snic_dr_clean_pending_req()
1877 SNIC_SCSI_DBG(snic->shost, "clean_pending_req: Success.\n"); in snic_dr_clean_pending_req()
1883 SNIC_HOST_ERR(snic->shost, in snic_dr_clean_pending_req()
1885 dev_name(&lr_sdev->sdev_gendev)); in snic_dr_clean_pending_req()
1908 SNIC_SCSI_DBG(snic->shost, in snic_dr_finish()
1916 rqi->dr_done = NULL; in snic_dr_finish()
1923 SNIC_SCSI_DBG(snic->shost, in snic_dr_finish()
1924 "dr_fini: Tag %x Dev Reset Timedout. flags 0x%llx\n", in snic_dr_finish()
1933 SNIC_SCSI_DBG(snic->shost, in snic_dr_finish()
1934 "dr_fini: Tag %x Dev Reset cmpl\n", in snic_dr_finish()
1940 SNIC_HOST_ERR(snic->shost, in snic_dr_finish()
1941 "dr_fini:Device Reset completed& failed.Tag = %x lr_status %s flags 0x%llx\n", in snic_dr_finish()
1951 * If any of these fail, then LUN Reset fails. in snic_dr_finish()
1953 * the lun reset command. If all cmds get cleaned, the LUN Reset in snic_dr_finish()
1960 SNIC_SCSI_DBG(snic->shost, in snic_dr_finish()
1961 "dr_fini: Device Reset Failed since could not abort all IOs. Tag = %x.\n", in snic_dr_finish()
1967 /* Cleanup LUN Reset Command */ in snic_dr_finish()
1994 /* Add special tag for device reset */ in snic_queue_dr_req()
1995 rqi->tm_tag |= SNIC_TAG_DEV_RST; in snic_queue_dr_req()
2015 SNIC_HOST_ERR(snic->shost, in snic_send_dr_and_wait()
2030 SNIC_SCSI_DBG(snic->shost, "dr: TAG = %x\n", tag); in snic_send_dr_and_wait()
2032 rqi->dr_done = &tm_done; in snic_send_dr_and_wait()
2033 SNIC_BUG_ON(!rqi->dr_done); in snic_send_dr_and_wait()
2040 * This logic still makes LUN Reset is inevitable. in snic_send_dr_and_wait()
2045 SNIC_HOST_ERR(snic->shost, in snic_send_dr_and_wait()
2046 "send_dr: IO w/ Tag 0x%x Failed err = %d. flags 0x%llx\n", in snic_send_dr_and_wait()
2054 rqi->dr_done = NULL; in snic_send_dr_and_wait()
2075 * auxillary funciton to check lun reset op is supported or not
2083 if (tgt->tdata.typ == SNIC_TGT_DAS) in snic_dev_reset_supported()
2101 start_time = rqi->start_time; in snic_unlink_and_release_req()
2111 SNIC_TRC(snic->shost->host_no, snic_cmd_tag(sc), (ulong) sc, in snic_unlink_and_release_req()
2112 jiffies_to_msecs(jiffies - start_time), (ulong) rqi, in snic_unlink_and_release_req()
2117 * SCSI Eh thread issues a LUN Reset when one or more commands on a LUN
2124 struct Scsi_Host *shost = sc->device->host; in snic_device_reset()
2133 sc, sc->cmnd[0], scsi_cmd_to_rq(sc), in snic_device_reset()
2135 dr_supp = snic_dev_reset_supported(sc->device); in snic_device_reset()
2137 /* device reset op is not supported */ in snic_device_reset()
2138 SNIC_HOST_INFO(shost, "LUN Reset Op not supported.\n"); in snic_device_reset()
2151 /* There is no tag when lun reset is issue through ioctl. */ in snic_device_reset()
2153 SNIC_HOST_INFO(snic->shost, in snic_device_reset()
2154 "Devrst: LUN Reset Recvd thru IOCTL.\n"); in snic_device_reset()
2166 rqi->tm_tag = SNIC_TAG_IOCTL_DEV_RST; in snic_device_reset()
2167 rqi->sc = sc; in snic_device_reset()
2172 SNIC_HOST_ERR(snic->shost, in snic_device_reset()
2173 "Devrst: IO w/ Tag %x Failed w/ err = %d\n", in snic_device_reset()
2184 SNIC_TRC(snic->shost->host_no, tag, (ulong) sc, in snic_device_reset()
2185 jiffies_to_msecs(jiffies - start_time), in snic_device_reset()
2188 SNIC_SCSI_DBG(snic->shost, in snic_device_reset()
2189 "Devrst: Returning from Device Reset : %s\n", in snic_device_reset()
2199 * Host Reset is the highest level of error recovery. If this fails, then
2203 * snic_issue_hba_reset : Queues FW Reset Request.
2213 int ret = -ENOMEM; in snic_issue_hba_reset()
2217 ret = -ENOMEM; in snic_issue_hba_reset()
2225 SNIC_HOST_INFO(snic->shost, "issu_hr:Host reset thru ioctl.\n"); in snic_issue_hba_reset()
2226 rqi->sc = sc; in snic_issue_hba_reset()
2237 snic->remove_wait = &wait; in snic_issue_hba_reset()
2241 snic_io_hdr_enc(&req->hdr, SNIC_REQ_HBA_RESET, 0, snic_cmd_tag(sc), in snic_issue_hba_reset()
2242 snic->config.hid, 0, (ulong) rqi); in snic_issue_hba_reset()
2244 req->u.reset.flags = 0; in snic_issue_hba_reset()
2248 SNIC_HOST_ERR(snic->shost, in snic_issue_hba_reset()
2249 "issu_hr:Queuing HBA Reset Failed. w err %d\n", in snic_issue_hba_reset()
2258 atomic64_inc(&snic->s_stats.reset.hba_resets); in snic_issue_hba_reset()
2259 SNIC_HOST_INFO(snic->shost, "Queued HBA Reset Successfully.\n"); in snic_issue_hba_reset()
2261 wait_for_completion_timeout(snic->remove_wait, in snic_issue_hba_reset()
2265 SNIC_HOST_ERR(snic->shost, "reset_cmpl: Reset Timedout.\n"); in snic_issue_hba_reset()
2266 ret = -ETIMEDOUT; in snic_issue_hba_reset()
2272 snic->remove_wait = NULL; in snic_issue_hba_reset()
2286 snic->remove_wait = NULL; in snic_issue_hba_reset()
2295 SNIC_HOST_ERR(snic->shost, in snic_issue_hba_reset()
2296 "reset:HBA Reset Failed w/ err = %d.\n", in snic_issue_hba_reset()
2313 spin_lock_irqsave(&snic->snic_lock, flags); in snic_reset()
2315 spin_unlock_irqrestore(&snic->snic_lock, flags); in snic_reset()
2316 SNIC_HOST_INFO(shost, "reset:prev reset is in progress\n"); in snic_reset()
2325 spin_unlock_irqrestore(&snic->snic_lock, flags); in snic_reset()
2329 while (atomic_read(&snic->ios_inflight)) in snic_reset()
2335 "reset:Host Reset Failed w/ err %d.\n", in snic_reset()
2337 spin_lock_irqsave(&snic->snic_lock, flags); in snic_reset()
2339 spin_unlock_irqrestore(&snic->snic_lock, flags); in snic_reset()
2340 atomic64_inc(&snic->s_stats.reset.hba_reset_fail); in snic_reset()
2356 * Host Reset is the highest level of error recovery. If this fails, then
2362 struct Scsi_Host *shost = sc->device->host; in snic_host_reset()
2367 "host reset:sc %p sc_cmd 0x%x req %p tag %d flags 0x%llx\n", in snic_host_reset()
2368 sc, sc->cmnd[0], scsi_cmd_to_rq(sc), in snic_host_reset()
2373 SNIC_TRC(shost->host_no, snic_cmd_tag(sc), (ulong) sc, in snic_host_reset()
2374 jiffies_to_msecs(jiffies - start_time), in snic_host_reset()
2388 SNIC_SCSI_DBG(snic->shost, in snic_cmpl_pending_tmreq()
2403 if (rqi->dr_done) in snic_cmpl_pending_tmreq()
2404 complete(rqi->dr_done); in snic_cmpl_pending_tmreq()
2405 else if (rqi->abts_done) in snic_cmpl_pending_tmreq()
2406 complete(rqi->abts_done); in snic_cmpl_pending_tmreq()
2422 SNIC_SCSI_DBG(snic->shost, "sc_clean: scsi cleanup.\n"); in snic_scsi_cleanup()
2424 for (tag = 0; tag < snic->max_tag_id; tag++) { in snic_scsi_cleanup()
2431 sc = scsi_host_find_tag(snic->shost, tag); in snic_scsi_cleanup()
2440 * When FW Completes reset w/o sending completions in snic_scsi_cleanup()
2456 SNIC_SCSI_DBG(snic->shost, in snic_scsi_cleanup()
2463 st_time = rqi->start_time; in snic_scsi_cleanup()
2465 SNIC_HOST_INFO(snic->shost, in snic_scsi_cleanup()
2472 sc->result = DID_TRANSPORT_DISRUPTED << 16; in snic_scsi_cleanup()
2473 SNIC_HOST_INFO(snic->shost, in snic_scsi_cleanup()
2475 sc, scsi_cmd_to_rq(sc)->tag, CMD_FLAGS(sc), rqi, in snic_scsi_cleanup()
2476 jiffies_to_msecs(jiffies - st_time)); in snic_scsi_cleanup()
2478 /* Update IO stats */ in snic_scsi_cleanup()
2479 snic_stats_update_io_cmpl(&snic->s_stats); in snic_scsi_cleanup()
2481 SNIC_TRC(snic->shost->host_no, tag, (ulong) sc, in snic_scsi_cleanup()
2482 jiffies_to_msecs(jiffies - st_time), 0, in snic_scsi_cleanup()
2493 SNIC_HOST_INFO(snic->shost, "Shutdown time SCSI Cleanup.\n"); in snic_shutdown_scsi_cleanup()
2523 SNIC_SCSI_DBG(snic->shost, in snic_internal_abort_io()
2532 SNIC_SCSI_DBG(snic->shost, in snic_internal_abort_io()
2533 "internal_abts: IO not yet issued sc 0x%p tag 0x%x flags 0x%llx state %d\n", in snic_internal_abort_io()
2546 rqi->tm_tag = SNIC_TAG_DEV_RST; in snic_internal_abort_io()
2547 SNIC_SCSI_DBG(snic->shost, "internal_abts:dev rst sc %p\n", sc); in snic_internal_abort_io()
2550 SNIC_SCSI_DBG(snic->shost, "internal_abts: Issuing abts tag %x\n", in snic_internal_abort_io()
2552 SNIC_BUG_ON(rqi->abts_done); in snic_internal_abort_io()
2557 SNIC_HOST_ERR(snic->shost, in snic_internal_abort_io()
2598 return -1; in snic_tgt_scsi_abort_io()
2601 SNIC_SCSI_DBG(snic->shost, "tgt_abt_io: Cleaning Pending IOs.\n"); in snic_tgt_scsi_abort_io()
2603 if (tgt->tdata.typ == SNIC_TGT_DAS) in snic_tgt_scsi_abort_io()
2608 for (tag = 0; tag < snic->max_tag_id; tag++) { in snic_tgt_scsi_abort_io()
2612 sc = scsi_host_find_tag(snic->shost, tag); in snic_tgt_scsi_abort_io()
2619 sc_tgt = starget_to_tgt(scsi_target(sc->device)); in snic_tgt_scsi_abort_io()
2629 SNIC_HOST_ERR(snic->shost, in snic_tgt_scsi_abort_io()
2640 SNIC_SCSI_DBG(snic->shost, "tgt_abt_io: abt_cnt = %d\n", abt_cnt); in snic_tgt_scsi_abort_io()