usb: gadget: u_ether: prepare for NCM
NCM is a Network Control Model, subclass of USB CDC class, specification is available at http://www.usb.org/developers/devclass_docs This patch makes possible for u_ether to use multiply of wMaxPacketSize predefined size transfers without ZLP (Zero Length Packet), required by NCM spec. Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@nokia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
ff176a4e29
commit
5c1168dbc5
|
@ -240,6 +240,9 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
|
||||||
size += out->maxpacket - 1;
|
size += out->maxpacket - 1;
|
||||||
size -= size % out->maxpacket;
|
size -= size % out->maxpacket;
|
||||||
|
|
||||||
|
if (dev->port_usb->is_fixed)
|
||||||
|
size = max(size, dev->port_usb->fixed_out_len);
|
||||||
|
|
||||||
skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
|
skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
|
||||||
if (skb == NULL) {
|
if (skb == NULL) {
|
||||||
DBG(dev, "no rx skb\n");
|
DBG(dev, "no rx skb\n");
|
||||||
|
@ -578,12 +581,19 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
|
||||||
req->context = skb;
|
req->context = skb;
|
||||||
req->complete = tx_complete;
|
req->complete = tx_complete;
|
||||||
|
|
||||||
|
/* NCM requires no zlp if transfer is dwNtbInMaxSize */
|
||||||
|
if (dev->port_usb->is_fixed &&
|
||||||
|
length == dev->port_usb->fixed_in_len &&
|
||||||
|
(length % in->maxpacket) == 0)
|
||||||
|
req->zero = 0;
|
||||||
|
else
|
||||||
|
req->zero = 1;
|
||||||
|
|
||||||
/* use zlp framing on tx for strict CDC-Ether conformance,
|
/* use zlp framing on tx for strict CDC-Ether conformance,
|
||||||
* though any robust network rx path ignores extra padding.
|
* though any robust network rx path ignores extra padding.
|
||||||
* and some hardware doesn't like to write zlps.
|
* and some hardware doesn't like to write zlps.
|
||||||
*/
|
*/
|
||||||
req->zero = 1;
|
if (req->zero && !dev->zlp && (length % in->maxpacket) == 0)
|
||||||
if (!dev->zlp && (length % in->maxpacket) == 0)
|
|
||||||
length++;
|
length++;
|
||||||
|
|
||||||
req->length = length;
|
req->length = length;
|
||||||
|
|
|
@ -62,6 +62,10 @@ struct gether {
|
||||||
|
|
||||||
/* hooks for added framing, as needed for RNDIS and EEM. */
|
/* hooks for added framing, as needed for RNDIS and EEM. */
|
||||||
u32 header_len;
|
u32 header_len;
|
||||||
|
/* NCM requires fixed size bundles */
|
||||||
|
bool is_fixed;
|
||||||
|
u32 fixed_out_len;
|
||||||
|
u32 fixed_in_len;
|
||||||
struct sk_buff *(*wrap)(struct gether *port,
|
struct sk_buff *(*wrap)(struct gether *port,
|
||||||
struct sk_buff *skb);
|
struct sk_buff *skb);
|
||||||
int (*unwrap)(struct gether *port,
|
int (*unwrap)(struct gether *port,
|
||||||
|
|
Loading…
Reference in New Issue