linux/drivers/ide/ide-probe.c

1636 lines
38 KiB

it821x: RAID mode fixes The DMA support for RAID mode broke after: commit 71ef51cc1756d1c56b57c70e7cc27a3559c81ee6 Author: Jens Axboe <axboe@suse.de> Date:   Fri Jul 28 09:02:17 2006 +0200     [PATCH] it821x: fix ide dma setup bug     Only enable dma for a valid speed setting.     Signed-off-by: Jens Axboe <axboe@suse.de> commit 0a8348d08677ad77ee353f96eb8745c693a05a13 Author: Jens Axboe <axboe@suse.de> Date:   Fri Jul 28 08:58:26 2006 +0200     [PATCH] ide: if the id fields looks screwy, disable DMA     It's the safer choice. Originally due to a bug in itx821x, but a     generally sound thing to do.     Signed-off-by: Jens Axboe <axboe@suse.de> However it worked by pure luck before Jens' fixes: bogus ide_dma_enable() usage in it821x driver combined with loosy check in ide_dma_verbose() allowed the hardware to operate in DMA mode. When these problems were fixed the DMA support broke... The source root for the regression turned out to be that the it821x.c code was clearing too much of id->field_valid. The IDE core code was using the original value of id->field_valid to do the tuning but later DMA got disabled in ide_dma_verbose() because of the incorrect id->field_valid fixup. Fix it. While at it: * Do fixup() after probing the drives but before tuning them (which is also OK w.r.t. ide_undecoded_slave() fixup). This change fixes device IDENTIFY data to be consistent before/after the tuning and allows us to remove extra re-tuning of drives from it821x_fixups(). * Fake MWDMA0 enabled/supported bits in IDENTIFY data if the device has DMA capable bit set (this is just to tell the IDE core that DMA is supported since it821x firmware takes care of DMA mode programming). * Don't touch timing registers and don't program transfer modes on devices et all when in RAID mode - depend solely on firmware to do the tuning (as suggested by Alan Cox and done in libata pata_it821x driver). Thanks for testing the patch goes out to Thomas Kuther. Cc: Thomas Kuther <gimpel@sonnenkinder.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Jens Axboe <axboe@suse.de> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
2007-06-08 15:14:29 +02:00
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
ide: free hwif->portdev on hwif_init() failure Recent pci_assign_irq() changes uncovered a problem with missing freeing of ide_port class instance on hwif_init() failure in ide_host_register(): ide0: disabled, no IRQ ide0: failed to initialize IDE interface ide0: disabling port cmd64x 0000:00:02.0: IDE controller (0x1095:0x0646 rev 0x07) CMD64x_IDE 0000:00:02.0: BAR 0: can't reserve [io 0x8050-0x8057] cmd64x 0000:00:02.0: can't reserve resources CMD64x_IDE: probe of 0000:00:02.0 failed with error -16 ide_generic: please use "probe_mask=0x3f" module parameter for probing all legacy ISA IDE ports ------------[ cut here ]------------ WARNING: CPU: 0 PID: 1 at fs/sysfs/dir.c:31 sysfs_warn_dup+0x94/0xd0 sysfs: cannot create duplicate filename '/class/ide_port/ide0' ... Trace: [<fffffc00003308a0>] __warn+0x160/0x190 [<fffffc000048c9f4>] sysfs_warn_dup+0x94/0xd0 [<fffffc0000330928>] warn_slowpath_fmt+0x58/0x70 [<fffffc000048c9f4>] sysfs_warn_dup+0x94/0xd0 [<fffffc0000486d40>] kernfs_path_from_node+0x30/0x60 [<fffffc00004874ac>] kernfs_put+0x16c/0x2c0 [<fffffc00004874ac>] kernfs_put+0x16c/0x2c0 [<fffffc000048d010>] sysfs_do_create_link_sd.isra.2+0x100/0x120 [<fffffc00005b9d64>] device_add+0x2a4/0x7c0 [<fffffc00005ba5cc>] device_create_groups_vargs+0x14c/0x170 [<fffffc00005ba518>] device_create_groups_vargs+0x98/0x170 [<fffffc00005ba690>] device_create+0x50/0x70 [<fffffc00005df36c>] ide_host_register+0x48c/0xa00 [<fffffc00005df330>] ide_host_register+0x450/0xa00 [<fffffc00005ba2a0>] device_register+0x20/0x50 [<fffffc00005df330>] ide_host_register+0x450/0xa00 [<fffffc00005df944>] ide_host_add+0x64/0xe0 [<fffffc000079b41c>] kobject_uevent_env+0x16c/0x710 [<fffffc0000310288>] do_one_initcall+0x68/0x260 [<fffffc00007b13bc>] kernel_init+0x1c/0x1a0 [<fffffc00007b13a0>] kernel_init+0x0/0x1a0 [<fffffc0000311868>] ret_from_kernel_thread+0x18/0x20 [<fffffc00007b13a0>] kernel_init+0x0/0x1a0 ---[ end trace 24a70433c3e4d374 ]--- ide0: disabling port Fix the problem by adding missing code to ide_host_register(). Fixes: 30fdfb929e82 ("PCI: Add a call to pci_assign_irq() in pci_device_probe()") Fixes: 0e4c2eeb758a ("alpha/PCI: Replace pci_fixup_irqs() call with host bridge IRQ mapping hooks") Link: http://lkml.kernel.org/r/32ec730f-c1b0-5584-cd35-f8a809122b96@roeck-us.net Reported-by: Guenter Roeck <linux@roeck-us.net> Tested-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> [bhelgaas: add Fixes:] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Cc: Richard Henderson <rth@twiddle.net> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Matt Turner <mattst88@gmail.com>
2017-10-03 13:18:47 +02:00