Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/usb Don't try to access a device that is being disco...
details: https://anonhg.NetBSD.org/src/rev/925006894ecd
branches: trunk
changeset: 500520:925006894ecd
user: augustss <augustss%NetBSD.org@localhost>
date: Wed Dec 13 04:05:14 2000 +0000
description:
Don't try to access a device that is being disconnected when generating
the detach event. Fixes (I hope) PR 11713 from itohy%netbsd.org@localhost (ITOH Yasufumi).
diffstat:
sys/dev/usb/ugen.c | 4 ++--
sys/dev/usb/usb.c | 6 +++---
sys/dev/usb/usb.h | 3 ++-
sys/dev/usb/usb_subr.c | 23 +++++++++++++++--------
sys/dev/usb/usbdi.h | 4 ++--
sys/dev/usb/usbdivar.h | 3 +--
6 files changed, 25 insertions(+), 18 deletions(-)
diffs (169 lines):
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/ugen.c
--- a/sys/dev/usb/ugen.c Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/ugen.c Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ugen.c,v 1.44 2000/11/26 21:05:02 augustss Exp $ */
+/* $NetBSD: ugen.c,v 1.45 2000/12/13 04:05:14 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/ugen.c,v 1.26 1999/11/17 22:33:41 n_hibma Exp $ */
/*
@@ -1223,7 +1223,7 @@
}
case USB_GET_DEVICEINFO:
usbd_fill_deviceinfo(sc->sc_udev,
- (struct usb_device_info *)addr);
+ (struct usb_device_info *)addr, 1);
break;
default:
return (EINVAL);
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/usb.c
--- a/sys/dev/usb/usb.c Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/usb.c Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: usb.c,v 1.47 2000/08/24 14:12:34 augustss Exp $ */
+/* $NetBSD: usb.c,v 1.48 2000/12/13 04:05:14 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb.c,v 1.20 1999/11/17 22:33:46 n_hibma Exp $ */
/*
@@ -498,7 +498,7 @@
dev = sc->sc_bus->devices[addr];
if (dev == NULL)
return (ENXIO);
- usbd_fill_deviceinfo(dev, di);
+ usbd_fill_deviceinfo(dev, di, 1);
break;
}
@@ -620,7 +620,7 @@
{
struct usb_event ue;
- usbd_fill_deviceinfo(udev, &ue.u.ue_device);
+ usbd_fill_deviceinfo(udev, &ue.u.ue_device, USB_EVENT_IS_ATTACH(type));
usb_add_event(type, &ue);
}
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/usb.h
--- a/sys/dev/usb/usb.h Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/usb.h Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: usb.h,v 1.50 2000/06/01 15:43:32 augustss Exp $ */
+/* $NetBSD: usb.h,v 1.51 2000/12/13 04:05:14 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb.h,v 1.14 1999/11/17 22:33:46 n_hibma Exp $ */
/*
@@ -560,6 +560,7 @@
#define USB_EVENT_DEVICE_DETACH 4
#define USB_EVENT_DRIVER_ATTACH 5
#define USB_EVENT_DRIVER_DETACH 6
+#define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH)
struct timespec ue_time;
union {
struct {
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/usb_subr.c
--- a/sys/dev/usb/usb_subr.c Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/usb_subr.c Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: usb_subr.c,v 1.81 2000/10/24 15:01:26 augustss Exp $ */
+/* $NetBSD: usb_subr.c,v 1.82 2000/12/13 04:05:14 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
/*
@@ -75,7 +75,8 @@
#define DPRINTFN(n,x)
#endif
-Static usbd_status usbd_set_config(usbd_device_handle, int);
+Static usbd_status usbd_set_config(usbd_device_handle, int);
+Static void usbd_devinfo_vp(usbd_device_handle, char *, char *, int);
Static char *usbd_get_string(usbd_device_handle, int, char *);
Static int usbd_getnewaddr(usbd_bus_handle bus);
#if defined(__NetBSD__)
@@ -209,7 +210,7 @@
}
void
-usbd_devinfo_vp(usbd_device_handle dev, char *v, char *p)
+usbd_devinfo_vp(usbd_device_handle dev, char *v, char *p, int usedev)
{
usb_device_descriptor_t *udd = &dev->ddesc;
char *vendor = 0, *product = 0;
@@ -222,8 +223,13 @@
return;
}
- vendor = usbd_get_string(dev, udd->iManufacturer, v);
- product = usbd_get_string(dev, udd->iProduct, p);
+ if (usedev) {
+ vendor = usbd_get_string(dev, udd->iManufacturer, v);
+ product = usbd_get_string(dev, udd->iProduct, p);
+ } else {
+ vendor = NULL;
+ product = NULL;
+ }
#ifdef USBVERBOSE
if (vendor == NULL || product == NULL) {
for(kdp = usb_knowndevs;
@@ -267,7 +273,7 @@
char product[USB_MAX_STRING_LEN];
int bcdDevice, bcdUSB;
- usbd_devinfo_vp(dev, vendor, product);
+ usbd_devinfo_vp(dev, vendor, product, 1);
cp += sprintf(cp, "%s %s", vendor, product);
if (showclass)
cp += sprintf(cp, ", class %d/%d",
@@ -1148,7 +1154,8 @@
#endif
void
-usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di)
+usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di,
+ int usedev)
{
struct usbd_port *p;
int i, err, s;
@@ -1156,7 +1163,7 @@
di->bus = USBDEVUNIT(dev->bus->bdev);
di->addr = dev->address;
di->cookie = dev->cookie;
- usbd_devinfo_vp(dev, di->vendor, di->product);
+ usbd_devinfo_vp(dev, di->vendor, di->product, usedev);
usbd_printBCD(di->release, UGETW(dev->ddesc.bcdDevice));
di->vendorNo = UGETW(dev->ddesc.idVendor);
di->productNo = UGETW(dev->ddesc.idProduct);
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/usbdi.h
--- a/sys/dev/usb/usbdi.h Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/usbdi.h Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdi.h,v 1.44 2000/09/23 21:02:04 augustss Exp $ */
+/* $NetBSD: usbdi.h,v 1.45 2000/12/13 04:05:15 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $ */
/*
@@ -152,7 +152,7 @@
usbd_status usbd_set_interface(usbd_interface_handle, int);
int usbd_get_no_alts(usb_config_descriptor_t *, int);
usbd_status usbd_get_interface(usbd_interface_handle iface, u_int8_t *aiface);
-void usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di);
+void usbd_fill_deviceinfo(usbd_device_handle dev, struct usb_device_info *di, int);
int usbd_get_interface_altindex(usbd_interface_handle iface);
usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd,
diff -r 7b5fdab10932 -r 925006894ecd sys/dev/usb/usbdivar.h
--- a/sys/dev/usb/usbdivar.h Wed Dec 13 03:49:56 2000 +0000
+++ b/sys/dev/usb/usbdivar.h Wed Dec 13 04:05:14 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdivar.h,v 1.58 2000/06/24 04:12:53 thorpej Exp $ */
+/* $NetBSD: usbdivar.h,v 1.59 2000/12/13 04:05:15 augustss Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $ */
/*
@@ -219,7 +219,6 @@
/* Routines from usb_subr.c */
int usbctlprint(void *, const char *);
void usb_delay_ms(usbd_bus_handle, u_int);
-void usbd_devinfo_vp(usbd_device_handle, char *, char *);
usbd_status usbd_reset_port(usbd_device_handle dev,
int port, usb_port_status_t *ps);
usbd_status usbd_setup_pipe(usbd_device_handle dev,
Home |
Main Index |
Thread Index |
Old Index