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
27 if (io_req == NULL) { in qedf_cmd_timeout()
32 fcport = io_req->fcport; in qedf_cmd_timeout()
33 if (io_req->fcport == NULL) { in qedf_cmd_timeout()
40 switch (io_req->cmd_type) { in qedf_cmd_timeout()
45 io_req->xid); in qedf_cmd_timeout()
50 io_req->xid); in qedf_cmd_timeout()
52 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
53 complete(&io_req->abts_done); in qedf_cmd_timeout()
60 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_cmd_timeout()
63 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_cmd_timeout()
75 io_req->xid); in qedf_cmd_timeout()
79 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_cmd_timeout()
81 kref_get(&io_req->refcount); in qedf_cmd_timeout()
88 io_req->xid); 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 op = io_req->cb_arg->op; in qedf_cmd_timeout()
93 io_req->cb_func(io_req->cb_arg); in qedf_cmd_timeout()
94 io_req->cb_arg = NULL; in qedf_cmd_timeout()
96 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
97 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_cmd_timeout()
101 "xid=0x%x.\n", io_req->xid); in qedf_cmd_timeout()
102 qedf_initiate_cleanup(io_req, true); in qedf_cmd_timeout()
103 io_req->event = QEDF_IOREQ_EV_ELS_TMO; in qedf_cmd_timeout()
104 qedf_process_seq_cleanup_compl(qedf, NULL, io_req); in qedf_cmd_timeout()
108 "Hit default case, xid=0x%x.\n", io_req->xid); in qedf_cmd_timeout()
122 struct qedf_ioreq *io_req; in qedf_cmd_mgr_free() local
154 io_req = &cmgr->cmds[i]; in qedf_cmd_mgr_free()
155 kfree(io_req->sgl_task_params); in qedf_cmd_mgr_free()
156 kfree(io_req->task_params); in qedf_cmd_mgr_free()
158 if (io_req->sense_buffer) in qedf_cmd_mgr_free()
160 QEDF_SCSI_SENSE_BUFFERSIZE, io_req->sense_buffer, in qedf_cmd_mgr_free()
161 io_req->sense_buffer_dma); in qedf_cmd_mgr_free()
162 cancel_delayed_work_sync(&io_req->rrq_work); in qedf_cmd_mgr_free()
171 struct qedf_ioreq *io_req = in qedf_handle_rrq() local
174 atomic_set(&io_req->state, QEDFC_CMD_ST_RRQ_ACTIVE); in qedf_handle_rrq()
175 qedf_send_rrq(io_req); in qedf_handle_rrq()
183 struct qedf_ioreq *io_req; in qedf_cmd_mgr_alloc() local
222 io_req = &cmgr->cmds[i]; in qedf_cmd_mgr_alloc()
223 INIT_DELAYED_WORK(&io_req->timeout_work, qedf_cmd_timeout); in qedf_cmd_mgr_alloc()
225 io_req->xid = xid++; in qedf_cmd_mgr_alloc()
227 INIT_DELAYED_WORK(&io_req->rrq_work, qedf_handle_rrq); in qedf_cmd_mgr_alloc()
230 io_req->sense_buffer = dma_alloc_coherent(&qedf->pdev->dev, in qedf_cmd_mgr_alloc()
231 QEDF_SCSI_SENSE_BUFFERSIZE, &io_req->sense_buffer_dma, in qedf_cmd_mgr_alloc()
233 if (!io_req->sense_buffer) { in qedf_cmd_mgr_alloc()
240 io_req->task_params = kzalloc(sizeof(*io_req->task_params), in qedf_cmd_mgr_alloc()
242 if (!io_req->task_params) { in qedf_cmd_mgr_alloc()
253 io_req->sgl_task_params = kzalloc( in qedf_cmd_mgr_alloc()
255 if (!io_req->sgl_task_params) { in qedf_cmd_mgr_alloc()
309 struct qedf_ioreq *io_req = NULL; in qedf_alloc_cmd() local
344 io_req = &cmd_mgr->cmds[cmd_mgr->idx]; in qedf_alloc_cmd()
350 if (!io_req->alloc) in qedf_alloc_cmd()
359 if (test_bit(QEDF_CMD_DIRTY, &io_req->flags)) in qedf_alloc_cmd()
362 io_req->xid); in qedf_alloc_cmd()
365 io_req->flags = 0; in qedf_alloc_cmd()
366 io_req->alloc = 1; in qedf_alloc_cmd()
371 xid = io_req->xid; in qedf_alloc_cmd()
374 io_req->cmd_mgr = cmd_mgr; in qedf_alloc_cmd()
375 io_req->fcport = fcport; in qedf_alloc_cmd()
378 io_req->sc_cmd = NULL; in qedf_alloc_cmd()
379 io_req->lun = -1; in qedf_alloc_cmd()
382 kref_init(&io_req->refcount); /* ID: 001 */ in qedf_alloc_cmd()
383 atomic_set(&io_req->state, QEDFC_CMD_ST_IO_ACTIVE); in qedf_alloc_cmd()
387 bd_tbl = io_req->bd_tbl = cmd_mgr->io_bdt_pool[xid]; in qedf_alloc_cmd()
390 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_alloc_cmd()
393 bd_tbl->io_req = io_req; in qedf_alloc_cmd()
394 io_req->cmd_type = cmd_type; in qedf_alloc_cmd()
395 io_req->tm_flags = 0; in qedf_alloc_cmd()
398 io_req->rx_buf_off = 0; in qedf_alloc_cmd()
399 io_req->tx_buf_off = 0; in qedf_alloc_cmd()
400 io_req->rx_id = 0xffff; /* No OX_ID */ in qedf_alloc_cmd()
402 return io_req; in qedf_alloc_cmd()
410 static void qedf_free_mp_resc(struct qedf_ioreq *io_req) in qedf_free_mp_resc() argument
412 struct qedf_mp_req *mp_req = &(io_req->mp_req); in qedf_free_mp_resc()
413 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_free_mp_resc()
441 struct qedf_ioreq *io_req = in qedf_release_cmd() local
443 struct qedf_cmd_mgr *cmd_mgr = io_req->cmd_mgr; in qedf_release_cmd()
444 struct qedf_rport *fcport = io_req->fcport; in qedf_release_cmd()
447 if (io_req->cmd_type == QEDF_SCSI_CMD) { in qedf_release_cmd()
450 io_req, io_req->xid); in qedf_release_cmd()
451 WARN_ON(io_req->sc_cmd); in qedf_release_cmd()
454 if (io_req->cmd_type == QEDF_ELS || in qedf_release_cmd()
455 io_req->cmd_type == QEDF_TASK_MGMT_CMD) in qedf_release_cmd()
456 qedf_free_mp_resc(io_req); in qedf_release_cmd()
460 atomic_set(&io_req->state, QEDF_CMD_ST_INACTIVE); in qedf_release_cmd()
467 io_req->task_retry_identifier++; in qedf_release_cmd()
468 io_req->fcport = NULL; in qedf_release_cmd()
470 clear_bit(QEDF_CMD_DIRTY, &io_req->flags); in qedf_release_cmd()
471 io_req->cpu = 0; in qedf_release_cmd()
473 io_req->fcport = NULL; in qedf_release_cmd()
474 io_req->alloc = 0; in qedf_release_cmd()
478 static int qedf_map_sg(struct qedf_ioreq *io_req) in qedf_map_sg() argument
480 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_map_sg()
484 struct scsi_sge *bd = io_req->bd_tbl->bd_tbl; in qedf_map_sg()
497 io_req->sge_type = QEDF_IOREQ_UNKNOWN_SGE; in qedf_map_sg()
499 if (sg_count <= 8 || io_req->io_req_flags == QEDF_READ) in qedf_map_sg()
500 io_req->sge_type = QEDF_IOREQ_FAST_SGE; in qedf_map_sg()
512 if (io_req->sge_type == QEDF_IOREQ_UNKNOWN_SGE && (i) && in qedf_map_sg()
514 io_req->sge_type = QEDF_IOREQ_SLOW_SGE; in qedf_map_sg()
525 if (io_req->sge_type == QEDF_IOREQ_UNKNOWN_SGE) in qedf_map_sg()
526 io_req->sge_type = QEDF_IOREQ_FAST_SGE; in qedf_map_sg()
531 scsi_bufflen(sc), io_req->xid); in qedf_map_sg()
536 static int qedf_build_bd_list_from_sg(struct qedf_ioreq *io_req) in qedf_build_bd_list_from_sg() argument
538 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_build_bd_list_from_sg()
539 struct scsi_sge *bd = io_req->bd_tbl->bd_tbl; in qedf_build_bd_list_from_sg()
543 bd_count = qedf_map_sg(io_req); in qedf_build_bd_list_from_sg()
551 io_req->bd_tbl->bd_valid = bd_count; in qedf_build_bd_list_from_sg()
556 static void qedf_build_fcp_cmnd(struct qedf_ioreq *io_req, in qedf_build_fcp_cmnd() argument
559 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_build_fcp_cmnd()
570 fcp_cmnd->fc_tm_flags = io_req->tm_flags; in qedf_build_fcp_cmnd()
571 fcp_cmnd->fc_flags = io_req->io_req_flags; in qedf_build_fcp_cmnd()
575 if (io_req->cmd_type == QEDF_TASK_MGMT_CMD) { in qedf_build_fcp_cmnd()
587 if (io_req->cmd_type != QEDF_TASK_MGMT_CMD) in qedf_build_fcp_cmnd()
591 fcp_cmnd->fc_dl = htonl(io_req->data_xfer_len); in qedf_build_fcp_cmnd()
595 struct qedf_ioreq *io_req, struct e4_fcoe_task_context *task_ctx, in qedf_init_task() argument
599 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_init_task()
600 struct io_bdt *bd_tbl = io_req->bd_tbl; in qedf_init_task()
612 io_req->task = task_ctx; in qedf_init_task()
614 memset(io_req->task_params, 0, sizeof(struct fcoe_task_params)); in qedf_init_task()
615 memset(io_req->sgl_task_params, 0, sizeof(struct scsi_sgl_task_params)); in qedf_init_task()
618 if (io_req->cmd_type == QEDF_TASK_MGMT_CMD) { in qedf_init_task()
623 tx_io_size = io_req->data_xfer_len; in qedf_init_task()
626 rx_io_size = io_req->data_xfer_len; in qedf_init_task()
631 io_req->task_params->context = task_ctx; in qedf_init_task()
632 io_req->task_params->sqe = sqe; in qedf_init_task()
633 io_req->task_params->task_type = task_type; in qedf_init_task()
634 io_req->task_params->tx_io_size = tx_io_size; in qedf_init_task()
635 io_req->task_params->rx_io_size = rx_io_size; in qedf_init_task()
636 io_req->task_params->conn_cid = fcport->fw_cid; in qedf_init_task()
637 io_req->task_params->itid = io_req->xid; in qedf_init_task()
638 io_req->task_params->cq_rss_number = cq_idx; in qedf_init_task()
639 io_req->task_params->is_tape_device = fcport->dev_type; in qedf_init_task()
642 if (io_req->cmd_type != QEDF_TASK_MGMT_CMD) { in qedf_init_task()
644 io_req->sgl_task_params->sgl = bd_tbl->bd_tbl; in qedf_init_task()
645 io_req->sgl_task_params->sgl_phys_addr.lo = in qedf_init_task()
647 io_req->sgl_task_params->sgl_phys_addr.hi = in qedf_init_task()
649 io_req->sgl_task_params->num_sges = bd_count; in qedf_init_task()
650 io_req->sgl_task_params->total_buffer_size = in qedf_init_task()
651 scsi_bufflen(io_req->sc_cmd); in qedf_init_task()
652 if (io_req->sge_type == QEDF_IOREQ_SLOW_SGE) in qedf_init_task()
653 io_req->sgl_task_params->small_mid_sge = 1; in qedf_init_task()
655 io_req->sgl_task_params->small_mid_sge = 0; in qedf_init_task()
659 sense_data_buffer_phys_addr.lo = U64_LO(io_req->sense_buffer_dma); in qedf_init_task()
660 sense_data_buffer_phys_addr.hi = U64_HI(io_req->sense_buffer_dma); in qedf_init_task()
663 qedf_build_fcp_cmnd(io_req, (struct fcp_cmnd *)tmp_fcp_cmnd); in qedf_init_task()
672 init_initiator_rw_fcoe_task(io_req->task_params, in qedf_init_task()
673 io_req->sgl_task_params, in qedf_init_task()
675 io_req->task_retry_identifier, fcp_cmnd); in qedf_init_task()
678 if (io_req->sge_type == QEDF_IOREQ_SLOW_SGE) in qedf_init_task()
684 void qedf_init_mp_task(struct qedf_ioreq *io_req, in qedf_init_mp_task() argument
687 struct qedf_mp_req *mp_req = &(io_req->mp_req); in qedf_init_mp_task()
688 struct qedf_rport *fcport = io_req->fcport; in qedf_init_mp_task()
689 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_init_mp_task()
697 io_req->cmd_type); in qedf_init_mp_task()
707 io_req->task = task_ctx; in qedf_init_mp_task()
710 io_req->task_params->context = task_ctx; in qedf_init_mp_task()
711 io_req->task_params->sqe = sqe; in qedf_init_mp_task()
712 io_req->task_params->task_type = FCOE_TASK_TYPE_MIDPATH; in qedf_init_mp_task()
713 io_req->task_params->tx_io_size = io_req->data_xfer_len; in qedf_init_mp_task()
715 io_req->task_params->rx_io_size = PAGE_SIZE; in qedf_init_mp_task()
716 io_req->task_params->conn_cid = fcport->fw_cid; in qedf_init_mp_task()
717 io_req->task_params->itid = io_req->xid; in qedf_init_mp_task()
719 io_req->task_params->cq_rss_number = 0; in qedf_init_mp_task()
720 io_req->task_params->is_tape_device = fcport->dev_type; in qedf_init_mp_task()
724 fc_hdr->fh_ox_id = io_req->xid; in qedf_init_mp_task()
742 tx_sgl_task_params.total_buffer_size = io_req->data_xfer_len; in qedf_init_mp_task()
759 init_initiator_midpath_unsolicited_fcoe_task(io_req->task_params, in qedf_init_mp_task()
808 static void qedf_trace_io(struct qedf_rport *fcport, struct qedf_ioreq *io_req, in qedf_trace_io() argument
813 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_trace_io()
821 io_log->task_id = io_req->xid; in qedf_trace_io()
833 io_log->refcount = kref_read(&io_req->refcount); in qedf_trace_io()
837 io_log->req_cpu = io_req->cpu; in qedf_trace_io()
841 io_log->req_cpu = io_req->cpu; in qedf_trace_io()
842 io_log->int_cpu = io_req->int_cpu; in qedf_trace_io()
846 io_log->sge_type = io_req->sge_type; in qedf_trace_io()
855 int qedf_post_io_req(struct qedf_rport *fcport, struct qedf_ioreq *io_req) in qedf_post_io_req() argument
857 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_post_io_req()
868 io_req->data_xfer_len = scsi_bufflen(sc_cmd); in qedf_post_io_req()
869 sc_cmd->SCp.ptr = (char *)io_req; in qedf_post_io_req()
870 io_req->sge_type = QEDF_IOREQ_FAST_SGE; /* Assume fast SGL by default */ in qedf_post_io_req()
873 io_req->cpu = smp_processor_id(); in qedf_post_io_req()
877 io_req->io_req_flags = QEDF_READ; in qedf_post_io_req()
881 io_req->io_req_flags = QEDF_WRITE; in qedf_post_io_req()
884 io_req->io_req_flags = 0; in qedf_post_io_req()
888 xid = io_req->xid; in qedf_post_io_req()
891 if (qedf_build_bd_list_from_sg(io_req)) { in qedf_post_io_req()
894 io_req->sc_cmd = NULL; in qedf_post_io_req()
895 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
903 io_req->sc_cmd = NULL; in qedf_post_io_req()
904 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
909 io_req->lun = (int)sc_cmd->device->lun; in qedf_post_io_req()
922 io_req->sc_cmd = NULL; in qedf_post_io_req()
923 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_post_io_req()
927 qedf_init_task(fcport, lport, io_req, task_ctx, sqe); in qedf_post_io_req()
933 set_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_post_io_req()
935 if (qedf_io_tracing && io_req->sc_cmd) in qedf_post_io_req()
936 qedf_trace_io(fcport, io_req, QEDF_IO_TRACE_REQ); in qedf_post_io_req()
949 struct qedf_ioreq *io_req; in qedf_queuecommand() local
1034 io_req = qedf_alloc_cmd(fcport, QEDF_SCSI_CMD); in qedf_queuecommand()
1035 if (!io_req) { in qedf_queuecommand()
1041 io_req->sc_cmd = sc_cmd; in qedf_queuecommand()
1045 if (qedf_post_io_req(fcport, io_req)) { in qedf_queuecommand()
1058 static void qedf_parse_fcp_rsp(struct qedf_ioreq *io_req, in qedf_parse_fcp_rsp() argument
1061 struct scsi_cmnd *sc_cmd = io_req->sc_cmd; in qedf_parse_fcp_rsp()
1062 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_parse_fcp_rsp()
1068 io_req->fcp_status = FC_GOOD; in qedf_parse_fcp_rsp()
1069 io_req->fcp_resid = 0; in qedf_parse_fcp_rsp()
1072 io_req->fcp_resid = fcp_rsp->fcp_resid; in qedf_parse_fcp_rsp()
1074 io_req->scsi_comp_flags = rsp_flags; in qedf_parse_fcp_rsp()
1075 CMD_SCSI_STATUS(sc_cmd) = io_req->cdb_status = in qedf_parse_fcp_rsp()
1086 io_req->fcp_rsp_len = fcp_rsp_len; in qedf_parse_fcp_rsp()
1087 io_req->fcp_sns_len = fcp_sns_len; in qedf_parse_fcp_rsp()
1088 rsp_info = sense_data = io_req->sense_buffer; in qedf_parse_fcp_rsp()
1093 io_req->fcp_rsp_code = rsp_info[3]; in qedf_parse_fcp_rsp()
1095 "fcp_rsp_code = %d\n", io_req->fcp_rsp_code); in qedf_parse_fcp_rsp()
1115 static void qedf_unmap_sg_list(struct qedf_ctx *qedf, struct qedf_ioreq *io_req) in qedf_unmap_sg_list() argument
1117 struct scsi_cmnd *sc = io_req->sc_cmd; in qedf_unmap_sg_list()
1119 if (io_req->bd_tbl->bd_valid && sc && scsi_sg_count(sc)) { in qedf_unmap_sg_list()
1122 io_req->bd_tbl->bd_valid = 0; in qedf_unmap_sg_list()
1127 struct qedf_ioreq *io_req) in qedf_scsi_completion() argument
1138 if (!io_req) in qedf_scsi_completion()
1143 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_scsi_completion()
1144 test_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags) || in qedf_scsi_completion()
1145 test_bit(QEDF_CMD_IN_ABORT, &io_req->flags)) { in qedf_scsi_completion()
1148 io_req->xid); in qedf_scsi_completion()
1152 xid = io_req->xid; in qedf_scsi_completion()
1154 sc_cmd = io_req->sc_cmd; in qedf_scsi_completion()
1186 fcport = io_req->fcport; in qedf_scsi_completion()
1197 io_req->xid); in qedf_scsi_completion()
1201 qedf_parse_fcp_rsp(io_req, fcp_rsp); in qedf_scsi_completion()
1203 qedf_unmap_sg_list(qedf, io_req); in qedf_scsi_completion()
1206 if (io_req->fcp_rsp_len > 3 && io_req->fcp_rsp_code) { in qedf_scsi_completion()
1209 "fcp_rsp_code=%d.\n", io_req->xid, io_req->fcp_rsp_len, in qedf_scsi_completion()
1210 io_req->fcp_rsp_code); in qedf_scsi_completion()
1220 io_req->xid, fcp_rsp->rsp_flags.flags, in qedf_scsi_completion()
1221 io_req->fcp_resid, in qedf_scsi_completion()
1225 if (io_req->cdb_status == 0) in qedf_scsi_completion()
1226 sc_cmd->result = (DID_ERROR << 16) | io_req->cdb_status; in qedf_scsi_completion()
1228 sc_cmd->result = (DID_OK << 16) | io_req->cdb_status; in qedf_scsi_completion()
1238 switch (io_req->fcp_status) { in qedf_scsi_completion()
1240 if (io_req->cdb_status == 0) { in qedf_scsi_completion()
1244 refcount = kref_read(&io_req->refcount); in qedf_scsi_completion()
1250 sc_cmd->device->lun, io_req->xid, in qedf_scsi_completion()
1253 io_req->cdb_status, io_req->fcp_resid, in qedf_scsi_completion()
1255 sc_cmd->result = (DID_OK << 16) | io_req->cdb_status; in qedf_scsi_completion()
1257 if (io_req->cdb_status == SAM_STAT_TASK_SET_FULL || in qedf_scsi_completion()
1258 io_req->cdb_status == SAM_STAT_BUSY) { in qedf_scsi_completion()
1281 if (io_req->cdb_status == in qedf_scsi_completion()
1288 if (io_req->fcp_resid) in qedf_scsi_completion()
1289 scsi_set_resid(sc_cmd, io_req->fcp_resid); in qedf_scsi_completion()
1293 io_req->fcp_status); in qedf_scsi_completion()
1299 qedf_trace_io(fcport, io_req, QEDF_IO_TRACE_RSP); in qedf_scsi_completion()
1305 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_scsi_completion()
1307 io_req->sc_cmd = NULL; in qedf_scsi_completion()
1310 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_scsi_completion()
1314 void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req, in qedf_scsi_done() argument
1321 if (!io_req) { in qedf_scsi_done()
1326 if (test_and_set_bit(QEDF_CMD_ERR_SCSI_DONE, &io_req->flags)) { in qedf_scsi_done()
1329 io_req); in qedf_scsi_done()
1337 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_scsi_done()
1339 xid = io_req->xid; in qedf_scsi_done()
1340 sc_cmd = io_req->sc_cmd; in qedf_scsi_done()
1391 qedf_unmap_sg_list(qedf, io_req); in qedf_scsi_done()
1394 refcount = kref_read(&io_req->refcount); in qedf_scsi_done()
1411 qedf_trace_io(io_req->fcport, io_req, QEDF_IO_TRACE_RSP); in qedf_scsi_done()
1413 io_req->sc_cmd = NULL; in qedf_scsi_done()
1416 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_scsi_done()
1424 io_req->sc_cmd = NULL; in qedf_scsi_done()
1425 kref_put(&io_req->refcount, qedf_release_cmd); /* ID: 001 */ in qedf_scsi_done()
1433 struct qedf_ioreq *io_req) in qedf_process_warning_compl() argument
1436 struct qedf_rport *fcport = io_req->fcport; in qedf_process_warning_compl()
1443 io_req, io_req->xid); in qedf_process_warning_compl()
1447 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "Warning CQE, " in qedf_process_warning_compl()
1448 "xid=0x%x\n", io_req->xid); in qedf_process_warning_compl()
1449 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), in qedf_process_warning_compl()
1453 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "tx_buff_off=%08x, " in qedf_process_warning_compl()
1475 if (!test_bit(QEDF_CMD_SRR_SENT, &io_req->flags)) { in qedf_process_warning_compl()
1476 io_req->rx_buf_off = in qedf_process_warning_compl()
1478 io_req->tx_buf_off = in qedf_process_warning_compl()
1480 io_req->rx_id = cqe->cqe_info.err_info.rx_id; in qedf_process_warning_compl()
1481 rval = qedf_send_rec(io_req); in qedf_process_warning_compl()
1495 init_completion(&io_req->abts_done); in qedf_process_warning_compl()
1496 rval = qedf_initiate_abts(io_req, true); in qedf_process_warning_compl()
1503 struct qedf_ioreq *io_req) in qedf_process_error_detect() argument
1509 "cqe is NULL for io_req %p\n", io_req); in qedf_process_error_detect()
1513 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "Error detection CQE, " in qedf_process_error_detect()
1514 "xid=0x%x\n", io_req->xid); in qedf_process_error_detect()
1515 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), in qedf_process_error_detect()
1519 QEDF_ERR(&(io_req->fcport->qedf->dbg_ctx), "tx_buff_off=%08x, " in qedf_process_error_detect()
1530 init_completion(&io_req->abts_done); in qedf_process_error_detect()
1531 rval = qedf_initiate_abts(io_req, true); in qedf_process_error_detect()
1567 struct qedf_ioreq *io_req; in qedf_flush_active_ios() local
1628 io_req = &cmd_mgr->cmds[i]; in qedf_flush_active_ios()
1630 if (!io_req) in qedf_flush_active_ios()
1632 if (!io_req->fcport) in qedf_flush_active_ios()
1637 if (io_req->alloc) { in qedf_flush_active_ios()
1638 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags)) { in qedf_flush_active_ios()
1639 if (io_req->cmd_type == QEDF_SCSI_CMD) in qedf_flush_active_ios()
1642 io_req->xid); in qedf_flush_active_ios()
1650 if (io_req->fcport != fcport) in qedf_flush_active_ios()
1658 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags)) { in qedf_flush_active_ios()
1659 refcount = kref_read(&io_req->refcount); in qedf_flush_active_ios()
1662 io_req->xid, io_req->cmd_type, refcount); in qedf_flush_active_ios()
1666 if (atomic_read(&io_req->state) == in qedf_flush_active_ios()
1669 (&io_req->rrq_work)) { in qedf_flush_active_ios()
1672 io_req->xid); in qedf_flush_active_ios()
1674 kref_put(&io_req->refcount, in qedf_flush_active_ios()
1682 if (io_req->cmd_type == QEDF_ELS && in qedf_flush_active_ios()
1684 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1688 io_req, io_req->xid); in qedf_flush_active_ios()
1692 qedf_flush_els_req(qedf, io_req); in qedf_flush_active_ios()
1700 if (io_req->cmd_type == QEDF_ABTS) { in qedf_flush_active_ios()
1702 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1706 io_req, io_req->xid); in qedf_flush_active_ios()
1709 if (lun != -1 && io_req->lun != lun) in qedf_flush_active_ios()
1713 "Flushing abort xid=0x%x.\n", io_req->xid); in qedf_flush_active_ios()
1715 if (cancel_delayed_work_sync(&io_req->rrq_work)) { in qedf_flush_active_ios()
1718 io_req->xid); in qedf_flush_active_ios()
1719 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1722 if (cancel_delayed_work_sync(&io_req->timeout_work)) { in qedf_flush_active_ios()
1725 io_req->xid); in qedf_flush_active_ios()
1726 qedf_initiate_cleanup(io_req, true); in qedf_flush_active_ios()
1730 complete(&io_req->abts_done); in qedf_flush_active_ios()
1731 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_flush_active_ios()
1733 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1739 if (!io_req->sc_cmd) in qedf_flush_active_ios()
1741 if (!io_req->sc_cmd->device) { in qedf_flush_active_ios()
1744 io_req->sc_cmd); in qedf_flush_active_ios()
1746 io_req->sc_cmd = NULL; in qedf_flush_active_ios()
1747 qedf_initiate_cleanup(io_req, false); in qedf_flush_active_ios()
1748 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_flush_active_ios()
1752 if (io_req->lun != lun) in qedf_flush_active_ios()
1760 rc = kref_get_unless_zero(&io_req->refcount); in qedf_flush_active_ios()
1763 "io_req=0x%p xid=0x%x\n", io_req, io_req->xid); in qedf_flush_active_ios()
1768 "Cleanup xid=0x%x.\n", io_req->xid); in qedf_flush_active_ios()
1772 qedf_initiate_cleanup(io_req, true); in qedf_flush_active_ios()
1775 kref_put(&io_req->refcount, qedf_release_cmd); /* ID: 004 */ in qedf_flush_active_ios()
1797 io_req = &cmd_mgr->cmds[i]; in qedf_flush_active_ios()
1798 if (io_req->fcport && in qedf_flush_active_ios()
1799 io_req->fcport == fcport) { in qedf_flush_active_ios()
1801 kref_read(&io_req->refcount); in qedf_flush_active_ios()
1803 &io_req->flags); in qedf_flush_active_ios()
1806 io_req, io_req->xid, in qedf_flush_active_ios()
1807 io_req->flags, in qedf_flush_active_ios()
1808 io_req->sc_cmd, in qedf_flush_active_ios()
1810 io_req->cmd_type); in qedf_flush_active_ios()
1831 int qedf_initiate_abts(struct qedf_ioreq *io_req, bool return_scsi_cmd_on_abts) in qedf_initiate_abts() argument
1834 struct qedf_rport *fcport = io_req->fcport; in qedf_initiate_abts()
1889 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_initiate_abts()
1890 test_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags) || in qedf_initiate_abts()
1891 test_bit(QEDF_CMD_IN_ABORT, &io_req->flags)) { in qedf_initiate_abts()
1894 io_req->xid, io_req->sc_cmd); in qedf_initiate_abts()
1899 kref_get(&io_req->refcount); in qedf_initiate_abts()
1901 xid = io_req->xid; in qedf_initiate_abts()
1906 io_req->cmd_type = QEDF_ABTS; in qedf_initiate_abts()
1907 io_req->return_scsi_cmd_on_abts = return_scsi_cmd_on_abts; in qedf_initiate_abts()
1909 set_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_initiate_abts()
1910 refcount = kref_read(&io_req->refcount); in qedf_initiate_abts()
1915 qedf_cmd_timer_set(qedf, io_req, QEDF_ABORT_TIMEOUT); in qedf_initiate_abts()
1922 io_req->task_params->sqe = sqe; in qedf_initiate_abts()
1924 init_initiator_abort_fcoe_task(io_req->task_params); in qedf_initiate_abts()
1936 struct qedf_ioreq *io_req) in qedf_process_abts_compl() argument
1941 struct qedf_rport *fcport = io_req->fcport; in qedf_process_abts_compl()
1944 "0x%x cmd_type = %d\n", io_req->xid, io_req->cmd_type); in qedf_process_abts_compl()
1946 xid = io_req->xid; in qedf_process_abts_compl()
1956 io_req->xid); in qedf_process_abts_compl()
1968 io_req->xid); in qedf_process_abts_compl()
1972 if (!cancel_delayed_work(&io_req->timeout_work)) { in qedf_process_abts_compl()
1981 io_req->event = QEDF_IOREQ_EV_ABORT_SUCCESS; in qedf_process_abts_compl()
1982 rc = kref_get_unless_zero(&io_req->refcount); /* ID: 003 */ in qedf_process_abts_compl()
1986 io_req->xid); in qedf_process_abts_compl()
1993 queue_delayed_work(qedf->dpc_wq, &io_req->rrq_work, in qedf_process_abts_compl()
1995 atomic_set(&io_req->state, QEDFC_CMD_ST_RRQ_WAIT); in qedf_process_abts_compl()
2001 io_req->event = QEDF_IOREQ_EV_ABORT_FAILED; in qedf_process_abts_compl()
2008 clear_bit(QEDF_CMD_IN_ABORT, &io_req->flags); in qedf_process_abts_compl()
2010 if (io_req->sc_cmd) { in qedf_process_abts_compl()
2011 if (!io_req->return_scsi_cmd_on_abts) in qedf_process_abts_compl()
2014 io_req->xid); in qedf_process_abts_compl()
2015 if (io_req->return_scsi_cmd_on_abts) in qedf_process_abts_compl()
2016 qedf_scsi_done(qedf, io_req, DID_ERROR); in qedf_process_abts_compl()
2020 complete(&io_req->abts_done); in qedf_process_abts_compl()
2022 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_process_abts_compl()
2025 int qedf_init_mp_req(struct qedf_ioreq *io_req) in qedf_init_mp_req() argument
2030 struct qedf_ctx *qedf = io_req->fcport->qedf; in qedf_init_mp_req()
2036 mp_req = (struct qedf_mp_req *)&(io_req->mp_req); in qedf_init_mp_req()
2039 if (io_req->cmd_type != QEDF_ELS) { in qedf_init_mp_req()
2041 io_req->data_xfer_len = mp_req->req_len; in qedf_init_mp_req()
2043 mp_req->req_len = io_req->data_xfer_len; in qedf_init_mp_req()
2049 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2058 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2068 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2076 qedf_free_mp_resc(io_req); in qedf_init_mp_req()
2129 int qedf_initiate_cleanup(struct qedf_ioreq *io_req, in qedf_initiate_cleanup() argument
2143 fcport = io_req->fcport; in qedf_initiate_cleanup()
2162 if (!test_bit(QEDF_CMD_OUTSTANDING, &io_req->flags) || in qedf_initiate_cleanup()
2163 test_and_set_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags)) { in qedf_initiate_cleanup()
2166 io_req->xid); in qedf_initiate_cleanup()
2169 set_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2175 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2179 if (io_req->cmd_type == QEDF_CLEANUP) { in qedf_initiate_cleanup()
2182 io_req->xid, io_req->cmd_type); in qedf_initiate_cleanup()
2183 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2187 refcount = kref_read(&io_req->refcount); in qedf_initiate_cleanup()
2191 io_req->xid, io_req->sc_cmd, io_req->cmd_type, io_req->flags, in qedf_initiate_cleanup()
2195 xid = io_req->xid; in qedf_initiate_cleanup()
2196 io_req->cmd_type = QEDF_CLEANUP; in qedf_initiate_cleanup()
2197 io_req->return_scsi_cmd_on_abts = return_scsi_cmd_on_abts; in qedf_initiate_cleanup()
2201 init_completion(&io_req->cleanup_done); in qedf_initiate_cleanup()
2208 io_req->task_params->sqe = sqe; in qedf_initiate_cleanup()
2210 init_initiator_cleanup_fcoe_task(io_req->task_params); in qedf_initiate_cleanup()
2215 tmo = wait_for_completion_timeout(&io_req->cleanup_done, in qedf_initiate_cleanup()
2222 "xid=%x.\n", io_req->xid); in qedf_initiate_cleanup()
2223 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_initiate_cleanup()
2232 if (io_req->tm_flags == FCP_TMF_LUN_RESET || in qedf_initiate_cleanup()
2233 io_req->tm_flags == FCP_TMF_TGT_RESET) { in qedf_initiate_cleanup()
2234 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_initiate_cleanup()
2235 io_req->sc_cmd = NULL; in qedf_initiate_cleanup()
2236 complete(&io_req->tm_done); in qedf_initiate_cleanup()
2239 if (io_req->sc_cmd) { in qedf_initiate_cleanup()
2240 if (!io_req->return_scsi_cmd_on_abts) in qedf_initiate_cleanup()
2243 io_req->xid); in qedf_initiate_cleanup()
2244 if (io_req->return_scsi_cmd_on_abts) in qedf_initiate_cleanup()
2245 qedf_scsi_done(qedf, io_req, DID_ERROR); in qedf_initiate_cleanup()
2249 io_req->event = QEDF_IOREQ_EV_CLEANUP_SUCCESS; in qedf_initiate_cleanup()
2251 io_req->event = QEDF_IOREQ_EV_CLEANUP_FAILED; in qedf_initiate_cleanup()
2257 struct qedf_ioreq *io_req) in qedf_process_cleanup_compl() argument
2260 io_req->xid); in qedf_process_cleanup_compl()
2262 clear_bit(QEDF_CMD_IN_CLEANUP, &io_req->flags); in qedf_process_cleanup_compl()
2265 complete(&io_req->cleanup_done); in qedf_process_cleanup_compl()
2271 struct qedf_ioreq *io_req; in qedf_execute_tmf() local
2295 io_req = qedf_alloc_cmd(fcport, QEDF_TASK_MGMT_CMD); in qedf_execute_tmf()
2296 if (!io_req) { in qedf_execute_tmf()
2308 io_req->sc_cmd = sc_cmd; in qedf_execute_tmf()
2309 io_req->fcport = fcport; in qedf_execute_tmf()
2310 io_req->cmd_type = QEDF_TASK_MGMT_CMD; in qedf_execute_tmf()
2313 io_req->cpu = smp_processor_id(); in qedf_execute_tmf()
2316 io_req->io_req_flags = QEDF_READ; in qedf_execute_tmf()
2317 io_req->data_xfer_len = 0; in qedf_execute_tmf()
2318 io_req->tm_flags = tm_flags; in qedf_execute_tmf()
2321 io_req->return_scsi_cmd_on_abts = false; in qedf_execute_tmf()
2324 xid = io_req->xid; in qedf_execute_tmf()
2332 init_completion(&io_req->tm_done); in qedf_execute_tmf()
2340 qedf_init_task(fcport, lport, io_req, task, sqe); in qedf_execute_tmf()
2345 set_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_execute_tmf()
2346 tmo = wait_for_completion_timeout(&io_req->tm_done, in qedf_execute_tmf()
2353 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_execute_tmf()
2354 io_req->sc_cmd = NULL; in qedf_execute_tmf()
2357 if (io_req->fcp_rsp_code == 0) in qedf_execute_tmf()
2372 kref_put(&io_req->refcount, qedf_release_cmd); in qedf_execute_tmf()
2400 struct qedf_ioreq *io_req = NULL; in qedf_initiate_tmf() local
2419 io_req = (struct qedf_ioreq *)sc_cmd->SCp.ptr; in qedf_initiate_tmf()
2420 ref_cnt = kref_read(&io_req->refcount); in qedf_initiate_tmf()
2423 io_req, io_req->xid, ref_cnt); in qedf_initiate_tmf()
2489 struct qedf_ioreq *io_req) in qedf_process_tmf_compl() argument
2493 clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags); in qedf_process_tmf_compl()
2496 qedf_parse_fcp_rsp(io_req, fcp_rsp); in qedf_process_tmf_compl()
2498 io_req->sc_cmd = NULL; in qedf_process_tmf_compl()
2499 complete(&io_req->tm_done); in qedf_process_tmf_compl()