Skip to content

Commit

Permalink
usb: gadget: add a new quirk to avoid skb_reserve in u_ether.c
Browse files Browse the repository at this point in the history
Some platforms (e.g. USB-DMAC on R-Car SoCs) has memory alignment
restriction. If memory alignment is not match, the usb peripheral
driver decides not to use the DMA controller. Then, the performance
is not good.

In the case of u_ether.c, since it calls skb_reserve() in rx_submit(),
it is possible to cause memory alignment mismatch.

So, this patch adds a new quirk "quirk_avoids_skb_reserve" to avoid
skb_reserve() calling in u_ether.c to improve performance.

A peripheral driver will set this flag and network gadget drivers
(e.g. f_ncm.c) will reference the flag via gadget_avoids_skb_reserve().

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
  • Loading branch information
Yoshihiro Shimoda authored and Felipe Balbi committed Aug 31, 2016
1 parent a00c979 commit 60e7396
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions include/linux/usb/gadget.h
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,8 @@ struct usb_gadget_ops {
* or B-Peripheral wants to take host role.
* @quirk_ep_out_aligned_size: epout requires buffer size to be aligned to
* MaxPacketSize.
* @quirk_avoids_skb_reserve: udc/platform wants to avoid skb_reserve() in
* u_ether.c to improve performance.
* @is_selfpowered: if the gadget is self-powered.
* @deactivated: True if gadget is deactivated - in deactivated state it cannot
* be connected.
Expand Down Expand Up @@ -398,6 +400,7 @@ struct usb_gadget {
unsigned quirk_altset_not_supp:1;
unsigned quirk_stall_not_supp:1;
unsigned quirk_zlp_not_supp:1;
unsigned quirk_avoids_skb_reserve:1;
unsigned is_selfpowered:1;
unsigned deactivated:1;
unsigned connected:1;
Expand Down Expand Up @@ -473,6 +476,16 @@ static inline int gadget_is_zlp_supported(struct usb_gadget *g)
return !g->quirk_zlp_not_supp;
}

/**
* gadget_avoids_skb_reserve - return true iff the hardware would like to avoid
* skb_reserve to improve performance.
* @g: controller to check for quirk
*/
static inline int gadget_avoids_skb_reserve(struct usb_gadget *g)
{
return g->quirk_avoids_skb_reserve;
}

/**
* gadget_is_dualspeed - return true iff the hardware handles high speed
* @g: controller that might support both high and full speeds
Expand Down

0 comments on commit 60e7396

Please sign in to comment.