summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/controller/at91dci.c
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2009-04-22 17:08:16 +0000
committerthompsa <thompsa@FreeBSD.org>2009-04-22 17:08:16 +0000
commitd07d36e872344cbf63c8ed718e8c1201fe879fb9 (patch)
tree5467fd04839124e57ba2eecd2dcb6736316ed6f9 /sys/dev/usb/controller/at91dci.c
parent7fc43d9a769b211f3caad87ea1751e8ba13c4d51 (diff)
downloadFreeBSD-src-d07d36e872344cbf63c8ed718e8c1201fe879fb9.zip
FreeBSD-src-d07d36e872344cbf63c8ed718e8c1201fe879fb9.tar.gz
MFp4 //depot/projects/usb@160930
Change the roothub exec functions to take the usb request and data pointers directly rather than placing them on the parent bus struct. Submitted by: Hans Petter Selasky
Diffstat (limited to 'sys/dev/usb/controller/at91dci.c')
-rw-r--r--sys/dev/usb/controller/at91dci.c90
1 files changed, 48 insertions, 42 deletions
diff --git a/sys/dev/usb/controller/at91dci.c b/sys/dev/usb/controller/at91dci.c
index ade0c2a..0dfb4fe 100644
--- a/sys/dev/usb/controller/at91dci.c
+++ b/sys/dev/usb/controller/at91dci.c
@@ -1744,28 +1744,32 @@ USB_MAKE_STRING_DESC(STRING_LANG, at91dci_langtab);
USB_MAKE_STRING_DESC(STRING_VENDOR, at91dci_vendor);
USB_MAKE_STRING_DESC(STRING_PRODUCT, at91dci_product);
-static void
-at91dci_roothub_exec(struct usb2_bus *bus)
+static usb2_error_t
+at91dci_roothub_exec(struct usb2_device *udev,
+ struct usb2_device_request *req, const void **pptr, uint16_t *plength)
{
- struct at91dci_softc *sc = AT9100_DCI_BUS2SC(bus);
- struct usb2_sw_transfer *std = &sc->sc_bus.roothub_req;
+ struct at91dci_softc *sc = AT9100_DCI_BUS2SC(udev->bus);
+ const void *ptr;
+ uint16_t len;
uint16_t value;
uint16_t index;
+ usb2_error_t err;
USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
/* buffer reset */
- std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
- std->len = 0;
+ ptr = (const void *)&sc->sc_hub_temp;
+ len = 0;
+ err = 0;
- value = UGETW(std->req.wValue);
- index = UGETW(std->req.wIndex);
+ value = UGETW(req->wValue);
+ index = UGETW(req->wIndex);
/* demultiplex the control request */
- switch (std->req.bmRequestType) {
+ switch (req->bmRequestType) {
case UT_READ_DEVICE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_GET_DESCRIPTOR:
goto tr_handle_get_descriptor;
case UR_GET_CONFIG:
@@ -1778,7 +1782,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_WRITE_DEVICE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_SET_ADDRESS:
goto tr_handle_set_address;
case UR_SET_CONFIG:
@@ -1794,9 +1798,9 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_WRITE_ENDPOINT:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_CLEAR_FEATURE:
- switch (UGETW(std->req.wValue)) {
+ switch (UGETW(req->wValue)) {
case UF_ENDPOINT_HALT:
goto tr_handle_clear_halt;
case UF_DEVICE_REMOTE_WAKEUP:
@@ -1806,7 +1810,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
}
break;
case UR_SET_FEATURE:
- switch (UGETW(std->req.wValue)) {
+ switch (UGETW(req->wValue)) {
case UF_ENDPOINT_HALT:
goto tr_handle_set_halt;
case UF_DEVICE_REMOTE_WAKEUP:
@@ -1823,7 +1827,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_READ_ENDPOINT:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_GET_STATUS:
goto tr_handle_get_ep_status;
default:
@@ -1832,7 +1836,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_WRITE_INTERFACE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_SET_INTERFACE:
goto tr_handle_set_interface;
case UR_CLEAR_FEATURE:
@@ -1844,7 +1848,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_READ_INTERFACE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_GET_INTERFACE:
goto tr_handle_get_interface;
case UR_GET_STATUS:
@@ -1865,7 +1869,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_WRITE_CLASS_DEVICE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_CLEAR_FEATURE:
goto tr_valid;
case UR_SET_DESCRIPTOR:
@@ -1877,7 +1881,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_WRITE_CLASS_OTHER:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_CLEAR_FEATURE:
goto tr_handle_clear_port_feature;
case UR_SET_FEATURE:
@@ -1893,7 +1897,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_READ_CLASS_OTHER:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_GET_TT_STATE:
goto tr_handle_get_tt_state;
case UR_GET_STATUS:
@@ -1904,7 +1908,7 @@ at91dci_roothub_exec(struct usb2_bus *bus)
break;
case UT_READ_CLASS_DEVICE:
- switch (std->req.bRequest) {
+ switch (req->bRequest) {
case UR_GET_DESCRIPTOR:
goto tr_handle_get_class_descriptor;
case UR_GET_STATUS:
@@ -1925,31 +1929,31 @@ tr_handle_get_descriptor:
if (value & 0xff) {
goto tr_stalled;
}
- std->len = sizeof(at91dci_devd);
- std->ptr = USB_ADD_BYTES(&at91dci_devd, 0);
+ len = sizeof(at91dci_devd);
+ ptr = (const void *)&at91dci_devd;
goto tr_valid;
case UDESC_CONFIG:
if (value & 0xff) {
goto tr_stalled;
}
- std->len = sizeof(at91dci_confd);
- std->ptr = USB_ADD_BYTES(&at91dci_confd, 0);
+ len = sizeof(at91dci_confd);
+ ptr = (const void *)&at91dci_confd;
goto tr_valid;
case UDESC_STRING:
switch (value & 0xff) {
case 0: /* Language table */
- std->len = sizeof(at91dci_langtab);
- std->ptr = USB_ADD_BYTES(&at91dci_langtab, 0);
+ len = sizeof(at91dci_langtab);
+ ptr = (const void *)&at91dci_langtab;
goto tr_valid;
case 1: /* Vendor */
- std->len = sizeof(at91dci_vendor);
- std->ptr = USB_ADD_BYTES(&at91dci_vendor, 0);
+ len = sizeof(at91dci_vendor);
+ ptr = (const void *)&at91dci_vendor;
goto tr_valid;
case 2: /* Product */
- std->len = sizeof(at91dci_product);
- std->ptr = USB_ADD_BYTES(&at91dci_product, 0);
+ len = sizeof(at91dci_product);
+ ptr = (const void *)&at91dci_product;
goto tr_valid;
default:
break;
@@ -1961,12 +1965,12 @@ tr_handle_get_descriptor:
goto tr_stalled;
tr_handle_get_config:
- std->len = 1;
+ len = 1;
sc->sc_hub_temp.wValue[0] = sc->sc_conf;
goto tr_valid;
tr_handle_get_status:
- std->len = 2;
+ len = 2;
USETW(sc->sc_hub_temp.wValue, UDS_SELF_POWERED);
goto tr_valid;
@@ -1985,7 +1989,7 @@ tr_handle_set_config:
goto tr_valid;
tr_handle_get_interface:
- std->len = 1;
+ len = 1;
sc->sc_hub_temp.wValue[0] = 0;
goto tr_valid;
@@ -1993,7 +1997,7 @@ tr_handle_get_tt_state:
tr_handle_get_class_status:
tr_handle_get_iface_status:
tr_handle_get_ep_status:
- std->len = 2;
+ len = 2;
USETW(sc->sc_hub_temp.wValue, 0);
goto tr_valid;
@@ -2038,7 +2042,7 @@ tr_handle_clear_port_feature:
sc->sc_flags.change_suspend = 0;
break;
default:
- std->err = USB_ERR_IOERROR;
+ err = USB_ERR_IOERROR;
goto done;
}
goto tr_valid;
@@ -2063,7 +2067,7 @@ tr_handle_set_port_feature:
sc->sc_flags.port_powered = 1;
break;
default:
- std->err = USB_ERR_IOERROR;
+ err = USB_ERR_IOERROR;
goto done;
}
goto tr_valid;
@@ -2117,22 +2121,24 @@ tr_handle_get_port_status:
value |= UPS_C_SUSPEND;
}
USETW(sc->sc_hub_temp.ps.wPortChange, value);
- std->len = sizeof(sc->sc_hub_temp.ps);
+ len = sizeof(sc->sc_hub_temp.ps);
goto tr_valid;
tr_handle_get_class_descriptor:
if (value & 0xFF) {
goto tr_stalled;
}
- std->ptr = USB_ADD_BYTES(&at91dci_hubd, 0);
- std->len = sizeof(at91dci_hubd);
+ ptr = (const void *)&at91dci_hubd;
+ len = sizeof(at91dci_hubd);
goto tr_valid;
tr_stalled:
- std->err = USB_ERR_STALLED;
+ err = USB_ERR_STALLED;
tr_valid:
done:
- return;
+ *plength = len;
+ *pptr = ptr;
+ return (err);
}
static void
OpenPOWER on IntegriCloud