mcs7830: Implement link state detection
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / net / usb / mcs7830.c
index add1064..03c2d8d 100644 (file)
@@ -629,11 +629,31 @@ static int mcs7830_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
        return skb->len > 0;
 }
 
+static void mcs7830_status(struct usbnet *dev, struct urb *urb)
+{
+       u8 *buf = urb->transfer_buffer;
+       bool link;
+
+       if (urb->actual_length < 16)
+               return;
+
+       link = !(buf[1] & 0x20);
+       if (netif_carrier_ok(dev->net) != link) {
+               if (link) {
+                       netif_carrier_on(dev->net);
+                       usbnet_defer_kevent(dev, EVENT_LINK_RESET);
+               } else
+                       netif_carrier_off(dev->net);
+               netdev_dbg(dev->net, "Link Status is: %d\n", link);
+       }
+}
+
 static const struct driver_info moschip_info = {
        .description    = "MOSCHIP 7830/7832/7730 usb-NET adapter",
        .bind           = mcs7830_bind,
        .rx_fixup       = mcs7830_rx_fixup,
-       .flags          = FLAG_ETHER,
+       .flags          = FLAG_ETHER | FLAG_LINK_INTR,
+       .status         = mcs7830_status,
        .in             = 1,
        .out            = 2,
 };
@@ -642,7 +662,8 @@ static const struct driver_info sitecom_info = {
        .description    = "Sitecom LN-30 usb-NET adapter",
        .bind           = mcs7830_bind,
        .rx_fixup       = mcs7830_rx_fixup,
-       .flags          = FLAG_ETHER,
+       .flags          = FLAG_ETHER | FLAG_LINK_INTR,
+       .status         = mcs7830_status,
        .in             = 1,
        .out            = 2,
 };