Date: Sat, 5 Jul 2008 20:52:35 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144747 for review Message-ID: <200807052052.m65KqZNt082531@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144747 Change 144747 by hselasky@hselasky_laptop001 on 2008/07/05 20:52:05 Improve autoinstall test and factor out re-enumerate code. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#8 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_msctest.c#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_msctest.h#2 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#7 edit .. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.h#4 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_generic.c#8 (text+ko) ==== @@ -880,11 +880,8 @@ static int ugen_re_enumerate(struct usb2_fifo *f) { - struct usb2_device *parent_hub; struct usb2_device *udev = f->udev; int error; - uint8_t old_addr; - uint8_t buf[8]; if (f->fifo_index >= 2) { /* control endpoint only */ @@ -893,46 +890,14 @@ if (suser(curthread)) { return (EPERM); } - old_addr = udev->address; - parent_hub = udev->parent_hub; - if (parent_hub == NULL) { - error = EINVAL; - goto done; - } - error = usb2_req_reset_port(parent_hub, &Giant, udev->port_no); - if (error) { - error = ENXIO; - goto done; - } - /* - * After that the port has been reset our device should be at - * address zero: - */ - udev->address = USB_START_ADDR; + mtx_lock(f->priv_mtx); + error = usb2_req_re_enumerate(udev, f->priv_mtx); + mtx_unlock(f->priv_mtx); - /* - * It should be allowed to read some descriptors from address - * zero: - */ - error = usb2_req_get_desc(udev, &Giant, buf, - 8, 8, 0, UDESC_DEVICE, 0, 0); if (error) { - error = ENXIO; - goto done; + return (ENXIO); } - /* - * Restore device address: - */ - error = usb2_req_set_address(udev, &Giant, old_addr); - if (error) { - error = ENXIO; - goto done; - } -done: - /* restore address */ - udev->address = old_addr; - - return (error); + return (0); } static int ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_msctest.c#2 (text+ko) ==== @@ -197,6 +197,23 @@ static void bbb_done(struct bbb_transfer *sc, uint8_t error) { + struct usb2_xfer *xfer; + + xfer = sc->xfer[sc->state]; + + /* verify the error code */ + + if (error) { + switch (USB_GET_STATE(xfer)) { + case USB_ST_SETUP: + case USB_ST_TRANSFERRED: + error = 1; + break; + default: + error = 2; + break; + } + } sc->error = error; sc->state = ST_COMMAND; sc->status_try = 1; @@ -448,53 +465,6 @@ return (sc->error); } -usb2_error_t -usb2_reset_device(struct usb2_device *udev, struct mtx *mtx) -{ - struct usb2_device *parent_hub; - usb2_error_t err; - uint8_t old_addr; - - old_addr = udev->address; - parent_hub = udev->parent_hub; - if (parent_hub == NULL) { - err = USB_ERR_INVAL; - goto done; - } - err = usb2_req_reset_port(parent_hub, mtx, udev->port_no); - if (err) { - goto done; - } - /* - * After that the port has been reset our device should be at - * address zero: - */ - udev->address = USB_START_ADDR; - - /* - * Restore device address: - */ - err = usb2_req_set_address(udev, mtx, old_addr); - if (err) { - /* XXX ignore any errors! */ - err = 0; - } - /* allow device time to set new address */ - usb2_pause_mtx(mtx, USB_SET_ADDRESS_SETTLE); - -done: - /* restore address */ - udev->address = old_addr; - - if (err == 0) { - /* restore configuration */ - err = usb2_req_set_config(udev, mtx, udev->curr_config_no); - /* wait a little bit, just in case */ - usb2_pause_mtx(mtx, 10); - } - return (err); -} - /*------------------------------------------------------------------------* * usb2_test_autoinstall * @@ -586,9 +556,6 @@ goto done; done: - if (mtx_owned(&(sc->mtx))) { - usb2_reset_device(udev, &(sc->mtx)); - } mtx_unlock(&(sc->mtx)); usb2_transfer_unsetup(sc->xfer, ST_MAX); mtx_destroy(&(sc->mtx)); ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_msctest.h#2 (text+ko) ==== @@ -26,7 +26,6 @@ #ifndef _USB2_MSCTEST_H_ #define _USB2_MSCTEST_H_ -usb2_error_t usb2_reset_device(struct usb2_device *udev, struct mtx *mtx); usb2_error_t usb2_test_autoinstall(struct usb2_device *udev, uint8_t iface_index); #endif /* _USB2_MSCTEST_H_ */ ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#7 (text+ko) ==== @@ -1264,3 +1264,68 @@ USETW(req.wLength, 1); return (usb2_do_request(udev, mtx, &req, pconf)); } + +/*------------------------------------------------------------------------* + * usb2_req_re_enumerate + * + * Returns: + * 0: Success + * Else: Failure + *------------------------------------------------------------------------*/ +usb2_error_t +usb2_req_re_enumerate(struct usb2_device *udev, struct mtx *mtx) +{ + struct usb2_device_descriptor ddesc; + struct usb2_device *parent_hub; + usb2_error_t err; + uint8_t old_addr; + + old_addr = udev->address; + parent_hub = udev->parent_hub; + if (parent_hub == NULL) { + err = USB_ERR_INVAL; + goto done; + } + err = usb2_req_reset_port(parent_hub, mtx, udev->port_no); + if (err) { + DPRINTF(-1, "addr=%d, port reset failed\n", old_addr); + goto done; + } + /* + * After that the port has been reset our device should be at + * address zero: + */ + udev->address = USB_START_ADDR; + + /* + * Restore device address: + */ + err = usb2_req_set_address(udev, mtx, old_addr); + if (err) { + /* XXX ignore any errors! */ + DPRINTF(-1, "addr=%d, set address failed\n", + old_addr); + err = 0; + } + /* allow device time to set new address */ + usb2_pause_mtx(mtx, USB_SET_ADDRESS_SETTLE); + + /* get the device descriptor */ + err = usb2_req_get_device_desc(udev, mtx, &ddesc); + if (err) { + DPRINTF(-1, "addr=%d, getting device " + "descriptor failed!\n", old_addr); + goto done; + } +done: + /* restore address */ + udev->address = old_addr; + + if (err == 0) { + /* restore configuration */ + err = usb2_req_set_config(udev, mtx, udev->curr_config_no); + /* wait a little bit, just in case */ + usb2_pause_mtx(mtx, 10); + } + return (err); +} ==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.h#4 (text+ko) ==== @@ -52,6 +52,7 @@ usb2_error_t usb2_req_set_port_feature(struct usb2_device *udev, struct mtx *mtx, uint8_t port, uint16_t sel); usb2_error_t usb2_req_set_protocol(struct usb2_device *udev, struct mtx *mtx, uint8_t iface_index, uint16_t report); usb2_error_t usb2_req_set_report(struct usb2_device *udev, struct mtx *mtx, void *data, uint16_t len, uint8_t iface_index, uint8_t type, uint8_t id); +usb2_error_t usb2_req_re_enumerate(struct usb2_device *udev, struct mtx *mtx); #define usb2_do_request(u,m,r,d) \ usb2_do_request_flags(u,m,r,d,0,NULL,USB_DEFAULT_TIMEOUT)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807052052.m65KqZNt082531>