|
@@ -138,6 +138,22 @@ enum {
|
|
|
ATA_SHT_THIS_ID = -1,
|
|
|
ATA_SHT_USE_CLUSTERING = 1,
|
|
|
|
|
|
+ /* struct ata_taskfile flags */
|
|
|
+ ATA_TFLAG_LBA48 = (1 << 0), /* enable 48-bit LBA and "HOB" */
|
|
|
+ ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */
|
|
|
+ ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */
|
|
|
+ ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */
|
|
|
+ ATA_TFLAG_LBA = (1 << 4), /* enable LBA */
|
|
|
+ ATA_TFLAG_FUA = (1 << 5), /* enable FUA */
|
|
|
+ ATA_TFLAG_POLLING = (1 << 6), /* set nIEN to 1 and use polling */
|
|
|
+
|
|
|
+ /* protocol flags */
|
|
|
+ ATA_PROT_FLAG_PIO = (1 << 0), /* is PIO */
|
|
|
+ ATA_PROT_FLAG_DMA = (1 << 1), /* is DMA */
|
|
|
+ ATA_PROT_FLAG_DATA = ATA_PROT_FLAG_PIO | ATA_PROT_FLAG_DMA,
|
|
|
+ ATA_PROT_FLAG_NCQ = (1 << 2), /* is NCQ */
|
|
|
+ ATA_PROT_FLAG_ATAPI = (1 << 3), /* is ATAPI */
|
|
|
+
|
|
|
/* struct ata_device stuff */
|
|
|
ATA_DFLAG_LBA = (1 << 0), /* device supports LBA */
|
|
|
ATA_DFLAG_LBA48 = (1 << 1), /* device supports LBA48 */
|
|
@@ -518,6 +534,29 @@ enum sw_activity {
|
|
|
BLINK_OFF,
|
|
|
};
|
|
|
|
|
|
+struct ata_taskfile {
|
|
|
+ unsigned long flags; /* ATA_TFLAG_xxx */
|
|
|
+ u8 protocol; /* ATA_PROT_xxx */
|
|
|
+
|
|
|
+ u8 ctl; /* control reg */
|
|
|
+
|
|
|
+ u8 hob_feature; /* additional data */
|
|
|
+ u8 hob_nsect; /* to support LBA48 */
|
|
|
+ u8 hob_lbal;
|
|
|
+ u8 hob_lbam;
|
|
|
+ u8 hob_lbah;
|
|
|
+
|
|
|
+ u8 feature;
|
|
|
+ u8 nsect;
|
|
|
+ u8 lbal;
|
|
|
+ u8 lbam;
|
|
|
+ u8 lbah;
|
|
|
+
|
|
|
+ u8 device;
|
|
|
+
|
|
|
+ u8 command; /* IO operation */
|
|
|
+};
|
|
|
+
|
|
|
#ifdef CONFIG_ATA_SFF
|
|
|
struct ata_ioports {
|
|
|
void __iomem *cmd_addr;
|
|
@@ -959,6 +998,69 @@ extern const unsigned long sata_deb_timing_long[];
|
|
|
extern struct ata_port_operations ata_dummy_port_ops;
|
|
|
extern const struct ata_port_info ata_dummy_port_info;
|
|
|
|
|
|
+/*
|
|
|
+ * protocol tests
|
|
|
+ */
|
|
|
+static inline unsigned int ata_prot_flags(u8 prot)
|
|
|
+{
|
|
|
+ switch (prot) {
|
|
|
+ case ATA_PROT_NODATA:
|
|
|
+ return 0;
|
|
|
+ case ATA_PROT_PIO:
|
|
|
+ return ATA_PROT_FLAG_PIO;
|
|
|
+ case ATA_PROT_DMA:
|
|
|
+ return ATA_PROT_FLAG_DMA;
|
|
|
+ case ATA_PROT_NCQ:
|
|
|
+ return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ;
|
|
|
+ case ATAPI_PROT_NODATA:
|
|
|
+ return ATA_PROT_FLAG_ATAPI;
|
|
|
+ case ATAPI_PROT_PIO:
|
|
|
+ return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO;
|
|
|
+ case ATAPI_PROT_DMA:
|
|
|
+ return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_DMA;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_atapi(u8 prot)
|
|
|
+{
|
|
|
+ return ata_prot_flags(prot) & ATA_PROT_FLAG_ATAPI;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_nodata(u8 prot)
|
|
|
+{
|
|
|
+ return !(ata_prot_flags(prot) & ATA_PROT_FLAG_DATA);
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_pio(u8 prot)
|
|
|
+{
|
|
|
+ return ata_prot_flags(prot) & ATA_PROT_FLAG_PIO;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_dma(u8 prot)
|
|
|
+{
|
|
|
+ return ata_prot_flags(prot) & ATA_PROT_FLAG_DMA;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_ncq(u8 prot)
|
|
|
+{
|
|
|
+ return ata_prot_flags(prot) & ATA_PROT_FLAG_NCQ;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int ata_is_data(u8 prot)
|
|
|
+{
|
|
|
+ return ata_prot_flags(prot) & ATA_PROT_FLAG_DATA;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
|
|
+{
|
|
|
+ return (tf->command == ATA_CMD_READ_MULTI) ||
|
|
|
+ (tf->command == ATA_CMD_WRITE_MULTI) ||
|
|
|
+ (tf->command == ATA_CMD_READ_MULTI_EXT) ||
|
|
|
+ (tf->command == ATA_CMD_WRITE_MULTI_EXT) ||
|
|
|
+ (tf->command == ATA_CMD_WRITE_MULTI_FUA_EXT);
|
|
|
+}
|
|
|
+
|
|
|
static inline const unsigned long *
|
|
|
sata_ehc_deb_timing(struct ata_eh_context *ehc)
|
|
|
{
|