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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html