On Mon, 26 Apr 2021, Michael Schmitz wrote: > Am 25.04.2021 um 21:06 schrieb Finn Thain: > > This was tested on my Quadra 630. I haven't tested it on my PowerBook 150 > > because I don't have a RAM adapter board for it. > > > > Apparently, the hardware I tested doesn't need macide_clear_irq() or > > macide_test_irq() -- if it did, the generic driver would not have worked. > > It's possible that those routines are needed for the PowerBook 150 but > > we can cross that bridge if and when we come to it. > > > > BTW, macide_clear_irq() appears to suffer from a race condition. The write > > to the interrupt flags register could easily have unintended side effects > > as it may alter other flag bits. Fortunately, all of the other bits are > > unused by Linux. Moreover, when tested on my Quadra 630, that assignment > > (*ide_ifr &= ~0x20) was observed to have no effect on bit 5. > > You are worried that the bit clear might not be done atomic? > The edge-triggered interrupt flag bits are usually cleared by writing 1 to the flag bit. Under this scheme, writing a 0 to a flag bit has no effect. The assignment statement here is trying to clear bit 5 by writing 0. But what about the other bits that we're writing 0 to? Some of them may also be flag bits, and they may have been asserted in between the load and store. AFAICS this scheme just can't work for edge-triggered interrupts. So perhaps this is a level-triggered interrupt? > Regarding the missing effect of clearing bit 5, I suspect this has never > before been tested rigorously (I don't remember ever using a Quadra > 630). > > The logic attempted to replicate what the MacOS IDE driver did. Fair enough. Maybe we have found a bug in the MacOS IDE driver. > The Linux IDE driver has its own way to test and clear a port's > interrupt flag, so this extra code can quite probably go. > > Thanks for cleaning this up! > > Reviewed-by: Michael Schmitz <schmitzmic@xxxxxxxxx> > Thanks for your review.