diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2005-09-27 05:38:03 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-28 12:07:13 -0400 |
commit | 312f7da2824c82800ee78d6190f12854456957af (patch) | |
tree | 68b3b18a4ddd783a5c75dba688aabf2de0682fb3 /include/linux | |
parent | 14be71f4c5c5ad1e222c5202ee6d234e9c8828b7 (diff) |
[PATCH] libata: interrupt driven pio for libata-core
- add PIO_ST_FIRST for the state before sending ATAPI CDB or sending
"ATA PIO data out" first data block.
- add ATA_TFLAG_POLLING and ATA_DFLAG_CDB_INTR flags
- remove the ATA_FLAG_NOINTR flag since the interrupt handler is now
aware of the states
- modify ata_pio_sector() and atapi_pio_bytes() to work in the interrupt
context
- modify the ata_host_intr() to handle PIO interrupts
- modify ata_qc_issue_prot() to initialize states
- atapi_packet_task() changed to handle "ATA PIO data out" first data block
- support the pre-ATA4 ATAPI device which raise interrupt when ready to
receive CDB
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/ata.h | 3 | ||||
-rw-r--r-- | include/linux/libata.h | 4 |
2 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index a5b74efab067..6fec2f6f2d59 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -181,6 +181,7 @@ enum { | |||
181 | ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */ | 181 | ATA_TFLAG_ISADDR = (1 << 1), /* enable r/w to nsect/lba regs */ |
182 | ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */ | 182 | ATA_TFLAG_DEVICE = (1 << 2), /* enable r/w to device reg */ |
183 | ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */ | 183 | ATA_TFLAG_WRITE = (1 << 3), /* data dir: host->dev==1 (write) */ |
184 | ATA_TFLAG_POLLING = (1 << 4), /* set nIEN to 1 and use polling */ | ||
184 | }; | 185 | }; |
185 | 186 | ||
186 | enum ata_tf_protocols { | 187 | enum ata_tf_protocols { |
@@ -250,6 +251,8 @@ struct ata_taskfile { | |||
250 | ((u64) (id)[(n) + 1] << 16) | \ | 251 | ((u64) (id)[(n) + 1] << 16) | \ |
251 | ((u64) (id)[(n) + 0]) ) | 252 | ((u64) (id)[(n) + 0]) ) |
252 | 253 | ||
254 | #define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) | ||
255 | |||
253 | static inline int atapi_cdb_len(u16 *dev_id) | 256 | static inline int atapi_cdb_len(u16 *dev_id) |
254 | { | 257 | { |
255 | u16 tmp = dev_id[0] & 0x3; | 258 | u16 tmp = dev_id[0] & 0x3; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index bb2d916bce44..9ac2b69df3c1 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -97,6 +97,7 @@ enum { | |||
97 | ATA_DFLAG_LBA48 = (1 << 0), /* device supports LBA48 */ | 97 | ATA_DFLAG_LBA48 = (1 << 0), /* device supports LBA48 */ |
98 | ATA_DFLAG_PIO = (1 << 1), /* device currently in PIO mode */ | 98 | ATA_DFLAG_PIO = (1 << 1), /* device currently in PIO mode */ |
99 | ATA_DFLAG_LOCK_SECTORS = (1 << 2), /* don't adjust max_sectors */ | 99 | ATA_DFLAG_LOCK_SECTORS = (1 << 2), /* don't adjust max_sectors */ |
100 | ATA_DFLAG_CDB_INTR = (1 << 3), /* device asserts INTRQ when ready for CDB */ | ||
100 | 101 | ||
101 | ATA_DEV_UNKNOWN = 0, /* unknown device */ | 102 | ATA_DEV_UNKNOWN = 0, /* unknown device */ |
102 | ATA_DEV_ATA = 1, /* ATA device */ | 103 | ATA_DEV_ATA = 1, /* ATA device */ |
@@ -115,8 +116,6 @@ enum { | |||
115 | ATA_FLAG_MMIO = (1 << 6), /* use MMIO, not PIO */ | 116 | ATA_FLAG_MMIO = (1 << 6), /* use MMIO, not PIO */ |
116 | ATA_FLAG_SATA_RESET = (1 << 7), /* use COMRESET */ | 117 | ATA_FLAG_SATA_RESET = (1 << 7), /* use COMRESET */ |
117 | ATA_FLAG_PIO_DMA = (1 << 8), /* PIO cmds via DMA */ | 118 | ATA_FLAG_PIO_DMA = (1 << 8), /* PIO cmds via DMA */ |
118 | ATA_FLAG_NOINTR = (1 << 9), /* FIXME: Remove this once | ||
119 | * proper HSM is in place. */ | ||
120 | 119 | ||
121 | ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ | 120 | ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ |
122 | ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ | 121 | ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ |
@@ -165,6 +164,7 @@ enum hsm_task_states { | |||
165 | HSM_ST_LAST, | 164 | HSM_ST_LAST, |
166 | HSM_ST_LAST_POLL, | 165 | HSM_ST_LAST_POLL, |
167 | HSM_ST_ERR, | 166 | HSM_ST_ERR, |
167 | HSM_ST_FIRST, | ||
168 | }; | 168 | }; |
169 | 169 | ||
170 | /* forward declarations */ | 170 | /* forward declarations */ |