resource_size_t start;
  
        start = pci_resource_start(pdev, IDXD_WQ_BAR);
 -      start = start + wq->id * IDXD_PORTAL_SIZE;
 +      start += idxd_get_wq_portal_full_offset(wq->id, IDXD_PORTAL_LIMITED);
  
-       wq->dportal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE);
-       if (!wq->dportal)
+       wq->portal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE);
+       if (!wq->portal)
                return -ENOMEM;
-       dev_dbg(dev, "wq %d portal mapped at %p\n", wq->id, wq->dportal);
  
        return 0;
  }
 
        if (idxd->state != IDXD_DEV_ENABLED)
                return -EIO;
  
-       portal = wq->dportal;
 -      portal = wq->portal + idxd_get_wq_portal_offset(IDXD_PORTAL_LIMITED);
++      portal = wq->portal;
+ 
        /*
-        * The wmb() flushes writes to coherent DMA data before possibly
-        * triggering a DMA read. The wmb() is necessary even on UP because
-        * the recipient is a device.
+        * The wmb() flushes writes to coherent DMA data before
+        * possibly triggering a DMA read. The wmb() is necessary
+        * even on UP because the recipient is a device.
         */
        wmb();
-       iosubmit_cmds512(portal, desc->hw, 1);
+       if (wq_dedicated(wq)) {
+               iosubmit_cmds512(portal, desc->hw, 1);
+       } else {
+               /*
+                * It's not likely that we would receive queue full rejection
+                * since the descriptor allocation gates at wq size. If we
+                * receive a -EAGAIN, that means something went wrong such as the
+                * device is not accepting descriptor at all.
+                */
+               rc = enqcmds(portal, desc->hw);
+               if (rc < 0)
+                       return rc;
+       }
  
        /*
         * Pending the descriptor to the lockless list for the irq_entry