linux/drivers/ide
Bartlomiej Zolnierkiewicz 23f8e4bf7c ide: fix early setup of hwif->host_flags
On Thursday 01 May 2008, Jeremy Kerr wrote:
> Hi all,
> 
> On QS20 Cell machines, Linus' current git tree explodes on boot:
> 
> SiI680: IDE controller (0x1095:0x0680 rev 0x02) at  PCI slot 
> 0000:00:0a.0
> SiI680: BASE CLOCK == 133
> SiI680: 100% native mode on irq 51
>     ide0: MMIO-DMA
>     ide1: MMIO-DMA
> Unable to handle kernel paging request for data at address 
> 0xa000100081220080
> Faulting instruction address: 0xc000000000024748
> cpu 0x2: Vector: 300 (Data Access) at [c00000001e143420]
>     pc: c000000000024748: ._insw_ns+0x10/0x30
>     lr: c000000000037fc4: .spiderpci_readsw+0x24/0x6c
>     sp: c00000001e1436a0
>    msr: 9000000000001032
>    dar: a000100081220080
>  dsisr: 40000000
>   current = 0xc00000003d060000
>   paca    = 0xc000000000623880
>     pid   = 1, comm = swapper
> enter ? for help
> [link register   ] c000000000037fc4 .spiderpci_readsw+0x24/0x6c
> [c00000001e1436a0] c00000000062ce63 (unreliable)
> [c00000001e143730] c0000000000379d4 .iowa_readsw+0x78/0xa8
> [c00000001e1437c0] c000000000037a98 .iowa_insw+0x94/0xd4
> [c00000001e143850] c00000000022a190 .ata_input_data+0x298/0x2ec
> [c00000001e143910] c00000000022b600 .try_to_identify+0x2c0/0x6d4
> [c00000001e1439d0] c00000000022bb54 .do_probe+0x140/0x35c
> [c00000001e143a80] c00000000022bfbc .ide_probe_port+0x24c/0x670
> [c00000001e143b50] c00000000022d09c .ide_device_add_all+0x2ec/0x690
> [c00000001e143c00] c00000000022d4a4 .ide_device_add+0x64/0x74
> [c00000001e143c90] c00000000022f834 .ide_setup_pci_device+0x58/0x7c
> [c00000001e143d30] c00000000038bdf8
> [c00000001e143e10] c000000000486fb0 .ide_scan_pcibus+0x8c/0x178
> [c00000001e143ea0] c000000000460c00 .kernel_init+0x1c4/0x344
> [c00000001e143f90] c000000000024a1c .kernel_thread+0x4c/0x68
> 
> It looks like we're trying to do PIO accesses (which appear to be 
> broken, but that's another issue) to this MMIO device. In 
> ata_input_data, we see that:
> 
> 	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
> 
> Gives mmio == 0.
> 
> (what's the difference between hwif->mmio and ID_HFLAG_MMIO?)
> 
> In the siimage driver, hwif->host flags is initially set up correctly 
> (host_flags includes IDE_HFLAG_MMIO), but we then *clear* this bit in 
> ide_init_port: 
> 
> 	hwif->host_flags = d->host_flags;
> 
> where d is the struct ide_port_info for this chipset. In my case, 
> d->host_flags is 0x0. It looks like this will be the same for all of 
> the siimage chipsets.

Don't over-write hwif->host_flags in ide_init_port(), some host drivers
set IDE_HFLAG_MMIO or IDE_HFLAG_NO_IO_32BIT host flag early.

Thanks to Jeremy Kerr for the excellent analysis of the bug.

Reported-by: Jeremy Kerr <jk@ozlabs.org>
Tested-by: Jeremy Kerr <jk@ozlabs.org>
Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Ben Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2008-05-01 14:08:51 +02:00
..
arm ide: add IDE_HFLAG_MMIO host flag (take 2) 2008-04-28 23:44:37 +02:00
h8300 ide: remove ->INW and ->OUTW methods 2008-04-28 23:44:41 +02:00
legacy ide: add IDE_HFLAG_MMIO host flag (take 2) 2008-04-28 23:44:37 +02:00
mips ide: remove ->INS{W,L} and ->OUTS{W,L} methods 2008-04-28 23:44:37 +02:00
pci alim15x3: disable init_hwif_ali15x3 for PowerPC 2008-04-29 22:57:38 +02:00
ppc ide: add IDE_HFLAG_MMIO host flag (take 2) 2008-04-28 23:44:37 +02:00
Kconfig remove the broken ETRAX_IDE driver 2008-04-28 23:44:42 +02:00
Makefile remove the broken ETRAX_IDE driver 2008-04-28 23:44:42 +02:00
ide-acpi.c ide: add "noacpi" / "acpigtf" / "acpionboot" parameters 2008-04-27 15:38:30 +02:00
ide-cd.c block: replace sizeof(rq->cmd) with BLK_MAX_CDB 2008-04-29 14:48:55 +02:00
ide-cd.h ide-cd: remove the internal 64k buffer 2008-04-26 17:36:37 +02:00
ide-cd_ioctl.c ide-cd: mark REQ_TYPE_ATA_PC write requests with REQ_RW flag 2008-03-07 21:53:49 +01:00
ide-cd_verbose.c block: replace sizeof(rq->cmd) with BLK_MAX_CDB 2008-04-29 14:48:55 +02:00
ide-disk.c ide-disk: fix issues found by checkpatch.pl 2008-04-26 17:36:37 +02:00
ide-dma.c ide: remove ->dma_prdtable field from ide_hwif_t 2008-04-28 23:44:42 +02:00
ide-floppy.c ide: add ide_pad_transfer() helper 2008-04-28 23:44:41 +02:00
ide-generic.c ide: cleanup setting hwif->mmio flag 2008-04-26 22:25:19 +02:00
ide-io.c ide: use blk_rq_init() to initialize the request 2008-04-29 14:48:55 +02:00
ide-iops.c ide: add TSSTcorp CDDVDW SH-S202H to ivb_list[] 2008-04-28 23:44:43 +02:00
ide-lib.c ide: add ->tf_load and ->tf_read methods 2008-04-28 23:44:40 +02:00
ide-pnp.c ide: make ide_unregister() take 'ide_hwif_t *' as an argument (take 2) 2008-04-27 15:38:31 +02:00
ide-probe.c ide: fix early setup of hwif->host_flags 2008-05-01 14:08:51 +02:00
ide-proc.c drivers: use non-racy method for proc entries creation (2) 2008-04-29 08:06:22 -07:00
ide-scan-pci.c ide: replace remaining __FUNCTION__ occurrences 2008-04-26 22:25:20 +02:00
ide-tape.c ide: use blk_rq_init() to initialize the request 2008-04-29 14:48:55 +02:00
ide-taskfile.c ide: use blk_rq_init() to initialize the request 2008-04-29 14:48:55 +02:00
ide-timing.h Spelling fixes: lenght->length 2008-02-03 15:42:53 +02:00
ide.c ide: use blk_rq_init() to initialize the request 2008-04-29 14:48:55 +02:00
setup-pci.c ide: constify struct ide_dma_ops 2008-04-26 22:25:24 +02:00