PERFORCE change 130744 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Dec 12 14:40:21 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=130744
Change 130744 by hselasky at hselasky_laptop001 on 2007/12/12 22:39:22
Refactor "usbreq_reset_port" a little bit.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_requests.c#12 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_requests.c#12 (text+ko) ====
@@ -54,62 +54,50 @@
* usbreq_reset_port
*------------------------------------------------------------------------*/
usbd_status_t
-usbreq_reset_port(struct usbd_device *udev, struct mtx *mtx,
- usb_port_status_t *ps, uint8_t port)
+usbreq_reset_port(struct usbd_device *udev, struct mtx *mtx, uint8_t port)
{
- usb_device_request_t req;
+ usb_port_status_t ps;
usbd_status_t err;
uint8_t n;
- req.bmRequestType = UT_WRITE_CLASS_OTHER;
- req.bRequest = UR_SET_FEATURE;
- USETW(req.wValue, UHF_PORT_RESET);
- req.wIndex[0] = port;
- req.wIndex[1] = 0;
- USETW(req.wLength, 0);
- err = usbd_do_request(udev, mtx, &req, 0);
-
- PRINTFN(1, ("port %d reset done, error=%s\n",
- port, usbd_errstr(err)));
-
+ err = usbreq_set_port_feature(udev, mtx, port, UHF_PORT_RESET);
if (err) {
goto done;
}
- n = 12;
- do {
- /* wait for device to recover from reset */
+ for (n = 12; n != 0; n--) {
+
+ /* wait for the device to recover from reset */
usbd_pause_mtx(mtx, USB_PORT_RESET_DELAY);
- err = usbreq_get_port_status(udev, mtx, ps, port);
-
+ err = usbreq_get_port_status(udev, mtx, &ps, port);
if (err) {
- PRINTF(("get status failed %d\n",
- err));
goto done;
}
/* if the device disappeared, just give up */
- if (!(UGETW(ps->wPortStatus) & UPS_CURRENT_CONNECT_STATUS)) {
- err = USBD_NORMAL_COMPLETION;
+ if (!(UGETW(ps.wPortStatus) & UPS_CURRENT_CONNECT_STATUS)) {
goto done;
}
- if (n == 0) {
- err = USBD_TIMEOUT;
- goto done;
- } else {
- n--;
+ /* check if reset is complete */
+ if (UGETW(ps.wPortChange) & UPS_C_PORT_RESET) {
+ break;
}
- } while ((UGETW(ps->wPortChange) & UPS_C_PORT_RESET) == 0);
+ }
- err = usbreq_clear_port_feature(udev, mtx, port, UHF_C_PORT_RESET);
-#ifdef USB_DEBUG
+ /* clear port reset first */
+ err = usbreq_clear_port_feature(
+ udev, mtx, port, UHF_C_PORT_RESET);
if (err) {
- PRINTF(("clear port feature failed %d\n",
- err));
+ goto done;
+ }
+ /* check for timeout */
+ if (n == 0) {
+ err = USBD_TIMEOUT;
+ goto done;
}
-#endif
-
/* wait for the device to recover from reset */
usbd_pause_mtx(mtx, USB_PORT_RESET_RECOVERY);
done:
+ PRINTFN(1, ("port %d reset returning error=%s\n",
+ port, usbd_errstr(err)));
return (err);
}
@@ -217,7 +205,7 @@
/* this is the language table */
return (USBD_INVAL);
}
- if (udev->no_strings) {
+ if (udev->flags.no_strings) {
return (USBD_STALLED);
}
swap = (udev->quirks->uq_flags & UQ_SWAP_UNICODE) ? 1 : 0;
More information about the p4-projects
mailing list