aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/gadget/u_ether.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
index 6c70a93a879..cc45d9adc50 100644
--- a/drivers/usb/gadget/u_ether.c
+++ b/drivers/usb/gadget/u_ether.c
@@ -171,6 +171,25 @@ static int ueth_change_mtu(struct net_device *net, int new_mtu)
return status;
}
+static int ueth_change_mtu_ip(struct net_device *net, int new_mtu)
+{
+ struct eth_dev *dev = netdev_priv(net);
+ unsigned long flags;
+ int status = 0;
+
+ spin_lock_irqsave(&dev->lock, flags);
+ if (new_mtu <= 0)
+ status = -EINVAL;
+ else
+ net->mtu = new_mtu;
+
+ DBG(dev, "[%s] MTU change: old=%d new=%d\n", net->name,
+ net->mtu, new_mtu);
+ spin_unlock_irqrestore(&dev->lock, flags);
+
+ return status;
+}
+
static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
{
struct eth_dev *dev = netdev_priv(net);
@@ -481,7 +500,8 @@ static void process_rx_w(struct work_struct *work)
while ((skb = skb_dequeue(&dev->rx_frames))) {
if (status < 0
|| ETH_HLEN > skb->len
- || skb->len > ETH_FRAME_LEN) {
+ || (skb->len > ETH_FRAME_LEN &&
+ test_bit(RMNET_MODE_LLP_ETH, &dev->flags))) {
dev->net->stats.rx_errors++;
dev->net->stats.rx_length_errors++;
DBG(dev, "rx length %d\n", skb->len);
@@ -999,7 +1019,7 @@ static const struct net_device_ops eth_netdev_ops_ip = {
.ndo_stop = eth_stop,
.ndo_start_xmit = eth_start_xmit,
.ndo_do_ioctl = ether_ioctl,
- .ndo_change_mtu = ueth_change_mtu,
+ .ndo_change_mtu = ueth_change_mtu_ip,
.ndo_set_mac_address = 0,
.ndo_validate_addr = 0,
};