Skip to contentSkip to conversation

Incorrect device link for ide-cs

PATCH Applied Hannes Reinecke 2 participants 5 messages Nov 3, 2005 – Nov 9, 2005 libata

lore
Share & tools
lore
#0 lore raw

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;
 
 /*
#1 lore raw

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

#2 lore raw
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;
 
 /*
#3 lore raw
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