|
@@ -282,6 +282,110 @@ typedef enum {
|
|
|
ide_started, /* a drive operation was started, handler was set */
|
|
|
} ide_startstop_t;
|
|
|
|
|
|
+enum {
|
|
|
+ IDE_TFLAG_LBA48 = (1 << 0),
|
|
|
+ IDE_TFLAG_FLAGGED = (1 << 2),
|
|
|
+ IDE_TFLAG_OUT_DATA = (1 << 3),
|
|
|
+ IDE_TFLAG_OUT_HOB_FEATURE = (1 << 4),
|
|
|
+ IDE_TFLAG_OUT_HOB_NSECT = (1 << 5),
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAL = (1 << 6),
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAM = (1 << 7),
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAH = (1 << 8),
|
|
|
+ IDE_TFLAG_OUT_HOB = IDE_TFLAG_OUT_HOB_FEATURE |
|
|
|
+ IDE_TFLAG_OUT_HOB_NSECT |
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAL |
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAM |
|
|
|
+ IDE_TFLAG_OUT_HOB_LBAH,
|
|
|
+ IDE_TFLAG_OUT_FEATURE = (1 << 9),
|
|
|
+ IDE_TFLAG_OUT_NSECT = (1 << 10),
|
|
|
+ IDE_TFLAG_OUT_LBAL = (1 << 11),
|
|
|
+ IDE_TFLAG_OUT_LBAM = (1 << 12),
|
|
|
+ IDE_TFLAG_OUT_LBAH = (1 << 13),
|
|
|
+ IDE_TFLAG_OUT_TF = IDE_TFLAG_OUT_FEATURE |
|
|
|
+ IDE_TFLAG_OUT_NSECT |
|
|
|
+ IDE_TFLAG_OUT_LBAL |
|
|
|
+ IDE_TFLAG_OUT_LBAM |
|
|
|
+ IDE_TFLAG_OUT_LBAH,
|
|
|
+ IDE_TFLAG_OUT_DEVICE = (1 << 14),
|
|
|
+ IDE_TFLAG_WRITE = (1 << 15),
|
|
|
+ IDE_TFLAG_FLAGGED_SET_IN_FLAGS = (1 << 16),
|
|
|
+ IDE_TFLAG_IN_DATA = (1 << 17),
|
|
|
+ IDE_TFLAG_CUSTOM_HANDLER = (1 << 18),
|
|
|
+ IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 19),
|
|
|
+ IDE_TFLAG_IN_HOB_FEATURE = (1 << 20),
|
|
|
+ IDE_TFLAG_IN_HOB_NSECT = (1 << 21),
|
|
|
+ IDE_TFLAG_IN_HOB_LBAL = (1 << 22),
|
|
|
+ IDE_TFLAG_IN_HOB_LBAM = (1 << 23),
|
|
|
+ IDE_TFLAG_IN_HOB_LBAH = (1 << 24),
|
|
|
+ IDE_TFLAG_IN_HOB_LBA = IDE_TFLAG_IN_HOB_LBAL |
|
|
|
+ IDE_TFLAG_IN_HOB_LBAM |
|
|
|
+ IDE_TFLAG_IN_HOB_LBAH,
|
|
|
+ IDE_TFLAG_IN_HOB = IDE_TFLAG_IN_HOB_FEATURE |
|
|
|
+ IDE_TFLAG_IN_HOB_NSECT |
|
|
|
+ IDE_TFLAG_IN_HOB_LBA,
|
|
|
+ IDE_TFLAG_IN_FEATURE = (1 << 1),
|
|
|
+ IDE_TFLAG_IN_NSECT = (1 << 25),
|
|
|
+ IDE_TFLAG_IN_LBAL = (1 << 26),
|
|
|
+ IDE_TFLAG_IN_LBAM = (1 << 27),
|
|
|
+ IDE_TFLAG_IN_LBAH = (1 << 28),
|
|
|
+ IDE_TFLAG_IN_LBA = IDE_TFLAG_IN_LBAL |
|
|
|
+ IDE_TFLAG_IN_LBAM |
|
|
|
+ IDE_TFLAG_IN_LBAH,
|
|
|
+ IDE_TFLAG_IN_TF = IDE_TFLAG_IN_NSECT |
|
|
|
+ IDE_TFLAG_IN_LBA,
|
|
|
+ IDE_TFLAG_IN_DEVICE = (1 << 29),
|
|
|
+ IDE_TFLAG_HOB = IDE_TFLAG_OUT_HOB |
|
|
|
+ IDE_TFLAG_IN_HOB,
|
|
|
+ IDE_TFLAG_TF = IDE_TFLAG_OUT_TF |
|
|
|
+ IDE_TFLAG_IN_TF,
|
|
|
+ IDE_TFLAG_DEVICE = IDE_TFLAG_OUT_DEVICE |
|
|
|
+ IDE_TFLAG_IN_DEVICE,
|
|
|
+ /* force 16-bit I/O operations */
|
|
|
+ IDE_TFLAG_IO_16BIT = (1 << 30),
|
|
|
+ /* ide_task_t was allocated using kmalloc() */
|
|
|
+ IDE_TFLAG_DYN = (1 << 31),
|
|
|
+};
|
|
|
+
|
|
|
+struct ide_taskfile {
|
|
|
+ u8 hob_data; /* 0: high data byte (for TASKFILE IOCTL) */
|
|
|
+
|
|
|
+ u8 hob_feature; /* 1-5: additional data to support LBA48 */
|
|
|
+ u8 hob_nsect;
|
|
|
+ u8 hob_lbal;
|
|
|
+ u8 hob_lbam;
|
|
|
+ u8 hob_lbah;
|
|
|
+
|
|
|
+ u8 data; /* 6: low data byte (for TASKFILE IOCTL) */
|
|
|
+
|
|
|
+ union { /* 7: */
|
|
|
+ u8 error; /* read: error */
|
|
|
+ u8 feature; /* write: feature */
|
|
|
+ };
|
|
|
+
|
|
|
+ u8 nsect; /* 8: number of sectors */
|
|
|
+ u8 lbal; /* 9: LBA low */
|
|
|
+ u8 lbam; /* 10: LBA mid */
|
|
|
+ u8 lbah; /* 11: LBA high */
|
|
|
+
|
|
|
+ u8 device; /* 12: device select */
|
|
|
+
|
|
|
+ union { /* 13: */
|
|
|
+ u8 status; /* read: status */
|
|
|
+ u8 command; /* write: command */
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+typedef struct ide_task_s {
|
|
|
+ union {
|
|
|
+ struct ide_taskfile tf;
|
|
|
+ u8 tf_array[14];
|
|
|
+ };
|
|
|
+ u32 tf_flags;
|
|
|
+ int data_phase;
|
|
|
+ struct request *rq; /* copy of request */
|
|
|
+ void *special; /* valid_t generally */
|
|
|
+} ide_task_t;
|
|
|
+
|
|
|
/* ATAPI packet command flags */
|
|
|
enum {
|
|
|
/* set when an error is considered normal - no retry (ide-tape) */
|
|
@@ -567,7 +671,6 @@ typedef struct ide_drive_s ide_drive_t;
|
|
|
#define ide_drv_g(disk, cont_type) \
|
|
|
container_of((disk)->private_data, struct cont_type, driver)
|
|
|
|
|
|
-struct ide_task_s;
|
|
|
struct ide_port_info;
|
|
|
|
|
|
struct ide_tp_ops {
|
|
@@ -694,6 +797,8 @@ typedef struct hwif_s {
|
|
|
/* data phase of the active command (currently only valid for PIO/DMA) */
|
|
|
int data_phase;
|
|
|
|
|
|
+ struct ide_task_s task; /* current command */
|
|
|
+
|
|
|
unsigned int nsect;
|
|
|
unsigned int nleft;
|
|
|
struct scatterlist *cursg;
|
|
@@ -1059,110 +1164,6 @@ extern void ide_do_drive_cmd(ide_drive_t *, struct request *);
|
|
|
|
|
|
extern void ide_end_drive_cmd(ide_drive_t *, u8, u8);
|
|
|
|
|
|
-enum {
|
|
|
- IDE_TFLAG_LBA48 = (1 << 0),
|
|
|
- IDE_TFLAG_FLAGGED = (1 << 2),
|
|
|
- IDE_TFLAG_OUT_DATA = (1 << 3),
|
|
|
- IDE_TFLAG_OUT_HOB_FEATURE = (1 << 4),
|
|
|
- IDE_TFLAG_OUT_HOB_NSECT = (1 << 5),
|
|
|
- IDE_TFLAG_OUT_HOB_LBAL = (1 << 6),
|
|
|
- IDE_TFLAG_OUT_HOB_LBAM = (1 << 7),
|
|
|
- IDE_TFLAG_OUT_HOB_LBAH = (1 << 8),
|
|
|
- IDE_TFLAG_OUT_HOB = IDE_TFLAG_OUT_HOB_FEATURE |
|
|
|
- IDE_TFLAG_OUT_HOB_NSECT |
|
|
|
- IDE_TFLAG_OUT_HOB_LBAL |
|
|
|
- IDE_TFLAG_OUT_HOB_LBAM |
|
|
|
- IDE_TFLAG_OUT_HOB_LBAH,
|
|
|
- IDE_TFLAG_OUT_FEATURE = (1 << 9),
|
|
|
- IDE_TFLAG_OUT_NSECT = (1 << 10),
|
|
|
- IDE_TFLAG_OUT_LBAL = (1 << 11),
|
|
|
- IDE_TFLAG_OUT_LBAM = (1 << 12),
|
|
|
- IDE_TFLAG_OUT_LBAH = (1 << 13),
|
|
|
- IDE_TFLAG_OUT_TF = IDE_TFLAG_OUT_FEATURE |
|
|
|
- IDE_TFLAG_OUT_NSECT |
|
|
|
- IDE_TFLAG_OUT_LBAL |
|
|
|
- IDE_TFLAG_OUT_LBAM |
|
|
|
- IDE_TFLAG_OUT_LBAH,
|
|
|
- IDE_TFLAG_OUT_DEVICE = (1 << 14),
|
|
|
- IDE_TFLAG_WRITE = (1 << 15),
|
|
|
- IDE_TFLAG_FLAGGED_SET_IN_FLAGS = (1 << 16),
|
|
|
- IDE_TFLAG_IN_DATA = (1 << 17),
|
|
|
- IDE_TFLAG_CUSTOM_HANDLER = (1 << 18),
|
|
|
- IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 19),
|
|
|
- IDE_TFLAG_IN_HOB_FEATURE = (1 << 20),
|
|
|
- IDE_TFLAG_IN_HOB_NSECT = (1 << 21),
|
|
|
- IDE_TFLAG_IN_HOB_LBAL = (1 << 22),
|
|
|
- IDE_TFLAG_IN_HOB_LBAM = (1 << 23),
|
|
|
- IDE_TFLAG_IN_HOB_LBAH = (1 << 24),
|
|
|
- IDE_TFLAG_IN_HOB_LBA = IDE_TFLAG_IN_HOB_LBAL |
|
|
|
- IDE_TFLAG_IN_HOB_LBAM |
|
|
|
- IDE_TFLAG_IN_HOB_LBAH,
|
|
|
- IDE_TFLAG_IN_HOB = IDE_TFLAG_IN_HOB_FEATURE |
|
|
|
- IDE_TFLAG_IN_HOB_NSECT |
|
|
|
- IDE_TFLAG_IN_HOB_LBA,
|
|
|
- IDE_TFLAG_IN_FEATURE = (1 << 1),
|
|
|
- IDE_TFLAG_IN_NSECT = (1 << 25),
|
|
|
- IDE_TFLAG_IN_LBAL = (1 << 26),
|
|
|
- IDE_TFLAG_IN_LBAM = (1 << 27),
|
|
|
- IDE_TFLAG_IN_LBAH = (1 << 28),
|
|
|
- IDE_TFLAG_IN_LBA = IDE_TFLAG_IN_LBAL |
|
|
|
- IDE_TFLAG_IN_LBAM |
|
|
|
- IDE_TFLAG_IN_LBAH,
|
|
|
- IDE_TFLAG_IN_TF = IDE_TFLAG_IN_NSECT |
|
|
|
- IDE_TFLAG_IN_LBA,
|
|
|
- IDE_TFLAG_IN_DEVICE = (1 << 29),
|
|
|
- IDE_TFLAG_HOB = IDE_TFLAG_OUT_HOB |
|
|
|
- IDE_TFLAG_IN_HOB,
|
|
|
- IDE_TFLAG_TF = IDE_TFLAG_OUT_TF |
|
|
|
- IDE_TFLAG_IN_TF,
|
|
|
- IDE_TFLAG_DEVICE = IDE_TFLAG_OUT_DEVICE |
|
|
|
- IDE_TFLAG_IN_DEVICE,
|
|
|
- /* force 16-bit I/O operations */
|
|
|
- IDE_TFLAG_IO_16BIT = (1 << 30),
|
|
|
- /* ide_task_t was allocated using kmalloc() */
|
|
|
- IDE_TFLAG_DYN = (1 << 31),
|
|
|
-};
|
|
|
-
|
|
|
-struct ide_taskfile {
|
|
|
- u8 hob_data; /* 0: high data byte (for TASKFILE IOCTL) */
|
|
|
-
|
|
|
- u8 hob_feature; /* 1-5: additional data to support LBA48 */
|
|
|
- u8 hob_nsect;
|
|
|
- u8 hob_lbal;
|
|
|
- u8 hob_lbam;
|
|
|
- u8 hob_lbah;
|
|
|
-
|
|
|
- u8 data; /* 6: low data byte (for TASKFILE IOCTL) */
|
|
|
-
|
|
|
- union { /* 7: */
|
|
|
- u8 error; /* read: error */
|
|
|
- u8 feature; /* write: feature */
|
|
|
- };
|
|
|
-
|
|
|
- u8 nsect; /* 8: number of sectors */
|
|
|
- u8 lbal; /* 9: LBA low */
|
|
|
- u8 lbam; /* 10: LBA mid */
|
|
|
- u8 lbah; /* 11: LBA high */
|
|
|
-
|
|
|
- u8 device; /* 12: device select */
|
|
|
-
|
|
|
- union { /* 13: */
|
|
|
- u8 status; /* read: status */
|
|
|
- u8 command; /* write: command */
|
|
|
- };
|
|
|
-};
|
|
|
-
|
|
|
-typedef struct ide_task_s {
|
|
|
- union {
|
|
|
- struct ide_taskfile tf;
|
|
|
- u8 tf_array[14];
|
|
|
- };
|
|
|
- u32 tf_flags;
|
|
|
- int data_phase;
|
|
|
- struct request *rq; /* copy of request */
|
|
|
- void *special; /* valid_t generally */
|
|
|
-} ide_task_t;
|
|
|
-
|
|
|
void ide_tf_dump(const char *, struct ide_taskfile *);
|
|
|
|
|
|
void ide_exec_command(ide_hwif_t *, u8);
|