Akira Iguchi wrote:
>
> I have a problem that our hardware (Celleb) cannot exit from
> ata_host_intr() when ATAPI DMA data read fails.
>
> This PATA controller sets bit2 (ATA_DMA_INTR) of BMDMA status register
> after it finished DMA data read. If ATAPI DMA data read fails
> due to no CDROM, it doesn't transfer data and generates an interrupt.
> In this case, bit2 of BMDMA status register is not set.
This behavior is different from other adapters. For other adapters,
ATA_DMA_INTR bit of BMDMA status is set whenever the drive raises INTRQ.
>
> libata ISR (ata_host_intr()) checks this bit by the following code:
>
> /* if it's not our irq... */
> if (!(host_stat & ATA_DMA_INTR))
> goto idle_irq;
>
>
> Our driver always hits this check. As a result, ISR loops forever.
> I temporarily use libata by removing this check.
>
> I wonder if this check is necessary. In drivers/ide, cdrom_decode_status()
> seems to check IDE STATUS register instead of BMDMA status register.
> If there is no problem, I hope this check will be removed.
>
This check is needed to make sure it is "my irq". Otherwise we might
- incorrectly stop BMDMA if another PCI adapter raise the same shared irq
- incorrectly read ALT_STATUS when DD0-DD15 being used for DMA transfer
Is the irq of Celleb IDE shared with other adapters?
If the irq is non-shared, could you check if the following code works
for Celleb:
/* if it's not our irq... */
if ((host_stat & ATA_DMA_ACTIVE) &&
!(host_stat & ATA_DMA_INTR))
goto idle_irq;
--
albert
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html