cdb = request->cdb;
 
        switch (cmd) {
+       case TEST_UNIT_READY:
+               request->data_direction = SOP_READ_FLAG;
+               cdb[0] = TEST_UNIT_READY;
+               break;
        case INQUIRY:
                request->data_direction = SOP_READ_FLAG;
                cdb[0] = INQUIRY;
        return rc;
 }
 
+/*
+ * Prevent adding drive to OS for some corner cases such as a drive
+ * undergoing a sanitize operation. Some OSes will continue to poll
+ * the drive until the sanitize completes, which can take hours,
+ * resulting in long bootup delays. Commands such as TUR, READ_CAP
+ * are allowed, but READ/WRITE cause check condition. So the OS
+ * cannot check/read the partition table.
+ * Note: devices that have completed sanitize must be re-enabled
+ *       using the management utility.
+ */
+static bool pqi_keep_device_offline(struct pqi_ctrl_info *ctrl_info,
+       struct pqi_scsi_dev *device)
+{
+       u8 scsi_status;
+       int rc;
+       enum dma_data_direction dir;
+       char *buffer;
+       int buffer_length = 64;
+       size_t sense_data_length;
+       struct scsi_sense_hdr sshdr;
+       struct pqi_raid_path_request request;
+       struct pqi_raid_error_info error_info;
+       bool offline = false; /* Assume keep online */
+
+       /* Do not check controllers. */
+       if (pqi_is_hba_lunid(device->scsi3addr))
+               return false;
+
+       /* Do not check LVs. */
+       if (pqi_is_logical_device(device))
+               return false;
+
+       buffer = kmalloc(buffer_length, GFP_KERNEL);
+       if (!buffer)
+               return false; /* Assume not offline */
+
+       /* Check for SANITIZE in progress using TUR */
+       rc = pqi_build_raid_path_request(ctrl_info, &request,
+               TEST_UNIT_READY, RAID_CTLR_LUNID, buffer,
+               buffer_length, 0, &dir);
+       if (rc)
+               goto out; /* Assume not offline */
+
+       memcpy(request.lun_number, device->scsi3addr, sizeof(request.lun_number));
+
+       rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0, &error_info);
+
+       if (rc)
+               goto out; /* Assume not offline */
+
+       scsi_status = error_info.status;
+       sense_data_length = get_unaligned_le16(&error_info.sense_data_length);
+       if (sense_data_length == 0)
+               sense_data_length =
+                       get_unaligned_le16(&error_info.response_data_length);
+       if (sense_data_length) {
+               if (sense_data_length > sizeof(error_info.data))
+                       sense_data_length = sizeof(error_info.data);
+
+               /*
+                * Check for sanitize in progress: asc:0x04, ascq: 0x1b
+                */
+               if (scsi_status == SAM_STAT_CHECK_CONDITION &&
+                       scsi_normalize_sense(error_info.data,
+                               sense_data_length, &sshdr) &&
+                               sshdr.sense_key == NOT_READY &&
+                               sshdr.asc == 0x04 &&
+                               sshdr.ascq == 0x1b) {
+                       device->device_offline = true;
+                       offline = true;
+                       goto out; /* Keep device offline */
+               }
+       }
+
+out:
+       kfree(buffer);
+       return offline;
+}
+
 static int pqi_get_device_info(struct pqi_ctrl_info *ctrl_info,
        struct pqi_scsi_dev *device,
        struct bmic_identify_physical_device *id_phys)
                if (!pqi_is_supported_device(device))
                        continue;
 
+               /* Do not present disks that the OS cannot fully probe */
+               if (pqi_keep_device_offline(ctrl_info, device))
+                       continue;
+
                /* Gather information about the device. */
                rc = pqi_get_device_info(ctrl_info, device, id_phys);
                if (rc == -ENOMEM) {