Thread (7 messages) 7 messages, 4 authors, 2005-02-22

Re: SATAPI timing

From: Albert Lee <hidden>
Date: 2005-02-22 06:36:38

On Sat, Feb 19 2005, Jeff Garzik wrote:
quoted
Albert Lee wrote:
quoted
I'm a little confused about what is the "correct behavior" of ATAPI DMA 
INTRQ.

1. The ATA-4 flowchart and ATA-6 state diagram seems to be inconsistent.
In the ATA-4 flowchart, no wait for INTRQ is specified.

2. From the ATA-5 errata:
http://www.t13.org/project/e01122r0.pdf

"...Page 265 through 270 of NCITS 340-2000 clause 9.8 was not properly 
converted from the flow
charts in NCITS 317-1998 to the state diagrams. The state diagrams figures 
33 and 34 and
associated text is modified to indicate that the device interrupts only at 
command completion. "

Notice the "device interrupts only at command completion." statement.
However, the diagrams in the errata are inconsistent with the above 
statement.

3. The ide-cd code does not wait for INTRQ before starting BM-DMA

       /* Arm the interrupt handler. */
       ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry);

       /* ATAPI commands get padded out to 12 bytes minimum */
       cmd_len = COMMAND_SIZE(rq->cmd[0]);
       if (cmd_len < ATAPI_MIN_CDB_BYTES)
           cmd_len = ATAPI_MIN_CDB_BYTES;

       /* Send the command to the device. */
       HWIF(drive)->atapi_output_bytes(drive, rq->cmd, cmd_len);

       /* Start the DMA if need be */
       if (info->dma)
           hwif->dma_start(drive);

       return ide_started;

4. My CD-ROM drive does not generate INTRQ after it received the command 
packet.
  It only assert DMARQ.

Maybe the state diagrams in ATA-5 and ATA-6 are incorrect?  Any idea?

As I mentioned in an earlier email, research seems to indicate the 
IDENTIFY PACKET DEVICE word 0, bits 6-5 can be used to indicate INTRQ 
will be delivered.  This is consistent with my ATA-4 specification.

Apparently this behavior is obsolete, but we still need to support it.
ide-cd uses those bits to check for interrupt delivery, see
drq_interrupt in that file.
  I've read the ide-cd code about the drq_interrupt indicated by config word 0, bits 6-5. 
The DRQ interrupt seems to be after PACKET command 0xA0 and _before_ the command packet 
is written to the device:

if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
  /* packet command */
  ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry);
  return ide_started;
 } else {
  unsigned long flags;

  /* packet command */
  spin_lock_irqsave(&ide_lock, flags);
  hwif->OUTBSYNC(drive, WIN_PACKETCMD, IDE_COMMAND_REG);
  ndelay(400);
  spin_unlock_irqrestore(&ide_lock, flags);

  return (*handler) (drive);
 }

  However, it seems not the same interrupt mentioned by gp and ATA-6 chap. 9.8 Figure 33.
The interrupt is _after_ the command packet is sent to the device: (HPD1:HPD3)
"When the Data register has been written, the writing of the command packet is completed,
and nIEN is cleared to zero, the host shall make a transition to the HPD3: INTRQ wait state."

Albert
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help