ata: pata_legacy: fix pdc20230_set_piomode()
authorSergey Shtylyov <s.shtylyov@omp.ru>
Fri, 28 Oct 2022 21:07:06 +0000 (00:07 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Nov 2022 17:15:28 +0000 (18:15 +0100)
[ Upstream commit 171a93182eccd6e6835d2c86b40787f9f832efaa ]

Clang gives a warning when compiling pata_legacy.c with 'make W=1' about
the 'rt' local variable in pdc20230_set_piomode() being set but unused.
Quite obviously, there is an outb() call missing to write back the updated
variable. Moreover, checking the docs by Petr Soucek revealed that bitwise
AND should have been done with a negated timing mask and the master/slave
timing masks were swapped while updating...

Fixes: 669a5db411d8 ("[libata] Add a bunch of PATA drivers.")
Reported-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/ata/pata_legacy.c

index 0a8bf09a5c19e5887ae463e0a581a04e366e4dd2..03c580625c2cc7c1d5ce0b905caf7190e989410a 100644 (file)
@@ -315,9 +315,10 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev)
        outb(inb(0x1F4) & 0x07, 0x1F4);
 
        rt = inb(0x1F3);
-       rt &= 0x07 << (3 * adev->devno);
+       rt &= ~(0x07 << (3 * !adev->devno));
        if (pio)
-               rt |= (1 + 3 * pio) << (3 * adev->devno);
+               rt |= (1 + 3 * pio) << (3 * !adev->devno);
+       outb(rt, 0x1F3);
 
        udelay(100);
        outb(inb(0x1F2) | 0x01, 0x1F2);