unsigned long size;
 
        nr_io_queues = max_io_queues();
+
+       /*
+        * If tags are shared with admin queue (Apple bug), then
+        * make sure we only use one IO queue.
+        */
+       if (dev->ctrl.quirks & NVME_QUIRK_SHARED_TAGS)
+               nr_io_queues = 1;
+
        result = nvme_set_queue_count(&dev->ctrl, &nr_io_queues);
        if (result < 0)
                return result;
                dev->tagset.flags = BLK_MQ_F_SHOULD_MERGE;
                dev->tagset.driver_data = dev;
 
+               /*
+                * Some Apple controllers requires tags to be unique
+                * across admin and IO queue, so reserve the first 32
+                * tags of the IO queue.
+                */
+               if (dev->ctrl.quirks & NVME_QUIRK_SHARED_TAGS)
+                       dev->tagset.reserved_tags = NVME_AQ_DEPTH;
+
                ret = blk_mq_alloc_tag_set(&dev->tagset);
                if (ret) {
                        dev_warn(dev->ctrl.device,
                         "set queue depth=%u\n", dev->q_depth);
        }
 
+       /*
+        * Controllers with the shared tags quirk need the IO queue to be
+        * big enough so that we get 32 tags for the admin queue
+        */
+       if ((dev->ctrl.quirks & NVME_QUIRK_SHARED_TAGS) &&
+           (dev->q_depth < (NVME_AQ_DEPTH + 2))) {
+               dev->q_depth = NVME_AQ_DEPTH + 2;
+               dev_warn(dev->ctrl.device, "IO queue depth clamped to %d\n",
+                        dev->q_depth);
+       }
+
+
        nvme_map_cmb(dev);
 
        pci_enable_pcie_error_reporting(pdev);
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2005),
                .driver_data = NVME_QUIRK_SINGLE_VECTOR |
-                               NVME_QUIRK_128_BYTES_SQES },
+                               NVME_QUIRK_128_BYTES_SQES |
+                               NVME_QUIRK_SHARED_TAGS },
        { 0, }
 };
 MODULE_DEVICE_TABLE(pci, nvme_id_table);