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