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.
This commit is contained in:
parent
279d93aa23
commit
ab72d59941
@ -1059,8 +1059,8 @@ ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr,
|
|||||||
sce->cur += count;
|
sce->cur += count;
|
||||||
if(sce->cur >= sce->limit)
|
if(sce->cur >= sce->limit)
|
||||||
sce->cur = sce->ibuf + (sce->limit - sce->cur);
|
sce->cur = sce->ibuf + (sce->limit - sce->cur);
|
||||||
DPRINTFN(5, ("ugen_isoc_rintr: throwing away %d bytes\n",
|
DPRINTF(("ugen_isoc_rintr: throwing away %d bytes\n",
|
||||||
count));
|
count));
|
||||||
}
|
}
|
||||||
|
|
||||||
isize = UGETW(sce->edesc->wMaxPacketSize);
|
isize = UGETW(sce->edesc->wMaxPacketSize);
|
||||||
@ -1427,7 +1427,6 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
|
|||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
struct uio uio;
|
struct uio uio;
|
||||||
void *ptr = 0;
|
void *ptr = 0;
|
||||||
usbd_status err;
|
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
if (!(flag & FWRITE))
|
if (!(flag & FWRITE))
|
||||||
@ -1485,6 +1484,11 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
|
|||||||
usbd_fill_deviceinfo(sc->sc_udev,
|
usbd_fill_deviceinfo(sc->sc_udev,
|
||||||
(struct usb_device_info *)addr, 1);
|
(struct usb_device_info *)addr, 1);
|
||||||
break;
|
break;
|
||||||
|
case USB_RESET_DEVICE:
|
||||||
|
err = usbd_reset_device(sc->sc_udev);
|
||||||
|
if (err)
|
||||||
|
return EIO;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
@ -699,6 +699,7 @@ struct usb_event {
|
|||||||
#define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info)
|
#define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info)
|
||||||
#define USB_SET_SHORT_XFER _IOW ('U', 113, int)
|
#define USB_SET_SHORT_XFER _IOW ('U', 113, int)
|
||||||
#define USB_SET_TIMEOUT _IOW ('U', 114, int)
|
#define USB_SET_TIMEOUT _IOW ('U', 114, int)
|
||||||
|
#define USB_RESET_DEVICE _IO ('U', 115)
|
||||||
|
|
||||||
/* Modem device */
|
/* Modem device */
|
||||||
#define USB_GET_CM_OVER_DATA _IOR ('U', 130, int)
|
#define USB_GET_CM_OVER_DATA _IOR ('U', 130, int)
|
||||||
|
@ -322,16 +322,10 @@ usbd_delay_ms(usbd_device_handle dev, u_int ms)
|
|||||||
usbd_status
|
usbd_status
|
||||||
usbd_reset_port(usbd_device_handle dev, int port, usb_port_status_t *ps)
|
usbd_reset_port(usbd_device_handle dev, int port, usb_port_status_t *ps)
|
||||||
{
|
{
|
||||||
usb_device_request_t req;
|
|
||||||
usbd_status err;
|
usbd_status err;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
req.bmRequestType = UT_WRITE_CLASS_OTHER;
|
err = usbd_set_port_feature(dev, port, UHF_PORT_RESET);
|
||||||
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);
|
|
||||||
DPRINTFN(1,("usbd_reset_port: port %d reset done, error=%s\n",
|
DPRINTFN(1,("usbd_reset_port: port %d reset done, error=%s\n",
|
||||||
port, usbd_errstr(err)));
|
port, usbd_errstr(err)));
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1235,6 +1235,15 @@ usbd_set_polling(usbd_device_handle dev, int on)
|
|||||||
dev->bus->methods->soft_intr(dev->bus);
|
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 *
|
usb_endpoint_descriptor_t *
|
||||||
usbd_get_endpoint_descriptor(usbd_interface_handle iface, u_int8_t address)
|
usbd_get_endpoint_descriptor(usbd_interface_handle iface, u_int8_t address)
|
||||||
|
@ -160,6 +160,7 @@ usb_endpoint_descriptor_t *usbd_find_edesc(usb_config_descriptor_t *,
|
|||||||
|
|
||||||
void usbd_dopoll(usbd_interface_handle);
|
void usbd_dopoll(usbd_interface_handle);
|
||||||
void usbd_set_polling(usbd_device_handle, int);
|
void usbd_set_polling(usbd_device_handle, int);
|
||||||
|
usbd_status usbd_reset_device(usbd_device_handle);
|
||||||
|
|
||||||
const char *usbd_errstr(usbd_status);
|
const char *usbd_errstr(usbd_status);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user