OSDN Git Service

Merge android-4.4.186 (aeb051d) into msm-4.4
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / usb / gadget / function / u_ether.c
index 21bf0a8..df94661 100644 (file)
@@ -217,11 +217,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
                out = dev->port_usb->out_ep;
        else
                out = NULL;
-       spin_unlock_irqrestore(&dev->lock, flags);
 
        if (!out)
+       {
+               spin_unlock_irqrestore(&dev->lock, flags);
                return -ENOTCONN;
-
+       }
 
        /* Padding up to RX_EXTRA handles minor disagreements with host.
         * Normally we use the USB "terminate on short read" convention;
@@ -245,6 +246,7 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
 
        if (dev->port_usb->is_fixed)
                size = max_t(size_t, size, dev->port_usb->fixed_out_len);
+       spin_unlock_irqrestore(&dev->lock, flags);
 
        DBG(dev, "%s: size: %zd\n", __func__, size);
        skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
@@ -1073,6 +1075,9 @@ int gether_set_dev_addr(struct net_device *net, const char *dev_addr)
        struct eth_dev *dev;
        u8 new_addr[ETH_ALEN];
 
+       if (!net)
+               return -ENODEV;
+
        dev = netdev_priv(net);
        if (get_ether_addr(dev_addr, new_addr))
                return -EINVAL;
@@ -1085,6 +1090,9 @@ int gether_get_dev_addr(struct net_device *net, char *dev_addr, int len)
 {
        struct eth_dev *dev;
 
+       if (!net)
+               return -ENODEV;
+
        dev = netdev_priv(net);
        return get_ether_addr_str(dev->dev_mac, dev_addr, len);
 }
@@ -1095,6 +1103,9 @@ int gether_set_host_addr(struct net_device *net, const char *host_addr)
        struct eth_dev *dev;
        u8 new_addr[ETH_ALEN];
 
+       if (!net)
+               return -ENODEV;
+
        dev = netdev_priv(net);
        if (get_ether_addr(host_addr, new_addr))
                return -EINVAL;
@@ -1107,6 +1118,9 @@ int gether_get_host_addr(struct net_device *net, char *host_addr, int len)
 {
        struct eth_dev *dev;
 
+       if (!net)
+               return -ENODEV;
+
        dev = netdev_priv(net);
        return get_ether_addr_str(dev->host_mac, host_addr, len);
 }
@@ -1139,6 +1153,9 @@ void gether_set_qmult(struct net_device *net, unsigned qmult)
 {
        struct eth_dev *dev;
 
+       if (!net)
+               return;
+
        dev = netdev_priv(net);
        dev->qmult = qmult;
 }
@@ -1148,6 +1165,9 @@ unsigned gether_get_qmult(struct net_device *net)
 {
        struct eth_dev *dev;
 
+       if (!net)
+               return -ENODEV;
+
        dev = netdev_priv(net);
        return dev->qmult;
 }
@@ -1155,6 +1175,9 @@ EXPORT_SYMBOL_GPL(gether_get_qmult);
 
 int gether_get_ifname(struct net_device *net, char *name, int len)
 {
+       if (!net)
+               return -ENODEV;
+
        rtnl_lock();
        strlcpy(name, netdev_name(net), len);
        rtnl_unlock();