NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/38528 (panic on unplugging Apple USB keyboard)
Christoph_Egger%gmx.de@localhost said:
> db{1}> bt
> uhidev_childdet() at netbsd:uhidev_childdet+0x32
> config_detach() at netbsd:config_detach+0x1de
This is a different bug, a new one. Can you try the appended patch?
best regards
Matthias
-------------------------------------------------------------------
-------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich
Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzende des Aufsichtsrats: MinDir'in Baerbel Brumme-Bothe
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr. Harald Bolt,
Dr. Sebastian M. Schmidt
-------------------------------------------------------------------
-------------------------------------------------------------------
#
# old_revision [bdb4e55c6bf540d7f3dea8012f0ea2b929c2e69b]
#
# patch "sys/dev/usb/uhidev.c"
# from [f79d1c3609a5e0b85227db74ee82e45cab36bf8a]
# to [6cb6f4302877f3032082964a88c8881fb7ab138e]
#
# patch "sys/dev/usb/uhidev.h"
# from [f34395cbd85e729f736a8288b1d9622082443c55]
# to [8badca5b78c7b292fc1923c22ede3e6d17dd95dc]
#
============================================================
--- sys/dev/usb/uhidev.c f79d1c3609a5e0b85227db74ee82e45cab36bf8a
+++ sys/dev/usb/uhidev.c 6cb6f4302877f3032082964a88c8881fb7ab138e
@@ -103,7 +103,8 @@ USB_ATTACH(uhidev)
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
struct uhidev_attach_arg uha;
- struct uhidev *dev;
+ device_t dev;
+ struct uhidev *csc;
int size, nrepid, repid, repsz;
int *repsizes;
int i;
@@ -290,16 +291,17 @@ nomem:
uha.reportid = repid;
locs[UHIDBUSCF_REPORTID] = repid;
- dev = device_private(config_found_sm_loc(self,
+ dev = config_found_sm_loc(self,
"uhidbus", locs, &uha,
- uhidevprint, config_stdsubmatch));
+ uhidevprint, config_stdsubmatch);
sc->sc_subdevs[repid] = dev;
if (dev != NULL) {
- dev->sc_in_rep_size = repsizes[repid];
+ csc = device_private(dev);
+ csc->sc_in_rep_size = repsizes[repid];
#ifdef DIAGNOSTIC
DPRINTF(("uhidev_match: repid=%d dev=%p\n",
repid, dev));
- if (dev->sc_intr == NULL) {
+ if (csc->sc_intr == NULL) {
free(repsizes, M_TEMP);
aprint_error_dev(self,
"sc_intr == NULL\n");
@@ -307,8 +309,8 @@ nomem:
}
#endif
#if NRND > 0
- rnd_attach_source(&dev->rnd_source,
- USBDEVNAME(dev->sc_dev),
+ rnd_attach_source(&csc->rnd_source,
+ USBDEVNAME(dev),
RND_TYPE_TTY, 0);
#endif
}
@@ -362,7 +364,7 @@ uhidev_activate(device_t self, enum deva
for (i = 0; i < sc->sc_nrepid; i++)
if (sc->sc_subdevs[i] != NULL)
rv |= config_deactivate(
- sc->sc_subdevs[i]->sc_dev);
+ sc->sc_subdevs[i]);
sc->sc_dying = 1;
break;
default:
@@ -379,7 +381,7 @@ uhidev_childdet(device_t self, device_t
struct uhidev_softc *sc = device_private(self);
for (i = 0; i < sc->sc_nrepid; i++) {
- if (sc->sc_subdevs[i]->sc_dev == child)
+ if (sc->sc_subdevs[i] == child)
break;
}
KASSERT(i < sc->sc_nrepid);
@@ -390,6 +392,9 @@ USB_DETACH(uhidev)
{
USB_DETACH_START(uhidev, sc);
int i, rv;
+#if NRND > 0
+ struct uhidev *csc;
+#endif
DPRINTF(("uhidev_detach: sc=%p flags=%d\n", sc, flags));
@@ -404,9 +409,10 @@ USB_DETACH(uhidev)
for (i = 0; i < sc->sc_nrepid; i++) {
if (sc->sc_subdevs[i] != NULL) {
#if NRND > 0
- rnd_detach_source(&sc->sc_subdevs[i]->rnd_source);
+ csc = device_private(sc->sc_subdevs[i]);
+ rnd_detach_source(&csc->rnd_source);
#endif
- rv |= config_detach(sc->sc_subdevs[i]->sc_dev, flags);
+ rv |= config_detach(sc->sc_subdevs[i], flags);
}
}
@@ -422,6 +428,7 @@ uhidev_intr(usbd_xfer_handle xfer, usbd_
uhidev_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status
status)
{
struct uhidev_softc *sc = addr;
+ device_t cdev;
struct uhidev *scd;
u_char *p;
u_int rep;
@@ -460,10 +467,13 @@ uhidev_intr(usbd_xfer_handle xfer, usbd_
printf("uhidev_intr: bad repid %d\n", rep);
return;
}
- scd = sc->sc_subdevs[rep];
+ cdev = sc->sc_subdevs[rep];
+ if (!cdev)
+ return;
+ scd = device_private(cdev);
DPRINTFN(5,("uhidev_intr: rep=%d, scd=%p state=0x%x\n",
rep, scd, scd ? scd->sc_state : 0));
- if (scd == NULL || !(scd->sc_state & UHIDEV_OPEN))
+ if (!(scd->sc_state & UHIDEV_OPEN))
return;
if (scd->sc_in_rep_size != cc) {
printf("%s: bad input length %d != %d\n",
============================================================
--- sys/dev/usb/uhidev.h f34395cbd85e729f736a8288b1d9622082443c55
+++ sys/dev/usb/uhidev.h 8badca5b78c7b292fc1923c22ede3e6d17dd95dc
@@ -53,7 +53,7 @@ struct uhidev_softc {
int sc_repdesc_size;
u_int sc_nrepid;
- struct uhidev **sc_subdevs;
+ device_t *sc_subdevs;
int sc_refcnt;
u_char sc_dying;
Home |
Main Index |
Thread Index |
Old Index