|
@@ -45,7 +45,7 @@
|
|
|
#include <scsi/scsi_transport.h>
|
|
|
#include <linux/libata.h>
|
|
|
#include <linux/hdreg.h>
|
|
|
-#include <asm/uaccess.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
|
|
|
#include "libata.h"
|
|
|
|
|
@@ -53,9 +53,9 @@
|
|
|
|
|
|
typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc);
|
|
|
|
|
|
-static struct ata_device * __ata_scsi_find_dev(struct ata_port *ap,
|
|
|
+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,
|
|
|
+static struct ata_device *ata_scsi_find_dev(struct ata_port *ap,
|
|
|
const struct scsi_device *scsidev);
|
|
|
static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
|
|
|
unsigned int id, unsigned int lun);
|
|
@@ -228,7 +228,7 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|
|
|
|
|
scsi_cmd[1] = (4 << 1); /* PIO Data-in */
|
|
|
scsi_cmd[2] = 0x0e; /* no off.line or cc, read from dev,
|
|
|
- block count in sector count field */
|
|
|
+ block count in sector count field */
|
|
|
data_dir = DMA_FROM_DEVICE;
|
|
|
} else {
|
|
|
scsi_cmd[1] = (3 << 1); /* Non-data */
|
|
@@ -252,7 +252,7 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|
|
/* Good values for timeout and retries? Values below
|
|
|
from scsi_ioctl_send_command() for default case... */
|
|
|
cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
|
|
|
- sensebuf, (10*HZ), 5, 0);
|
|
|
+ sensebuf, (10*HZ), 5, 0);
|
|
|
|
|
|
if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
|
|
|
u8 *desc = sensebuf + 8;
|
|
@@ -263,18 +263,18 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|
|
if (cmd_result & SAM_STAT_CHECK_CONDITION) {
|
|
|
struct scsi_sense_hdr sshdr;
|
|
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
|
|
- &sshdr);
|
|
|
- if (sshdr.sense_key==0 &&
|
|
|
- sshdr.asc==0 && sshdr.ascq==0)
|
|
|
+ &sshdr);
|
|
|
+ if (sshdr.sense_key == 0 &&
|
|
|
+ sshdr.asc == 0 && sshdr.ascq == 0)
|
|
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
|
|
}
|
|
|
|
|
|
/* Send userspace a few ATA registers (same as drivers/ide) */
|
|
|
- if (sensebuf[0] == 0x72 && /* format is "descriptor" */
|
|
|
- desc[0] == 0x09 ) { /* code is "ATA Descriptor" */
|
|
|
- args[0] = desc[13]; /* status */
|
|
|
- args[1] = desc[3]; /* error */
|
|
|
- args[2] = desc[5]; /* sector count (0:7) */
|
|
|
+ if (sensebuf[0] == 0x72 && /* format is "descriptor" */
|
|
|
+ desc[0] == 0x09) { /* code is "ATA Descriptor" */
|
|
|
+ args[0] = desc[13]; /* status */
|
|
|
+ args[1] = desc[3]; /* error */
|
|
|
+ args[2] = desc[5]; /* sector count (0:7) */
|
|
|
if (copy_to_user(arg, args, sizeof(args)))
|
|
|
rc = -EFAULT;
|
|
|
}
|
|
@@ -350,8 +350,8 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
|
|
|
struct scsi_sense_hdr sshdr;
|
|
|
scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE,
|
|
|
&sshdr);
|
|
|
- if (sshdr.sense_key==0 &&
|
|
|
- sshdr.asc==0 && sshdr.ascq==0)
|
|
|
+ if (sshdr.sense_key == 0 &&
|
|
|
+ sshdr.asc == 0 && sshdr.ascq == 0)
|
|
|
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
|
|
|
}
|
|
|
|
|
@@ -975,7 +975,7 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
|
|
|
if ((qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
|
|
|
(system_state == SYSTEM_HALT ||
|
|
|
system_state == SYSTEM_POWER_OFF)) {
|
|
|
- static unsigned long warned = 0;
|
|
|
+ static unsigned long warned;
|
|
|
|
|
|
if (!test_and_set_bit(0, &warned)) {
|
|
|
ata_dev_printk(qc->dev, KERN_WARNING,
|
|
@@ -1364,7 +1364,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
|
|
struct ata_eh_info *ehi = &qc->dev->link->eh_info;
|
|
|
struct scsi_cmnd *cmd = qc->scsicmd;
|
|
|
u8 *cdb = cmd->cmnd;
|
|
|
- int need_sense = (qc->err_mask != 0);
|
|
|
+ int need_sense = (qc->err_mask != 0);
|
|
|
|
|
|
/* We snoop the SET_FEATURES - Write Cache ON/OFF command, and
|
|
|
* schedule EH_REVALIDATE operation to update the IDENTIFY DEVICE
|
|
@@ -1396,7 +1396,7 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
|
|
|
* was no error, SK, ASC and ASCQ will all be zero.
|
|
|
*/
|
|
|
if (((cdb[0] == ATA_16) || (cdb[0] == ATA_12)) &&
|
|
|
- ((cdb[2] & 0x20) || need_sense)) {
|
|
|
+ ((cdb[2] & 0x20) || need_sense)) {
|
|
|
ata_gen_passthru_sense(qc);
|
|
|
} else {
|
|
|
if (!need_sense) {
|
|
@@ -1500,7 +1500,7 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,
|
|
|
return 0;
|
|
|
|
|
|
early_finish:
|
|
|
- ata_qc_free(qc);
|
|
|
+ ata_qc_free(qc);
|
|
|
qc->scsidone(cmd);
|
|
|
DPRINTK("EXIT - early finish (good or error)\n");
|
|
|
return 0;
|
|
@@ -1590,8 +1590,8 @@ static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
|
|
|
*/
|
|
|
|
|
|
void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
|
|
|
- unsigned int (*actor) (struct ata_scsi_args *args,
|
|
|
- u8 *rbuf, unsigned int buflen))
|
|
|
+ unsigned int (*actor) (struct ata_scsi_args *args,
|
|
|
+ u8 *rbuf, unsigned int buflen))
|
|
|
{
|
|
|
u8 *rbuf;
|
|
|
unsigned int buflen, rc;
|
|
@@ -2140,7 +2140,7 @@ saving_not_supp:
|
|
|
* None.
|
|
|
*/
|
|
|
unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
|
|
|
- unsigned int buflen)
|
|
|
+ unsigned int buflen)
|
|
|
{
|
|
|
u64 last_lba = args->dev->n_sectors - 1; /* LBA of the last block */
|
|
|
|
|
@@ -2464,7 +2464,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct ata_device * ata_find_dev(struct ata_port *ap, int devno)
|
|
|
+static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
|
|
|
{
|
|
|
if (ap->nr_pmp_links == 0) {
|
|
|
if (likely(devno < ata_link_max_devices(&ap->link)))
|
|
@@ -2477,8 +2477,8 @@ static struct ata_device * ata_find_dev(struct ata_port *ap, int devno)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
{
|
|
|
int devno;
|
|
|
|
|
@@ -2564,27 +2564,27 @@ static u8
|
|
|
ata_scsi_map_proto(u8 byte1)
|
|
|
{
|
|
|
switch((byte1 & 0x1e) >> 1) {
|
|
|
- case 3: /* Non-data */
|
|
|
- return ATA_PROT_NODATA;
|
|
|
-
|
|
|
- case 6: /* DMA */
|
|
|
- case 10: /* UDMA Data-in */
|
|
|
- case 11: /* UDMA Data-Out */
|
|
|
- return ATA_PROT_DMA;
|
|
|
-
|
|
|
- case 4: /* PIO Data-in */
|
|
|
- case 5: /* PIO Data-out */
|
|
|
- return ATA_PROT_PIO;
|
|
|
-
|
|
|
- case 0: /* Hard Reset */
|
|
|
- case 1: /* SRST */
|
|
|
- case 8: /* Device Diagnostic */
|
|
|
- case 9: /* Device Reset */
|
|
|
- case 7: /* DMA Queued */
|
|
|
- case 12: /* FPDMA */
|
|
|
- case 15: /* Return Response Info */
|
|
|
- default: /* Reserved */
|
|
|
- break;
|
|
|
+ case 3: /* Non-data */
|
|
|
+ return ATA_PROT_NODATA;
|
|
|
+
|
|
|
+ case 6: /* DMA */
|
|
|
+ case 10: /* UDMA Data-in */
|
|
|
+ case 11: /* UDMA Data-Out */
|
|
|
+ return ATA_PROT_DMA;
|
|
|
+
|
|
|
+ case 4: /* PIO Data-in */
|
|
|
+ case 5: /* PIO Data-out */
|
|
|
+ return ATA_PROT_PIO;
|
|
|
+
|
|
|
+ case 0: /* Hard Reset */
|
|
|
+ case 1: /* SRST */
|
|
|
+ case 8: /* Device Diagnostic */
|
|
|
+ case 9: /* Device Reset */
|
|
|
+ case 7: /* DMA Queued */
|
|
|
+ case 12: /* FPDMA */
|
|
|
+ case 15: /* Return Response Info */
|
|
|
+ default: /* Reserved */
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return ATA_PROT_UNKNOWN;
|
|
@@ -2919,94 +2919,94 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd,
|
|
|
args.done = done;
|
|
|
|
|
|
switch(scsicmd[0]) {
|
|
|
- /* TODO: worth improving? */
|
|
|
- case FORMAT_UNIT:
|
|
|
+ /* TODO: worth improving? */
|
|
|
+ case FORMAT_UNIT:
|
|
|
+ ata_scsi_invalid_field(cmd, done);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case INQUIRY:
|
|
|
+ if (scsicmd[1] & 2) /* is CmdDt set? */
|
|
|
ata_scsi_invalid_field(cmd, done);
|
|
|
+ else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
|
|
|
+ else switch (scsicmd[2]) {
|
|
|
+ case 0x00:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
|
|
|
break;
|
|
|
-
|
|
|
- case INQUIRY:
|
|
|
- if (scsicmd[1] & 2) /* is CmdDt set? */
|
|
|
- ata_scsi_invalid_field(cmd, done);
|
|
|
- else if ((scsicmd[1] & 1) == 0) /* is EVPD clear? */
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_inq_std);
|
|
|
- else switch (scsicmd[2]) {
|
|
|
- case 0x00:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_inq_00);
|
|
|
- break;
|
|
|
- case 0x80:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
|
|
|
- break;
|
|
|
- case 0x83:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
|
|
|
- break;
|
|
|
- case 0x89:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
|
|
|
- break;
|
|
|
- default:
|
|
|
- ata_scsi_invalid_field(cmd, done);
|
|
|
- break;
|
|
|
- }
|
|
|
+ case 0x80:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_inq_80);
|
|
|
break;
|
|
|
-
|
|
|
- case MODE_SENSE:
|
|
|
- case MODE_SENSE_10:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
|
|
|
+ case 0x83:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_inq_83);
|
|
|
break;
|
|
|
-
|
|
|
- case MODE_SELECT: /* unconditionally return */
|
|
|
- case MODE_SELECT_10: /* bad-field-in-cdb */
|
|
|
+ case 0x89:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_inq_89);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
ata_scsi_invalid_field(cmd, done);
|
|
|
break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MODE_SENSE:
|
|
|
+ case MODE_SENSE_10:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_mode_sense);
|
|
|
+ break;
|
|
|
|
|
|
- case READ_CAPACITY:
|
|
|
+ case MODE_SELECT: /* unconditionally return */
|
|
|
+ case MODE_SELECT_10: /* bad-field-in-cdb */
|
|
|
+ ata_scsi_invalid_field(cmd, done);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case READ_CAPACITY:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SERVICE_ACTION_IN:
|
|
|
+ if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
|
|
|
ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
|
|
|
- break;
|
|
|
+ else
|
|
|
+ ata_scsi_invalid_field(cmd, done);
|
|
|
+ break;
|
|
|
|
|
|
- case SERVICE_ACTION_IN:
|
|
|
- if ((scsicmd[1] & 0x1f) == SAI_READ_CAPACITY_16)
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_read_cap);
|
|
|
- else
|
|
|
- ata_scsi_invalid_field(cmd, done);
|
|
|
- break;
|
|
|
+ case REPORT_LUNS:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
|
|
|
+ break;
|
|
|
|
|
|
- case REPORT_LUNS:
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_report_luns);
|
|
|
- break;
|
|
|
+ case REQUEST_SENSE:
|
|
|
+ ata_scsi_set_sense(cmd, 0, 0, 0);
|
|
|
+ cmd->result = (DRIVER_SENSE << 24);
|
|
|
+ done(cmd);
|
|
|
+ break;
|
|
|
|
|
|
- case REQUEST_SENSE:
|
|
|
- ata_scsi_set_sense(cmd, 0, 0, 0);
|
|
|
- cmd->result = (DRIVER_SENSE << 24);
|
|
|
- done(cmd);
|
|
|
- break;
|
|
|
+ /* if we reach this, then writeback caching is disabled,
|
|
|
+ * turning this into a no-op.
|
|
|
+ */
|
|
|
+ case SYNCHRONIZE_CACHE:
|
|
|
+ /* fall through */
|
|
|
+
|
|
|
+ /* no-op's, complete with success */
|
|
|
+ case REZERO_UNIT:
|
|
|
+ case SEEK_6:
|
|
|
+ case SEEK_10:
|
|
|
+ case TEST_UNIT_READY:
|
|
|
+ ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
|
|
|
+ break;
|
|
|
|
|
|
- /* if we reach this, then writeback caching is disabled,
|
|
|
- * turning this into a no-op.
|
|
|
- */
|
|
|
- case SYNCHRONIZE_CACHE:
|
|
|
- /* fall through */
|
|
|
-
|
|
|
- /* no-op's, complete with success */
|
|
|
- case REZERO_UNIT:
|
|
|
- case SEEK_6:
|
|
|
- case SEEK_10:
|
|
|
- case TEST_UNIT_READY:
|
|
|
+ case SEND_DIAGNOSTIC:
|
|
|
+ tmp8 = scsicmd[1] & ~(1 << 3);
|
|
|
+ if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
|
|
|
ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
|
|
|
- break;
|
|
|
-
|
|
|
- case SEND_DIAGNOSTIC:
|
|
|
- tmp8 = scsicmd[1] & ~(1 << 3);
|
|
|
- if ((tmp8 == 0x4) && (!scsicmd[3]) && (!scsicmd[4]))
|
|
|
- ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
|
|
|
- else
|
|
|
- ata_scsi_invalid_field(cmd, done);
|
|
|
- break;
|
|
|
+ else
|
|
|
+ ata_scsi_invalid_field(cmd, done);
|
|
|
+ break;
|
|
|
|
|
|
- /* all other commands */
|
|
|
- default:
|
|
|
- ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
|
|
|
- /* "Invalid command operation code" */
|
|
|
- done(cmd);
|
|
|
- break;
|
|
|
+ /* all other commands */
|
|
|
+ default:
|
|
|
+ ata_scsi_set_sense(cmd, ILLEGAL_REQUEST, 0x20, 0x0);
|
|
|
+ /* "Invalid command operation code" */
|
|
|
+ done(cmd);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|