Lines Matching refs:io_req

11 void qedf_cmd_timer_set(struct qedf_ctx *qedf, struct qedf_ioreq *io_req,  in qedf_cmd_timer_set()  argument
14 queue_delayed_work(qedf->timer_work_queue, &io_req->timeout_work, in qedf_cmd_timer_set()
21 struct qedf_ioreq *io_req = in qedf_cmd_timeout() local
26 if (io_req == NULL) { in qedf_cmd_timeout()
31 fcport = io_req->fcport; in qedf_cmd_timeout()
32 if (io_req->fcport == NULL) { in qedf_cmd_timeout()
39 switch (io_req->cmd_type) { in qedf_cmd_timeout()
44 io_req->xid); in qedf_cmd_timeout()
49 io_req->xid); in qedf_cmd_timeout()
51 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
52 complete(&io_req->abts_done); in qedf_cmd_timeout()
59 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_cmd_timeout()
62 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_cmd_timeout()
74 io_req->xid); in qedf_cmd_timeout()
78 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_cmd_timeout()
80 kref_get(&io_req->refcount); in qedf_cmd_timeout()
87 io_req->xid); in qedf_cmd_timeout()
88 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
89 io_req->event = QEDF_IOREQ_EV_ELS_TMO; in qedf_cmd_timeout()
91 if (io_req->cb_func && io_req->cb_arg) { in qedf_cmd_timeout()
92 io_req->cb_func(io_req->cb_arg); in qedf_cmd_timeout()
93 io_req->cb_arg = NULL; in qedf_cmd_timeout()
95 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_cmd_timeout()
99 "xid=0x%x.\n", io_req->xid); in qedf_cmd_timeout()
100 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
101 io_req->event = QEDF_IOREQ_EV_ELS_TMO; in qedf_cmd_timeout()
102 qedf_process_seq_cleanup_compl(qedf, NULL, io_req); in qedf_cmd_timeout()
106 "Hit default case, xid=0x%x.\n", io_req->xid); in qedf_cmd_timeout()
120 struct qedf_ioreq *io_req; in qedf_cmd_mgr_free() local
152 io_req = &cmgr->cmds[i]; in qedf_cmd_mgr_free()
153 kfree(io_req->sgl_task_params); in qedf_cmd_mgr_free()
154 kfree(io_req->task_params); in qedf_cmd_mgr_free()
156 if (io_req->sense_buffer) in qedf_cmd_mgr_free()
158 QEDF_SCSI_SENSE_BUFFERSIZE, io_req->sense_buffer, in qedf_cmd_mgr_free()
159 io_req->sense_buffer_dma); in qedf_cmd_mgr_free()
160 cancel_delayed_work_sync(&io_req->rrq_work); in qedf_cmd_mgr_free()
169 struct qedf_ioreq *io_req = in qedf_handle_rrq() local
172 atomic_set(&io_req->state, QEDFC_CMD_ST_RRQ_ACTIVE); in qedf_handle_rrq()
173 qedf_send_rrq(io_req); in qedf_handle_rrq()
181 struct qedf_ioreq *io_req; in qedf_cmd_mgr_alloc() local
220 io_req = &cmgr->cmds[i]; in qedf_cmd_mgr_alloc()
221 INIT_DELAYED_WORK(&io_req->timeout_work, qedf_cmd_timeout); in qedf_cmd_mgr_alloc()
223 io_req->xid = xid++; in qedf_cmd_mgr_alloc()
225 INIT_DELAYED_WORK(&io_req->rrq_work, qedf_handle_rrq); in qedf_cmd_mgr_alloc()
228 io_req->sense_buffer = dma_alloc_coherent(&qedf->pdev->dev, in qedf_cmd_mgr_alloc()
229 QEDF_SCSI_SENSE_BUFFERSIZE, &io_req->sense_buffer_dma, in qedf_cmd_mgr_alloc()
231 if (!io_req->sense_buffer) { in qedf_cmd_mgr_alloc()
238 io_req->task_params = kzalloc(sizeof(*io_req->task_params), in qedf_cmd_mgr_alloc()
240 if (!io_req->task_params) { in qedf_cmd_mgr_alloc()
251 io_req->sgl_task_params = kzalloc( in qedf_cmd_mgr_alloc()
253 if (!io_req->sgl_task_params) { in qedf_cmd_mgr_alloc()
307 struct qedf_ioreq *io_req = NULL; in qedf_alloc_cmd() local
342 io_req = &cmd_mgr->cmds[cmd_mgr->idx]; in qedf_alloc_cmd()
348 if (!io_req->alloc) in qedf_alloc_cmd()
357 if (test_bit(QEDF_CMD_DIRTY, &io_req->flags)) in qedf_alloc_cmd()
360 io_req->xid); in qedf_alloc_cmd()
363 io_req->flags = 0; in qedf_alloc_cmd()
364 io_req->alloc = 1; in qedf_alloc_cmd()
369 xid = io_req->xid; in qedf_alloc_cmd()
372 io_req->cmd_mgr = cmd_mgr; in qedf_alloc_cmd()
373 io_req->fcport = fcport; in qedf_alloc_cmd()
376 io_req->sc_cmd = NULL; in qedf_alloc_cmd()
377 io_req->lun = -1; in qedf_alloc_cmd()
380 kref_init(&io_req->refcount); /* ID: 001 */ in qedf_alloc_cmd()
381 atomic_set(&io_req->state, QEDFC_CMD_ST_IO_ACTIVE); in qedf_alloc_cmd()
385 bd_tbl = io_req->bd_tbl = cmd_mgr->io_bdt_pool[xid]; in qedf_alloc_cmd()
388 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_alloc_cmd()
391 bd_tbl->io_req = io_req; in qedf_alloc_cmd()
392 io_req->cmd_type = cmd_type; in qedf_alloc_cmd()
393 io_req->tm_flags = 0; in qedf_alloc_cmd()
396 io_req->rx_buf_off = 0; in qedf_alloc_cmd()
397 io_req->tx_buf_off = 0; in qedf_alloc_cmd()
398 io_req->rx_id = 0xffff; /* No OX_ID */ in qedf_alloc_cmd()
400 return io_req; in qedf_alloc_cmd()
408 static void qedf_free_mp_resc(struct qedf_ioreq *io_req) in qedf_free_mp_resc() argument
410 struct qedf_mp_req *mp_req = &(io_req->mp_req); in qedf_free_mp_resc()
411 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_free_mp_resc()
439 struct qedf_ioreq *io_req = in qedf_release_cmd() local
441 struct qedf_cmd_mgr *cmd_mgr = io_req->cmd_mgr; in qedf_release_cmd()
442 struct qedf_rport *fcport = io_req->fcport; in qedf_release_cmd()
445 if (io_req->cmd_type == QEDF_SCSI_CMD) { in qedf_release_cmd()
448 io_req, io_req->xid); in qedf_release_cmd()
449 WARN_ON(io_req->sc_cmd); in qedf_release_cmd()
452 if (io_req->cmd_type == QEDF_ELS || in qedf_release_cmd()
453 io_req->cmd_type == QEDF_TASK_MGMT_CMD) in qedf_release_cmd()
454 qedf_free_mp_resc(io_req); in qedf_release_cmd()
458 atomic_set(&io_req->state, QEDF_CMD_ST_INACTIVE); in qedf_release_cmd()
465 io_req->task_retry_identifier++; in qedf_release_cmd()
466 io_req->fcport = NULL; in qedf_release_cmd()
468 clear_bit(QEDF_CMD_DIRTY, &io_req->flags); in qedf_release_cmd()
469 io_req->cpu = 0; in qedf_release_cmd()
471 io_req->fcport = NULL; in qedf_release_cmd()
472 io_req->alloc = 0; in qedf_release_cmd()
476 static int qedf_map_sg(struct qedf_ioreq *io_req) in qedf_map_sg() argument
478 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_map_sg()
482 struct scsi_sge *bd = io_req->bd_tbl->bd_tbl; in qedf_map_sg()
495 io_req->sge_type = QEDF_IOREQ_UNKNOWN_SGE; in qedf_map_sg()
497 if (sg_count <= 8 || io_req->io_req_flags == QEDF_READ) in qedf_map_sg()
498 io_req->sge_type = QEDF_IOREQ_FAST_SGE; in qedf_map_sg()
509 if (io_req->sge_type == QEDF_IOREQ_UNKNOWN_SGE && (i) && in qedf_map_sg()
511 io_req->sge_type = QEDF_IOREQ_SLOW_SGE; in qedf_map_sg()
522 if (io_req->sge_type == QEDF_IOREQ_UNKNOWN_SGE) in qedf_map_sg()
523 io_req->sge_type = QEDF_IOREQ_FAST_SGE; in qedf_map_sg()
528 scsi_bufflen(sc), io_req->xid); in qedf_map_sg()
533 static int qedf_build_bd_list_from_sg(struct qedf_ioreq *io_req) in qedf_build_bd_list_from_sg() argument
535 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_build_bd_list_from_sg()
536 struct scsi_sge *bd = io_req->bd_tbl->bd_tbl; in qedf_build_bd_list_from_sg()
540 bd_count = qedf_map_sg(io_req); in qedf_build_bd_list_from_sg()
548 io_req->bd_tbl->bd_valid = bd_count; in qedf_build_bd_list_from_sg()
553 static void qedf_build_fcp_cmnd(struct qedf_ioreq *io_req, in qedf_build_fcp_cmnd() argument
556 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_build_fcp_cmnd()
567 fcp_cmnd->fc_tm_flags = io_req->tm_flags; in qedf_build_fcp_cmnd()
568 fcp_cmnd->fc_flags = io_req->io_req_flags; in qedf_build_fcp_cmnd()
572 if (io_req->cmd_type == QEDF_TASK_MGMT_CMD) { in qedf_build_fcp_cmnd()
584 if (io_req->cmd_type != QEDF_TASK_MGMT_CMD) in qedf_build_fcp_cmnd()
588 fcp_cmnd->fc_dl = htonl(io_req->data_xfer_len); in qedf_build_fcp_cmnd()
592 struct qedf_ioreq *io_req, struct e4_fcoe_task_context *task_ctx, in qedf_init_task() argument
596 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_init_task()
597 struct io_bdt *bd_tbl = io_req->bd_tbl; in qedf_init_task()
609 io_req->task = task_ctx; in qedf_init_task()
611 memset(io_req->task_params, 0, sizeof(struct fcoe_task_params)); in qedf_init_task()
612 memset(io_req->sgl_task_params, 0, sizeof(struct scsi_sgl_task_params)); in qedf_init_task()
615 if (io_req->cmd_type == QEDF_TASK_MGMT_CMD) { in qedf_init_task()
620 tx_io_size = io_req->data_xfer_len; in qedf_init_task()
623 rx_io_size = io_req->data_xfer_len; in qedf_init_task()
628 io_req->task_params->context = task_ctx; in qedf_init_task()
629 io_req->task_params->sqe = sqe; in qedf_init_task()
630 io_req->task_params->task_type = task_type; in qedf_init_task()
631 io_req->task_params->tx_io_size = tx_io_size; in qedf_init_task()
632 io_req->task_params->rx_io_size = rx_io_size; in qedf_init_task()
633 io_req->task_params->conn_cid = fcport->fw_cid; in qedf_init_task()
634 io_req->task_params->itid = io_req->xid; in qedf_init_task()
635 io_req->task_params->cq_rss_number = cq_idx; in qedf_init_task()
636 io_req->task_params->is_tape_device = fcport->dev_type; in qedf_init_task()
639 if (io_req->cmd_type != QEDF_TASK_MGMT_CMD) { in qedf_init_task()
641 io_req->sgl_task_params->sgl = bd_tbl->bd_tbl; in qedf_init_task()
642 io_req->sgl_task_params->sgl_phys_addr.lo = in qedf_init_task()
644 io_req->sgl_task_params->sgl_phys_addr.hi = in qedf_init_task()
646 io_req->sgl_task_params->num_sges = bd_count; in qedf_init_task()
647 io_req->sgl_task_params->total_buffer_size = in qedf_init_task()
648 scsi_bufflen(io_req->sc_cmd); in qedf_init_task()
649 if (io_req->sge_type == QEDF_IOREQ_SLOW_SGE) in qedf_init_task()
650 io_req->sgl_task_params->small_mid_sge = 1; in qedf_init_task()
652 io_req->sgl_task_params->small_mid_sge = 0; in qedf_init_task()
656 sense_data_buffer_phys_addr.lo = U64_LO(io_req->sense_buffer_dma); in qedf_init_task()
657 sense_data_buffer_phys_addr.hi = U64_HI(io_req->sense_buffer_dma); in qedf_init_task()
660 qedf_build_fcp_cmnd(io_req, (struct fcp_cmnd *)tmp_fcp_cmnd); in qedf_init_task()
669 init_initiator_rw_fcoe_task(io_req->task_params, in qedf_init_task()
670 io_req->sgl_task_params, in qedf_init_task()
672 io_req->task_retry_identifier, fcp_cmnd); in qedf_init_task()
675 if (io_req->sge_type == QEDF_IOREQ_SLOW_SGE) in qedf_init_task()
681 void qedf_init_mp_task(struct qedf_ioreq *io_req, in qedf_init_mp_task() argument
684 struct qedf_mp_req *mp_req = &(io_req->mp_req); in qedf_init_mp_task()
685 struct qedf_rport *fcport = io_req->fcport; in qedf_init_mp_task()
686 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_init_mp_task()
694 io_req->cmd_type); in qedf_init_mp_task()
704 io_req->task = task_ctx; in qedf_init_mp_task()
707 io_req->task_params->context = task_ctx; in qedf_init_mp_task()
708 io_req->task_params->sqe = sqe; in qedf_init_mp_task()
709 io_req->task_params->task_type = FCOE_TASK_TYPE_MIDPATH; in qedf_init_mp_task()
710 io_req->task_params->tx_io_size = io_req->data_xfer_len; in qedf_init_mp_task()
712 io_req->task_params->rx_io_size = PAGE_SIZE; in qedf_init_mp_task()
713 io_req->task_params->conn_cid = fcport->fw_cid; in qedf_init_mp_task()
714 io_req->task_params->itid = io_req->xid; in qedf_init_mp_task()
716 io_req->task_params->cq_rss_number = 0; in qedf_init_mp_task()
717 io_req->task_params->is_tape_device = fcport->dev_type; in qedf_init_mp_task()
721 fc_hdr->fh_ox_id = io_req->xid; in qedf_init_mp_task()
739 tx_sgl_task_params.total_buffer_size = io_req->data_xfer_len; in qedf_init_mp_task()
756 init_initiator_midpath_unsolicited_fcoe_task(io_req->task_params, in qedf_init_mp_task()
805 static void qedf_trace_io(struct qedf_rport *fcport, struct qedf_ioreq *io_req, in qedf_trace_io() argument
810 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_trace_io()
818 io_log->task_id = io_req->xid; in qedf_trace_io()
830 io_log->refcount = kref_read(&io_req->refcount); in qedf_trace_io()
834 io_log->req_cpu = io_req->cpu; in qedf_trace_io()
838 io_log->req_cpu = io_req->cpu; in qedf_trace_io()
839 io_log->int_cpu = io_req->int_cpu; in qedf_trace_io()
843 io_log->sge_type = io_req->sge_type; in qedf_trace_io()
852 int qedf_post_io_req(struct qedf_rport *fcport, struct qedf_ioreq *io_req) in qedf_post_io_req() argument
854 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_post_io_req()
864 io_req->data_xfer_len = scsi_bufflen(sc_cmd); in qedf_post_io_req()
865 sc_cmd->SCp.ptr = (char *)io_req; in qedf_post_io_req()
866 io_req->sge_type = QEDF_IOREQ_FAST_SGE; /* Assume fast SGL by default */ in qedf_post_io_req()
869 io_req->cpu = smp_processor_id(); in qedf_post_io_req()
872 io_req->io_req_flags = QEDF_READ; in qedf_post_io_req()
875 io_req->io_req_flags = QEDF_WRITE; in qedf_post_io_req()
878 io_req->io_req_flags = 0; in qedf_post_io_req()
882 xid = io_req->xid; in qedf_post_io_req()
885 if (qedf_build_bd_list_from_sg(io_req)) { in qedf_post_io_req()
888 io_req->sc_cmd = NULL; in qedf_post_io_req()
889 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
897 io_req->sc_cmd = NULL; in qedf_post_io_req()
898 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
903 io_req->lun = (int)sc_cmd->device->lun; in qedf_post_io_req()
916 io_req->sc_cmd = NULL; in qedf_post_io_req()
917 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
921 qedf_init_task(fcport, lport, io_req, task_ctx, sqe); in qedf_post_io_req()
927 set_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_post_io_req()
929 if (qedf_io_tracing && io_req->sc_cmd) in qedf_post_io_req()
930 qedf_trace_io(fcport, io_req, QEDF_IO_TRACE_REQ); in qedf_post_io_req()
943 struct qedf_ioreq *io_req; in qedf_queuecommand() local
1032 io_req = qedf_alloc_cmd(fcport, QEDF_SCSI_CMD); in qedf_queuecommand()
1033 if (!io_req) { in qedf_queuecommand()
1039 io_req->sc_cmd = sc_cmd; in qedf_queuecommand()
1043 if (qedf_post_io_req(fcport, io_req)) { in qedf_queuecommand()
1056 static void qedf_parse_fcp_rsp(struct qedf_ioreq *io_req, in qedf_parse_fcp_rsp() argument
1059 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_parse_fcp_rsp()
1060 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_parse_fcp_rsp()
1066 io_req->fcp_status = FC_GOOD; in qedf_parse_fcp_rsp()
1067 io_req->fcp_resid = 0; in qedf_parse_fcp_rsp()
1070 io_req->fcp_resid = fcp_rsp->fcp_resid; in qedf_parse_fcp_rsp()
1072 io_req->scsi_comp_flags = rsp_flags; in qedf_parse_fcp_rsp()
1073 CMD_SCSI_STATUS(sc_cmd) = io_req->cdb_status = in qedf_parse_fcp_rsp()
1084 io_req->fcp_rsp_len = fcp_rsp_len; in qedf_parse_fcp_rsp()
1085 io_req->fcp_sns_len = fcp_sns_len; in qedf_parse_fcp_rsp()
1086 rsp_info = sense_data = io_req->sense_buffer; in qedf_parse_fcp_rsp()
1091 io_req->fcp_rsp_code = rsp_info[3]; in qedf_parse_fcp_rsp()
1093 "fcp_rsp_code = %d\n", io_req->fcp_rsp_code); in qedf_parse_fcp_rsp()
1113 static void qedf_unmap_sg_list(struct qedf_ctx *qedf, struct qedf_ioreq *io_req) in qedf_unmap_sg_list() argument
1115 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_unmap_sg_list()
1117 if (io_req->bd_tbl->bd_valid && sc && scsi_sg_count(sc)) { in qedf_unmap_sg_list()
1120 io_req->bd_tbl->bd_valid = 0; in qedf_unmap_sg_list()
1125 struct qedf_ioreq *io_req) in qedf_scsi_completion() argument
1136 if (!io_req) in qedf_scsi_completion()
1141 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_scsi_completion()
1142 test_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags) || in qedf_scsi_completion()
1143 test_bit(QEDF_CMD_IN_ABORT, &io_req->flags)) { in qedf_scsi_completion()
1146 io_req->xid); in qedf_scsi_completion()
1150 sc_cmd = io_req->sc_cmd; in qedf_scsi_completion()
1182 fcport = io_req->fcport; in qedf_scsi_completion()
1193 io_req->xid); in qedf_scsi_completion()
1197 qedf_parse_fcp_rsp(io_req, fcp_rsp); in qedf_scsi_completion()
1199 qedf_unmap_sg_list(qedf, io_req); in qedf_scsi_completion()
1202 if (io_req->fcp_rsp_len > 3 && io_req->fcp_rsp_code) { in qedf_scsi_completion()
1205 "fcp_rsp_code=%d.\n", io_req->xid, io_req->fcp_rsp_len, in qedf_scsi_completion()
1206 io_req->fcp_rsp_code); in qedf_scsi_completion()
1216 io_req->xid, fcp_rsp->rsp_flags.flags, in qedf_scsi_completion()
1217 io_req->fcp_resid, in qedf_scsi_completion()
1221 if (io_req->cdb_status == 0) in qedf_scsi_completion()
1222 sc_cmd->result = (DID_ERROR << 16) | io_req->cdb_status; in qedf_scsi_completion()
1224 sc_cmd->result = (DID_OK << 16) | io_req->cdb_status; in qedf_scsi_completion()
1234 switch (io_req->fcp_status) { in qedf_scsi_completion()
1236 if (io_req->cdb_status == 0) { in qedf_scsi_completion()
1240 refcount = kref_read(&io_req->refcount); in qedf_scsi_completion()
1246 sc_cmd->device->lun, io_req->xid, in qedf_scsi_completion()
1249 io_req->cdb_status, io_req->fcp_resid, in qedf_scsi_completion()
1251 sc_cmd->result = (DID_OK << 16) | io_req->cdb_status; in qedf_scsi_completion()
1253 if (io_req->cdb_status == SAM_STAT_TASK_SET_FULL || in qedf_scsi_completion()
1254 io_req->cdb_status == SAM_STAT_BUSY) { in qedf_scsi_completion()
1269 if (io_req->cdb_status == in qedf_scsi_completion()
1276 if (io_req->fcp_resid) in qedf_scsi_completion()
1277 scsi_set_resid(sc_cmd, io_req->fcp_resid); in qedf_scsi_completion()
1311 io_req->fcp_status); in qedf_scsi_completion()
1317 qedf_trace_io(fcport, io_req, QEDF_IO_TRACE_RSP); in qedf_scsi_completion()
1323 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_scsi_completion()
1325 io_req->sc_cmd = NULL; in qedf_scsi_completion()
1328 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_scsi_completion()
1332 void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req, in qedf_scsi_done() argument
1338 if (!io_req) { in qedf_scsi_done()
1343 if (test_and_set_bit(QEDF_CMD_ERR_SCSI_DONE, &io_req->flags)) { in qedf_scsi_done()
1346 io_req); in qedf_scsi_done()
1354 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_scsi_done()
1356 sc_cmd = io_req->sc_cmd; in qedf_scsi_done()
1407 qedf_unmap_sg_list(qedf, io_req); in qedf_scsi_done()
1410 refcount = kref_read(&io_req->refcount); in qedf_scsi_done()
1427 qedf_trace_io(io_req->fcport, io_req, QEDF_IO_TRACE_RSP); in qedf_scsi_done()
1429 io_req->sc_cmd = NULL; in qedf_scsi_done()
1432 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_scsi_done()
1440 io_req->sc_cmd = NULL; in qedf_scsi_done()
1441 kref_put(&io_req->refcount, qedf_release_cmd); /* ID: 001 */ in qedf_scsi_done()
1449 struct qedf_ioreq *io_req) in qedf_process_warning_compl() argument
1452 struct qedf_rport *fcport = io_req->fcport; in qedf_process_warning_compl()
1459 io_req, io_req->xid); in qedf_process_warning_compl()
1463 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "Warning CQE, " in qedf_process_warning_compl()
1464 "xid=0x%x\n", io_req->xid); in qedf_process_warning_compl()
1465 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), in qedf_process_warning_compl()
1469 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "tx_buff_off=%08x, " in qedf_process_warning_compl()
1491 if (!test_bit(QEDF_CMD_SRR_SENT, &io_req->flags)) { in qedf_process_warning_compl()
1492 io_req->rx_buf_off = in qedf_process_warning_compl()
1494 io_req->tx_buf_off = in qedf_process_warning_compl()
1496 io_req->rx_id = cqe->cqe_info.err_info.rx_id; in qedf_process_warning_compl()
1497 rval = qedf_send_rec(io_req); in qedf_process_warning_compl()
1511 init_completion(&io_req->abts_done); in qedf_process_warning_compl()
1512 rval = qedf_initiate_abts(io_req, true); in qedf_process_warning_compl()
1519 struct qedf_ioreq *io_req) in qedf_process_error_detect() argument
1523 if (io_req == NULL) { in qedf_process_error_detect()
1528 if (io_req->fcport == NULL) { in qedf_process_error_detect()
1535 "cqe is NULL for io_req %p\n", io_req); in qedf_process_error_detect()
1539 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "Error detection CQE, " in qedf_process_error_detect()
1540 "xid=0x%x\n", io_req->xid); in qedf_process_error_detect()
1541 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), in qedf_process_error_detect()
1545 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "tx_buff_off=%08x, " in qedf_process_error_detect()
1552 if (test_bit(QEDF_RPORT_IN_TARGET_RESET, &io_req->fcport->flags) || in qedf_process_error_detect()
1553 (test_bit(QEDF_RPORT_IN_LUN_RESET, &io_req->fcport->flags) && in qedf_process_error_detect()
1554 io_req->sc_cmd->device->lun == (u64)io_req->fcport->lun_reset_lun)) { in qedf_process_error_detect()
1557 io_req->xid); in qedf_process_error_detect()
1566 init_completion(&io_req->abts_done); in qedf_process_error_detect()
1567 rval = qedf_initiate_abts(io_req, true); in qedf_process_error_detect()
1605 struct qedf_ioreq *io_req; in qedf_flush_active_ios() local
1666 io_req = &cmd_mgr->cmds[i]; in qedf_flush_active_ios()
1668 if (!io_req) in qedf_flush_active_ios()
1670 if (!io_req->fcport) in qedf_flush_active_ios()
1675 if (io_req->alloc) { in qedf_flush_active_ios()
1676 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags)) { in qedf_flush_active_ios()
1677 if (io_req->cmd_type == QEDF_SCSI_CMD) in qedf_flush_active_ios()
1680 io_req->xid); in qedf_flush_active_ios()
1688 if (io_req->fcport != fcport) in qedf_flush_active_ios()
1696 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags)) { in qedf_flush_active_ios()
1697 refcount = kref_read(&io_req->refcount); in qedf_flush_active_ios()
1700 io_req->xid, io_req->cmd_type, refcount); in qedf_flush_active_ios()
1704 if (atomic_read(&io_req->state) == in qedf_flush_active_ios()
1707 (&io_req->rrq_work)) { in qedf_flush_active_ios()
1710 io_req->xid); in qedf_flush_active_ios()
1712 kref_put(&io_req->refcount, in qedf_flush_active_ios()
1720 if (io_req->cmd_type == QEDF_ELS && in qedf_flush_active_ios()
1722 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1726 io_req, io_req->xid); in qedf_flush_active_ios()
1729 qedf_initiate_cleanup(io_req, false); in qedf_flush_active_ios()
1731 qedf_flush_els_req(qedf, io_req); in qedf_flush_active_ios()
1740 if (io_req->cmd_type == QEDF_ABTS) { in qedf_flush_active_ios()
1742 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1746 io_req, io_req->xid); in qedf_flush_active_ios()
1749 if (lun != -1 && io_req->lun != lun) in qedf_flush_active_ios()
1753 "Flushing abort xid=0x%x.\n", io_req->xid); in qedf_flush_active_ios()
1755 if (cancel_delayed_work_sync(&io_req->rrq_work)) { in qedf_flush_active_ios()
1758 io_req->xid); in qedf_flush_active_ios()
1759 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1762 if (cancel_delayed_work_sync(&io_req->timeout_work)) { in qedf_flush_active_ios()
1765 io_req->xid); in qedf_flush_active_ios()
1766 qedf_initiate_cleanup(io_req, true); in qedf_flush_active_ios()
1770 complete(&io_req->abts_done); in qedf_flush_active_ios()
1771 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_flush_active_ios()
1773 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1779 if (!io_req->sc_cmd) in qedf_flush_active_ios()
1781 if (!io_req->sc_cmd->device) { in qedf_flush_active_ios()
1784 io_req->sc_cmd); in qedf_flush_active_ios()
1786 io_req->sc_cmd = NULL; in qedf_flush_active_ios()
1787 qedf_initiate_cleanup(io_req, false); in qedf_flush_active_ios()
1788 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1792 if (io_req->lun != lun) in qedf_flush_active_ios()
1800 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1803 "io_req=0x%p xid=0x%x\n", io_req, io_req->xid); in qedf_flush_active_ios()
1808 "Cleanup xid=0x%x.\n", io_req->xid); in qedf_flush_active_ios()
1812 qedf_initiate_cleanup(io_req, true); in qedf_flush_active_ios()
1815 kref_put(&io_req->refcount, qedf_release_cmd); /* ID: 004 */ in qedf_flush_active_ios()
1837 io_req = &cmd_mgr->cmds[i]; in qedf_flush_active_ios()
1838 if (io_req->fcport && in qedf_flush_active_ios()
1839 io_req->fcport == fcport) { in qedf_flush_active_ios()
1841 kref_read(&io_req->refcount); in qedf_flush_active_ios()
1843 &io_req->flags); in qedf_flush_active_ios()
1846 io_req, io_req->xid, in qedf_flush_active_ios()
1847 io_req->flags, in qedf_flush_active_ios()
1848 io_req->sc_cmd, in qedf_flush_active_ios()
1850 io_req->cmd_type); in qedf_flush_active_ios()
1871 int qedf_initiate_abts(struct qedf_ioreq *io_req, bool return_scsi_cmd_on_abts) in qedf_initiate_abts() argument
1874 struct qedf_rport *fcport = io_req->fcport; in qedf_initiate_abts()
1927 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_initiate_abts()
1928 test_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags) || in qedf_initiate_abts()
1929 test_bit(QEDF_CMD_IN_ABORT, &io_req->flags)) { in qedf_initiate_abts()
1932 io_req->xid, io_req->sc_cmd); in qedf_initiate_abts()
1937 kref_get(&io_req->refcount); in qedf_initiate_abts()
1939 xid = io_req->xid; in qedf_initiate_abts()
1944 io_req->cmd_type = QEDF_ABTS; in qedf_initiate_abts()
1945 io_req->return_scsi_cmd_on_abts = return_scsi_cmd_on_abts; in qedf_initiate_abts()
1947 set_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_initiate_abts()
1948 refcount = kref_read(&io_req->refcount); in qedf_initiate_abts()
1953 qedf_cmd_timer_set(qedf, io_req, QEDF_ABORT_TIMEOUT); in qedf_initiate_abts()
1960 io_req->task_params->sqe = sqe; in qedf_initiate_abts()
1962 init_initiator_abort_fcoe_task(io_req->task_params); in qedf_initiate_abts()
1974 struct qedf_ioreq *io_req) in qedf_process_abts_compl() argument
1978 struct qedf_rport *fcport = io_req->fcport; in qedf_process_abts_compl()
1981 "0x%x cmd_type = %d\n", io_req->xid, io_req->cmd_type); in qedf_process_abts_compl()
1992 io_req->xid); in qedf_process_abts_compl()
2004 io_req->xid); in qedf_process_abts_compl()
2008 if (!cancel_delayed_work(&io_req->timeout_work)) { in qedf_process_abts_compl()
2017 io_req->event = QEDF_IOREQ_EV_ABORT_SUCCESS; in qedf_process_abts_compl()
2018 rc = kref_get_unless_zero(&io_req->refcount); /* ID: 003 */ in qedf_process_abts_compl()
2022 io_req->xid); in qedf_process_abts_compl()
2029 queue_delayed_work(qedf->dpc_wq, &io_req->rrq_work, in qedf_process_abts_compl()
2031 atomic_set(&io_req->state, QEDFC_CMD_ST_RRQ_WAIT); in qedf_process_abts_compl()
2037 io_req->event = QEDF_IOREQ_EV_ABORT_FAILED; in qedf_process_abts_compl()
2044 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_process_abts_compl()
2046 if (io_req->sc_cmd) { in qedf_process_abts_compl()
2047 if (!io_req->return_scsi_cmd_on_abts) in qedf_process_abts_compl()
2050 io_req->xid); in qedf_process_abts_compl()
2051 if (io_req->return_scsi_cmd_on_abts) in qedf_process_abts_compl()
2052 qedf_scsi_done(qedf, io_req, DID_ERROR); in qedf_process_abts_compl()
2056 complete(&io_req->abts_done); in qedf_process_abts_compl()
2058 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_process_abts_compl()
2061 int qedf_init_mp_req(struct qedf_ioreq *io_req) in qedf_init_mp_req() argument
2066 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_init_mp_req()
2072 mp_req = (struct qedf_mp_req *)&(io_req->mp_req); in qedf_init_mp_req()
2075 if (io_req->cmd_type != QEDF_ELS) { in qedf_init_mp_req()
2077 io_req->data_xfer_len = mp_req->req_len; in qedf_init_mp_req()
2079 mp_req->req_len = io_req->data_xfer_len; in qedf_init_mp_req()
2085 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2094 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2104 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2112 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2165 int qedf_initiate_cleanup(struct qedf_ioreq *io_req, in qedf_initiate_cleanup() argument
2177 fcport = io_req->fcport; in qedf_initiate_cleanup()
2195 if (io_req->cmd_type == QEDF_ELS) { in qedf_initiate_cleanup()
2199 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_initiate_cleanup()
2200 test_and_set_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags)) { in qedf_initiate_cleanup()
2203 io_req->xid); in qedf_initiate_cleanup()
2206 set_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2213 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2217 if (io_req->cmd_type == QEDF_CLEANUP) { in qedf_initiate_cleanup()
2220 io_req->xid, io_req->cmd_type); in qedf_initiate_cleanup()
2221 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2225 refcount = kref_read(&io_req->refcount); in qedf_initiate_cleanup()
2229 io_req->xid, io_req->sc_cmd, io_req->cmd_type, io_req->flags, in qedf_initiate_cleanup()
2233 io_req->cmd_type = QEDF_CLEANUP; in qedf_initiate_cleanup()
2234 io_req->return_scsi_cmd_on_abts = return_scsi_cmd_on_abts; in qedf_initiate_cleanup()
2236 init_completion(&io_req->cleanup_done); in qedf_initiate_cleanup()
2243 io_req->task_params->sqe = sqe; in qedf_initiate_cleanup()
2245 init_initiator_cleanup_fcoe_task(io_req->task_params); in qedf_initiate_cleanup()
2250 tmo = wait_for_completion_timeout(&io_req->cleanup_done, in qedf_initiate_cleanup()
2257 "xid=%x.\n", io_req->xid); in qedf_initiate_cleanup()
2258 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2267 if (io_req->tm_flags == FCP_TMF_LUN_RESET || in qedf_initiate_cleanup()
2268 io_req->tm_flags == FCP_TMF_TGT_RESET) { in qedf_initiate_cleanup()
2269 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_initiate_cleanup()
2270 io_req->sc_cmd = NULL; in qedf_initiate_cleanup()
2271 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_initiate_cleanup()
2272 complete(&io_req->tm_done); in qedf_initiate_cleanup()
2275 if (io_req->sc_cmd) { in qedf_initiate_cleanup()
2276 if (!io_req->return_scsi_cmd_on_abts) in qedf_initiate_cleanup()
2279 io_req->xid); in qedf_initiate_cleanup()
2280 if (io_req->return_scsi_cmd_on_abts) in qedf_initiate_cleanup()
2281 qedf_scsi_done(qedf, io_req, DID_ERROR); in qedf_initiate_cleanup()
2285 io_req->event = QEDF_IOREQ_EV_CLEANUP_SUCCESS; in qedf_initiate_cleanup()
2287 io_req->event = QEDF_IOREQ_EV_CLEANUP_FAILED; in qedf_initiate_cleanup()
2293 struct qedf_ioreq *io_req) in qedf_process_cleanup_compl() argument
2296 io_req->xid); in qedf_process_cleanup_compl()
2298 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_process_cleanup_compl()
2301 complete(&io_req->cleanup_done); in qedf_process_cleanup_compl()
2307 struct qedf_ioreq *io_req; in qedf_execute_tmf() local
2331 io_req = qedf_alloc_cmd(fcport, QEDF_TASK_MGMT_CMD); in qedf_execute_tmf()
2332 if (!io_req) { in qedf_execute_tmf()
2344 io_req->sc_cmd = sc_cmd; in qedf_execute_tmf()
2345 io_req->fcport = fcport; in qedf_execute_tmf()
2346 io_req->cmd_type = QEDF_TASK_MGMT_CMD; in qedf_execute_tmf()
2349 io_req->cpu = smp_processor_id(); in qedf_execute_tmf()
2352 io_req->io_req_flags = QEDF_READ; in qedf_execute_tmf()
2353 io_req->data_xfer_len = 0; in qedf_execute_tmf()
2354 io_req->tm_flags = tm_flags; in qedf_execute_tmf()
2357 io_req->return_scsi_cmd_on_abts = false; in qedf_execute_tmf()
2360 xid = io_req->xid; in qedf_execute_tmf()
2368 init_completion(&io_req->tm_done); in qedf_execute_tmf()
2376 qedf_init_task(fcport, lport, io_req, task, sqe); in qedf_execute_tmf()
2381 set_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_execute_tmf()
2382 tmo = wait_for_completion_timeout(&io_req->tm_done, in qedf_execute_tmf()
2389 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_execute_tmf()
2390 io_req->sc_cmd = NULL; in qedf_execute_tmf()
2393 if (io_req->fcp_rsp_code == 0) in qedf_execute_tmf()
2408 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_execute_tmf()
2436 struct qedf_ioreq *io_req = NULL; in qedf_initiate_tmf() local
2455 io_req = (struct qedf_ioreq *)sc_cmd->SCp.ptr; in qedf_initiate_tmf()
2456 ref_cnt = kref_read(&io_req->refcount); in qedf_initiate_tmf()
2459 io_req, io_req->xid, ref_cnt); in qedf_initiate_tmf()
2525 struct qedf_ioreq *io_req) in qedf_process_tmf_compl() argument
2529 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_process_tmf_compl()
2532 qedf_parse_fcp_rsp(io_req, fcp_rsp); in qedf_process_tmf_compl()
2534 io_req->sc_cmd = NULL; in qedf_process_tmf_compl()
2535 complete(&io_req->tm_done); in qedf_process_tmf_compl()