Incorrect device link for ide-cs
PATCH 1/1 Incorrect device link for ide-cs
Hi Bartlomiej,
I just came across a patch which appearently never made it anywhere near mainline. It is, however, still valid.
Problem is that devices driven by ide-cs will appear under /sys/devices instead of the appropriate PCMCIA device. To fix this I had to extend the hw_regs_t structure with a 'struct device' field, which allows us to set the parent link for the appropriate hwif.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke [email protected] SuSE Linux Products GmbH S390 & zSeries Maxfeldstraße 5 +49 911 74053 688 90409 Nürnberg http://www.suse.de
From: Hannes Reinecke <[email protected]>
Subject: Incorrect device link for ide-cs
Devices driven by ide-cs will appear under /sys/devices instead of the appropriate PCMCIA device. To fix this I had to extend the hw_regs_t structure with a 'struct device' field, which allows us to set the parent link for the appropriate hwif.
drivers/ide/ide.c +1 -0
@@ -803,6 +803,7 @@ found: hwif->irq = hw->irq; hwif->noprobe =0 ; hwif->chipset = hw->chipset; + hwif->gendev.parent = hw->dev;if (!initializing) {probe_hwif_init_with_fixup (hwif, fixup);
drivers/ide/legacy/ide-cs.c +5 -4
@@ -182,13 +182,14 @@ static void ide_detach(dev_link_t *link) }/* ide_detach */ -static int idecs_register (unsigned long io,unsigned long ctl,unsigned long irq) +static int idecs_register (unsigned long io,unsigned long ctl,unsigned long irq,struct pcmcia_device *handle) {hw_regs_t hw;memset (&hw,0 ,sizeof (hw)); -ide_init_hwif_ports (&hw, io, ctl,NULL ); +ide_std_init_ports (&hw, io, ctl); hw.irq = irq; hw.chipset = ide_pci; + hw.dev = &handle->dev;return ide_register_hw_with_fixup (&hw,NULL , ide_undecoded_slave); }
@@ -328,12 +329,12 @@ static void ide_config(dev_link_t *link)/* retry registration in case device is still spinning up */ for (hd =-1 , i =0 ; i <10 ; i++) { - hd =idecs_register (io_base, ctl_base, link->irq.AssignedIRQ); + hd =idecs_register (io_base, ctl_base, link->irq.AssignedIRQ, handle);if (hd >=0 )break ;if (link->io.NumPorts1 ==0x20 ) {outb (0x02 , ctl_base +0x10 ); hd =idecs_register (io_base +0x10 , ctl_base +0x10 , - link->irq.AssignedIRQ); + link->irq.AssignedIRQ, handle);if (hd >=0 ) { io_base +=0x10 ; ctl_base +=0x10 ;
include/linux/ide.h +1 -0
@@ -230,6 +230,7 @@ typedef struct hw_regs_s {int dma;/* our dma entry */ ide_ack_intr_t *ack_intr;/* acknowledge interrupt */ hwif_chipset_t chipset; +struct device *dev; } hw_regs_t;/*
Hi,
drivers/ide/legacy/ide-cs.c static void ide_detach(dev_link_t *link) · line 189
Quoted 4 lines
hw_regs_t hw; memset(&hw, 0, sizeof(hw));drivers/ide/legacy/ide-cs.c +1
-1-ide_init_hwif_ports (&hw, io, ctl,NULL ); +ide_std_init_ports (&hw, io, ctl);
Could you separate this into another patch?
This change fixes ide-cs for some archs but OTOH we should verify that there are no ide-cs specific hacks in ide_init_hwif_ports() on other archs.
Otherwise patch looks fine.
Thanks,
Bartlomiej
Quoted 7 lines · Bartlomiej Zolnierkiewicz
Hi,
Review
Quoted 4 lines
hw_regs_t hw; memset(&hw, 0, sizeof(hw));(quoted diff) +1
-1- ide_init_hwif_ports(&hw, io, ctl, NULL); + ide_std_init_ports(&hw, io, ctl);
Quoted 5 lines
Could you separate this into another patch?
This change fixes ide-cs for some archs but OTOH we should verify that there are no ide-cs specific hacks in
ide_init_hwif_ports()on other archs.
Oops, you are correct. The main reason why I did this is this comment in include/linux/ide.h:
* ide_init_hwif_ports() is OBSOLETE and will be removed in 2.7 series.
Arch specific codes are in:
cris/v10
arm/sa1100
arch-m68knommu
Neither of which is using the irq parameter anyway, so it would make sense to remove that interface completely.
Updated patch attached.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke [email protected] SuSE Linux Products GmbH S390 & zSeries Maxfeldstraße 5 +49 911 74053 688 90409 Nürnberg http://www.suse.de
From: Hannes Reinecke <[email protected]>
Subject: Incorrect device link for ide-cs
Devices driven by ide-cs will appear under /sys/devices instead of the appropriate PCMCIA device. To fix this I had to extend the hw_regs_t structure with a 'struct device' field, which allows us to set the parent link for the appropriate hwif.
drivers/ide/ide.c +1 -0
@@ -803,6 +803,7 @@ found: hwif->irq = hw->irq; hwif->noprobe =0 ; hwif->chipset = hw->chipset; + hwif->gendev.parent = hw->dev;if (!initializing) {probe_hwif_init_with_fixup (hwif, fixup);
drivers/ide/legacy/ide-cs.c +4 -3
@@ -182,13 +182,14 @@ static void ide_detach(dev_link_t *link) }/* ide_detach */ -static int idecs_register (unsigned long io,unsigned long ctl,unsigned long irq) +static int idecs_register (unsigned long io,unsigned long ctl,unsigned long irq,struct pcmcia_device *handle) {hw_regs_t hw;memset (&hw,0 ,sizeof (hw));ide_init_hwif_ports (&hw, io, ctl,NULL ); hw.irq = irq; hw.chipset = ide_pci; + hw.dev = &handle->dev;return ide_register_hw_with_fixup (&hw,NULL , ide_undecoded_slave); }
@@ -328,12 +329,12 @@ static void ide_config(dev_link_t *link)/* retry registration in case device is still spinning up */ for (hd =-1 , i =0 ; i <10 ; i++) { - hd =idecs_register (io_base, ctl_base, link->irq.AssignedIRQ); + hd =idecs_register (io_base, ctl_base, link->irq.AssignedIRQ, handle);if (hd >=0 )break ;if (link->io.NumPorts1 ==0x20 ) {outb (0x02 , ctl_base +0x10 ); hd =idecs_register (io_base +0x10 , ctl_base +0x10 , - link->irq.AssignedIRQ); + link->irq.AssignedIRQ, handle);if (hd >=0 ) { io_base +=0x10 ; ctl_base +=0x10 ;
include/linux/ide.h +1 -0
@@ -230,6 +230,7 @@ typedef struct hw_regs_s {int dma;/* our dma entry */ ide_ack_intr_t *ack_intr;/* acknowledge interrupt */ hwif_chipset_t chipset; +struct device *dev; } hw_regs_t;/*
Quoted 13 lines · Hannes Reinecke
Quoted 7 lines · Bartlomiej Zolnierkiewicz
Hi,
Review
Quoted 4 lines
hw_regs_t hw; memset(&hw, 0, sizeof(hw));(quoted diff) +1
-1- ide_init_hwif_ports(&hw, io, ctl, NULL); + ide_std_init_ports(&hw, io, ctl);Quoted 5 lines
Could you separate this into another patch?
This change fixes ide-cs for some archs but OTOH we should verify that there are no ide-cs specific hacks in
ide_init_hwif_ports()on other archs.
Quoted 8 lines
Oops, you are correct. The main reason why I did this is this comment in
include/linux/ide.h:
*ide_init_hwif_ports()is OBSOLETE and will be removed in 2.7 series.Arch specific codes are in:
cris/v10
arm/sa1100
arch-m68knommu
I'm more worried about indirect PPC32 hacks...
...
#ifdef CONFIG_PPC32
if (ppc_ide_md.ide_init_hwif)
ppc_ide_md.ide_init_hwif(hw, io_addr, ctl_addr, irq);#endif
...
Quoted 4 lines
Neither of which is using the irq parameter anyway, so it would make sense to remove that interface completely.
Updated patch attached.
Thanks,
Bartlomiej
Bartlomiej Zolnierkiewicz
AppliedQuoted 1 line · Hannes Reinecke
Updated patch attached.
applied