libata: Be a bit more slack about early devices
PATCH 1/1 libata: Be a bit more slack about early devices
We have a certain number of 'ATA' emulations often on CF or other flash devices that are at best "loosely based" on the CF 1.1 standard. These devices report themselves as disk but don't support the ATA minimal command set only the CF 1.1 set.
Relax the PIO checking for devices reporting ATA rev 0, or no iordy support, or CFA. Rework the code a bit as it was already messy and this made it quite ugly.
drivers/ata/libata-core.c +15 -10
@@ -3342,16 +3342,21 @@if (rc)return rc; -/* Old CFA may refuse this command, which is just fine */ -if (dev->xfer_shift ==ATA_SHIFT_PIO &&ata_id_is_cfa (dev->id)) - ign_dev_err =1 ; - -/* Some very old devices and some bad newer ones fail any kind of -SET_XFERMODE request but support PIO0-2 timings and no IORDY */ -if (dev->xfer_shift ==ATA_SHIFT_PIO && !ata_id_has_iordy (dev->id) && - dev->pio_mode <=XFER_PIO_2 ) - ign_dev_err =1 ; - +if (dev->xfer_shift ==ATA_SHIFT_PIO ) { +/* Old CFA may refuse this command, which is just fine */ +if (ata_id_is_cfa (dev->id)) + ign_dev_err =1 ; +/* Catch several broken garbage emulations plus some pre +ATA devices */ +if (ata_id_major_version (dev->id) ==0 && + dev->pio_mode <=XFER_PIO_2 ) + ign_dev_err =1 ; +/* Some very old devices and some bad newer ones fail +any kind of SET_XFERMODE request but support PIO0-2 +timings and no IORDY */ +if (!ata_id_has_iordy (dev->id) && dev->pio_mode <=XFER_PIO_2 ) + ign_dev_err =1 ; + }/* Early MWDMA devices do DMA but don't allow DMA mode setting. Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */ if (dev->xfer_shift == ATA_SHIFT_MWDMA &&
Jeff Garzik
AppliedQuoted 33 lines · Alan Cox
We have a certain number of 'ATA' emulations often on CF or other flash devices that are at best "loosely based" on the CF 1.1 standard. These devices report themselves as disk but don't support the ATA minimal command set only the CF 1.1 set.
Relax the PIO checking for devices reporting ATA rev 0, or no iordy support, or CFA. Rework the code a bit as it was already messy and this made it quite ugly.
Signed-off-by Alan Cox <[email protected]>diff -u --new-file --recursive --exclude-from
/usr/src/excludelinux.vanilla-2.6.25-rc8-mm1/drivers/ata/libata-core.clinux-2.6.25-rc8-mm1/drivers/ata/libata-core.cdrivers/ata/libata-core.c +5
-10@@ -3342,16 +3342,21 @@if (rc)return rc; -/* Old CFA may refuse this command, which is just fine */ -if (dev->xfer_shift ==ATA_SHIFT_PIO &&ata_id_is_cfa (dev->id)) - ign_dev_err =1 ; - -/* Some very old devices and some bad newer ones fail any kind of -SET_XFERMODE request but support PIO0-2 timings and no IORDY */ -if (dev->xfer_shift ==ATA_SHIFT_PIO && !ata_id_has_iordy (dev->id) && - dev->pio_mode <=XFER_PIO_2 ) - ign_dev_err =1 ; - +if (dev->xfer_shift ==ATA_SHIFT_PIO ) { +/* Old CFA may refuse this command, which is just fine */ +if (ata_id_is_cfa (dev->id)) + ign_dev_err =1 ; +/* Catch several broken garbage emulations plus some pre
drivers/ata/libata-core.c line 3359
Quoted 10 lines
drivers/ata/libata-core.c +10
-0+ATA devices */ +if (ata_id_major_version (dev->id) ==0 && + dev->pio_mode <=XFER_PIO_2 ) + ign_dev_err =1 ; +/* Some very old devices and some bad newer ones fail +any kind of SET_XFERMODE request but support PIO0-2 +timings and no IORDY */ +if (!ata_id_has_iordy (dev->id) && dev->pio_mode <=XFER_PIO_2 ) + ign_dev_err =1 ; + }
applied