@@ -8107,6 +8107,37 @@ static void r8156b_init(struct r8152 *tp)
8107
8107
tp -> coalesce = 15000 ; /* 15 us */
8108
8108
}
8109
8109
8110
+ static bool rtl_check_vendor_ok (struct usb_interface * intf )
8111
+ {
8112
+ struct usb_host_interface * alt = intf -> cur_altsetting ;
8113
+ struct usb_endpoint_descriptor * in , * out , * intr ;
8114
+
8115
+ if (usb_find_common_endpoints (alt , & in , & out , & intr , NULL ) < 0 ) {
8116
+ dev_err (& intf -> dev , "Expected endpoints are not found\n" );
8117
+ return false;
8118
+ }
8119
+
8120
+ /* Check Rx endpoint address */
8121
+ if (usb_endpoint_num (in ) != 1 ) {
8122
+ dev_err (& intf -> dev , "Invalid Rx endpoint address\n" );
8123
+ return false;
8124
+ }
8125
+
8126
+ /* Check Tx endpoint address */
8127
+ if (usb_endpoint_num (out ) != 2 ) {
8128
+ dev_err (& intf -> dev , "Invalid Tx endpoint address\n" );
8129
+ return false;
8130
+ }
8131
+
8132
+ /* Check interrupt endpoint address */
8133
+ if (usb_endpoint_num (intr ) != 3 ) {
8134
+ dev_err (& intf -> dev , "Invalid interrupt endpoint address\n" );
8135
+ return false;
8136
+ }
8137
+
8138
+ return true;
8139
+ }
8140
+
8110
8141
static bool rtl_vendor_mode (struct usb_interface * intf )
8111
8142
{
8112
8143
struct usb_host_interface * alt = intf -> cur_altsetting ;
@@ -8115,12 +8146,15 @@ static bool rtl_vendor_mode(struct usb_interface *intf)
8115
8146
int i , num_configs ;
8116
8147
8117
8148
if (alt -> desc .bInterfaceClass == USB_CLASS_VENDOR_SPEC )
8118
- return true ;
8149
+ return rtl_check_vendor_ok ( intf ) ;
8119
8150
8120
8151
/* The vendor mode is not always config #1, so to find it out. */
8121
8152
udev = interface_to_usbdev (intf );
8122
8153
c = udev -> config ;
8123
8154
num_configs = udev -> descriptor .bNumConfigurations ;
8155
+ if (num_configs < 2 )
8156
+ return false;
8157
+
8124
8158
for (i = 0 ; i < num_configs ; (i ++ , c ++ )) {
8125
8159
struct usb_interface_descriptor * desc = NULL ;
8126
8160
@@ -8135,7 +8169,8 @@ static bool rtl_vendor_mode(struct usb_interface *intf)
8135
8169
}
8136
8170
}
8137
8171
8138
- WARN_ON_ONCE (i == num_configs );
8172
+ if (i == num_configs )
8173
+ dev_err (& intf -> dev , "Unexpected Device\n" );
8139
8174
8140
8175
return false;
8141
8176
}
@@ -9381,9 +9416,6 @@ static int rtl8152_probe(struct usb_interface *intf,
9381
9416
if (!rtl_vendor_mode (intf ))
9382
9417
return - ENODEV ;
9383
9418
9384
- if (intf -> cur_altsetting -> desc .bNumEndpoints < 3 )
9385
- return - ENODEV ;
9386
-
9387
9419
usb_reset_device (udev );
9388
9420
netdev = alloc_etherdev (sizeof (struct r8152 ));
9389
9421
if (!netdev ) {
0 commit comments