# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.369.105.15 -> 1.369.105.16
# drivers/usb/host/ohci-hcd.c 1.9 -> 1.10
# drivers/usb/host/ohci-hub.c 1.4 -> 1.5
# drivers/usb/host/usb-ohci.c 1.31 -> 1.32
# drivers/usb/host/ehci-dbg.c 1.2 -> 1.3
# drivers/usb/host/ehci-q.c 1.9 -> 1.10
# drivers/usb/host/ohci-dbg.c 1.4 -> 1.5
# drivers/usb/core/hcd.h 1.5 -> 1.6
# include/linux/usb.h 1.26 -> 1.27
# drivers/usb/host/ehci-hub.c 1.7 -> 1.8
# drivers/usb/host/usb-uhci.c 1.32 -> 1.33
# drivers/usb/core/hub.c 1.22 -> 1.23
# drivers/usb/core/usb.c 1.41 -> 1.42
# drivers/usb/core/hcd.c 1.15 -> 1.16
# drivers/usb/host/ehci-hcd.c 1.11 -> 1.12
# drivers/usb/host/uhci.c 1.39 -> 1.40
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/09 [EMAIL PROTECTED] 1.369.105.16
# [PATCH] USB physical paths id
#
# This provides something that gets discussed regularly: stable
# device IDs. Straightforward; most of it was already present:
#
# - Moves "bus_name" out of HCD framework into usb_bus.
# This accounts for _by far the bulk_ of this patch, since
# every use of that original field needed to change.
#
# - Make Vojtech's usb_make_path() use bus_name instead
# of unstable bus numbers ... and usb_device->devpath
# instead of recomputing that same info. Combine two
# stable IDs, and the result is still stable. And since both
# are precomputed, usb_make_path() turns into only an
# error check wrapped around snprintf() ... so I inlined it.
#
# - Minor tweak to usb_device->devpath construction. It
# still uses "/" for the root hub (better suggestions?) but
# Vojtech wanted "." for separators, so I changed that.
#
# - The older HCDs (uhci.c etc) initialize usb_bus.bus_name,
# as well as the sharable HCD framework
#
# - HCD framework no longer uses "bus" member.
#
# These IDs are currently exposed in "input" hotplugging, and
# my next patch addresses that for USB network devices.
# --------------------------------------------
#
diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/core/hcd.c Thu Apr 11 11:28:32 2002
@@ -310,7 +310,7 @@
// serial number
} else if (id == 1) {
- strcpy (buf, hcd->bus_name);
+ strcpy (buf, hcd->self.bus_name);
// product description
} else if (id == 2) {
@@ -406,7 +406,7 @@
case DeviceOutRequest | USB_REQ_SET_ADDRESS:
// wValue == urb->dev->devaddr
dbg ("%s root hub device address %d",
- hcd->bus_name, wValue);
+ hcd->self.bus_name, wValue);
break;
/* INTERFACE REQUESTS (no defined feature/status flags) */
@@ -520,7 +520,7 @@
&& rh_status_urb (hcd, urb) != 0) {
/* another driver snuck in? */
dbg ("%s, can't resubmit roothub status urb?",
- hcd->bus_name);
+ hcd->self.bus_name);
spin_unlock_irqrestore (&hcd_data_lock, flags);
BUG ();
}
@@ -1051,8 +1051,7 @@
usb_init_bus (&hcd->self);
hcd->self.op = &hcd_operations;
hcd->self.hcpriv = (void *) hcd;
- hcd->bus = &hcd->self;
- hcd->bus_name = dev->slot_name;
+ hcd->self.bus_name = dev->slot_name;
hcd->product_desc = dev->name;
INIT_LIST_HEAD (&hcd->dev_list);
@@ -1089,16 +1088,15 @@
hcd = pci_get_drvdata(dev);
if (!hcd)
return;
- info ("remove: %s, state %x", hcd->bus_name, hcd->state);
+ info ("remove: %s, state %x", hcd->self.bus_name, hcd->state);
if (in_interrupt ()) BUG ();
- hub = hcd->bus->root_hub;
+ hub = hcd->self.root_hub;
hcd->state = USB_STATE_QUIESCING;
- dbg ("%s: roothub graceful disconnect", hcd->bus_name);
+ dbg ("%s: roothub graceful disconnect", hcd->self.bus_name);
usb_disconnect (&hub);
- // usb_disconnect (&hcd->bus->root_hub);
hcd->driver->stop (hcd);
hcd->state = USB_STATE_HALT;
@@ -1113,10 +1111,9 @@
pci_resource_len (dev, hcd->region));
}
- usb_deregister_bus (hcd->bus);
+ usb_deregister_bus (&hcd->self);
if (atomic_read (&hcd->self.refcnt) != 1)
- err ("usb_hcd_pci_remove %s, count != 1", hcd->bus_name);
- hcd->bus = NULL;
+ err ("usb_hcd_pci_remove %s, count != 1", hcd->self.bus_name);
hcd->driver->hcd_free (hcd);
}
@@ -1164,7 +1161,7 @@
int retval;
hcd = pci_get_drvdata(dev);
- info ("suspend %s to state %d", hcd->bus_name, state);
+ info ("suspend %s to state %d", hcd->self.bus_name, state);
pci_save_state (dev, hcd->pci_state);
@@ -1193,12 +1190,12 @@
int retval;
hcd = pci_get_drvdata(dev);
- info ("resume %s", hcd->bus_name);
+ info ("resume %s", hcd->self.bus_name);
/* guard against multiple resumes (APM bug?) */
atomic_inc (&hcd->resume_count);
if (atomic_read (&hcd->resume_count) != 1) {
- err ("concurrent PCI resumes for %s", hcd->bus_name);
+ err ("concurrent PCI resumes for %s", hcd->self.bus_name);
retval = 0;
goto done;
}
@@ -1215,7 +1212,7 @@
retval = hcd->driver->resume (hcd);
if (!HCD_IS_RUNNING (hcd->state)) {
- dbg ("resume %s failure, retval %d", hcd->bus_name, retval);
+ dbg ("resume %s failure, retval %d", hcd->self.bus_name, retval);
hc_died (hcd);
// FIXME: recover, reset etc.
} else {
@@ -1290,7 +1287,7 @@
list_for_each (urblist, &dev->urb_list) {
urb = list_entry (urblist, struct urb, urb_list);
dbg ("shutdown %s urb %p pipe %x, current status %d",
- hcd->bus_name, urb, urb->pipe, urb->status);
+ hcd->self.bus_name, urb, urb->pipe, urb->status);
if (urb->status == -EINPROGRESS)
urb->status = -ESHUTDOWN;
}
@@ -1534,7 +1531,7 @@
* since we report some queuing/setup errors ourselves
*/
urb = usb_get_urb (urb);
- if (urb->dev == hcd->bus->root_hub)
+ if (urb->dev == hcd->self.root_hub)
status = rh_urb_enqueue (hcd, urb);
else
status = hcd->driver->urb_enqueue (hcd, urb, mem_flags);
@@ -1686,7 +1683,7 @@
&& HCD_IS_RUNNING (hcd->state)
&& !retval) {
dbg ("%s: wait for giveback urb %p",
- hcd->bus_name, urb);
+ hcd->self.bus_name, urb);
wait_for_completion (&splice.done);
} else if ((urb->transfer_flags & USB_ASYNC_UNLINK) && retval == 0) {
return -EINPROGRESS;
@@ -1698,7 +1695,7 @@
bye:
if (retval)
dbg ("%s: hcd_unlink_urb fail %d",
- hcd ? hcd->bus_name : "(no bus?)",
+ hcd ? hcd->self.bus_name : "(no bus?)",
retval);
return retval;
}
@@ -1731,7 +1728,7 @@
/* device driver problem with refcounts? */
if (!list_empty (&dev->urb_list)) {
dbg ("free busy dev, %s devnum %d (bug!)",
- hcd->bus_name, udev->devnum);
+ hcd->self.bus_name, udev->devnum);
return -EINVAL;
}
diff -Nru a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
--- a/drivers/usb/core/hcd.h Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/core/hcd.h Thu Apr 11 11:28:32 2002
@@ -35,10 +35,8 @@
/*
* housekeeping
*/
- struct usb_bus *bus; /* FIXME only use "self" */
struct usb_bus self; /* hcd is-a bus */
- const char *bus_name;
const char *product_desc; /* product/vendor string */
const char *description; /* "ehci-hcd" etc */
diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/core/hub.c Thu Apr 11 11:28:32 2002
@@ -765,23 +765,23 @@
* devices by location for diagnostics, tools, etc. The
* string is a path along hub ports, from the root. Each
* device's id will be stable until USB is re-cabled, and
- * hubs are often labled with these port numbers.
+ * hubs are often labeled with these port numbers.
*
- * Initial size: "/NN" times five hubs + NUL = 16 bytes max
+ * Initial size: ".NN" times five hubs + NUL = 16 bytes max
* (quite rare, since most hubs have 4-6 ports).
*/
pdev = dev->parent;
- if (pdev->devpath [1] != '\0') /* parent not root */
+ if (pdev->devpath [0] != '/') /* parent not root */
len = snprintf (dev->devpath, sizeof dev->devpath,
- "%s/%d", pdev->devpath, port + 1);
- else /* root == "/", root port 2 == "/2" */
+ "%s.%d", pdev->devpath, port + 1);
+ else /* root == "/", root port 2 == "2", port 3 that hub "/2.3" */
len = snprintf (dev->devpath, sizeof dev->devpath,
- "/%d", port + 1);
+ "%d", port + 1);
if (len == sizeof dev->devpath)
warn ("devpath size! usb/%03d/%03d path %s",
dev->bus->busnum, dev->devnum, dev->devpath);
- info("new USB device on bus %d path %s, assigned address %d",
- dev->bus->busnum, dev->devpath, dev->devnum);
+ info("new USB device %s-%s, assigned address %d",
+ dev->bus->bus_name, dev->devpath, dev->devnum);
/* put the device in the global device tree */
dev->dev.parent = &dev->parent->dev;
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/core/usb.c Thu Apr 11 11:28:32 2002
@@ -2407,56 +2407,6 @@
return err;
}
-/**
- * usb_make_path - returns device path in the hub tree
- * @dev: the device whose path is being constructed
- * @buf: where to put the string
- * @size: how big is "buf"?
- * Context: !in_interrupt ()
- *
- * Returns length of the string (>= 0) or out of memory status (< 0).
- *
- * NOTE: prefer to use use dev->devpath directly.
- */
-int usb_make_path(struct usb_device *dev, char *buf, size_t size)
-{
- struct usb_device *pdev = dev->parent;
- char *tmp;
- char *port;
- int i;
-
- if (!(port = kmalloc(size, GFP_KERNEL)))
- return -ENOMEM;
- if (!(tmp = kmalloc(size, GFP_KERNEL))) {
- kfree(port);
- return -ENOMEM;
- }
-
- *port = 0;
- while (pdev) {
- for (i = 0; i < pdev->maxchild; i++)
- if (pdev->children[i] == dev)
- break;
-
- if (pdev->children[i] != dev) {
- kfree(port);
- kfree(tmp);
- return -ENODEV;
- }
-
- strcpy(tmp, port);
- snprintf(port, size, strlen(port) ? "%d.%s" : "%d", i + 1, tmp);
-
- dev = pdev;
- pdev = dev->parent;
- }
-
- snprintf(buf, size, "usb%d:%s", dev->bus->busnum, port);
- kfree(port);
- kfree(tmp);
- return strlen(buf);
-}
-
/*
* By the time we get here, the device has gotten a new device ID
* and is in the default state. We need to identify the thing and
diff -Nru a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c
--- a/drivers/usb/host/ehci-dbg.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ehci-dbg.c Thu Apr 11 11:28:32 2002
@@ -55,7 +55,7 @@
strcat(buf, tmp);
}
dbg ("%s: %s portroute %s",
- ehci->hcd.bus_name, label,
+ ehci->hcd.self.bus_name, label,
buf);
}
}
diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
--- a/drivers/usb/host/ehci-hcd.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ehci-hcd.c Thu Apr 11 11:28:32 2002
@@ -248,7 +248,7 @@
ehci->tasklet.data = (unsigned long) ehci;
/* wire up the root hub */
- hcd->bus->root_hub = udev = usb_alloc_dev (NULL, hcd->bus);
+ hcd->self.root_hub = udev = usb_alloc_dev (NULL, &hcd->self);
if (!udev) {
done2:
ehci_mem_cleanup (ehci);
@@ -288,8 +288,7 @@
while (readl (&ehci->regs->status) & (STS_ASS | STS_PSS))
udelay (100);
ehci_reset (ehci);
- // usb_disconnect (udev);
- hcd->bus->root_hub = 0;
+ hcd->self.root_hub = 0;
usb_free_dev (udev);
retval = -ENODEV;
goto done2;
@@ -304,7 +303,7 @@
{
struct ehci_hcd *ehci = hcd_to_ehci (hcd);
- dbg ("%s: stop", hcd->bus_name);
+ dbg ("%s: stop", hcd->self.bus_name);
if (hcd->state == USB_STATE_RUNNING)
ehci_ready (ehci);
@@ -339,7 +338,7 @@
int ports;
int i;
- dbg ("%s: suspend to %d", hcd->bus_name, state);
+ dbg ("%s: suspend to %d", hcd->self.bus_name, state);
ports = HCS_N_PORTS (ehci->hcs_params);
@@ -356,7 +355,7 @@
if ((temp & PORT_PE) == 0
|| (temp & PORT_OWNER) != 0)
continue;
-dbg ("%s: suspend port %d", hcd->bus_name, i);
+dbg ("%s: suspend port %d", hcd->self.bus_name, i);
temp |= PORT_SUSPEND;
writel (temp, &ehci->regs->port_status [i]);
}
@@ -380,7 +379,7 @@
int ports;
int i;
- dbg ("%s: resume", hcd->bus_name);
+ dbg ("%s: resume", hcd->self.bus_name);
ports = HCS_N_PORTS (ehci->hcs_params);
@@ -400,7 +399,7 @@
if ((temp & PORT_PE) == 0
|| (temp & PORT_SUSPEND) != 0)
continue;
-dbg ("%s: resume port %d", hcd->bus_name, i);
+dbg ("%s: resume port %d", hcd->self.bus_name, i);
temp |= PORT_RESUME;
writel (temp, &ehci->regs->port_status [i]);
readl (&ehci->regs->command); /* unblock posted writes */
@@ -472,7 +471,7 @@
/* PCI errors [4.15.2.4] */
if (unlikely ((status & STS_FATAL) != 0)) {
- err ("%s: fatal error, state %x", hcd->bus_name, hcd->state);
+ err ("%s: fatal error, state %x", hcd->self.bus_name, hcd->state);
ehci_reset (ehci);
// generic layer kills/unlinks all urbs
// then tasklet cleans up the rest
@@ -547,7 +546,7 @@
unsigned long flags;
dbg ("%s urb_dequeue %p qh state %d",
- hcd->bus_name, urb, qh->qh_state);
+ hcd->self.bus_name, urb, qh->qh_state);
switch (usb_pipetype (urb->pipe)) {
case PIPE_CONTROL:
@@ -608,7 +607,7 @@
/* ASSERT: nobody can be submitting urbs for this any more */
- dbg ("%s: free_config devnum %d", hcd->bus_name, udev->devnum);
+ dbg ("%s: free_config devnum %d", hcd->self.bus_name, udev->devnum);
spin_lock_irqsave (&ehci->lock, flags);
for (i = 0; i < 32; i++) {
diff -Nru a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
--- a/drivers/usb/host/ehci-hub.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ehci-hub.c Thu Apr 11 11:28:32 2002
@@ -41,14 +41,14 @@
/* if reset finished and it's still not enabled -- handoff */
if (!(port_status & PORT_PE)) {
dbg ("%s port %d full speed, give to companion, 0x%x",
- ehci->hcd.bus_name, index + 1, port_status);
+ ehci->hcd.self.bus_name, index + 1, port_status);
// what happens if HCS_N_CC(params) == 0 ?
port_status |= PORT_OWNER;
writel (port_status, &ehci->regs->port_status [index]);
} else
- dbg ("%s port %d high speed", ehci->hcd.bus_name, index + 1);
+ dbg ("%s port %d high speed", ehci->hcd.self.bus_name, index + 1);
return port_status;
}
@@ -306,11 +306,11 @@
if ((temp & (PORT_PE|PORT_CONNECT)) == PORT_CONNECT
&& PORT_USB11 (temp)) {
dbg ("%s port %d low speed, give to companion",
- hcd->bus_name, wIndex + 1);
+ hcd->self.bus_name, wIndex + 1);
temp |= PORT_OWNER;
} else {
vdbg ("%s port %d reset",
- hcd->bus_name, wIndex + 1);
+ hcd->self.bus_name, wIndex + 1);
temp |= PORT_RESET;
temp &= ~PORT_PE;
diff -Nru a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
--- a/drivers/usb/host/ehci-q.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ehci-q.c Thu Apr 11 11:28:32 2002
@@ -733,7 +733,7 @@
epnum |= 0x10;
vdbg ("%s: submit_async urb %p len %d ep %d-%s qtd %p [qh %p]",
- ehci->hcd.bus_name, urb, urb->transfer_buffer_length,
+ ehci->hcd.self.bus_name, urb, urb->transfer_buffer_length,
epnum & 0x0f, (epnum & 0x10) ? "in" : "out",
qtd, dev ? dev->ep [epnum] : (void *)~0);
diff -Nru a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c
--- a/drivers/usb/host/ohci-dbg.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ohci-dbg.c Thu Apr 11 11:28:32 2002
@@ -89,7 +89,7 @@
continue;
printed = 1;
printk (KERN_DEBUG "%s, ohci %s frame %2d:",
- label, ohci->hcd.bus_name, i);
+ label, ohci->hcd.self.bus_name, i);
while (*ed_p != 0 && j--) {
struct ed *ed = dma_to_ed (ohci, le32_to_cpup(ed_p));
printk (" %p/%08x;", ed, ed->hwINFO);
@@ -99,7 +99,7 @@
}
if (!printed)
printk (KERN_DEBUG "%s, ohci %s, empty periodic schedule\n",
- label, ohci->hcd.bus_name);
+ label, ohci->hcd.self.bus_name);
}
#endif
@@ -229,7 +229,7 @@
static void ohci_dump (struct ohci_hcd *controller, int verbose)
{
- dbg ("OHCI controller %s state", controller->hcd.bus_name);
+ dbg ("OHCI controller %s state", controller->hcd.self.bus_name);
// dumps some of the state we know about
ohci_dump_status (controller);
diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ohci-hcd.c Thu Apr 11 11:28:32 2002
@@ -379,7 +379,7 @@
writel (OHCI_INTR_MIE, &ohci->regs->intrdisable);
dbg ("USB HC reset_hc %s: ctrl = 0x%x ;",
- ohci->hcd.bus_name,
+ ohci->hcd.self.bus_name,
readl (&ohci->regs->control));
/* Reset USB (needed by some controllers) */
@@ -449,7 +449,7 @@
mdelay ((roothub_a (ohci) >> 23) & 0x1fe);
/* connect the virtual root hub */
- ohci->hcd.bus->root_hub = udev = usb_alloc_dev (NULL, ohci->hcd.bus);
+ ohci->hcd.self.root_hub = udev = usb_alloc_dev (NULL, &ohci->hcd.self);
ohci->hcd.state = USB_STATE_READY;
if (!udev) {
ohci->disabled = 1;
@@ -491,7 +491,7 @@
if (ints & OHCI_INTR_UE) {
ohci->disabled++;
- err ("OHCI Unrecoverable Error, %s disabled", hcd->bus_name);
+ err ("OHCI Unrecoverable Error, %s disabled", hcd->self.bus_name);
// e.g. due to PCI Master/Target Abort
#ifdef DEBUG
@@ -530,7 +530,7 @@
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
dbg ("%s: stop %s controller%s",
- hcd->bus_name,
+ hcd->self.bus_name,
hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS),
ohci->disabled ? " (disabled)" : ""
);
@@ -571,7 +571,7 @@
&& hcd->pdev->device == 0x740c) {
ohci->flags = OHCI_QUIRK_AMD756;
info ("%s: AMD756 erratum 4 workaround",
- hcd->bus_name);
+ hcd->self.bus_name);
}
/* Apple's OHCI driver has a lot of bizarre workarounds
@@ -581,7 +581,7 @@
else if (hcd->pdev->vendor == 0x1045
&& hcd->pdev->device == 0xc861) {
info ("%s: WARNING: OPTi workarounds unavailable",
- hcd->bus_name);
+ hcd->self.bus_name);
}
}
#else
@@ -601,7 +601,7 @@
}
if (hc_start (ohci) < 0) {
- err ("can't start %s", ohci->hcd.bus_name);
+ err ("can't start %s", ohci->hcd.self.bus_name);
ohci_stop (hcd);
return -EBUSY;
}
@@ -623,13 +623,13 @@
u16 cmd;
if ((ohci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER) {
- dbg ("can't suspend %s (state is %s)", hcd->bus_name,
+ dbg ("can't suspend %s (state is %s)", hcd->self.bus_name,
hcfs2string (ohci->hc_control & OHCI_CTRL_HCFS));
return -EIO;
}
/* act as if usb suspend can always be used */
- dbg ("%s: suspend to %d", hcd->bus_name, state);
+ dbg ("%s: suspend to %d", hcd->self.bus_name, state);
ohci->sleeping = 1;
/* First stop processing */
@@ -664,16 +664,16 @@
switch (readl (&ohci->regs->control) & OHCI_CTRL_HCFS) {
case OHCI_USB_RESET:
- dbg ("%s suspend->reset ?", hcd->bus_name);
+ dbg ("%s suspend->reset ?", hcd->self.bus_name);
break;
case OHCI_USB_RESUME:
- dbg ("%s suspend->resume ?", hcd->bus_name);
+ dbg ("%s suspend->resume ?", hcd->self.bus_name);
break;
case OHCI_USB_OPER:
- dbg ("%s suspend->operational ?", hcd->bus_name);
+ dbg ("%s suspend->operational ?", hcd->self.bus_name);
break;
case OHCI_USB_SUSPEND:
- dbg ("%s suspended", hcd->bus_name);
+ dbg ("%s suspended", hcd->self.bus_name);
break;
}
@@ -711,8 +711,8 @@
ohci->disabled = 1;
ohci->sleeping = 0;
- if (ohci->hcd.bus->root_hub)
- usb_disconnect (&ohci->hcd.bus->root_hub);
+ if (ohci->hcd.self.root_hub)
+ usb_disconnect (&ohci->hcd.self.root_hub);
/* empty the interrupt branches */
for (i = 0; i < NUM_INTS; i++) ohci->ohci_int_load [i] = 0;
@@ -728,10 +728,10 @@
ohci->ed_bulktail = NULL;
if ((temp = hc_reset (ohci)) < 0 || (temp = hc_start (ohci)) < 0) {
- err ("can't restart %s, %d", ohci->hcd.bus_name, temp);
+ err ("can't restart %s, %d", ohci->hcd.self.bus_name, temp);
return temp;
} else
- dbg ("restart %s completed", ohci->hcd.bus_name);
+ dbg ("restart %s completed", ohci->hcd.self.bus_name);
return 0;
}
@@ -767,13 +767,13 @@
switch (temp) {
case OHCI_USB_RESET: // lost power
- info ("USB restart: %s", hcd->bus_name);
+ info ("USB restart: %s", hcd->self.bus_name);
retval = hc_restart (ohci);
break;
case OHCI_USB_SUSPEND: // host wakeup
case OHCI_USB_RESUME: // remote wakeup
- info ("USB continue: %s from %s wakeup", hcd->bus_name,
+ info ("USB continue: %s from %s wakeup", hcd->self.bus_name,
(temp == OHCI_USB_SUSPEND)
? "host" : "remote");
ohci->hc_control = OHCI_USB_RESUME;
@@ -786,7 +786,7 @@
temp = readl (&ohci->regs->control);
temp = ohci->hc_control & OHCI_CTRL_HCFS;
if (temp != OHCI_USB_RESUME) {
- err ("controller %s won't resume", hcd->bus_name);
+ err ("controller %s won't resume", hcd->self.bus_name);
ohci->disabled = 1;
retval = -EIO;
break;
@@ -836,7 +836,7 @@
break;
default:
- warn ("odd PCI resume for %s", hcd->bus_name);
+ warn ("odd PCI resume for %s", hcd->self.bus_name);
}
return retval;
}
diff -Nru a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
--- a/drivers/usb/host/ohci-hub.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/ohci-hub.c Thu Apr 11 11:28:32 2002
@@ -41,7 +41,7 @@
#define dbg_port(hc,label,num,value) \
dbg ("%s: %s roothub.portstatus [%d] " \
"= 0x%08x%s%s%s%s%s%s%s%s%s%s%s%s", \
- hc->hcd.bus_name, label, num, temp, \
+ hc->hcd.self.bus_name, label, num, temp, \
(temp & RH_PS_PRSC) ? " PRSC" : "", \
(temp & RH_PS_OCIC) ? " OCIC" : "", \
(temp & RH_PS_PSSC) ? " PSSC" : "", \
@@ -71,7 +71,7 @@
ports = roothub_a (ohci) & RH_A_NDP;
if (ports > MAX_ROOT_PORTS) {
- err ("%s: bogus NDP=%d", hcd->bus_name, ports);
+ err ("%s: bogus NDP=%d", hcd->self.bus_name, ports);
err ("rereads as NDP=%d",
readl (&ohci->regs->roothub.a) & RH_A_NDP);
/* retry later; "should not happen" */
diff -Nru a/drivers/usb/host/uhci.c b/drivers/usb/host/uhci.c
--- a/drivers/usb/host/uhci.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/uhci.c Thu Apr 11 11:28:32 2002
@@ -2799,6 +2799,7 @@
uhci->bus = bus;
bus->hcpriv = uhci;
+ bus->bus_name = dev->slot_name;
usb_register_bus(uhci->bus);
diff -Nru a/drivers/usb/host/usb-ohci.c b/drivers/usb/host/usb-ohci.c
--- a/drivers/usb/host/usb-ohci.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/usb-ohci.c Thu Apr 11 11:28:32 2002
@@ -2400,6 +2400,7 @@
return NULL;
}
ohci->bus->hcpriv = (void *) ohci;
+ ohci->bus->bus_name = dev->slot_name;
return ohci;
}
diff -Nru a/drivers/usb/host/usb-uhci.c b/drivers/usb/host/usb-uhci.c
--- a/drivers/usb/host/usb-uhci.c Thu Apr 11 11:28:32 2002
+++ b/drivers/usb/host/usb-uhci.c Thu Apr 11 11:28:32 2002
@@ -2977,6 +2977,7 @@
s->bus = bus;
bus->hcpriv = s;
+ bus->bus_name = dev->slot_name;
/* UHCI specs says devices must have 2 ports, but goes on to say */
/* they may have more but give no way to determine how many they */
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h Thu Apr 11 11:28:32 2002
+++ b/include/linux/usb.h Thu Apr 11 11:28:32 2002
@@ -890,7 +890,6 @@
char *buf, size_t size);
extern int usb_set_configuration(struct usb_device *dev, int configuration);
extern int usb_set_interface(struct usb_device *dev, int ifnum, int alternate);
-extern int usb_make_path(struct usb_device *dev, char *buf, size_t size);
/*
* timeouts, in seconds, used for sending/receiving control messages
@@ -917,6 +916,7 @@
*/
struct usb_bus {
int busnum; /* Bus number (in order of reg) */
+ char *bus_name; /* stable id (PCI slot_name etc) */
#ifdef DEVNUM_ROUND_ROBIN
int devnum_next; /* Next open device number in round-robin
allocation */
@@ -1086,6 +1086,37 @@
const struct usb_device_id *usb_match_id(struct usb_device *dev,
struct usb_interface *interface,
const struct usb_device_id *id);
+
+/**
+ * usb_make_path - returns stable device path in the usb tree
+ * @dev: the device whose path is being constructed
+ * @buf: where to put the string
+ * @size: how big is "buf"?
+ *
+ * Returns length of the string (> 0) or negative if size was too small.
+ *
+ * This identifier is intended to be "stable", reflecting physical paths in
+ * hardware such as physical bus addresses for host controllers or ports on
+ * USB hubs. That makes it stay the same until systems are physically
+ * reconfigured, by re-cabling a tree of USB devices or by moving USB host
+ * controllers. Adding and removing devices, including virtual root hubs
+ * in host controller driver modules, does not change these path identifers;
+ * neither does rebooting or re-enumerating. These are more useful identifiers
+ * than changeable ("unstable") ones like bus numbers or device addresses.
+ *
+ * With a partial exception for devices connected to USB 2.0 root hubs, these
+ * identifiers are also predictable: so long as the device tree isn't changed,
+ * plugging any USB device into a given hub port always gives it the same path.
+ * Because of the use of "companion" controllers, devices connected to ports on
+ * USB 2.0 root hubs (EHCI host controllers) will get one path ID if they are
+ * high speed, and a different one if they are full or low speed.
+ */
+static inline int usb_make_path (struct usb_device *dev, char *buf, size_t size)
+{
+ int actual;
+ actual = snprintf (buf, size, "usb-%s-%s", dev->bus->bus_name, dev->devpath);
+ return (actual >= size) ? -1 : actual;
+}
/* -------------------------------------------------------------------------- */
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel