aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManu Gautam <mgautam@codeaurora.org>2013-09-24 15:54:15 +0530
committerManu Gautam <mgautam@codeaurora.org>2013-09-24 16:22:23 +0530
commitf90a10b1df679fb56f81c4e94e92c57a83386a41 (patch)
tree42fbc4d305c55a20a5bbfe82224dd115edc5c1bf
parentcad6f8bde0680e48fdda4b9c13395a5703a92802 (diff)
usb: gadget: u_ether: Don't drop IP packets with size > ETH_FRAME
Driver drops RX packets if size is greater than ETH max packet size i.e. 1500. But this can happen in IP mode, hence don't drop such large RX packets in IP mode. Change-Id: I9e916dc85ed8dea3d3d45ae8756485c14e3b2ac0 Signed-off-by: Manu Gautam <mgautam@codeaurora.org>
-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,
};