diff options
author | Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | 2016-08-22 04:48:26 -0400 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2016-08-31 03:06:03 -0400 |
commit | 05f6b0ff68429bb7c6b84b35e71b522c3bae76ae (patch) | |
tree | 3d59d92dd7c41eb935be159835e2b09e84210dfc | |
parent | 60e7396f820fa67a007f2a2eb5d97d3e77a74881 (diff) |
usb: gadget: u_ether: add a flag to avoid skb_reserve() calling
This patch adds a flag "no_skb_reserve" in struct eth_dev.
So, if a peripheral driver sets the quirk_avoids_skb_reserve flag,
upper network gadget drivers (e.g. f_ncm.c) can avoid skb_reserve()
calling using the flag as well.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r-- | drivers/usb/gadget/function/u_ether.c | 5 | ||||
-rw-r--r-- | drivers/usb/gadget/function/u_ether.h | 1 |
2 files changed, 5 insertions, 1 deletions
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 5f562c1ec795..3be4b93fd415 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c | |||
@@ -82,6 +82,7 @@ struct eth_dev { | |||
82 | #define WORK_RX_MEMORY 0 | 82 | #define WORK_RX_MEMORY 0 |
83 | 83 | ||
84 | bool zlp; | 84 | bool zlp; |
85 | bool no_skb_reserve; | ||
85 | u8 host_mac[ETH_ALEN]; | 86 | u8 host_mac[ETH_ALEN]; |
86 | u8 dev_mac[ETH_ALEN]; | 87 | u8 dev_mac[ETH_ALEN]; |
87 | }; | 88 | }; |
@@ -233,7 +234,8 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) | |||
233 | * but on at least one, checksumming fails otherwise. Note: | 234 | * but on at least one, checksumming fails otherwise. Note: |
234 | * RNDIS headers involve variable numbers of LE32 values. | 235 | * RNDIS headers involve variable numbers of LE32 values. |
235 | */ | 236 | */ |
236 | skb_reserve(skb, NET_IP_ALIGN); | 237 | if (likely(!dev->no_skb_reserve)) |
238 | skb_reserve(skb, NET_IP_ALIGN); | ||
237 | 239 | ||
238 | req->buf = skb->data; | 240 | req->buf = skb->data; |
239 | req->length = size; | 241 | req->length = size; |
@@ -1063,6 +1065,7 @@ struct net_device *gether_connect(struct gether *link) | |||
1063 | 1065 | ||
1064 | if (result == 0) { | 1066 | if (result == 0) { |
1065 | dev->zlp = link->is_zlp_ok; | 1067 | dev->zlp = link->is_zlp_ok; |
1068 | dev->no_skb_reserve = link->no_skb_reserve; | ||
1066 | DBG(dev, "qlen %d\n", qlen(dev->gadget, dev->qmult)); | 1069 | DBG(dev, "qlen %d\n", qlen(dev->gadget, dev->qmult)); |
1067 | 1070 | ||
1068 | dev->header_len = link->header_len; | 1071 | dev->header_len = link->header_len; |
diff --git a/drivers/usb/gadget/function/u_ether.h b/drivers/usb/gadget/function/u_ether.h index c77145bd6b5b..81d94a7ae4b4 100644 --- a/drivers/usb/gadget/function/u_ether.h +++ b/drivers/usb/gadget/function/u_ether.h | |||
@@ -64,6 +64,7 @@ struct gether { | |||
64 | struct usb_ep *out_ep; | 64 | struct usb_ep *out_ep; |
65 | 65 | ||
66 | bool is_zlp_ok; | 66 | bool is_zlp_ok; |
67 | bool no_skb_reserve; | ||
67 | 68 | ||
68 | u16 cdc_filter; | 69 | u16 cdc_filter; |
69 | 70 | ||