Skip to content

Commit 86e1cf7

Browse files
committed
Merge tag 'fixes-for-v5.7-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes: USB: fixes for v5.7-rc6 The main part here are the important fixes for the raw-gadget before it becomes an ABI. We're adding support for stall/halt/wedge which is actually pretty important in many situations. There's also a NULL pointer deref fix. Apart from raw-gadget, I've included some recent sparse fixes to a few drivers. Signed-off-by: Felipe Balbi <[email protected]> * tag 'fixes-for-v5.7-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb: usb: cdns3: gadget: make a bunch of functions static usb: mtu3: constify struct debugfs_reg32 usb: gadget: udc: atmel: Make some symbols static usb: raw-gadget: fix null-ptr-deref when reenabling endpoints usb: raw-gadget: documentation updates usb: raw-gadget: support stalling/halting/wedging endpoints usb: raw-gadget: fix gadget endpoint selection usb: raw-gadget: improve uapi headers comments
2 parents a0e710a + 172b14b commit 86e1cf7

File tree

6 files changed

+385
-95
lines changed

6 files changed

+385
-95
lines changed

Documentation/usb/raw-gadget.rst

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ differences are:
2727
3. Raw Gadget provides a way to select a UDC device/driver to bind to,
2828
while GadgetFS currently binds to the first available UDC.
2929

30-
4. Raw Gadget uses predictable endpoint names (handles) across different
31-
UDCs (as long as UDCs have enough endpoints of each required transfer
32-
type).
30+
4. Raw Gadget explicitly exposes information about endpoints addresses and
31+
capabilities allowing a user to write UDC-agnostic gadgets.
3332

3433
5. Raw Gadget has ioctl-based interface instead of a filesystem-based one.
3534

@@ -50,12 +49,36 @@ The typical usage of Raw Gadget looks like:
5049
Raw Gadget and react to those depending on what kind of USB device
5150
needs to be emulated.
5251

52+
Note, that some UDC drivers have fixed addresses assigned to endpoints, and
53+
therefore arbitrary endpoint addresses can't be used in the descriptors.
54+
Nevertheles, Raw Gadget provides a UDC-agnostic way to write USB gadgets.
55+
Once a USB_RAW_EVENT_CONNECT event is received via USB_RAW_IOCTL_EVENT_FETCH,
56+
the USB_RAW_IOCTL_EPS_INFO ioctl can be used to find out information about
57+
endpoints that the UDC driver has. Based on that information, the user must
58+
chose UDC endpoints that will be used for the gadget being emulated, and
59+
properly assign addresses in endpoint descriptors.
60+
61+
You can find usage examples (along with a test suite) here:
62+
63+
https://github.com/xairy/raw-gadget
64+
65+
Internal details
66+
~~~~~~~~~~~~~~~~
67+
68+
Currently every endpoint read/write ioctl submits a USB request and waits until
69+
its completion. This is the desired mode for coverage-guided fuzzing (as we'd
70+
like all USB request processing happen during the lifetime of a syscall),
71+
and must be kept in the implementation. (This might be slow for real world
72+
applications, thus the O_NONBLOCK improvement suggestion below.)
73+
5374
Potential future improvements
5475
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5576

56-
- Implement ioctl's for setting/clearing halt status on endpoints.
57-
58-
- Reporting more events (suspend, resume, etc.) through
59-
USB_RAW_IOCTL_EVENT_FETCH.
77+
- Report more events (suspend, resume, etc.) through USB_RAW_IOCTL_EVENT_FETCH.
6078

6179
- Support O_NONBLOCK I/O.
80+
81+
- Support USB 3 features (accept SS endpoint companion descriptor when
82+
enabling endpoints; allow providing stream_id for bulk transfers).
83+
84+
- Support ISO transfer features (expose frame_number for completed requests).

drivers/usb/cdns3/gadget.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ static int cdns3_ep_run_stream_transfer(struct cdns3_endpoint *priv_ep,
8282
* @ptr: address of device controller register to be read and changed
8383
* @mask: bits requested to clar
8484
*/
85-
void cdns3_clear_register_bit(void __iomem *ptr, u32 mask)
85+
static void cdns3_clear_register_bit(void __iomem *ptr, u32 mask)
8686
{
8787
mask = readl(ptr) & ~mask;
8888
writel(mask, ptr);
@@ -137,7 +137,7 @@ struct usb_request *cdns3_next_request(struct list_head *list)
137137
*
138138
* Returns buffer or NULL if no buffers in list
139139
*/
140-
struct cdns3_aligned_buf *cdns3_next_align_buf(struct list_head *list)
140+
static struct cdns3_aligned_buf *cdns3_next_align_buf(struct list_head *list)
141141
{
142142
return list_first_entry_or_null(list, struct cdns3_aligned_buf, list);
143143
}
@@ -148,7 +148,7 @@ struct cdns3_aligned_buf *cdns3_next_align_buf(struct list_head *list)
148148
*
149149
* Returns request or NULL if no requests in list
150150
*/
151-
struct cdns3_request *cdns3_next_priv_request(struct list_head *list)
151+
static struct cdns3_request *cdns3_next_priv_request(struct list_head *list)
152152
{
153153
return list_first_entry_or_null(list, struct cdns3_request, list);
154154
}
@@ -190,7 +190,7 @@ dma_addr_t cdns3_trb_virt_to_dma(struct cdns3_endpoint *priv_ep,
190190
return priv_ep->trb_pool_dma + offset;
191191
}
192192

193-
int cdns3_ring_size(struct cdns3_endpoint *priv_ep)
193+
static int cdns3_ring_size(struct cdns3_endpoint *priv_ep)
194194
{
195195
switch (priv_ep->type) {
196196
case USB_ENDPOINT_XFER_ISOC:
@@ -345,7 +345,7 @@ static void cdns3_ep_inc_deq(struct cdns3_endpoint *priv_ep)
345345
cdns3_ep_inc_trb(&priv_ep->dequeue, &priv_ep->ccs, priv_ep->num_trbs);
346346
}
347347

348-
void cdns3_move_deq_to_next_trb(struct cdns3_request *priv_req)
348+
static void cdns3_move_deq_to_next_trb(struct cdns3_request *priv_req)
349349
{
350350
struct cdns3_endpoint *priv_ep = priv_req->priv_ep;
351351
int current_trb = priv_req->start_trb;
@@ -511,7 +511,7 @@ static void cdns3_wa2_descmiss_copy_data(struct cdns3_endpoint *priv_ep,
511511
}
512512
}
513513

514-
struct usb_request *cdns3_wa2_gadget_giveback(struct cdns3_device *priv_dev,
514+
static struct usb_request *cdns3_wa2_gadget_giveback(struct cdns3_device *priv_dev,
515515
struct cdns3_endpoint *priv_ep,
516516
struct cdns3_request *priv_req)
517517
{
@@ -551,7 +551,7 @@ struct usb_request *cdns3_wa2_gadget_giveback(struct cdns3_device *priv_dev,
551551
return &priv_req->request;
552552
}
553553

554-
int cdns3_wa2_gadget_ep_queue(struct cdns3_device *priv_dev,
554+
static int cdns3_wa2_gadget_ep_queue(struct cdns3_device *priv_dev,
555555
struct cdns3_endpoint *priv_ep,
556556
struct cdns3_request *priv_req)
557557
{
@@ -836,7 +836,7 @@ void cdns3_gadget_giveback(struct cdns3_endpoint *priv_ep,
836836
cdns3_gadget_ep_free_request(&priv_ep->endpoint, request);
837837
}
838838

839-
void cdns3_wa1_restore_cycle_bit(struct cdns3_endpoint *priv_ep)
839+
static void cdns3_wa1_restore_cycle_bit(struct cdns3_endpoint *priv_ep)
840840
{
841841
/* Work around for stale data address in TRB*/
842842
if (priv_ep->wa1_set) {
@@ -1904,7 +1904,7 @@ static int cdns3_ep_onchip_buffer_reserve(struct cdns3_device *priv_dev,
19041904
return 0;
19051905
}
19061906

1907-
void cdns3_stream_ep_reconfig(struct cdns3_device *priv_dev,
1907+
static void cdns3_stream_ep_reconfig(struct cdns3_device *priv_dev,
19081908
struct cdns3_endpoint *priv_ep)
19091909
{
19101910
if (!priv_ep->use_streams || priv_dev->gadget.speed < USB_SPEED_SUPER)
@@ -1925,7 +1925,7 @@ void cdns3_stream_ep_reconfig(struct cdns3_device *priv_dev,
19251925
EP_CFG_TDL_CHK | EP_CFG_SID_CHK);
19261926
}
19271927

1928-
void cdns3_configure_dmult(struct cdns3_device *priv_dev,
1928+
static void cdns3_configure_dmult(struct cdns3_device *priv_dev,
19291929
struct cdns3_endpoint *priv_ep)
19301930
{
19311931
struct cdns3_usb_regs __iomem *regs = priv_dev->regs;

0 commit comments

Comments
 (0)