|
@@ -240,6 +240,9 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
|
|
|
size += out->maxpacket - 1;
|
|
|
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);
|
|
|
if (skb == NULL) {
|
|
|
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->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,
|
|
|
* though any robust network rx path ignores extra padding.
|
|
|
* and some hardware doesn't like to write zlps.
|
|
|
*/
|
|
|
- req->zero = 1;
|
|
|
- if (!dev->zlp && (length % in->maxpacket) == 0)
|
|
|
+ if (req->zero && !dev->zlp && (length % in->maxpacket) == 0)
|
|
|
length++;
|
|
|
|
|
|
req->length = length;
|