[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-arm-kernel
Subject:    RE: [PATCH] 2.5.44 SA-1111 ohci-hcd
From:       "Christopher Hoover" <ch () murgatroid ! com>
Date:       2002-10-29 0:07:54
[Download RAW message or body]



-----Original Message-----
From: linux-arm-kernel-admin@lists.arm.linux.org.uk
[mailto:linux-arm-kernel-admin@lists.arm.linux.org.uk] On Behalf Of
Christopher Hoover
Sent: Monday, October 28, 2002 4:03 PM
To: linux-usb-devel@lists.sourceforge.net
Cc: Linux-Arm-Kernel (Linux-Arm-Kernel); David Brownell
Subject: [PATCH] 2.5.44 SA-1111 ohci-hcd



Dereferencing hcd.pdev will always oops with SA-1111.  It has to be
treated as a cookie, not a pointer in any common OHCI HCD code.

Apparently we need a clean way to go from struct device * to struct
ohci_hcd *.  I added dev_to_ohci that does the obvious thing and added
separate implementations for PCI and SA-1111.  Two implementations is
ugly but I didn't think it wise (for me) to hack on the PCI/driverfs
interface, so I just cut & paste the old code.

Two patches.  The first is a diff from linux-2.5.44 and
linux-2.5.44-rmk1.  It is from rmk and adds a struct device pointer to
ohci_hcd.  The second depends on the first and contains my changes to
clean up to the pdev oops problems.  (Some fuzz may occur as I have
ohci-1024 applied.)

With these changes, SA111 OHCI-HC/HCD is showing some signs of life on
linux-2.5.44-rmk1.  usb-storage is currentl blowing chunks, but I think
I saw some patches go by against 2.5.44 that I haven't yet tried.

-ch

diff -Naurp -X ../dontdiff.txt linux-2.5.44-usb1/drivers/usb/core/hcd.h
linux-2.5.44-rmk1-usb/drivers/usb/core/hcd.h
--- linux-2.5.44-usb1/drivers/usb/core/hcd.h	Fri Oct 18 21:01:22 2002
+++ linux-2.5.44-rmk1-usb/drivers/usb/core/hcd.h	Mon Oct 28
15:44:30 2002
@@ -77,6 +77,7 @@ struct usb_hcd {	/* usb_bus.hcpriv point
 
 	/* a few non-PCI controllers exist, mostly for OHCI */
 	struct pci_dev		*pdev;		/* pci is typical */
+	struct device		*parent;	/* parent device driver
*/
 #ifdef	CONFIG_PCI
 	int			region;		/* pci region for regs
*/
 	u32			pci_state [16];	/* for PM state save */
diff -Naurp -X ../dontdiff.txt
linux-2.5.44-usb1/drivers/usb/host/ohci-sa1111.c
linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-sa1111.c
--- linux-2.5.44-usb1/drivers/usb/host/ohci-sa1111.c	Fri Oct 18
21:01:54 2002
+++ linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-sa1111.c	Mon Oct
28 15:44:30 2002
@@ -120,7 +120,7 @@ static void usb_hcd_sa1111_hcim_irq (int
 	}
 #endif
 
-	usb_hcd_irq(irq, __hcd, r);
+	usb_hcd_irq(irq, hcd, r);
 }
 
 
/*----------------------------------------------------------------------
---*/




diff -Naurp -X ../dontdiff.txt
linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-dbg.c
linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-dbg.c
--- linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-dbg.c	Fri Oct 18
21:02:29 2002
+++ linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-dbg.c	Mon Oct 28
15:16:32 2002
@@ -394,15 +394,14 @@ show_list (struct ohci_hcd *ohci, char *
 static ssize_t
 show_async (struct device *dev, char *buf, size_t count, loff_t off)
 {
-	struct pci_dev		*pdev;
 	struct ohci_hcd		*ohci;
 	size_t			temp;
 	unsigned long		flags;
 
 	if (off != 0)
 		return 0;
-	pdev = container_of (dev, struct pci_dev, dev);
-	ohci = container_of (pci_get_drvdata (pdev), struct ohci_hcd,
hcd);
+
+	ohci = dev_to_ohci(dev);
 
 	/* display control and bulk lists together, for simplicity */
 	spin_lock_irqsave (&ohci->lock, flags);
@@ -420,7 +419,6 @@ static DEVICE_ATTR (async, S_IRUGO, show
 static ssize_t
 show_periodic (struct device *dev, char *buf, size_t count, loff_t off)
 {
-	struct pci_dev		*pdev;
 	struct ohci_hcd		*ohci;
 	struct ed		**seen, *ed;
 	unsigned long		flags;
@@ -434,8 +432,7 @@ show_periodic (struct device *dev, char 
 		return 0;
 	seen_count = 0;
 
-	pdev = container_of (dev, struct pci_dev, dev);
-	ohci = container_of (pci_get_drvdata (pdev), struct ohci_hcd,
hcd);
+	ohci = dev_to_ohci(dev);
 	next = buf;
 	size = count;
 
@@ -513,16 +510,16 @@ static DEVICE_ATTR (periodic, S_IRUGO, s
 
 static inline void create_debug_files (struct ohci_hcd *bus)
 {
-	device_create_file (&bus->hcd.pdev->dev, &dev_attr_async);
-	device_create_file (&bus->hcd.pdev->dev, &dev_attr_periodic);
+	device_create_file (bus->hcd.parent, &dev_attr_async);
+	device_create_file (bus->hcd.parent, &dev_attr_periodic);
 	// registers
 	dbg ("%s: created debug files", bus->hcd.self.bus_name);
 }
 
 static inline void remove_debug_files (struct ohci_hcd *bus)
 {
-	device_remove_file (&bus->hcd.pdev->dev, &dev_attr_async);
-	device_remove_file (&bus->hcd.pdev->dev, &dev_attr_periodic);
+	device_remove_file (bus->hcd.parent, &dev_attr_async);
+	device_remove_file (bus->hcd.parent, &dev_attr_periodic);
 }
 
 #else /* empty stubs for creating those files */
diff -Naurp -X ../dontdiff.txt
linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-pci.c
linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-pci.c
--- linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-pci.c	Fri Oct 18
21:02:27 2002
+++ linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-pci.c	Mon Oct 28
15:47:03 2002
@@ -29,6 +29,17 @@
 
 
/*----------------------------------------------------------------------
---*/
 
+struct ohci_hcd *dev_to_ohci(struct device *dev) {
+	struct pci_dev *pdev = 
+		container_of (dev, struct pci_dev, dev);
+	struct ohci_hcd	*ohci = 
+		container_of (pci_get_drvdata (pdev), struct ohci_hcd,
hcd);
+
+	return ohci;
+}
+
+/*---------------------------------------------------------------------
----*/
+
 static int __devinit
 ohci_pci_start (struct usb_hcd *hcd)
 {
diff -Naurp -X ../dontdiff.txt
linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-sa1111.c
linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-sa1111.c
--- linux-2.5.44-rmk1-usb/drivers/usb/host/ohci-sa1111.c	Mon Oct
28 15:44:30 2002
+++ linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci-sa1111.c	Mon Oct
28 15:35:23 2002
@@ -27,6 +27,14 @@ extern int usb_disabled(void);
 
 
/*----------------------------------------------------------------------
---*/
 
+struct ohci_hcd *dev_to_ohci(struct device *dev) {
+	struct usb_hcd *hcd = dev->driver_data;
+
+	return hcd_to_ohci(hcd);
+}
+
+/*---------------------------------------------------------------------
----*/
+
 static void sa1111_start_hc(struct sa1111_dev *dev)
 {
 	unsigned int usb_rst = 0;
diff -Naurp -X ../dontdiff.txt
linux-2.5.44-rmk1-usb/drivers/usb/host/ohci.h
linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci.h
--- linux-2.5.44-rmk1-usb/drivers/usb/host/ohci.h	Fri Oct 18
21:02:35 2002
+++ linux-2.5.44-rmk1-ch1/drivers/usb/host/ohci.h	Mon Oct 28
15:15:49 2002
@@ -400,3 +400,4 @@ struct ohci_hcd {
 
 #define hcd_to_ohci(hcd_ptr) container_of(hcd_ptr, struct ohci_hcd,
hcd)
 
+struct ohci_hcd *dev_to_ohci(struct device *);






-------------------------------------------------------------------
Subscription options:
http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
FAQ/Etiquette:
http://www.arm.linux.org.uk/armlinux/mailinglists.php


-------------------------------------------------------------------
Subscription options: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel
FAQ/Etiquette:       http://www.arm.linux.org.uk/armlinux/mailinglists.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic