61
61
#define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
62
62
SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3)
63
63
64
+ #define CARRIER_CHECK_DELAY (2 * HZ)
65
+
64
66
struct smsc95xx_priv {
65
67
u32 mac_cr ;
66
68
u32 hash_hi ;
@@ -69,6 +71,9 @@ struct smsc95xx_priv {
69
71
spinlock_t mac_cr_lock ;
70
72
u8 features ;
71
73
u8 suspend_flags ;
74
+ bool link_ok ;
75
+ struct delayed_work carrier_check ;
76
+ struct usbnet * dev ;
72
77
};
73
78
74
79
static bool turbo_mode = true;
@@ -624,6 +629,44 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
624
629
intdata );
625
630
}
626
631
632
+ static void set_carrier (struct usbnet * dev , bool link )
633
+ {
634
+ struct smsc95xx_priv * pdata = (struct smsc95xx_priv * )(dev -> data [0 ]);
635
+
636
+ if (pdata -> link_ok == link )
637
+ return ;
638
+
639
+ pdata -> link_ok = link ;
640
+
641
+ if (link )
642
+ usbnet_link_change (dev , 1 , 0 );
643
+ else
644
+ usbnet_link_change (dev , 0 , 0 );
645
+ }
646
+
647
+ static void check_carrier (struct work_struct * work )
648
+ {
649
+ struct smsc95xx_priv * pdata = container_of (work , struct smsc95xx_priv ,
650
+ carrier_check .work );
651
+ struct usbnet * dev = pdata -> dev ;
652
+ int ret ;
653
+
654
+ if (pdata -> suspend_flags != 0 )
655
+ return ;
656
+
657
+ ret = smsc95xx_mdio_read (dev -> net , dev -> mii .phy_id , MII_BMSR );
658
+ if (ret < 0 ) {
659
+ netdev_warn (dev -> net , "Failed to read MII_BMSR\n" );
660
+ return ;
661
+ }
662
+ if (ret & BMSR_LSTATUS )
663
+ set_carrier (dev , 1 );
664
+ else
665
+ set_carrier (dev , 0 );
666
+
667
+ schedule_delayed_work (& pdata -> carrier_check , CARRIER_CHECK_DELAY );
668
+ }
669
+
627
670
/* Enable or disable Tx & Rx checksum offload engines */
628
671
static int smsc95xx_set_features (struct net_device * netdev ,
629
672
netdev_features_t features )
@@ -1165,13 +1208,20 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
1165
1208
dev -> net -> flags |= IFF_MULTICAST ;
1166
1209
dev -> net -> hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM ;
1167
1210
dev -> hard_mtu = dev -> net -> mtu + dev -> net -> hard_header_len ;
1211
+
1212
+ pdata -> dev = dev ;
1213
+ INIT_DELAYED_WORK (& pdata -> carrier_check , check_carrier );
1214
+ schedule_delayed_work (& pdata -> carrier_check , CARRIER_CHECK_DELAY );
1215
+
1168
1216
return 0 ;
1169
1217
}
1170
1218
1171
1219
static void smsc95xx_unbind (struct usbnet * dev , struct usb_interface * intf )
1172
1220
{
1173
1221
struct smsc95xx_priv * pdata = (struct smsc95xx_priv * )(dev -> data [0 ]);
1222
+
1174
1223
if (pdata ) {
1224
+ cancel_delayed_work (& pdata -> carrier_check );
1175
1225
netif_dbg (dev , ifdown , dev -> net , "free pdata\n" );
1176
1226
kfree (pdata );
1177
1227
pdata = NULL ;
@@ -1695,6 +1745,7 @@ static int smsc95xx_resume(struct usb_interface *intf)
1695
1745
1696
1746
/* do this first to ensure it's cleared even in error case */
1697
1747
pdata -> suspend_flags = 0 ;
1748
+ schedule_delayed_work (& pdata -> carrier_check , CARRIER_CHECK_DELAY );
1698
1749
1699
1750
if (suspend_flags & SUSPEND_ALLMODES ) {
1700
1751
/* clear wake-up sources */
0 commit comments