Lines Matching refs:cmd

108 	*cmd, struct atio_from_isp *atio, int ha_locked);
112 struct qla_tgt_cmd *cmd);
1299 struct qla_tgt_cmd *cmd; in abort_cmd_for_tag() local
1311 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmd_for_tag()
1312 if (tag == cmd->atio.u.isp24.exchange_addr) { in abort_cmd_for_tag()
1313 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmd_for_tag()
1332 struct qla_tgt_cmd *cmd; in abort_cmds_for_lun() local
1347 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_lun()
1351 cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); in abort_cmds_for_lun()
1353 (struct scsi_lun *)&cmd->atio.u.isp24.fcp_cmnd.lun); in abort_cmds_for_lun()
1355 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmds_for_lun()
1374 struct qla_tgt_cmd *cmd = in __qlt_24xx_handle_abts() local
1376 if (cmd->tag == abts->exchange_addr_to_abort) { in __qlt_24xx_handle_abts()
1377 lun = cmd->unpacked_lun; in __qlt_24xx_handle_abts()
1606 struct qla_tgt_cmd *cmd = prm->cmd; in qlt_pci_map_calc_cnt() local
1608 BUG_ON(cmd->sg_cnt == 0); in qlt_pci_map_calc_cnt()
1610 prm->sg = (struct scatterlist *)cmd->sg; in qlt_pci_map_calc_cnt()
1611 prm->seg_cnt = pci_map_sg(prm->tgt->ha->pdev, cmd->sg, in qlt_pci_map_calc_cnt()
1612 cmd->sg_cnt, cmd->dma_data_direction); in qlt_pci_map_calc_cnt()
1616 prm->cmd->sg_mapped = 1; in qlt_pci_map_calc_cnt()
1618 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) { in qlt_pci_map_calc_cnt()
1629 if ((cmd->se_cmd.prot_op == TARGET_PROT_DIN_INSERT) || in qlt_pci_map_calc_cnt()
1630 (cmd->se_cmd.prot_op == TARGET_PROT_DOUT_STRIP)) { in qlt_pci_map_calc_cnt()
1631 prm->seg_cnt = DIV_ROUND_UP(cmd->bufflen, cmd->blk_sz); in qlt_pci_map_calc_cnt()
1636 if (cmd->prot_sg_cnt) { in qlt_pci_map_calc_cnt()
1637 prm->prot_sg = cmd->prot_sg; in qlt_pci_map_calc_cnt()
1639 cmd->prot_sg, cmd->prot_sg_cnt, in qlt_pci_map_calc_cnt()
1640 cmd->dma_data_direction); in qlt_pci_map_calc_cnt()
1644 if ((cmd->se_cmd.prot_op == TARGET_PROT_DIN_INSERT) || in qlt_pci_map_calc_cnt()
1645 (cmd->se_cmd.prot_op == TARGET_PROT_DOUT_STRIP)) { in qlt_pci_map_calc_cnt()
1647 prm->prot_seg_cnt = DIV_ROUND_UP(cmd->bufflen, in qlt_pci_map_calc_cnt()
1648 cmd->blk_sz); in qlt_pci_map_calc_cnt()
1658 ql_dbg(ql_dbg_tgt, prm->cmd->vha, 0xe04d, in qlt_pci_map_calc_cnt()
1660 0, prm->cmd->sg_cnt); in qlt_pci_map_calc_cnt()
1664 static void qlt_unmap_sg(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) in qlt_unmap_sg() argument
1668 if (!cmd->sg_mapped) in qlt_unmap_sg()
1671 pci_unmap_sg(ha->pdev, cmd->sg, cmd->sg_cnt, cmd->dma_data_direction); in qlt_unmap_sg()
1672 cmd->sg_mapped = 0; in qlt_unmap_sg()
1674 if (cmd->prot_sg_cnt) in qlt_unmap_sg()
1675 pci_unmap_sg(ha->pdev, cmd->prot_sg, cmd->prot_sg_cnt, in qlt_unmap_sg()
1676 cmd->dma_data_direction); in qlt_unmap_sg()
1678 if (cmd->ctx_dsd_alloced) in qlt_unmap_sg()
1679 qla2x00_clean_dsd_pool(ha, NULL, cmd); in qlt_unmap_sg()
1681 if (cmd->ctx) in qlt_unmap_sg()
1682 dma_pool_free(ha->dl_dma_pool, cmd->ctx, cmd->ctx->crc_ctx_dma); in qlt_unmap_sg()
1765 struct atio_from_isp *atio = &prm->cmd->atio; in qlt_24xx_build_ctio_pkt()
1785 ha->tgt.cmds[h-1] = prm->cmd; in qlt_24xx_build_ctio_pkt()
1788 pkt->nport_handle = prm->cmd->loop_id; in qlt_24xx_build_ctio_pkt()
1797 pkt->u.status0.relative_offset = cpu_to_le32(prm->cmd->offset); in qlt_24xx_build_ctio_pkt()
1873 pkt24->u.status0.transfer_length = cpu_to_le32(prm->cmd->bufflen); in qlt_load_data_segments()
1910 static inline int qlt_has_data(struct qla_tgt_cmd *cmd) in qlt_has_data() argument
1912 return cmd->bufflen > 0; in qlt_has_data()
1918 static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd, in qlt_pre_xmit_response() argument
1922 struct qla_tgt *tgt = cmd->tgt; in qlt_pre_xmit_response()
1925 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_pre_xmit_response()
1927 prm->cmd = cmd; in qlt_pre_xmit_response()
1930 prm->sense_buffer = &cmd->sense_buffer[0]; in qlt_pre_xmit_response()
1941 if ((xmit_type & QLA_TGT_XMIT_DATA) && qlt_has_data(cmd)) { in qlt_pre_xmit_response()
1953 cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, in qlt_pre_xmit_response()
1954 cmd->bufflen, prm->rq_result); in qlt_pre_xmit_response()
1961 cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0, in qlt_pre_xmit_response()
1962 cmd->bufflen, prm->rq_result); in qlt_pre_xmit_response()
1971 if (qlt_has_data(cmd)) { in qlt_pre_xmit_response()
1985 struct qla_tgt_cmd *cmd, int sending_sense) in qlt_need_explicit_conf() argument
1991 return cmd->conf_compl_supported; in qlt_need_explicit_conf()
1994 cmd->conf_compl_supported; in qlt_need_explicit_conf()
2028 static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type) in qlt_check_srr_debug() argument
2034 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf015, in qlt_check_srr_debug()
2035 "Dropping cmd %p (tag %d) status", cmd, cmd->tag); in qlt_check_srr_debug()
2042 if (cmd->dma_data_direction != DMA_FROM_DEVICE) in qlt_check_srr_debug()
2045 if (qlt_has_data(cmd) && (cmd->sg_cnt > 1) && in qlt_check_srr_debug()
2051 leave = qlt_srr_random() % cmd->sg_cnt; in qlt_check_srr_debug()
2054 tot_len += cmd->sg[i].length; in qlt_check_srr_debug()
2056 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf016, in qlt_check_srr_debug()
2059 " cmd->sg_cnt %d)", cmd, cmd->tag, tot_len, leave, in qlt_check_srr_debug()
2060 cmd->bufflen, cmd->sg_cnt); in qlt_check_srr_debug()
2062 cmd->bufflen = tot_len; in qlt_check_srr_debug()
2063 cmd->sg_cnt = leave; in qlt_check_srr_debug()
2066 if (qlt_has_data(cmd) && ((qlt_srr_random() % 100) == 70)) { in qlt_check_srr_debug()
2067 unsigned int offset = qlt_srr_random() % cmd->bufflen; in qlt_check_srr_debug()
2069 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf017, in qlt_check_srr_debug()
2071 "to offset %d (cmd->bufflen %d)", cmd, cmd->tag, offset, in qlt_check_srr_debug()
2072 cmd->bufflen); in qlt_check_srr_debug()
2075 else if (qlt_set_data_offset(cmd, offset)) { in qlt_check_srr_debug()
2076 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf018, in qlt_check_srr_debug()
2077 "qlt_set_data_offset() failed (tag %d)", cmd->tag); in qlt_check_srr_debug()
2082 static inline void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type) in qlt_check_srr_debug() argument
2093 if (qlt_need_explicit_conf(prm->tgt->ha, prm->cmd, 0)) { in qlt_24xx_init_ctio_to_isp()
2103 if (qlt_need_explicit_conf(prm->tgt->ha, prm->cmd, 1)) { in qlt_24xx_init_ctio_to_isp()
2104 if (prm->cmd->se_cmd.scsi_status != 0) { in qlt_24xx_init_ctio_to_isp()
2105 ql_dbg(ql_dbg_tgt, prm->cmd->vha, 0xe017, in qlt_24xx_init_ctio_to_isp()
2276 struct qla_tgt_cmd *cmd = prm->cmd; in qlt_build_ctio_crc2_pkt() local
2277 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_build_ctio_crc2_pkt()
2279 struct atio_from_isp *atio = &prm->cmd->atio; in qlt_build_ctio_crc2_pkt()
2299 data_bytes = cmd->bufflen; in qlt_build_ctio_crc2_pkt()
2300 dif_bytes = (data_bytes / cmd->blk_sz) * 8; in qlt_build_ctio_crc2_pkt()
2367 ha->tgt.cmds[h-1] = prm->cmd; in qlt_build_ctio_crc2_pkt()
2371 pkt->nport_handle = prm->cmd->loop_id; in qlt_build_ctio_crc2_pkt()
2384 pkt->relative_offset = cpu_to_le32(prm->cmd->offset); in qlt_build_ctio_crc2_pkt()
2387 if (cmd->dma_data_direction == DMA_TO_DEVICE) in qlt_build_ctio_crc2_pkt()
2389 else if (cmd->dma_data_direction == DMA_FROM_DEVICE) in qlt_build_ctio_crc2_pkt()
2401 crc_ctx_pkt = cmd->ctx = in qlt_build_ctio_crc2_pkt()
2439 crc_ctx_pkt->blk_size = cpu_to_le16(cmd->blk_sz); in qlt_build_ctio_crc2_pkt()
2450 prm->tot_dsds, cmd)) in qlt_build_ctio_crc2_pkt()
2453 (prm->tot_dsds - prm->prot_seg_cnt), cmd)) in qlt_build_ctio_crc2_pkt()
2462 prm->prot_seg_cnt, cmd)) in qlt_build_ctio_crc2_pkt()
2478 int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type, in qlt_xmit_response() argument
2481 struct scsi_qla_host *vha = cmd->vha; in qlt_xmit_response()
2490 if (cmd->sess && cmd->sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) { in qlt_xmit_response()
2491 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_xmit_response()
2492 if (cmd->sess->logout_completed) in qlt_xmit_response()
2494 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_xmit_response()
2496 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_xmit_response()
2503 qlt_check_srr_debug(cmd, &xmit_type); in qlt_xmit_response()
2505 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe018, in qlt_xmit_response()
2508 1 : 0, cmd->bufflen, cmd->sg_cnt, cmd->dma_data_direction, in qlt_xmit_response()
2509 &cmd->se_cmd); in qlt_xmit_response()
2511 res = qlt_pre_xmit_response(cmd, &prm, xmit_type, scsi_status, in qlt_xmit_response()
2519 if (qla2x00_reset_active(vha) || cmd->reset_count != ha->chip_reset) { in qlt_xmit_response()
2524 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_xmit_response()
2525 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_xmit_response()
2528 qla2x00_reset_active(vha), cmd->reset_count, in qlt_xmit_response()
2539 if (cmd->se_cmd.prot_op && (xmit_type & QLA_TGT_XMIT_DATA)) in qlt_xmit_response()
2550 if (qlt_has_data(cmd) && (xmit_type & QLA_TGT_XMIT_DATA)) { in qlt_xmit_response()
2555 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) in qlt_xmit_response()
2566 if (qlt_need_explicit_conf(ha, cmd, 0)) { in qlt_xmit_response()
2616 cmd->state = QLA_TGT_STATE_PROCESSED; /* Mid-level is done processing */ in qlt_xmit_response()
2617 cmd->cmd_sent_to_fw = 1; in qlt_xmit_response()
2627 qlt_unmap_sg(vha, cmd); in qlt_xmit_response()
2634 int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd) in qlt_rdy_to_xfer() argument
2637 struct scsi_qla_host *vha = cmd->vha; in qlt_rdy_to_xfer()
2639 struct qla_tgt *tgt = cmd->tgt; in qlt_rdy_to_xfer()
2645 prm.cmd = cmd; in qlt_rdy_to_xfer()
2660 if (qla2x00_reset_active(vha) || (cmd->reset_count != ha->chip_reset) || in qlt_rdy_to_xfer()
2661 (cmd->sess && cmd->sess->deleted == QLA_SESS_DELETION_IN_PROGRESS)) { in qlt_rdy_to_xfer()
2666 cmd->state = QLA_TGT_STATE_NEED_DATA; in qlt_rdy_to_xfer()
2667 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_rdy_to_xfer()
2670 qla2x00_reset_active(vha), cmd->reset_count, in qlt_rdy_to_xfer()
2680 if (cmd->se_cmd.prot_op) in qlt_rdy_to_xfer()
2694 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) in qlt_rdy_to_xfer()
2697 cmd->state = QLA_TGT_STATE_NEED_DATA; in qlt_rdy_to_xfer()
2698 cmd->cmd_sent_to_fw = 1; in qlt_rdy_to_xfer()
2708 qlt_unmap_sg(vha, cmd); in qlt_rdy_to_xfer()
2721 qlt_handle_dif_error(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd, in qlt_handle_dif_error() argument
2729 uint64_t lba = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2744 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2753 ((cmd->se_cmd.prot_type != TARGET_DIF_TYPE3_PROT) || in qlt_handle_dif_error()
2759 cmd->se_cmd.bad_sector = e_ref_tag; in qlt_handle_dif_error()
2760 cmd->se_cmd.pi_err = 0; in qlt_handle_dif_error()
2765 if (cmd->prot_sg_cnt) { in qlt_handle_dif_error()
2770 sgl = cmd->prot_sg; in qlt_handle_dif_error()
2773 for_each_sg(sgl, sg, cmd->prot_sg_cnt, i) { in qlt_handle_dif_error()
2801 if (cmd->se_cmd.prot_type == SCSI_PROT_DIF_TYPE3) in qlt_handle_dif_error()
2811 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; in qlt_handle_dif_error()
2812 cmd->se_cmd.bad_sector = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2816 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2818 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2824 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; in qlt_handle_dif_error()
2825 cmd->se_cmd.bad_sector = e_ref_tag; in qlt_handle_dif_error()
2829 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2831 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2837 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; in qlt_handle_dif_error()
2838 cmd->se_cmd.bad_sector = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2842 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2844 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2938 struct qla_tgt_cmd *cmd, in __qlt_send_term_exchange() argument
2957 if (cmd != NULL) { in __qlt_send_term_exchange()
2958 if (cmd->state < QLA_TGT_STATE_PROCESSED) { in __qlt_send_term_exchange()
2961 "incorrect state %d\n", vha->vp_idx, cmd, in __qlt_send_term_exchange()
2962 cmd->state); in __qlt_send_term_exchange()
2972 ctio24->nport_handle = cmd ? cmd->loop_id : CTIO7_NHANDLE_UNRECOGNIZED; in __qlt_send_term_exchange()
2999 struct qla_tgt_cmd *cmd, struct atio_from_isp *atio, int ha_locked) in qlt_send_term_exchange() argument
3008 rc = __qlt_send_term_exchange(vha, cmd, atio); in qlt_send_term_exchange()
3014 rc = __qlt_send_term_exchange(vha, cmd, atio); in qlt_send_term_exchange()
3019 if (cmd && ((cmd->state != QLA_TGT_STATE_ABORTED) || in qlt_send_term_exchange()
3020 !cmd->cmd_sent_to_fw)) { in qlt_send_term_exchange()
3021 if (cmd->sg_mapped) in qlt_send_term_exchange()
3022 qlt_unmap_sg(vha, cmd); in qlt_send_term_exchange()
3023 vha->hw->tgt.tgt_ops->free_cmd(cmd); in qlt_send_term_exchange()
3035 struct qla_tgt_cmd *cmd, *tcmd; in qlt_init_term_exchange() local
3040 cmd = tcmd = NULL; in qlt_init_term_exchange()
3045 list_for_each_entry_safe(cmd, tcmd, &free_list, cmd_list) { in qlt_init_term_exchange()
3046 list_del(&cmd->cmd_list); in qlt_init_term_exchange()
3050 qlt_free_cmd(cmd); in qlt_init_term_exchange()
3079 void qlt_abort_cmd(struct qla_tgt_cmd *cmd) in qlt_abort_cmd() argument
3081 struct qla_tgt *tgt = cmd->tgt; in qlt_abort_cmd()
3083 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_abort_cmd()
3087 "(se_cmd=%p, tag=%llu)", vha->vp_idx, cmd, &cmd->se_cmd, in qlt_abort_cmd()
3088 cmd->tag); in qlt_abort_cmd()
3090 cmd->state = QLA_TGT_STATE_ABORTED; in qlt_abort_cmd()
3091 cmd->cmd_flags |= BIT_6; in qlt_abort_cmd()
3093 qlt_send_term_exchange(vha, cmd, &cmd->atio, 0); in qlt_abort_cmd()
3097 void qlt_free_cmd(struct qla_tgt_cmd *cmd) in qlt_free_cmd() argument
3099 struct qla_tgt_sess *sess = cmd->sess; in qlt_free_cmd()
3101 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe074, in qlt_free_cmd()
3103 __func__, &cmd->se_cmd, in qlt_free_cmd()
3104 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_cmd()
3106 BUG_ON(cmd->cmd_in_wq); in qlt_free_cmd()
3108 if (!cmd->q_full) in qlt_free_cmd()
3109 qlt_decr_num_pend_cmds(cmd->vha); in qlt_free_cmd()
3111 BUG_ON(cmd->sg_mapped); in qlt_free_cmd()
3112 cmd->jiffies_at_free = get_jiffies_64(); in qlt_free_cmd()
3113 if (unlikely(cmd->free_sg)) in qlt_free_cmd()
3114 kfree(cmd->sg); in qlt_free_cmd()
3120 cmd->jiffies_at_free = get_jiffies_64(); in qlt_free_cmd()
3121 percpu_ida_free(&sess->se_sess->sess_tag_pool, cmd->se_cmd.map_tag); in qlt_free_cmd()
3127 struct qla_tgt_cmd *cmd, void *ctio) in qlt_prepare_srr_ctio() argument
3134 cmd->cmd_flags |= BIT_15; in qlt_prepare_srr_ctio()
3148 sc->cmd = cmd; in qlt_prepare_srr_ctio()
3213 struct qla_tgt_cmd *cmd, uint32_t status) in qlt_term_ctio_exchange() argument
3225 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_term_ctio_exchange()
3238 struct qla_tgt_cmd *cmd = ha->tgt.cmds[handle]; in qlt_get_cmd() local
3240 return cmd; in qlt_get_cmd()
3249 struct qla_tgt_cmd *cmd = NULL; in qlt_ctio_to_cmd() local
3266 cmd = qlt_get_cmd(vha, handle); in qlt_ctio_to_cmd()
3267 if (unlikely(cmd == NULL)) { in qlt_ctio_to_cmd()
3282 return cmd; in qlt_ctio_to_cmd()
3287 qlt_abort_cmd_on_host_reset(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) in qlt_abort_cmd_on_host_reset() argument
3292 if (cmd->sg_mapped) in qlt_abort_cmd_on_host_reset()
3293 qlt_unmap_sg(vha, cmd); in qlt_abort_cmd_on_host_reset()
3298 if (cmd->state == QLA_TGT_STATE_PROCESSED) { in qlt_abort_cmd_on_host_reset()
3301 } else if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_abort_cmd_on_host_reset()
3302 cmd->write_data_transferred = 0; in qlt_abort_cmd_on_host_reset()
3303 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_abort_cmd_on_host_reset()
3308 ha->tgt.tgt_ops->handle_data(cmd); in qlt_abort_cmd_on_host_reset()
3310 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { in qlt_abort_cmd_on_host_reset()
3316 cmd->state); in qlt_abort_cmd_on_host_reset()
3320 cmd->cmd_flags |= BIT_12; in qlt_abort_cmd_on_host_reset()
3321 ha->tgt.tgt_ops->free_cmd(cmd); in qlt_abort_cmd_on_host_reset()
3327 struct qla_tgt_cmd *cmd; in qlt_host_reset_handler() local
3349 cmd = qlt_get_cmd(base_vha, i); in qlt_host_reset_handler()
3350 if (!cmd) in qlt_host_reset_handler()
3353 vha = cmd->vha; in qlt_host_reset_handler()
3354 qlt_abort_cmd_on_host_reset(vha, cmd); in qlt_host_reset_handler()
3369 struct qla_tgt_cmd *cmd; in qlt_do_ctio_completion() local
3381 cmd = qlt_ctio_to_cmd(vha, handle, ctio); in qlt_do_ctio_completion()
3382 if (cmd == NULL) in qlt_do_ctio_completion()
3385 se_cmd = &cmd->se_cmd; in qlt_do_ctio_completion()
3387 cmd->cmd_sent_to_fw = 0; in qlt_do_ctio_completion()
3389 qlt_unmap_sg(vha, cmd); in qlt_do_ctio_completion()
3405 status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3414 status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3421 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3422 if (qlt_prepare_srr_ctio(vha, cmd, ctio) != 0) in qlt_do_ctio_completion()
3432 vha->vp_idx, status, cmd->state, se_cmd, in qlt_do_ctio_completion()
3436 if (qlt_handle_dif_error(vha, cmd, ctio)) { in qlt_do_ctio_completion()
3437 if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_do_ctio_completion()
3445 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_do_ctio_completion()
3446 ha->tgt.tgt_ops->handle_dif_err(cmd); in qlt_do_ctio_completion()
3461 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3472 if ((cmd->state != QLA_TGT_STATE_NEED_DATA) && in qlt_do_ctio_completion()
3473 (cmd->state != QLA_TGT_STATE_ABORTED)) { in qlt_do_ctio_completion()
3474 cmd->cmd_flags |= BIT_13; in qlt_do_ctio_completion()
3475 if (qlt_term_ctio_exchange(vha, ctio, cmd, status)) in qlt_do_ctio_completion()
3481 if (cmd->state == QLA_TGT_STATE_PROCESSED) { in qlt_do_ctio_completion()
3483 } else if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_do_ctio_completion()
3486 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_do_ctio_completion()
3491 cmd->write_data_transferred = 1; in qlt_do_ctio_completion()
3493 ha->tgt.tgt_ops->handle_data(cmd); in qlt_do_ctio_completion()
3495 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { in qlt_do_ctio_completion()
3497 "Aborted command %p (tag %d) finished\n", cmd, cmd->tag); in qlt_do_ctio_completion()
3501 "not return a CTIO complete\n", vha->vp_idx, cmd->state); in qlt_do_ctio_completion()
3505 (cmd->state != QLA_TGT_STATE_ABORTED)) { in qlt_do_ctio_completion()
3511 ha->tgt.tgt_ops->free_cmd(cmd); in qlt_do_ctio_completion()
3551 static void __qlt_do_work(struct qla_tgt_cmd *cmd) in __qlt_do_work() argument
3553 scsi_qla_host_t *vha = cmd->vha; in __qlt_do_work()
3556 struct qla_tgt_sess *sess = cmd->sess; in __qlt_do_work()
3557 struct atio_from_isp *atio = &cmd->atio; in __qlt_do_work()
3563 cmd->cmd_in_wq = 0; in __qlt_do_work()
3564 cmd->cmd_flags |= BIT_1; in __qlt_do_work()
3568 if (cmd->state == QLA_TGT_STATE_ABORTED) { in __qlt_do_work()
3571 cmd->atio.u.isp24.exchange_addr); in __qlt_do_work()
3576 cmd->tag = atio->u.isp24.exchange_addr; in __qlt_do_work()
3577 cmd->unpacked_lun = scsilun_to_int( in __qlt_do_work()
3597 ret = ha->tgt.tgt_ops->handle_cmd(vha, cmd, cdb, data_length, in __qlt_do_work()
3610 ql_dbg(ql_dbg_io, vha, 0x3060, "Terminating work cmd %p", cmd); in __qlt_do_work()
3615 cmd->cmd_flags |= BIT_2; in __qlt_do_work()
3617 qlt_send_term_exchange(vha, NULL, &cmd->atio, 1); in __qlt_do_work()
3620 percpu_ida_free(&sess->se_sess->sess_tag_pool, cmd->se_cmd.map_tag); in __qlt_do_work()
3627 struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work); in qlt_do_work() local
3628 scsi_qla_host_t *vha = cmd->vha; in qlt_do_work()
3632 list_del(&cmd->cmd_list); in qlt_do_work()
3635 __qlt_do_work(cmd); in qlt_do_work()
3643 struct qla_tgt_cmd *cmd; in qlt_get_tag() local
3650 cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; in qlt_get_tag()
3651 memset(cmd, 0, sizeof(struct qla_tgt_cmd)); in qlt_get_tag()
3653 memcpy(&cmd->atio, atio, sizeof(*atio)); in qlt_get_tag()
3654 cmd->state = QLA_TGT_STATE_NEW; in qlt_get_tag()
3655 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_get_tag()
3657 cmd->vha = vha; in qlt_get_tag()
3658 cmd->se_cmd.map_tag = tag; in qlt_get_tag()
3659 cmd->sess = sess; in qlt_get_tag()
3660 cmd->loop_id = sess->loop_id; in qlt_get_tag()
3661 cmd->conf_compl_supported = sess->conf_compl_supported; in qlt_get_tag()
3663 cmd->cmd_flags = 0; in qlt_get_tag()
3664 cmd->jiffies_at_alloc = get_jiffies_64(); in qlt_get_tag()
3666 cmd->reset_count = vha->hw->chip_reset; in qlt_get_tag()
3668 return cmd; in qlt_get_tag()
3681 struct qla_tgt_cmd *cmd; in qlt_create_sess_from_atio() local
3719 cmd = qlt_get_tag(vha, sess, &op->atio); in qlt_create_sess_from_atio()
3720 if (!cmd) { in qlt_create_sess_from_atio()
3732 __qlt_do_work(cmd); in qlt_create_sess_from_atio()
3751 struct qla_tgt_cmd *cmd; in qlt_handle_cmd_for_atio() local
3792 cmd = qlt_get_tag(vha, sess, atio); in qlt_handle_cmd_for_atio()
3793 if (!cmd) { in qlt_handle_cmd_for_atio()
3800 cmd->cmd_in_wq = 1; in qlt_handle_cmd_for_atio()
3801 cmd->cmd_flags |= BIT_0; in qlt_handle_cmd_for_atio()
3804 list_add_tail(&cmd->cmd_list, &vha->qla_cmd_list); in qlt_handle_cmd_for_atio()
3807 INIT_WORK(&cmd->work, qlt_do_work); in qlt_handle_cmd_for_atio()
3808 queue_work(qla_tgt_wq, &cmd->work); in qlt_handle_cmd_for_atio()
4116 struct qla_tgt_cmd *cmd; in abort_cmds_for_s_id() local
4132 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_s_id()
4133 uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); in abort_cmds_for_s_id()
4135 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmds_for_s_id()
4321 static int qlt_set_data_offset(struct qla_tgt_cmd *cmd, uint32_t offset) in qlt_set_data_offset() argument
4327 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe023, in qlt_set_data_offset()
4330 cmd, cmd->sg, cmd->sg_cnt, cmd->dma_data_direction); in qlt_set_data_offset()
4339 if (!cmd->sg || !cmd->sg_cnt) { in qlt_set_data_offset()
4340 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe055, in qlt_set_data_offset()
4348 for_each_sg(cmd->sg, sg, cmd->sg_cnt, i) { in qlt_set_data_offset()
4349 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe024, in qlt_set_data_offset()
4356 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe025, in qlt_set_data_offset()
4367 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe056, in qlt_set_data_offset()
4371 sg_srr_cnt = (cmd->sg_cnt - i); in qlt_set_data_offset()
4375 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe057, in qlt_set_data_offset()
4400 cmd->sg = sg_srr; in qlt_set_data_offset()
4401 cmd->sg_cnt = sg_srr_cnt; in qlt_set_data_offset()
4402 cmd->bufflen = bufflen; in qlt_set_data_offset()
4403 cmd->offset += offset; in qlt_set_data_offset()
4404 cmd->free_sg = 1; in qlt_set_data_offset()
4406 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe026, "New cmd->sg: %p\n", cmd->sg); in qlt_set_data_offset()
4407 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe027, "New cmd->sg_cnt: %u\n", in qlt_set_data_offset()
4408 cmd->sg_cnt); in qlt_set_data_offset()
4409 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe028, "New cmd->bufflen: %u\n", in qlt_set_data_offset()
4410 cmd->bufflen); in qlt_set_data_offset()
4411 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe029, "New cmd->offset: %u\n", in qlt_set_data_offset()
4412 cmd->offset); in qlt_set_data_offset()
4414 if (cmd->sg_cnt < 0) in qlt_set_data_offset()
4417 if (cmd->bufflen < 0) in qlt_set_data_offset()
4423 static inline int qlt_srr_adjust_data(struct qla_tgt_cmd *cmd, in qlt_srr_adjust_data() argument
4428 rel_offs = srr_rel_offs - cmd->offset; in qlt_srr_adjust_data()
4429 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf027, "srr_rel_offs=%d, rel_offs=%d", in qlt_srr_adjust_data()
4435 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf062, in qlt_srr_adjust_data()
4437 cmd->vha->vp_idx, rel_offs); in qlt_srr_adjust_data()
4439 } else if (rel_offs == cmd->bufflen) in qlt_srr_adjust_data()
4442 res = qlt_set_data_offset(cmd, rel_offs); in qlt_srr_adjust_data()
4454 struct qla_tgt_cmd *cmd = sctio->cmd; in qlt_handle_srr() local
4455 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_handle_srr()
4465 cmd, srr_ui); in qlt_handle_srr()
4477 if (!cmd->sg || !cmd->sg_cnt) { in qlt_handle_srr()
4480 " missing cmd->sg, state: %d\n", cmd->state); in qlt_handle_srr()
4490 cmd->bufflen = se_cmd->data_length; in qlt_handle_srr()
4492 if (qlt_has_data(cmd)) { in qlt_handle_srr()
4493 if (qlt_srr_adjust_data(cmd, offset, &xmit_type) != 0) in qlt_handle_srr()
4504 "reject", vha->vp_idx, cmd->tag, in qlt_handle_srr()
4505 cmd->se_cmd.scsi_status); in qlt_handle_srr()
4510 if (!cmd->sg || !cmd->sg_cnt) { in qlt_handle_srr()
4523 cmd->bufflen = se_cmd->data_length; in qlt_handle_srr()
4525 if (qlt_has_data(cmd)) { in qlt_handle_srr()
4526 if (qlt_srr_adjust_data(cmd, offset, &xmit_type) != 0) in qlt_handle_srr()
4533 cmd->cmd_flags |= BIT_8; in qlt_handle_srr()
4534 qlt_rdy_to_xfer(cmd); in qlt_handle_srr()
4540 "reject", vha->vp_idx, cmd->tag, in qlt_handle_srr()
4541 cmd->se_cmd.scsi_status); in qlt_handle_srr()
4554 cmd->cmd_flags |= BIT_7; in qlt_handle_srr()
4555 qlt_xmit_response(cmd, xmit_type, se_cmd->scsi_status); in qlt_handle_srr()
4566 if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_handle_srr()
4567 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_handle_srr()
4570 cmd->cmd_flags |= BIT_9; in qlt_handle_srr()
4571 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_handle_srr()
4610 struct qla_tgt_cmd *cmd; in qlt_handle_srr_work() local
4644 cmd = sctio->cmd; in qlt_handle_srr_work()
4650 cmd->offset = 0; in qlt_handle_srr_work()
4651 if (cmd->free_sg) { in qlt_handle_srr_work()
4652 kfree(cmd->sg); in qlt_handle_srr_work()
4653 cmd->sg = NULL; in qlt_handle_srr_work()
4654 cmd->free_sg = 0; in qlt_handle_srr_work()
4656 se_cmd = &cmd->se_cmd; in qlt_handle_srr_work()
4658 cmd->sg_cnt = se_cmd->t_data_nents; in qlt_handle_srr_work()
4659 cmd->sg = se_cmd->t_data_sg; in qlt_handle_srr_work()
4663 "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag, in qlt_handle_srr_work()
4665 cmd->sg_cnt, cmd->offset); in qlt_handle_srr_work()
4746 qlt_send_term_exchange(vha, sctio->cmd, in qlt_prepare_srr_imm()
4747 &sctio->cmd->atio, 1); in qlt_prepare_srr_imm()
4971 struct qla_tgt_cmd *cmd; in qlt_alloc_qfull_cmd() local
5007 cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; in qlt_alloc_qfull_cmd()
5008 if (!cmd) { in qlt_alloc_qfull_cmd()
5023 memset(cmd, 0, sizeof(struct qla_tgt_cmd)); in qlt_alloc_qfull_cmd()
5026 INIT_LIST_HEAD(&cmd->cmd_list); in qlt_alloc_qfull_cmd()
5027 memcpy(&cmd->atio, atio, sizeof(*atio)); in qlt_alloc_qfull_cmd()
5029 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_alloc_qfull_cmd()
5030 cmd->vha = vha; in qlt_alloc_qfull_cmd()
5031 cmd->reset_count = vha->hw->chip_reset; in qlt_alloc_qfull_cmd()
5032 cmd->q_full = 1; in qlt_alloc_qfull_cmd()
5035 cmd->q_full = 1; in qlt_alloc_qfull_cmd()
5037 cmd->state = status; in qlt_alloc_qfull_cmd()
5039 cmd->term_exchg = 1; in qlt_alloc_qfull_cmd()
5041 list_add_tail(&cmd->cmd_list, &vha->hw->tgt.q_full_list); in qlt_alloc_qfull_cmd()
5055 struct qla_tgt_cmd *cmd, *tcmd; in qlt_free_qfull_cmds() local
5071 list_for_each_entry_safe(cmd, tcmd, &ha->tgt.q_full_list, cmd_list) { in qlt_free_qfull_cmds()
5072 if (cmd->q_full) in qlt_free_qfull_cmds()
5074 rc = __qlt_send_busy(vha, &cmd->atio, cmd->state); in qlt_free_qfull_cmds()
5075 else if (cmd->term_exchg) in qlt_free_qfull_cmds()
5076 rc = __qlt_send_term_exchange(vha, NULL, &cmd->atio); in qlt_free_qfull_cmds()
5081 if (cmd->q_full) in qlt_free_qfull_cmds()
5084 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_qfull_cmds()
5085 else if (cmd->term_exchg) in qlt_free_qfull_cmds()
5088 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_qfull_cmds()
5092 cmd); in qlt_free_qfull_cmds()
5094 list_del(&cmd->cmd_list); in qlt_free_qfull_cmds()
5095 list_add_tail(&cmd->cmd_list, &free_list); in qlt_free_qfull_cmds()
5102 cmd = NULL; in qlt_free_qfull_cmds()
5104 list_for_each_entry_safe(cmd, tcmd, &free_list, cmd_list) { in qlt_free_qfull_cmds()
5105 list_del(&cmd->cmd_list); in qlt_free_qfull_cmds()
5109 qlt_free_cmd(cmd); in qlt_free_qfull_cmds()
6490 qlt_update_vp_map(struct scsi_qla_host *vha, int cmd) in qlt_update_vp_map() argument
6495 switch (cmd) { in qlt_update_vp_map()