File tree Expand file tree Collapse file tree 3 files changed +36
-2
lines changed Expand file tree Collapse file tree 3 files changed +36
-2
lines changed Original file line number Diff line number Diff line change @@ -85,9 +85,34 @@ static int always_connected (struct usbnet *dev)
85
85
*
86
86
*-------------------------------------------------------------------------*/
87
87
88
+ static void m5632_recover (struct usbnet * dev )
89
+ {
90
+ struct usb_device * udev = dev -> udev ;
91
+ struct usb_interface * intf = dev -> intf ;
92
+ int r ;
93
+
94
+ r = usb_lock_device_for_reset (udev , intf );
95
+ if (r < 0 )
96
+ return ;
97
+
98
+ usb_reset_device (udev );
99
+ usb_unlock_device (udev );
100
+ }
101
+
102
+ static int dummy_prereset (struct usb_interface * intf )
103
+ {
104
+ return 0 ;
105
+ }
106
+
107
+ static int dummy_postreset (struct usb_interface * intf )
108
+ {
109
+ return 0 ;
110
+ }
111
+
88
112
static const struct driver_info ali_m5632_info = {
89
113
.description = "ALi M5632" ,
90
114
.flags = FLAG_POINTTOPOINT ,
115
+ .recover = m5632_recover ,
91
116
};
92
117
93
118
#endif
@@ -332,6 +357,8 @@ static struct usb_driver cdc_subset_driver = {
332
357
.probe = usbnet_probe ,
333
358
.suspend = usbnet_suspend ,
334
359
.resume = usbnet_resume ,
360
+ .pre_reset = dummy_prereset ,
361
+ .post_reset = dummy_postreset ,
335
362
.disconnect = usbnet_disconnect ,
336
363
.id_table = products ,
337
364
.disable_hub_initiated_lpm = 1 ,
Original file line number Diff line number Diff line change @@ -1218,8 +1218,12 @@ void usbnet_tx_timeout (struct net_device *net)
1218
1218
1219
1219
unlink_urbs (dev , & dev -> txq );
1220
1220
tasklet_schedule (& dev -> bh );
1221
-
1222
- // FIXME: device recovery -- reset?
1221
+ /* this needs to be handled individually because the generic layer
1222
+ * doesn't know what is sufficient and could not restore private
1223
+ * information if a remedy of an unconditional reset were used.
1224
+ */
1225
+ if (dev -> driver_info -> recover )
1226
+ (dev -> driver_info -> recover )(dev );
1223
1227
}
1224
1228
EXPORT_SYMBOL_GPL (usbnet_tx_timeout );
1225
1229
Original file line number Diff line number Diff line change @@ -148,6 +148,9 @@ struct driver_info {
148
148
struct sk_buff * (* tx_fixup )(struct usbnet * dev ,
149
149
struct sk_buff * skb , gfp_t flags );
150
150
151
+ /* recover from timeout */
152
+ void (* recover )(struct usbnet * dev );
153
+
151
154
/* early initialization code, can sleep. This is for minidrivers
152
155
* having 'subminidrivers' that need to do extra initialization
153
156
* right after minidriver have initialized hardware. */
You can’t perform that action at this time.
0 commit comments