Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ide: falconide/q40ide - Use __ide_mm_{in,out}sw() for data

Both of commits f94116aeec7a299640dd692128e1d22178affa8d ("ide: cleanup
<asm-m68k/ide.h>") and 15a453a955f89f6545118770c669b52e925368bd ("ide: include
<asm/ide.h> only when needed") break falconide:

| Uniform Multi-Platform E-IDE driver
| ide: Falcon IDE controller
| Probing IDE interface ide0...
| hda: Sarge m68k, ATA DISK drive
| ide0 at 0xfff00000 on irq 15 (serialized)
| ide-gd driver 1.18
| hda: max request size: 128KiB
| hda: 2118816 sectors (1084 MB) w/256KiB Cache, CHS=2102/16/63
| hda:<4>hda: lost interrupt

This happens because falconide relies on {in,out}sw() being redefined in
<asm/ide.h>, as included by <linux/ide.h>, which is no longer the case.
Use __ide_mm_{in,out}sw() from <asm/ide.h> instead, just like
ide_{in,out}put_data() do.

The same problem seems to exist in q40ide.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>

authored by

Geert Uytterhoeven and committed by
Bartlomiej Zolnierkiewicz
d1881207 aa07573b

+19 -8
+9 -4
drivers/ide/falconide.c
··· 20 20 #include <asm/atarihw.h> 21 21 #include <asm/atariints.h> 22 22 #include <asm/atari_stdma.h> 23 + #include <asm/ide.h> 23 24 24 25 #define DRV_NAME "falconide" 25 26 ··· 68 67 { 69 68 unsigned long data_addr = drive->hwif->io_ports.data_addr; 70 69 71 - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) 72 - return insw(data_addr, buf, (len + 1) / 2); 70 + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { 71 + __ide_mm_insw(data_addr, buf, (len + 1) / 2); 72 + return; 73 + } 73 74 74 75 raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2); 75 76 } ··· 81 78 { 82 79 unsigned long data_addr = drive->hwif->io_ports.data_addr; 83 80 84 - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) 85 - return outsw(data_addr, buf, (len + 1) / 2); 81 + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { 82 + __ide_mm_outsw(data_addr, buf, (len + 1) / 2); 83 + return; 84 + } 86 85 87 86 raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2); 88 87 }
+10 -4
drivers/ide/q40ide.c
··· 16 16 #include <linux/blkdev.h> 17 17 #include <linux/ide.h> 18 18 19 + #include <asm/ide.h> 20 + 19 21 /* 20 22 * Bases of the IDE interfaces 21 23 */ ··· 79 77 { 80 78 unsigned long data_addr = drive->hwif->io_ports.data_addr; 81 79 82 - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) 83 - return insw(data_addr, buf, (len + 1) / 2); 80 + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { 81 + __ide_mm_insw(data_addr, buf, (len + 1) / 2); 82 + return; 83 + } 84 84 85 85 raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2); 86 86 } ··· 92 88 { 93 89 unsigned long data_addr = drive->hwif->io_ports.data_addr; 94 90 95 - if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) 96 - return outsw(data_addr, buf, (len + 1) / 2); 91 + if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { 92 + __ide_mm_outsw(data_addr, buf, (len + 1) / 2); 93 + return; 94 + } 97 95 98 96 raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2); 99 97 }