|
@@ -324,6 +324,13 @@ enum {
|
|
ATA_TFLAG_LBA = (1 << 4), /* enable LBA */
|
|
ATA_TFLAG_LBA = (1 << 4), /* enable LBA */
|
|
ATA_TFLAG_FUA = (1 << 5), /* enable FUA */
|
|
ATA_TFLAG_FUA = (1 << 5), /* enable FUA */
|
|
ATA_TFLAG_POLLING = (1 << 6), /* set nIEN to 1 and use polling */
|
|
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 */
|
|
};
|
|
};
|
|
|
|
|
|
enum ata_tf_protocols {
|
|
enum ata_tf_protocols {
|
|
@@ -373,6 +380,63 @@ struct ata_taskfile {
|
|
u8 command; /* IO operation */
|
|
u8 command; /* IO operation */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * 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 ATA_PROT_ATAPI_NODATA:
|
|
|
|
+ return ATA_PROT_FLAG_ATAPI;
|
|
|
|
+ case ATA_PROT_ATAPI:
|
|
|
|
+ return ATA_PROT_FLAG_ATAPI | ATA_PROT_FLAG_PIO;
|
|
|
|
+ case ATA_PROT_ATAPI_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;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * id tests
|
|
|
|
+ */
|
|
#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0)
|
|
#define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0)
|
|
#define ata_id_has_lba(id) ((id)[49] & (1 << 9))
|
|
#define ata_id_has_lba(id) ((id)[49] & (1 << 9))
|
|
#define ata_id_has_dma(id) ((id)[49] & (1 << 8))
|
|
#define ata_id_has_dma(id) ((id)[49] & (1 << 8))
|
|
@@ -594,13 +658,6 @@ static inline int atapi_command_packet_set(const u16 *dev_id)
|
|
return (dev_id[0] >> 8) & 0x1f;
|
|
return (dev_id[0] >> 8) & 0x1f;
|
|
}
|
|
}
|
|
|
|
|
|
-static inline int is_atapi_taskfile(const struct ata_taskfile *tf)
|
|
|
|
-{
|
|
|
|
- return (tf->protocol == ATA_PROT_ATAPI) ||
|
|
|
|
- (tf->protocol == ATA_PROT_ATAPI_NODATA) ||
|
|
|
|
- (tf->protocol == ATA_PROT_ATAPI_DMA);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
|
static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
|
{
|
|
{
|
|
return (tf->command == ATA_CMD_READ_MULTI) ||
|
|
return (tf->command == ATA_CMD_READ_MULTI) ||
|