Lines Matching refs:cmd
108 *cmd, struct atio_from_isp *atio, int ha_locked);
112 struct qla_tgt_cmd *cmd);
1298 struct qla_tgt_cmd *cmd; in abort_cmd_for_tag() local
1310 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmd_for_tag()
1311 if (tag == cmd->atio.u.isp24.exchange_addr) { in abort_cmd_for_tag()
1312 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmd_for_tag()
1331 struct qla_tgt_cmd *cmd; in abort_cmds_for_lun() local
1346 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_lun()
1350 cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); in abort_cmds_for_lun()
1352 (struct scsi_lun *)&cmd->atio.u.isp24.fcp_cmnd.lun); in abort_cmds_for_lun()
1354 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmds_for_lun()
1373 struct qla_tgt_cmd *cmd = in __qlt_24xx_handle_abts() local
1376 lun = cmd->unpacked_lun; in __qlt_24xx_handle_abts()
1604 struct qla_tgt_cmd *cmd = prm->cmd; in qlt_pci_map_calc_cnt() local
1606 BUG_ON(cmd->sg_cnt == 0); in qlt_pci_map_calc_cnt()
1608 prm->sg = (struct scatterlist *)cmd->sg; in qlt_pci_map_calc_cnt()
1609 prm->seg_cnt = pci_map_sg(prm->tgt->ha->pdev, cmd->sg, in qlt_pci_map_calc_cnt()
1610 cmd->sg_cnt, cmd->dma_data_direction); in qlt_pci_map_calc_cnt()
1614 prm->cmd->sg_mapped = 1; in qlt_pci_map_calc_cnt()
1616 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) { in qlt_pci_map_calc_cnt()
1627 if ((cmd->se_cmd.prot_op == TARGET_PROT_DIN_INSERT) || in qlt_pci_map_calc_cnt()
1628 (cmd->se_cmd.prot_op == TARGET_PROT_DOUT_STRIP)) { in qlt_pci_map_calc_cnt()
1629 prm->seg_cnt = DIV_ROUND_UP(cmd->bufflen, cmd->blk_sz); in qlt_pci_map_calc_cnt()
1634 if (cmd->prot_sg_cnt) { in qlt_pci_map_calc_cnt()
1635 prm->prot_sg = cmd->prot_sg; in qlt_pci_map_calc_cnt()
1637 cmd->prot_sg, cmd->prot_sg_cnt, in qlt_pci_map_calc_cnt()
1638 cmd->dma_data_direction); in qlt_pci_map_calc_cnt()
1642 if ((cmd->se_cmd.prot_op == TARGET_PROT_DIN_INSERT) || in qlt_pci_map_calc_cnt()
1643 (cmd->se_cmd.prot_op == TARGET_PROT_DOUT_STRIP)) { in qlt_pci_map_calc_cnt()
1645 prm->prot_seg_cnt = DIV_ROUND_UP(cmd->bufflen, in qlt_pci_map_calc_cnt()
1646 cmd->blk_sz); in qlt_pci_map_calc_cnt()
1656 ql_dbg(ql_dbg_tgt, prm->cmd->vha, 0xe04d, in qlt_pci_map_calc_cnt()
1658 0, prm->cmd->sg_cnt); in qlt_pci_map_calc_cnt()
1662 static void qlt_unmap_sg(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) in qlt_unmap_sg() argument
1666 if (!cmd->sg_mapped) in qlt_unmap_sg()
1669 pci_unmap_sg(ha->pdev, cmd->sg, cmd->sg_cnt, cmd->dma_data_direction); in qlt_unmap_sg()
1670 cmd->sg_mapped = 0; in qlt_unmap_sg()
1672 if (cmd->prot_sg_cnt) in qlt_unmap_sg()
1673 pci_unmap_sg(ha->pdev, cmd->prot_sg, cmd->prot_sg_cnt, in qlt_unmap_sg()
1674 cmd->dma_data_direction); in qlt_unmap_sg()
1676 if (cmd->ctx_dsd_alloced) in qlt_unmap_sg()
1677 qla2x00_clean_dsd_pool(ha, NULL, cmd); in qlt_unmap_sg()
1679 if (cmd->ctx) in qlt_unmap_sg()
1680 dma_pool_free(ha->dl_dma_pool, cmd->ctx, cmd->ctx->crc_ctx_dma); in qlt_unmap_sg()
1763 struct atio_from_isp *atio = &prm->cmd->atio; in qlt_24xx_build_ctio_pkt()
1783 ha->tgt.cmds[h-1] = prm->cmd; in qlt_24xx_build_ctio_pkt()
1786 pkt->nport_handle = prm->cmd->loop_id; in qlt_24xx_build_ctio_pkt()
1795 pkt->u.status0.relative_offset = cpu_to_le32(prm->cmd->offset); in qlt_24xx_build_ctio_pkt()
1871 pkt24->u.status0.transfer_length = cpu_to_le32(prm->cmd->bufflen); in qlt_load_data_segments()
1908 static inline int qlt_has_data(struct qla_tgt_cmd *cmd) in qlt_has_data() argument
1910 return cmd->bufflen > 0; in qlt_has_data()
1916 static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd, in qlt_pre_xmit_response() argument
1920 struct qla_tgt *tgt = cmd->tgt; in qlt_pre_xmit_response()
1923 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_pre_xmit_response()
1925 prm->cmd = cmd; in qlt_pre_xmit_response()
1928 prm->sense_buffer = &cmd->sense_buffer[0]; in qlt_pre_xmit_response()
1939 if ((xmit_type & QLA_TGT_XMIT_DATA) && qlt_has_data(cmd)) { in qlt_pre_xmit_response()
1952 cmd->bufflen, prm->rq_result); in qlt_pre_xmit_response()
1959 se_cmd->t_task_cdb[0] : 0, cmd->bufflen, prm->rq_result); in qlt_pre_xmit_response()
1968 if (qlt_has_data(cmd)) { in qlt_pre_xmit_response()
1982 struct qla_tgt_cmd *cmd, int sending_sense) in qlt_need_explicit_conf() argument
1988 return cmd->conf_compl_supported; in qlt_need_explicit_conf()
1991 cmd->conf_compl_supported; in qlt_need_explicit_conf()
2025 static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type) in qlt_check_srr_debug() argument
2031 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf015, in qlt_check_srr_debug()
2032 "Dropping cmd %p (tag %d) status", cmd, se_cmd->tag); in qlt_check_srr_debug()
2039 if (cmd->dma_data_direction != DMA_FROM_DEVICE) in qlt_check_srr_debug()
2042 if (qlt_has_data(cmd) && (cmd->sg_cnt > 1) && in qlt_check_srr_debug()
2048 leave = qlt_srr_random() % cmd->sg_cnt; in qlt_check_srr_debug()
2051 tot_len += cmd->sg[i].length; in qlt_check_srr_debug()
2053 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf016, in qlt_check_srr_debug()
2056 " cmd->sg_cnt %d)", cmd, se_cmd->tag, tot_len, leave, in qlt_check_srr_debug()
2057 cmd->bufflen, cmd->sg_cnt); in qlt_check_srr_debug()
2059 cmd->bufflen = tot_len; in qlt_check_srr_debug()
2060 cmd->sg_cnt = leave; in qlt_check_srr_debug()
2063 if (qlt_has_data(cmd) && ((qlt_srr_random() % 100) == 70)) { in qlt_check_srr_debug()
2064 unsigned int offset = qlt_srr_random() % cmd->bufflen; in qlt_check_srr_debug()
2066 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf017, in qlt_check_srr_debug()
2068 "to offset %d (cmd->bufflen %d)", cmd, se_cmd->tag, offset, in qlt_check_srr_debug()
2069 cmd->bufflen); in qlt_check_srr_debug()
2072 else if (qlt_set_data_offset(cmd, offset)) { in qlt_check_srr_debug()
2073 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf018, in qlt_check_srr_debug()
2079 static inline void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type) in qlt_check_srr_debug() argument
2089 if (qlt_need_explicit_conf(prm->tgt->ha, prm->cmd, 0)) { in qlt_24xx_init_ctio_to_isp()
2099 if (qlt_need_explicit_conf(prm->tgt->ha, prm->cmd, 1)) { in qlt_24xx_init_ctio_to_isp()
2100 if (prm->cmd->se_cmd.scsi_status != 0) { in qlt_24xx_init_ctio_to_isp()
2101 ql_dbg(ql_dbg_tgt, prm->cmd->vha, 0xe017, in qlt_24xx_init_ctio_to_isp()
2271 struct qla_tgt_cmd *cmd = prm->cmd; in qlt_build_ctio_crc2_pkt() local
2272 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_build_ctio_crc2_pkt()
2274 struct atio_from_isp *atio = &prm->cmd->atio; in qlt_build_ctio_crc2_pkt()
2293 data_bytes = cmd->bufflen; in qlt_build_ctio_crc2_pkt()
2294 dif_bytes = (data_bytes / cmd->blk_sz) * 8; in qlt_build_ctio_crc2_pkt()
2361 ha->tgt.cmds[h-1] = prm->cmd; in qlt_build_ctio_crc2_pkt()
2365 pkt->nport_handle = prm->cmd->loop_id; in qlt_build_ctio_crc2_pkt()
2378 pkt->relative_offset = cpu_to_le32(prm->cmd->offset); in qlt_build_ctio_crc2_pkt()
2381 if (cmd->dma_data_direction == DMA_TO_DEVICE) in qlt_build_ctio_crc2_pkt()
2383 else if (cmd->dma_data_direction == DMA_FROM_DEVICE) in qlt_build_ctio_crc2_pkt()
2395 crc_ctx_pkt = cmd->ctx = in qlt_build_ctio_crc2_pkt()
2433 crc_ctx_pkt->blk_size = cpu_to_le16(cmd->blk_sz); in qlt_build_ctio_crc2_pkt()
2444 prm->tot_dsds, cmd)) in qlt_build_ctio_crc2_pkt()
2447 (prm->tot_dsds - prm->prot_seg_cnt), cmd)) in qlt_build_ctio_crc2_pkt()
2456 prm->prot_seg_cnt, cmd)) in qlt_build_ctio_crc2_pkt()
2472 int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type, in qlt_xmit_response() argument
2475 struct scsi_qla_host *vha = cmd->vha; in qlt_xmit_response()
2484 if (cmd->sess && cmd->sess->deleted == QLA_SESS_DELETION_IN_PROGRESS) { in qlt_xmit_response()
2485 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_xmit_response()
2486 if (cmd->sess->logout_completed) in qlt_xmit_response()
2488 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_xmit_response()
2490 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_xmit_response()
2497 qlt_check_srr_debug(cmd, &xmit_type); in qlt_xmit_response()
2499 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe018, in qlt_xmit_response()
2502 1 : 0, cmd->bufflen, cmd->sg_cnt, cmd->dma_data_direction, in qlt_xmit_response()
2503 &cmd->se_cmd); in qlt_xmit_response()
2505 res = qlt_pre_xmit_response(cmd, &prm, xmit_type, scsi_status, in qlt_xmit_response()
2513 if (qla2x00_reset_active(vha) || cmd->reset_count != ha->chip_reset) { in qlt_xmit_response()
2518 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_xmit_response()
2519 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_xmit_response()
2522 qla2x00_reset_active(vha), cmd->reset_count, in qlt_xmit_response()
2533 if (cmd->se_cmd.prot_op && (xmit_type & QLA_TGT_XMIT_DATA)) in qlt_xmit_response()
2544 if (qlt_has_data(cmd) && (xmit_type & QLA_TGT_XMIT_DATA)) { in qlt_xmit_response()
2549 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) in qlt_xmit_response()
2560 if (qlt_need_explicit_conf(ha, cmd, 0)) { in qlt_xmit_response()
2610 cmd->state = QLA_TGT_STATE_PROCESSED; /* Mid-level is done processing */ in qlt_xmit_response()
2611 cmd->cmd_sent_to_fw = 1; in qlt_xmit_response()
2621 qlt_unmap_sg(vha, cmd); in qlt_xmit_response()
2628 int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd) in qlt_rdy_to_xfer() argument
2631 struct scsi_qla_host *vha = cmd->vha; in qlt_rdy_to_xfer()
2633 struct qla_tgt *tgt = cmd->tgt; in qlt_rdy_to_xfer()
2639 prm.cmd = cmd; in qlt_rdy_to_xfer()
2654 if (qla2x00_reset_active(vha) || (cmd->reset_count != ha->chip_reset) || in qlt_rdy_to_xfer()
2655 (cmd->sess && cmd->sess->deleted == QLA_SESS_DELETION_IN_PROGRESS)) { in qlt_rdy_to_xfer()
2660 cmd->state = QLA_TGT_STATE_NEED_DATA; in qlt_rdy_to_xfer()
2661 qlt_abort_cmd_on_host_reset(cmd->vha, cmd); in qlt_rdy_to_xfer()
2664 qla2x00_reset_active(vha), cmd->reset_count, in qlt_rdy_to_xfer()
2674 if (cmd->se_cmd.prot_op) in qlt_rdy_to_xfer()
2688 if (cmd->se_cmd.prot_op == TARGET_PROT_NORMAL) in qlt_rdy_to_xfer()
2691 cmd->state = QLA_TGT_STATE_NEED_DATA; in qlt_rdy_to_xfer()
2692 cmd->cmd_sent_to_fw = 1; in qlt_rdy_to_xfer()
2702 qlt_unmap_sg(vha, cmd); in qlt_rdy_to_xfer()
2715 qlt_handle_dif_error(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd, in qlt_handle_dif_error() argument
2723 uint64_t lba = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2738 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2747 ((cmd->se_cmd.prot_type != TARGET_DIF_TYPE3_PROT) || in qlt_handle_dif_error()
2753 cmd->se_cmd.bad_sector = e_ref_tag; in qlt_handle_dif_error()
2754 cmd->se_cmd.pi_err = 0; in qlt_handle_dif_error()
2759 if (cmd->prot_sg_cnt) { in qlt_handle_dif_error()
2764 sgl = cmd->prot_sg; in qlt_handle_dif_error()
2767 for_each_sg(sgl, sg, cmd->prot_sg_cnt, i) { in qlt_handle_dif_error()
2794 if (cmd->se_cmd.prot_type == SCSI_PROT_DIF_TYPE3) in qlt_handle_dif_error()
2804 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED; in qlt_handle_dif_error()
2805 cmd->se_cmd.bad_sector = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2809 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2811 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2817 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED; in qlt_handle_dif_error()
2818 cmd->se_cmd.bad_sector = e_ref_tag; in qlt_handle_dif_error()
2822 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2824 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2830 cmd->se_cmd.pi_err = TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED; in qlt_handle_dif_error()
2831 cmd->se_cmd.bad_sector = cmd->se_cmd.t_task_lba; in qlt_handle_dif_error()
2835 cmd->atio.u.isp24.fcp_cmnd.cdb[0], lba, in qlt_handle_dif_error()
2837 a_guard, e_guard, cmd); in qlt_handle_dif_error()
2931 struct qla_tgt_cmd *cmd, in __qlt_send_term_exchange() argument
2950 if (cmd != NULL) { in __qlt_send_term_exchange()
2951 if (cmd->state < QLA_TGT_STATE_PROCESSED) { in __qlt_send_term_exchange()
2954 "incorrect state %d\n", vha->vp_idx, cmd, in __qlt_send_term_exchange()
2955 cmd->state); in __qlt_send_term_exchange()
2965 ctio24->nport_handle = cmd ? cmd->loop_id : CTIO7_NHANDLE_UNRECOGNIZED; in __qlt_send_term_exchange()
2992 struct qla_tgt_cmd *cmd, struct atio_from_isp *atio, int ha_locked) in qlt_send_term_exchange() argument
3001 rc = __qlt_send_term_exchange(vha, cmd, atio); in qlt_send_term_exchange()
3007 rc = __qlt_send_term_exchange(vha, cmd, atio); in qlt_send_term_exchange()
3012 if (cmd && ((cmd->state != QLA_TGT_STATE_ABORTED) || in qlt_send_term_exchange()
3013 !cmd->cmd_sent_to_fw)) { in qlt_send_term_exchange()
3014 if (cmd->sg_mapped) in qlt_send_term_exchange()
3015 qlt_unmap_sg(vha, cmd); in qlt_send_term_exchange()
3016 vha->hw->tgt.tgt_ops->free_cmd(cmd); in qlt_send_term_exchange()
3028 struct qla_tgt_cmd *cmd, *tcmd; in qlt_init_term_exchange() local
3033 cmd = tcmd = NULL; in qlt_init_term_exchange()
3038 list_for_each_entry_safe(cmd, tcmd, &free_list, cmd_list) { in qlt_init_term_exchange()
3039 list_del(&cmd->cmd_list); in qlt_init_term_exchange()
3043 qlt_free_cmd(cmd); in qlt_init_term_exchange()
3072 void qlt_abort_cmd(struct qla_tgt_cmd *cmd) in qlt_abort_cmd() argument
3074 struct qla_tgt *tgt = cmd->tgt; in qlt_abort_cmd()
3076 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_abort_cmd()
3080 "(se_cmd=%p, tag=%llu)", vha->vp_idx, cmd, &cmd->se_cmd, in qlt_abort_cmd()
3083 cmd->state = QLA_TGT_STATE_ABORTED; in qlt_abort_cmd()
3084 cmd->cmd_flags |= BIT_6; in qlt_abort_cmd()
3086 qlt_send_term_exchange(vha, cmd, &cmd->atio, 0); in qlt_abort_cmd()
3090 void qlt_free_cmd(struct qla_tgt_cmd *cmd) in qlt_free_cmd() argument
3092 struct qla_tgt_sess *sess = cmd->sess; in qlt_free_cmd()
3094 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe074, in qlt_free_cmd()
3096 __func__, &cmd->se_cmd, in qlt_free_cmd()
3097 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_cmd()
3099 BUG_ON(cmd->cmd_in_wq); in qlt_free_cmd()
3101 if (!cmd->q_full) in qlt_free_cmd()
3102 qlt_decr_num_pend_cmds(cmd->vha); in qlt_free_cmd()
3104 BUG_ON(cmd->sg_mapped); in qlt_free_cmd()
3105 cmd->jiffies_at_free = get_jiffies_64(); in qlt_free_cmd()
3106 if (unlikely(cmd->free_sg)) in qlt_free_cmd()
3107 kfree(cmd->sg); in qlt_free_cmd()
3113 cmd->jiffies_at_free = get_jiffies_64(); in qlt_free_cmd()
3114 percpu_ida_free(&sess->se_sess->sess_tag_pool, cmd->se_cmd.map_tag); in qlt_free_cmd()
3120 struct qla_tgt_cmd *cmd, void *ctio) in qlt_prepare_srr_ctio() argument
3127 cmd->cmd_flags |= BIT_15; in qlt_prepare_srr_ctio()
3141 sc->cmd = cmd; in qlt_prepare_srr_ctio()
3206 struct qla_tgt_cmd *cmd, uint32_t status) in qlt_term_ctio_exchange() argument
3218 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_term_ctio_exchange()
3231 struct qla_tgt_cmd *cmd = ha->tgt.cmds[handle]; in qlt_get_cmd() local
3233 return cmd; in qlt_get_cmd()
3242 struct qla_tgt_cmd *cmd = NULL; in qlt_ctio_to_cmd() local
3259 cmd = qlt_get_cmd(vha, handle); in qlt_ctio_to_cmd()
3260 if (unlikely(cmd == NULL)) { in qlt_ctio_to_cmd()
3275 return cmd; in qlt_ctio_to_cmd()
3280 qlt_abort_cmd_on_host_reset(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd) in qlt_abort_cmd_on_host_reset() argument
3285 if (cmd->sg_mapped) in qlt_abort_cmd_on_host_reset()
3286 qlt_unmap_sg(vha, cmd); in qlt_abort_cmd_on_host_reset()
3291 if (cmd->state == QLA_TGT_STATE_PROCESSED) { in qlt_abort_cmd_on_host_reset()
3294 } else if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_abort_cmd_on_host_reset()
3295 cmd->write_data_transferred = 0; in qlt_abort_cmd_on_host_reset()
3296 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_abort_cmd_on_host_reset()
3301 ha->tgt.tgt_ops->handle_data(cmd); in qlt_abort_cmd_on_host_reset()
3303 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { in qlt_abort_cmd_on_host_reset()
3309 cmd->state); in qlt_abort_cmd_on_host_reset()
3313 cmd->cmd_flags |= BIT_17; in qlt_abort_cmd_on_host_reset()
3314 ha->tgt.tgt_ops->free_cmd(cmd); in qlt_abort_cmd_on_host_reset()
3320 struct qla_tgt_cmd *cmd; in qlt_host_reset_handler() local
3342 cmd = qlt_get_cmd(base_vha, i); in qlt_host_reset_handler()
3343 if (!cmd) in qlt_host_reset_handler()
3346 vha = cmd->vha; in qlt_host_reset_handler()
3347 qlt_abort_cmd_on_host_reset(vha, cmd); in qlt_host_reset_handler()
3361 struct qla_tgt_cmd *cmd; in qlt_do_ctio_completion() local
3373 cmd = qlt_ctio_to_cmd(vha, handle, ctio); in qlt_do_ctio_completion()
3374 if (cmd == NULL) in qlt_do_ctio_completion()
3377 se_cmd = &cmd->se_cmd; in qlt_do_ctio_completion()
3378 cmd->cmd_sent_to_fw = 0; in qlt_do_ctio_completion()
3380 qlt_unmap_sg(vha, cmd); in qlt_do_ctio_completion()
3396 status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3405 status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3412 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3413 if (qlt_prepare_srr_ctio(vha, cmd, ctio) != 0) in qlt_do_ctio_completion()
3423 vha->vp_idx, status, cmd->state, se_cmd, in qlt_do_ctio_completion()
3427 if (qlt_handle_dif_error(vha, cmd, ctio)) { in qlt_do_ctio_completion()
3428 if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_do_ctio_completion()
3436 cmd->state = QLA_TGT_STATE_PROCESSED; in qlt_do_ctio_completion()
3437 ha->tgt.tgt_ops->handle_dif_err(cmd); in qlt_do_ctio_completion()
3452 vha->vp_idx, status, cmd->state, se_cmd); in qlt_do_ctio_completion()
3463 if ((cmd->state != QLA_TGT_STATE_NEED_DATA) && in qlt_do_ctio_completion()
3464 (cmd->state != QLA_TGT_STATE_ABORTED)) { in qlt_do_ctio_completion()
3465 cmd->cmd_flags |= BIT_13; in qlt_do_ctio_completion()
3466 if (qlt_term_ctio_exchange(vha, ctio, cmd, status)) in qlt_do_ctio_completion()
3472 if (cmd->state == QLA_TGT_STATE_PROCESSED) { in qlt_do_ctio_completion()
3473 cmd->cmd_flags |= BIT_12; in qlt_do_ctio_completion()
3474 } else if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_do_ctio_completion()
3475 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_do_ctio_completion()
3478 cmd->write_data_transferred = 1; in qlt_do_ctio_completion()
3480 ha->tgt.tgt_ops->handle_data(cmd); in qlt_do_ctio_completion()
3482 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { in qlt_do_ctio_completion()
3483 cmd->cmd_flags |= BIT_18; in qlt_do_ctio_completion()
3485 "Aborted command %p (tag %lld) finished\n", cmd, se_cmd->tag); in qlt_do_ctio_completion()
3487 cmd->cmd_flags |= BIT_19; in qlt_do_ctio_completion()
3490 "not return a CTIO complete\n", vha->vp_idx, cmd->state); in qlt_do_ctio_completion()
3494 (cmd->state != QLA_TGT_STATE_ABORTED)) { in qlt_do_ctio_completion()
3499 ha->tgt.tgt_ops->free_cmd(cmd); in qlt_do_ctio_completion()
3539 static void __qlt_do_work(struct qla_tgt_cmd *cmd) in __qlt_do_work() argument
3541 scsi_qla_host_t *vha = cmd->vha; in __qlt_do_work()
3544 struct qla_tgt_sess *sess = cmd->sess; in __qlt_do_work()
3545 struct atio_from_isp *atio = &cmd->atio; in __qlt_do_work()
3551 cmd->cmd_in_wq = 0; in __qlt_do_work()
3552 cmd->cmd_flags |= BIT_1; in __qlt_do_work()
3556 if (cmd->state == QLA_TGT_STATE_ABORTED) { in __qlt_do_work()
3559 cmd->atio.u.isp24.exchange_addr); in __qlt_do_work()
3564 cmd->se_cmd.tag = atio->u.isp24.exchange_addr; in __qlt_do_work()
3565 cmd->unpacked_lun = scsilun_to_int( in __qlt_do_work()
3585 ret = ha->tgt.tgt_ops->handle_cmd(vha, cmd, cdb, data_length, in __qlt_do_work()
3598 ql_dbg(ql_dbg_io, vha, 0x3060, "Terminating work cmd %p", cmd); in __qlt_do_work()
3603 cmd->cmd_flags |= BIT_2; in __qlt_do_work()
3605 qlt_send_term_exchange(vha, NULL, &cmd->atio, 1); in __qlt_do_work()
3608 percpu_ida_free(&sess->se_sess->sess_tag_pool, cmd->se_cmd.map_tag); in __qlt_do_work()
3615 struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work); in qlt_do_work() local
3616 scsi_qla_host_t *vha = cmd->vha; in qlt_do_work()
3620 list_del(&cmd->cmd_list); in qlt_do_work()
3623 __qlt_do_work(cmd); in qlt_do_work()
3631 struct qla_tgt_cmd *cmd; in qlt_get_tag() local
3638 cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; in qlt_get_tag()
3639 memset(cmd, 0, sizeof(struct qla_tgt_cmd)); in qlt_get_tag()
3641 memcpy(&cmd->atio, atio, sizeof(*atio)); in qlt_get_tag()
3642 cmd->state = QLA_TGT_STATE_NEW; in qlt_get_tag()
3643 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_get_tag()
3645 cmd->vha = vha; in qlt_get_tag()
3646 cmd->se_cmd.map_tag = tag; in qlt_get_tag()
3647 cmd->sess = sess; in qlt_get_tag()
3648 cmd->loop_id = sess->loop_id; in qlt_get_tag()
3649 cmd->conf_compl_supported = sess->conf_compl_supported; in qlt_get_tag()
3651 cmd->cmd_flags = 0; in qlt_get_tag()
3652 cmd->jiffies_at_alloc = get_jiffies_64(); in qlt_get_tag()
3654 cmd->reset_count = vha->hw->chip_reset; in qlt_get_tag()
3656 return cmd; in qlt_get_tag()
3669 struct qla_tgt_cmd *cmd; in qlt_create_sess_from_atio() local
3707 cmd = qlt_get_tag(vha, sess, &op->atio); in qlt_create_sess_from_atio()
3708 if (!cmd) { in qlt_create_sess_from_atio()
3720 __qlt_do_work(cmd); in qlt_create_sess_from_atio()
3739 struct qla_tgt_cmd *cmd; in qlt_handle_cmd_for_atio() local
3780 cmd = qlt_get_tag(vha, sess, atio); in qlt_handle_cmd_for_atio()
3781 if (!cmd) { in qlt_handle_cmd_for_atio()
3788 cmd->cmd_in_wq = 1; in qlt_handle_cmd_for_atio()
3789 cmd->cmd_flags |= BIT_0; in qlt_handle_cmd_for_atio()
3792 list_add_tail(&cmd->cmd_list, &vha->qla_cmd_list); in qlt_handle_cmd_for_atio()
3795 INIT_WORK(&cmd->work, qlt_do_work); in qlt_handle_cmd_for_atio()
3796 queue_work(qla_tgt_wq, &cmd->work); in qlt_handle_cmd_for_atio()
4103 struct qla_tgt_cmd *cmd; in abort_cmds_for_s_id() local
4119 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { in abort_cmds_for_s_id()
4120 uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); in abort_cmds_for_s_id()
4122 cmd->state = QLA_TGT_STATE_ABORTED; in abort_cmds_for_s_id()
4308 static int qlt_set_data_offset(struct qla_tgt_cmd *cmd, uint32_t offset) in qlt_set_data_offset() argument
4322 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe023, in qlt_set_data_offset()
4325 cmd, cmd->sg, cmd->sg_cnt, cmd->dma_data_direction); in qlt_set_data_offset()
4327 if (!cmd->sg || !cmd->sg_cnt) { in qlt_set_data_offset()
4328 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe055, in qlt_set_data_offset()
4336 for_each_sg(cmd->sg, sg, cmd->sg_cnt, i) { in qlt_set_data_offset()
4337 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe024, in qlt_set_data_offset()
4344 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe025, in qlt_set_data_offset()
4355 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe056, in qlt_set_data_offset()
4359 sg_srr_cnt = (cmd->sg_cnt - i); in qlt_set_data_offset()
4363 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe057, in qlt_set_data_offset()
4388 cmd->sg = sg_srr; in qlt_set_data_offset()
4389 cmd->sg_cnt = sg_srr_cnt; in qlt_set_data_offset()
4390 cmd->bufflen = bufflen; in qlt_set_data_offset()
4391 cmd->offset += offset; in qlt_set_data_offset()
4392 cmd->free_sg = 1; in qlt_set_data_offset()
4394 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe026, "New cmd->sg: %p\n", cmd->sg); in qlt_set_data_offset()
4395 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe027, "New cmd->sg_cnt: %u\n", in qlt_set_data_offset()
4396 cmd->sg_cnt); in qlt_set_data_offset()
4397 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe028, "New cmd->bufflen: %u\n", in qlt_set_data_offset()
4398 cmd->bufflen); in qlt_set_data_offset()
4399 ql_dbg(ql_dbg_tgt, cmd->vha, 0xe029, "New cmd->offset: %u\n", in qlt_set_data_offset()
4400 cmd->offset); in qlt_set_data_offset()
4402 if (cmd->sg_cnt < 0) in qlt_set_data_offset()
4405 if (cmd->bufflen < 0) in qlt_set_data_offset()
4412 static inline int qlt_srr_adjust_data(struct qla_tgt_cmd *cmd, in qlt_srr_adjust_data() argument
4417 rel_offs = srr_rel_offs - cmd->offset; in qlt_srr_adjust_data()
4418 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf027, "srr_rel_offs=%d, rel_offs=%d", in qlt_srr_adjust_data()
4424 ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf062, in qlt_srr_adjust_data()
4426 cmd->vha->vp_idx, rel_offs); in qlt_srr_adjust_data()
4428 } else if (rel_offs == cmd->bufflen) in qlt_srr_adjust_data()
4431 res = qlt_set_data_offset(cmd, rel_offs); in qlt_srr_adjust_data()
4443 struct qla_tgt_cmd *cmd = sctio->cmd; in qlt_handle_srr() local
4444 struct se_cmd *se_cmd = &cmd->se_cmd; in qlt_handle_srr()
4454 cmd, srr_ui); in qlt_handle_srr()
4466 if (!cmd->sg || !cmd->sg_cnt) { in qlt_handle_srr()
4469 " missing cmd->sg, state: %d\n", cmd->state); in qlt_handle_srr()
4479 cmd->bufflen = se_cmd->data_length; in qlt_handle_srr()
4481 if (qlt_has_data(cmd)) { in qlt_handle_srr()
4482 if (qlt_srr_adjust_data(cmd, offset, &xmit_type) != 0) in qlt_handle_srr()
4493 cmd->se_cmd.scsi_status); in qlt_handle_srr()
4498 if (!cmd->sg || !cmd->sg_cnt) { in qlt_handle_srr()
4511 cmd->bufflen = se_cmd->data_length; in qlt_handle_srr()
4513 if (qlt_has_data(cmd)) { in qlt_handle_srr()
4514 if (qlt_srr_adjust_data(cmd, offset, &xmit_type) != 0) in qlt_handle_srr()
4521 cmd->cmd_flags |= BIT_8; in qlt_handle_srr()
4522 qlt_rdy_to_xfer(cmd); in qlt_handle_srr()
4527 vha->vp_idx, se_cmd->tag, cmd->se_cmd.scsi_status); in qlt_handle_srr()
4540 cmd->cmd_flags |= BIT_7; in qlt_handle_srr()
4541 qlt_xmit_response(cmd, xmit_type, se_cmd->scsi_status); in qlt_handle_srr()
4552 if (cmd->state == QLA_TGT_STATE_NEED_DATA) { in qlt_handle_srr()
4553 cmd->state = QLA_TGT_STATE_DATA_IN; in qlt_handle_srr()
4556 cmd->cmd_flags |= BIT_9; in qlt_handle_srr()
4557 qlt_send_term_exchange(vha, cmd, &cmd->atio, 1); in qlt_handle_srr()
4600 struct qla_tgt_cmd *cmd; in qlt_handle_srr_work() local
4634 cmd = sctio->cmd; in qlt_handle_srr_work()
4640 cmd->offset = 0; in qlt_handle_srr_work()
4641 if (cmd->free_sg) { in qlt_handle_srr_work()
4642 kfree(cmd->sg); in qlt_handle_srr_work()
4643 cmd->sg = NULL; in qlt_handle_srr_work()
4644 cmd->free_sg = 0; in qlt_handle_srr_work()
4646 se_cmd = &cmd->se_cmd; in qlt_handle_srr_work()
4648 cmd->sg_cnt = se_cmd->t_data_nents; in qlt_handle_srr_work()
4649 cmd->sg = se_cmd->t_data_sg; in qlt_handle_srr_work()
4653 cmd, &cmd->se_cmd, se_cmd->tag, se_cmd->t_task_cdb ? in qlt_handle_srr_work()
4654 se_cmd->t_task_cdb[0] : 0, cmd->sg_cnt, cmd->offset); in qlt_handle_srr_work()
4735 qlt_send_term_exchange(vha, sctio->cmd, in qlt_prepare_srr_imm()
4736 &sctio->cmd->atio, 1); in qlt_prepare_srr_imm()
4960 struct qla_tgt_cmd *cmd; in qlt_alloc_qfull_cmd() local
4996 cmd = &((struct qla_tgt_cmd *)se_sess->sess_cmd_map)[tag]; in qlt_alloc_qfull_cmd()
4997 if (!cmd) { in qlt_alloc_qfull_cmd()
5012 memset(cmd, 0, sizeof(struct qla_tgt_cmd)); in qlt_alloc_qfull_cmd()
5015 INIT_LIST_HEAD(&cmd->cmd_list); in qlt_alloc_qfull_cmd()
5016 memcpy(&cmd->atio, atio, sizeof(*atio)); in qlt_alloc_qfull_cmd()
5018 cmd->tgt = vha->vha_tgt.qla_tgt; in qlt_alloc_qfull_cmd()
5019 cmd->vha = vha; in qlt_alloc_qfull_cmd()
5020 cmd->reset_count = vha->hw->chip_reset; in qlt_alloc_qfull_cmd()
5021 cmd->q_full = 1; in qlt_alloc_qfull_cmd()
5024 cmd->q_full = 1; in qlt_alloc_qfull_cmd()
5026 cmd->state = status; in qlt_alloc_qfull_cmd()
5028 cmd->term_exchg = 1; in qlt_alloc_qfull_cmd()
5030 list_add_tail(&cmd->cmd_list, &vha->hw->tgt.q_full_list); in qlt_alloc_qfull_cmd()
5044 struct qla_tgt_cmd *cmd, *tcmd; in qlt_free_qfull_cmds() local
5060 list_for_each_entry_safe(cmd, tcmd, &ha->tgt.q_full_list, cmd_list) { in qlt_free_qfull_cmds()
5061 if (cmd->q_full) in qlt_free_qfull_cmds()
5063 rc = __qlt_send_busy(vha, &cmd->atio, cmd->state); in qlt_free_qfull_cmds()
5064 else if (cmd->term_exchg) in qlt_free_qfull_cmds()
5065 rc = __qlt_send_term_exchange(vha, NULL, &cmd->atio); in qlt_free_qfull_cmds()
5070 if (cmd->q_full) in qlt_free_qfull_cmds()
5073 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_qfull_cmds()
5074 else if (cmd->term_exchg) in qlt_free_qfull_cmds()
5077 be16_to_cpu(cmd->atio.u.isp24.fcp_hdr.ox_id)); in qlt_free_qfull_cmds()
5081 cmd); in qlt_free_qfull_cmds()
5083 list_del(&cmd->cmd_list); in qlt_free_qfull_cmds()
5084 list_add_tail(&cmd->cmd_list, &free_list); in qlt_free_qfull_cmds()
5091 cmd = NULL; in qlt_free_qfull_cmds()
5093 list_for_each_entry_safe(cmd, tcmd, &free_list, cmd_list) { in qlt_free_qfull_cmds()
5094 list_del(&cmd->cmd_list); in qlt_free_qfull_cmds()
5098 qlt_free_cmd(cmd); in qlt_free_qfull_cmds()
6478 qlt_update_vp_map(struct scsi_qla_host *vha, int cmd) in qlt_update_vp_map() argument
6483 switch (cmd) { in qlt_update_vp_map()