@@ -264,13 +264,23 @@ static void rndis_set_link_state(struct rndis_device *rdev,
264
264
}
265
265
}
266
266
267
- static void rndis_filter_receive_response (struct rndis_device * dev ,
268
- struct rndis_message * resp )
267
+ static void rndis_filter_receive_response (struct net_device * ndev ,
268
+ struct netvsc_device * nvdev ,
269
+ const struct rndis_message * resp )
269
270
{
271
+ struct rndis_device * dev = nvdev -> extension ;
270
272
struct rndis_request * request = NULL ;
271
273
bool found = false;
272
274
unsigned long flags ;
273
- struct net_device * ndev = dev -> ndev ;
275
+
276
+ /* This should never happen, it means control message
277
+ * response received after device removed.
278
+ */
279
+ if (dev -> state == RNDIS_DEV_UNINITIALIZED ) {
280
+ netdev_err (ndev ,
281
+ "got rndis message uninitialized\n" );
282
+ return ;
283
+ }
274
284
275
285
spin_lock_irqsave (& dev -> request_lock , flags );
276
286
list_for_each_entry (request , & dev -> req_list , list_ent ) {
@@ -352,7 +362,6 @@ static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)
352
362
353
363
static int rndis_filter_receive_data (struct net_device * ndev ,
354
364
struct netvsc_device * nvdev ,
355
- struct rndis_device * dev ,
356
365
struct rndis_message * msg ,
357
366
struct vmbus_channel * channel ,
358
367
void * data , u32 data_buflen )
@@ -372,7 +381,7 @@ static int rndis_filter_receive_data(struct net_device *ndev,
372
381
* should be the data packet size plus the trailer padding size
373
382
*/
374
383
if (unlikely (data_buflen < rndis_pkt -> data_len )) {
375
- netdev_err (dev -> ndev , "rndis message buffer "
384
+ netdev_err (ndev , "rndis message buffer "
376
385
"overflow detected (got %u, min %u)"
377
386
"...dropping this message!\n" ,
378
387
data_buflen , rndis_pkt -> data_len );
@@ -400,35 +409,20 @@ int rndis_filter_receive(struct net_device *ndev,
400
409
void * data , u32 buflen )
401
410
{
402
411
struct net_device_context * net_device_ctx = netdev_priv (ndev );
403
- struct rndis_device * rndis_dev = net_dev -> extension ;
404
412
struct rndis_message * rndis_msg = data ;
405
413
406
- /* Make sure the rndis device state is initialized */
407
- if (unlikely (!rndis_dev )) {
408
- netif_dbg (net_device_ctx , rx_err , ndev ,
409
- "got rndis message but no rndis device!\n" );
410
- return NVSP_STAT_FAIL ;
411
- }
412
-
413
- if (unlikely (rndis_dev -> state == RNDIS_DEV_UNINITIALIZED )) {
414
- netif_dbg (net_device_ctx , rx_err , ndev ,
415
- "got rndis message uninitialized\n" );
416
- return NVSP_STAT_FAIL ;
417
- }
418
-
419
414
if (netif_msg_rx_status (net_device_ctx ))
420
415
dump_rndis_message (ndev , rndis_msg );
421
416
422
417
switch (rndis_msg -> ndis_msg_type ) {
423
418
case RNDIS_MSG_PACKET :
424
- return rndis_filter_receive_data (ndev , net_dev ,
425
- rndis_dev , rndis_msg ,
419
+ return rndis_filter_receive_data (ndev , net_dev , rndis_msg ,
426
420
channel , data , buflen );
427
421
case RNDIS_MSG_INIT_C :
428
422
case RNDIS_MSG_QUERY_C :
429
423
case RNDIS_MSG_SET_C :
430
424
/* completion msgs */
431
- rndis_filter_receive_response (rndis_dev , rndis_msg );
425
+ rndis_filter_receive_response (ndev , net_dev , rndis_msg );
432
426
break ;
433
427
434
428
case RNDIS_MSG_INDICATE :
@@ -1357,7 +1351,6 @@ void rndis_filter_device_remove(struct hv_device *dev,
1357
1351
net_dev -> extension = NULL ;
1358
1352
1359
1353
netvsc_device_remove (dev );
1360
- kfree (rndis_dev );
1361
1354
}
1362
1355
1363
1356
int rndis_filter_open (struct netvsc_device * nvdev )
0 commit comments