complete(&tmf->u.tmf.comp);
 }
 
-int
-qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint32_t lun,
-       uint32_t tag)
+static int
+__qla2x00_async_tm_cmd(struct tmf_arg *arg)
 {
-       struct scsi_qla_host *vha = fcport->vha;
+       struct scsi_qla_host *vha = arg->vha;
        struct srb_iocb *tm_iocb;
        srb_t *sp;
+       unsigned long flags;
        int rval = QLA_FUNCTION_FAILED;
 
+       fc_port_t *fcport = arg->fcport;
+
        /* ref: INIT */
-       sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
+       sp = qla2xxx_get_qpair_sp(vha, arg->qpair, fcport, GFP_KERNEL);
        if (!sp)
                goto done;
 
 
        tm_iocb = &sp->u.iocb_cmd;
        init_completion(&tm_iocb->u.tmf.comp);
-       tm_iocb->u.tmf.flags = flags;
-       tm_iocb->u.tmf.lun = lun;
+       tm_iocb->u.tmf.flags = arg->flags;
+       tm_iocb->u.tmf.lun = arg->lun;
 
+       rval = qla2x00_start_sp(sp);
        ql_dbg(ql_dbg_taskm, vha, 0x802f,
-           "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x.\n",
+           "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x ctrl=%x.\n",
            sp->handle, fcport->loop_id, fcport->d_id.b.domain,
-           fcport->d_id.b.area, fcport->d_id.b.al_pa);
+           fcport->d_id.b.area, fcport->d_id.b.al_pa, arg->flags);
 
-       rval = qla2x00_start_sp(sp);
        if (rval != QLA_SUCCESS)
                goto done_free_sp;
        wait_for_completion(&tm_iocb->u.tmf.comp);
 
        if (!test_bit(UNLOADING, &vha->dpc_flags) && !IS_QLAFX00(vha->hw)) {
                flags = tm_iocb->u.tmf.flags;
-               lun = (uint16_t)tm_iocb->u.tmf.lun;
+               if (flags & (TCF_LUN_RESET|TCF_ABORT_TASK_SET|
+                       TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA))
+                       flags = MK_SYNC_ID_LUN;
+               else
+                       flags = MK_SYNC_ID;
 
-               /* Issue Marker IOCB */
-               qla2x00_marker(vha, vha->hw->base_qpair,
-                   fcport->loop_id, lun,
-                   flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
+               qla2x00_marker(vha, sp->qpair,
+                   sp->fcport->loop_id, arg->lun, flags);
        }
 
 done_free_sp:
        return rval;
 }
 
+int
+qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t flags, uint64_t lun,
+                    uint32_t tag)
+{
+       struct scsi_qla_host *vha = fcport->vha;
+       struct qla_qpair *qpair;
+       struct tmf_arg a;
+       struct completion comp;
+       int i, rval;
+
+       init_completion(&comp);
+       a.vha = fcport->vha;
+       a.fcport = fcport;
+       a.lun = lun;
+
+       if (vha->hw->mqenable) {
+               for (i = 0; i < vha->hw->num_qpairs; i++) {
+                       qpair = vha->hw->queue_pair_map[i];
+                       if (!qpair)
+                               continue;
+                       a.qpair = qpair;
+                       a.flags = flags|TCF_NOTMCMD_TO_TARGET;
+                       rval = __qla2x00_async_tm_cmd(&a);
+                       if (rval)
+                               break;
+               }
+       }
+
+       a.qpair = vha->hw->base_qpair;
+       a.flags = flags;
+       rval = __qla2x00_async_tm_cmd(&a);
+
+       return rval;
+}
+
 int
 qla24xx_async_abort_command(srb_t *sp)
 {
 
        scsi_qla_host_t *vha = fcport->vha;
        struct qla_hw_data *ha = vha->hw;
        struct srb_iocb *iocb = &sp->u.iocb_cmd;
-       struct req_que *req = vha->req;
+       struct req_que *req = sp->qpair->req;
 
        flags = iocb->u.tmf.flags;
        lun = iocb->u.tmf.lun;
        tsk->port_id[2] = fcport->d_id.b.domain;
        tsk->vp_index = fcport->vha->vp_idx;
 
-       if (flags == TCF_LUN_RESET) {
+       if (flags & (TCF_LUN_RESET | TCF_ABORT_TASK_SET|
+           TCF_CLEAR_TASK_SET|TCF_CLEAR_ACA)) {
                int_to_scsilun(lun, &tsk->lun);
                host_to_fcp_swap((uint8_t *)&tsk->lun,
                        sizeof(tsk->lun));