summaryrefslogtreecommitdiff
path: root/firmware/usbstack/usb_core.c
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-03-04 19:32:23 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-03-04 19:32:23 +0000
commit1e6d550087d195032495e9648d3c305a1fd80044 (patch)
tree06917f921dc4c9842ec5577389a5dd1cb7efa379 /firmware/usbstack/usb_core.c
parentc8d2a2458d34ece46e69bb910734074c1637b39a (diff)
downloadrockbox-1e6d550087d195032495e9648d3c305a1fd80044.zip
rockbox-1e6d550087d195032495e9648d3c305a1fd80044.tar.gz
rockbox-1e6d550087d195032495e9648d3c305a1fd80044.tar.bz2
rockbox-1e6d550087d195032495e9648d3c305a1fd80044.tar.xz
handle interface-specific control requests a bit more cleanly
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16519 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/usbstack/usb_core.c')
-rw-r--r--firmware/usbstack/usb_core.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 883d3d6..96a5994 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -647,16 +647,28 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
break;
} /* USB_REQ_GET_DESCRIPTOR */
- default:
+ default: {
+ bool handled=false;
+ if((req->bRequestType & 0x1f) == 1) /* Interface */
+ {
#ifdef USB_STORAGE
- /* does usb_storage know this request? */
- if (!usb_storage_control_request(req))
+ /* does usb_storage know this request? */
+ if(req->wIndex == mass_storage_interface_descriptor.bInterfaceNumber)
+ {
+ handled = usb_storage_control_request(req);
+ }
#endif
#ifdef USB_SERIAL
- /* does usb_serial know this request? */
- if (!usb_serial_control_request(req))
+ /* does usb_serial know this request? */
+ if(req->wIndex == serial_interface_descriptor.bInterfaceNumber)
+ {
+ handled = usb_serial_control_request(req);
+ }
+
#endif
+ }
+ if(!handled)
{
/* nope. flag error */
logf("usb bad req %d", req->bRequest);
@@ -664,6 +676,7 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
ack_control(req);
}
break;
+ }
}
logf("control handled");
}