|
@@ -52,8 +52,12 @@
|
|
|
#define SECTOR_SIZE 512
|
|
|
|
|
|
typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, const u8 *scsicmd);
|
|
|
-static struct ata_device *
|
|
|
-ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev);
|
|
|
+
|
|
|
+static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
|
|
|
+ const struct scsi_device *scsidev);
|
|
|
+static struct ata_device * ata_scsi_find_dev(struct ata_port *ap,
|
|
|
+ const struct scsi_device *scsidev);
|
|
|
+
|
|
|
|
|
|
#define RW_RECOVERY_MPAGE 0x1
|
|
|
#define RW_RECOVERY_MPAGE_LEN 12
|
|
@@ -2308,6 +2312,23 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static struct ata_device * ata_find_dev(struct ata_port *ap, int id)
|
|
|
+{
|
|
|
+ if (likely(id < ATA_MAX_DEVICES))
|
|
|
+ return &ap->device[id];
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
|
|
|
+ const struct scsi_device *scsidev)
|
|
|
+{
|
|
|
+ /* skip commands not addressed to targets we simulate */
|
|
|
+ if (unlikely(scsidev->channel || scsidev->lun))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return ata_find_dev(ap, scsidev->id);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ata_scsi_find_dev - lookup ata_device from scsi_cmnd
|
|
|
* @ap: ATA port to which the device is attached
|
|
@@ -2324,23 +2345,12 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc, const u8 *scsicmd)
|
|
|
* RETURNS:
|
|
|
* Associated ATA device, or %NULL if not found.
|
|
|
*/
|
|
|
-
|
|
|
static struct ata_device *
|
|
|
ata_scsi_find_dev(struct ata_port *ap, const struct scsi_device *scsidev)
|
|
|
{
|
|
|
- struct ata_device *dev;
|
|
|
-
|
|
|
- /* skip commands not addressed to targets we simulate */
|
|
|
- if (likely(scsidev->id < ATA_MAX_DEVICES))
|
|
|
- dev = &ap->device[scsidev->id];
|
|
|
- else
|
|
|
- return NULL;
|
|
|
-
|
|
|
- if (unlikely((scsidev->channel != 0) ||
|
|
|
- (scsidev->lun != 0)))
|
|
|
- return NULL;
|
|
|
+ struct ata_device *dev = __ata_scsi_find_dev(ap, scsidev);
|
|
|
|
|
|
- if (unlikely(!ata_dev_enabled(dev)))
|
|
|
+ if (unlikely(!dev || !ata_dev_enabled(dev)))
|
|
|
return NULL;
|
|
|
|
|
|
if (!atapi_enabled || (ap->flags & ATA_FLAG_NO_ATAPI)) {
|