> Has anyone looked at FreeBSD for fixes after the routine has been copied? I tried, but they seem to have partially re-factored the code.
Initially, the fix was #ifdef __powerpc__. It looks like they are doing the magic (additional 4-byte read on the status register) only for what they call the ATA_K2 chip: ata_serverworks_ch_attach() will, only in that case, set ch->hw.status = ata_serverworks_status (the interrupt handler doing the magic read) plus set ATA_DMA_BEFORE_CMD plus two other special treatments I don't understand: two ATA_OUTL at the beginning of the block commented as Set SICR registers to turn off waiting for a status message before sending FIS. Values obtained from the Darwin driver. and setting a ATA_STATUS_IS_LONG flag (whatever that is) commented as The status register must be read as a long to fill the other registers. Can anyone make sense of that?