svn commit: r190251 - stable/7/sys/dev/usb
Nick Hibma
n_hibma at FreeBSD.org
Sat Mar 21 23:37:16 PDT 2009
Author: n_hibma
Date: Sun Mar 22 06:37:14 2009
New Revision: 190251
URL: http://svn.freebsd.org/changeset/base/190251
Log:
MFC 184941:
Add a reset device command to ugen.c.
This is needed to make some devices work that require a
firmware upload and a USB reset afterwards.
Modified:
stable/7/sys/dev/usb/ugen.c
stable/7/sys/dev/usb/usb.h
stable/7/sys/dev/usb/usb_subr.c
stable/7/sys/dev/usb/usbdi.c
stable/7/sys/dev/usb/usbdi.h
Modified: stable/7/sys/dev/usb/ugen.c
==============================================================================
--- stable/7/sys/dev/usb/ugen.c Sun Mar 22 06:31:59 2009 (r190250)
+++ stable/7/sys/dev/usb/ugen.c Sun Mar 22 06:37:14 2009 (r190251)
@@ -1059,8 +1059,8 @@ ugen_isoc_rintr(usbd_xfer_handle xfer, u
sce->cur += count;
if(sce->cur >= sce->limit)
sce->cur = sce->ibuf + (sce->limit - sce->cur);
- DPRINTFN(5, ("ugen_isoc_rintr: throwing away %d bytes\n",
- count));
+ DPRINTF(("ugen_isoc_rintr: throwing away %d bytes\n",
+ count));
}
isize = UGETW(sce->edesc->wMaxPacketSize);
@@ -1427,7 +1427,6 @@ ugen_do_ioctl(struct ugen_softc *sc, int
struct iovec iov;
struct uio uio;
void *ptr = 0;
- usbd_status err;
int error = 0;
if (!(flag & FWRITE))
@@ -1485,6 +1484,11 @@ ugen_do_ioctl(struct ugen_softc *sc, int
usbd_fill_deviceinfo(sc->sc_udev,
(struct usb_device_info *)addr, 1);
break;
+ case USB_RESET_DEVICE:
+ err = usbd_reset_device(sc->sc_udev);
+ if (err)
+ return EIO;
+ break;
default:
return (EINVAL);
}
Modified: stable/7/sys/dev/usb/usb.h
==============================================================================
--- stable/7/sys/dev/usb/usb.h Sun Mar 22 06:31:59 2009 (r190250)
+++ stable/7/sys/dev/usb/usb.h Sun Mar 22 06:37:14 2009 (r190251)
@@ -697,6 +697,7 @@ struct usb_event {
#define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info)
#define USB_SET_SHORT_XFER _IOW ('U', 113, int)
#define USB_SET_TIMEOUT _IOW ('U', 114, int)
+#define USB_RESET_DEVICE _IO ('U', 115)
/* Modem device */
#define USB_GET_CM_OVER_DATA _IOR ('U', 130, int)
Modified: stable/7/sys/dev/usb/usb_subr.c
==============================================================================
--- stable/7/sys/dev/usb/usb_subr.c Sun Mar 22 06:31:59 2009 (r190250)
+++ stable/7/sys/dev/usb/usb_subr.c Sun Mar 22 06:37:14 2009 (r190251)
@@ -322,16 +322,10 @@ usbd_delay_ms(usbd_device_handle dev, u_
usbd_status
usbd_reset_port(usbd_device_handle dev, int port, usb_port_status_t *ps)
{
- usb_device_request_t req;
usbd_status err;
int n;
- req.bmRequestType = UT_WRITE_CLASS_OTHER;
- req.bRequest = UR_SET_FEATURE;
- USETW(req.wValue, UHF_PORT_RESET);
- USETW(req.wIndex, port);
- USETW(req.wLength, 0);
- err = usbd_do_request(dev, &req, 0);
+ err = usbd_set_port_feature(dev, port, UHF_PORT_RESET);
DPRINTFN(1,("usbd_reset_port: port %d reset done, error=%s\n",
port, usbd_errstr(err)));
if (err)
@@ -685,11 +679,11 @@ usbd_set_config_index(usbd_device_handle
DPRINTF(("power exceeded %d %d\n", power,dev->powersrc->power));
/* XXX print nicer message. */
if (msg)
- printf("%s: device addr %d (config %d) exceeds power "
- "budget, %d mA > %d mA\n",
- device_get_nameunit(dev->bus->bdev), dev->address,
- cdp->bConfigurationValue,
- power, dev->powersrc->power);
+ device_printf(dev->bus->bdev,
+ "device addr %d (config %d) exceeds "
+ "power budget, %d mA > %d mA\n",
+ dev->address, cdp->bConfigurationValue,
+ power, dev->powersrc->power);
err = USBD_NO_POWER;
goto bad;
}
@@ -1023,8 +1017,7 @@ usbd_new_device(device_t parent, usbd_bu
bus, port, depth, speed));
addr = usbd_getnewaddr(bus);
if (addr < 0) {
- printf("%s: No free USB addresses, new device ignored.\n",
- device_get_nameunit(bus->bdev));
+ device_printf(bus->bdev, "No free USB addresses\n");
return (USBD_NO_ADDR);
}
@@ -1370,11 +1363,14 @@ usb_disconnect_port(struct usbd_port *up
if (dev->subdevs != NULL) {
DPRINTFN(3,("usb_disconnect_port: disconnect subdevs\n"));
for (i = 0; dev->subdevs[i]; i++) {
- printf("%s: at %s", device_get_nameunit(dev->subdevs[i]),
- hubname);
- if (up->portno != 0)
- printf(" port %d", up->portno);
- printf(" (addr %d) disconnected\n", dev->address);
+ if (!device_is_quiet(dev->subdevs[i])) {
+ device_printf(dev->subdevs[i],
+ "at %s", hubname);
+ if (up->portno != 0)
+ printf(" port %d", up->portno);
+ printf(" (addr %d) disconnected\n", dev->address);
+ }
+
struct usb_attach_arg *uaap =
device_get_ivars(dev->subdevs[i]);
device_detach(dev->subdevs[i]);
Modified: stable/7/sys/dev/usb/usbdi.c
==============================================================================
--- stable/7/sys/dev/usb/usbdi.c Sun Mar 22 06:31:59 2009 (r190250)
+++ stable/7/sys/dev/usb/usbdi.c Sun Mar 22 06:37:14 2009 (r190251)
@@ -1230,6 +1230,15 @@ usbd_set_polling(usbd_device_handle dev,
dev->bus->methods->soft_intr(dev->bus);
}
+usbd_status
+usbd_reset_device(usbd_device_handle dev)
+{
+ usbd_device_handle parent = dev->myhub;
+ struct usbd_port *up = dev->powersrc;
+
+ return usbd_reset_port(parent, up->portno, &up->status);
+}
+
usb_endpoint_descriptor_t *
usbd_get_endpoint_descriptor(usbd_interface_handle iface, u_int8_t address)
Modified: stable/7/sys/dev/usb/usbdi.h
==============================================================================
--- stable/7/sys/dev/usb/usbdi.h Sun Mar 22 06:31:59 2009 (r190250)
+++ stable/7/sys/dev/usb/usbdi.h Sun Mar 22 06:37:14 2009 (r190251)
@@ -158,6 +158,7 @@ usb_endpoint_descriptor_t *usbd_find_ede
void usbd_dopoll(usbd_interface_handle);
void usbd_set_polling(usbd_device_handle, int);
+usbd_status usbd_reset_device(usbd_device_handle);
const char *usbd_errstr(usbd_status);
More information about the svn-src-stable
mailing list