Commit a163af74 authored by Jeff Garzik's avatar Jeff Garzik

[libata] comments and constants

* note a nasty problem with shared interrupts that must be fixed
  before we turn on certain code paths.
* add a few comments to the READ CAPACITY scsi simulator
* remove a FIXME comment from the TEST UNIT READY scsi simulator
* add constant for ATA command CHECK POWER MODE, and associated
  "mandatory" power management feature set bit.
parent 7f594e47
...@@ -2634,6 +2634,8 @@ inline unsigned int ata_host_intr (struct ata_port *ap, ...@@ -2634,6 +2634,8 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
unsigned int handled = 0; unsigned int handled = 0;
switch (qc->tf.protocol) { switch (qc->tf.protocol) {
/* BMDMA completion */
case ATA_PROT_DMA: case ATA_PROT_DMA:
case ATA_PROT_ATAPI_DMA: case ATA_PROT_ATAPI_DMA:
if (ap->flags & ATA_FLAG_MMIO) { if (ap->flags & ATA_FLAG_MMIO) {
...@@ -2652,8 +2654,16 @@ inline unsigned int ata_host_intr (struct ata_port *ap, ...@@ -2652,8 +2654,16 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
handled = 1; handled = 1;
break; break;
/* command completion, but no data xfer */
/* FIXME: a shared interrupt _will_ cause a non-data command
* to be completed prematurely, with an error.
*
* This doesn't matter right now, since we aren't sending
* non-data commands down this pipe except in development
* situations.
*/
case ATA_PROT_ATAPI: case ATA_PROT_ATAPI:
case ATA_PROT_NODATA: /* command completion, but no data xfer */ case ATA_PROT_NODATA:
status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000); status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status); DPRINTK("BUS_NODATA (drv_stat 0x%X)\n", status);
ata_qc_complete(qc, status); ata_qc_complete(qc, status);
......
...@@ -812,20 +812,23 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf, ...@@ -812,20 +812,23 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
VPRINTK("ENTER\n"); VPRINTK("ENTER\n");
n_sectors--; /* one off */ n_sectors--; /* ATA TotalUserSectors - 1 */
tmp = n_sectors; /* note: truncates, if lba48 */ tmp = n_sectors; /* note: truncates, if lba48 */
if (args->cmd->cmnd[0] == READ_CAPACITY) { if (args->cmd->cmnd[0] == READ_CAPACITY) {
/* sector count, 32-bit */
rbuf[0] = tmp >> (8 * 3); rbuf[0] = tmp >> (8 * 3);
rbuf[1] = tmp >> (8 * 2); rbuf[1] = tmp >> (8 * 2);
rbuf[2] = tmp >> (8 * 1); rbuf[2] = tmp >> (8 * 1);
rbuf[3] = tmp; rbuf[3] = tmp;
/* sector size */
tmp = ATA_SECT_SIZE; tmp = ATA_SECT_SIZE;
rbuf[6] = tmp >> 8; rbuf[6] = tmp >> 8;
rbuf[7] = tmp; rbuf[7] = tmp;
} else { } else {
/* sector count, 64-bit */
rbuf[2] = n_sectors >> (8 * 7); rbuf[2] = n_sectors >> (8 * 7);
rbuf[3] = n_sectors >> (8 * 6); rbuf[3] = n_sectors >> (8 * 6);
rbuf[4] = n_sectors >> (8 * 5); rbuf[4] = n_sectors >> (8 * 5);
...@@ -835,6 +838,7 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf, ...@@ -835,6 +838,7 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
rbuf[8] = tmp >> (8 * 1); rbuf[8] = tmp >> (8 * 1);
rbuf[9] = tmp; rbuf[9] = tmp;
/* sector size */
tmp = ATA_SECT_SIZE; tmp = ATA_SECT_SIZE;
rbuf[12] = tmp >> 8; rbuf[12] = tmp >> 8;
rbuf[13] = tmp; rbuf[13] = tmp;
...@@ -1114,7 +1118,7 @@ static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev, ...@@ -1114,7 +1118,7 @@ static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev,
args.done = done; args.done = done;
switch(scsicmd[0]) { switch(scsicmd[0]) {
case TEST_UNIT_READY: /* FIXME: correct? */ case TEST_UNIT_READY:
case FORMAT_UNIT: /* FIXME: correct? */ case FORMAT_UNIT: /* FIXME: correct? */
case SEND_DIAGNOSTIC: /* FIXME: correct? */ case SEND_DIAGNOSTIC: /* FIXME: correct? */
ata_scsi_rbuf_fill(&args, ata_scsiop_noop); ata_scsi_rbuf_fill(&args, ata_scsiop_noop);
......
...@@ -104,6 +104,7 @@ enum { ...@@ -104,6 +104,7 @@ enum {
ATA_REG_IRQ = ATA_REG_NSECT, ATA_REG_IRQ = ATA_REG_NSECT,
/* ATA device commands */ /* ATA device commands */
ATA_CMD_CHK_POWER = 0xE5, /* check power mode */
ATA_CMD_EDD = 0x90, /* execute device diagnostic */ ATA_CMD_EDD = 0x90, /* execute device diagnostic */
ATA_CMD_FLUSH = 0xE7, ATA_CMD_FLUSH = 0xE7,
ATA_CMD_FLUSH_EXT = 0xEA, ATA_CMD_FLUSH_EXT = 0xEA,
...@@ -204,6 +205,7 @@ struct ata_taskfile { ...@@ -204,6 +205,7 @@ struct ata_taskfile {
#define ata_id_wcache_enabled(dev) ((dev)->id[85] & (1 << 5)) #define ata_id_wcache_enabled(dev) ((dev)->id[85] & (1 << 5))
#define ata_id_has_lba48(dev) ((dev)->id[83] & (1 << 10)) #define ata_id_has_lba48(dev) ((dev)->id[83] & (1 << 10))
#define ata_id_has_wcache(dev) ((dev)->id[82] & (1 << 5)) #define ata_id_has_wcache(dev) ((dev)->id[82] & (1 << 5))
#define ata_id_has_pm(dev) ((dev)->id[82] & (1 << 3))
#define ata_id_has_lba(dev) ((dev)->id[49] & (1 << 8)) #define ata_id_has_lba(dev) ((dev)->id[49] & (1 << 8))
#define ata_id_has_dma(dev) ((dev)->id[49] & (1 << 9)) #define ata_id_has_dma(dev) ((dev)->id[49] & (1 << 9))
#define ata_id_removeable(dev) ((dev)->id[0] & (1 << 7)) #define ata_id_removeable(dev) ((dev)->id[0] & (1 << 7))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment