[PATCH] libata: Don't believe bogus claims in the older PIO mode register
[sfrench/cifs-2.6.git] / drivers / ata / libata-core.c
index dce65651d8586ffb67c4bf4dcc3efc38940cc8b0..ad8e2c64c867ea1927597032896d471e417660c7 100644 (file)
@@ -870,7 +870,11 @@ static unsigned int ata_id_xfermask(const u16 *id)
                 * the PIO timing number for the maximum. Turn it into
                 * a mask.
                 */
-               pio_mask = (2 << (id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ;
+               u8 mode = id[ATA_ID_OLD_PIO_MODES] & 0xFF;
+               if (mode < 5)   /* Valid PIO range */
+                       pio_mask = (2 << mode) - 1;
+               else
+                       pio_mask = 1;
 
                /* But wait.. there's more. Design your standards by
                 * committee and you too can get a free iordy field to