@@ -365,15 +365,15 @@ static inline unsigned long at76_get_timeout(struct dfu_status *s)
365
365
static int at76_usbdfu_download (struct usb_device * udev , u8 * buf , u32 size ,
366
366
int manifest_sync_timeout )
367
367
{
368
- u8 * block ;
369
- struct dfu_status dfu_stat_buf ;
370
368
int ret = 0 ;
371
369
int need_dfu_state = 1 ;
372
370
int is_done = 0 ;
373
- u8 dfu_state = 0 ;
374
371
u32 dfu_timeout = 0 ;
375
372
int bsize = 0 ;
376
373
int blockno = 0 ;
374
+ struct dfu_status * dfu_stat_buf = NULL ;
375
+ u8 * dfu_state = NULL ;
376
+ u8 * block = NULL ;
377
377
378
378
at76_dbg (DBG_DFU , "%s( %p, %u, %d)" , __func__ , buf , size ,
379
379
manifest_sync_timeout );
@@ -383,13 +383,28 @@ static int at76_usbdfu_download(struct usb_device *udev, u8 *buf, u32 size,
383
383
return - EINVAL ;
384
384
}
385
385
386
+ dfu_stat_buf = kmalloc (sizeof (struct dfu_status ), GFP_KERNEL );
387
+ if (!dfu_stat_buf ) {
388
+ ret = - ENOMEM ;
389
+ goto exit ;
390
+ }
391
+
386
392
block = kmalloc (FW_BLOCK_SIZE , GFP_KERNEL );
387
- if (!block )
388
- return - ENOMEM ;
393
+ if (!block ) {
394
+ ret = - ENOMEM ;
395
+ goto exit ;
396
+ }
397
+
398
+ dfu_state = kmalloc (sizeof (u8 ), GFP_KERNEL );
399
+ if (!dfu_state ) {
400
+ ret = - ENOMEM ;
401
+ goto exit ;
402
+ }
403
+ * dfu_state = 0 ;
389
404
390
405
do {
391
406
if (need_dfu_state ) {
392
- ret = at76_dfu_get_state (udev , & dfu_state );
407
+ ret = at76_dfu_get_state (udev , dfu_state );
393
408
if (ret < 0 ) {
394
409
dev_err (& udev -> dev ,
395
410
"cannot get DFU state: %d\n" , ret );
@@ -398,13 +413,13 @@ static int at76_usbdfu_download(struct usb_device *udev, u8 *buf, u32 size,
398
413
need_dfu_state = 0 ;
399
414
}
400
415
401
- switch (dfu_state ) {
416
+ switch (* dfu_state ) {
402
417
case STATE_DFU_DOWNLOAD_SYNC :
403
418
at76_dbg (DBG_DFU , "STATE_DFU_DOWNLOAD_SYNC" );
404
- ret = at76_dfu_get_status (udev , & dfu_stat_buf );
419
+ ret = at76_dfu_get_status (udev , dfu_stat_buf );
405
420
if (ret >= 0 ) {
406
- dfu_state = dfu_stat_buf . state ;
407
- dfu_timeout = at76_get_timeout (& dfu_stat_buf );
421
+ * dfu_state = dfu_stat_buf -> state ;
422
+ dfu_timeout = at76_get_timeout (dfu_stat_buf );
408
423
need_dfu_state = 0 ;
409
424
} else
410
425
dev_err (& udev -> dev ,
@@ -447,12 +462,12 @@ static int at76_usbdfu_download(struct usb_device *udev, u8 *buf, u32 size,
447
462
case STATE_DFU_MANIFEST_SYNC :
448
463
at76_dbg (DBG_DFU , "STATE_DFU_MANIFEST_SYNC" );
449
464
450
- ret = at76_dfu_get_status (udev , & dfu_stat_buf );
465
+ ret = at76_dfu_get_status (udev , dfu_stat_buf );
451
466
if (ret < 0 )
452
467
break ;
453
468
454
- dfu_state = dfu_stat_buf . state ;
455
- dfu_timeout = at76_get_timeout (& dfu_stat_buf );
469
+ * dfu_state = dfu_stat_buf -> state ;
470
+ dfu_timeout = at76_get_timeout (dfu_stat_buf );
456
471
need_dfu_state = 0 ;
457
472
458
473
/* override the timeout from the status response,
@@ -484,14 +499,17 @@ static int at76_usbdfu_download(struct usb_device *udev, u8 *buf, u32 size,
484
499
break ;
485
500
486
501
default :
487
- at76_dbg (DBG_DFU , "DFU UNKNOWN STATE (%d)" , dfu_state );
502
+ at76_dbg (DBG_DFU , "DFU UNKNOWN STATE (%d)" , * dfu_state );
488
503
ret = - EINVAL ;
489
504
break ;
490
505
}
491
506
} while (!is_done && (ret >= 0 ));
492
507
493
508
exit :
509
+ kfree (dfu_state );
494
510
kfree (block );
511
+ kfree (dfu_stat_buf );
512
+
495
513
if (ret >= 0 )
496
514
ret = 0 ;
497
515
@@ -1277,6 +1295,7 @@ static int at76_load_external_fw(struct usb_device *udev, struct fwentry *fwe)
1277
1295
dev_err (& udev -> dev ,
1278
1296
"loading %dth firmware block failed: %d\n" ,
1279
1297
blockno , ret );
1298
+ ret = - EIO ;
1280
1299
goto exit ;
1281
1300
}
1282
1301
buf += bsize ;
@@ -2330,16 +2349,22 @@ static int at76_probe(struct usb_interface *interface,
2330
2349
struct usb_device * udev ;
2331
2350
int op_mode ;
2332
2351
int need_ext_fw = 0 ;
2333
- struct mib_fw_version fwv ;
2352
+ struct mib_fw_version * fwv = NULL ;
2334
2353
int board_type = (int )id -> driver_info ;
2335
2354
2336
2355
udev = usb_get_dev (interface_to_usbdev (interface ));
2337
2356
2357
+ fwv = kmalloc (sizeof (* fwv ), GFP_KERNEL );
2358
+ if (!fwv ) {
2359
+ ret = - ENOMEM ;
2360
+ goto exit ;
2361
+ }
2362
+
2338
2363
/* Load firmware into kernel memory */
2339
2364
fwe = at76_load_firmware (udev , board_type );
2340
2365
if (!fwe ) {
2341
2366
ret = - ENOENT ;
2342
- goto error ;
2367
+ goto exit ;
2343
2368
}
2344
2369
2345
2370
op_mode = at76_get_op_mode (udev );
@@ -2353,7 +2378,7 @@ static int at76_probe(struct usb_interface *interface,
2353
2378
dev_err (& interface -> dev ,
2354
2379
"cannot handle a device in HW_CONFIG_MODE\n" );
2355
2380
ret = - EBUSY ;
2356
- goto error ;
2381
+ goto exit ;
2357
2382
}
2358
2383
2359
2384
if (op_mode != OPMODE_NORMAL_NIC_WITH_FLASH
@@ -2366,10 +2391,10 @@ static int at76_probe(struct usb_interface *interface,
2366
2391
dev_err (& interface -> dev ,
2367
2392
"error %d downloading internal firmware\n" ,
2368
2393
ret );
2369
- goto error ;
2394
+ goto exit ;
2370
2395
}
2371
2396
usb_put_dev (udev );
2372
- return ret ;
2397
+ goto exit ;
2373
2398
}
2374
2399
2375
2400
/* Internal firmware already inside the device. Get firmware
@@ -2382,8 +2407,8 @@ static int at76_probe(struct usb_interface *interface,
2382
2407
* query the device for the fw version */
2383
2408
if ((fwe -> fw_version .major > 0 || fwe -> fw_version .minor >= 100 )
2384
2409
|| (op_mode == OPMODE_NORMAL_NIC_WITH_FLASH )) {
2385
- ret = at76_get_mib (udev , MIB_FW_VERSION , & fwv , sizeof (fwv ));
2386
- if (ret < 0 || (fwv . major | fwv . minor ) == 0 )
2410
+ ret = at76_get_mib (udev , MIB_FW_VERSION , fwv , sizeof (* fwv ));
2411
+ if (ret < 0 || (fwv -> major | fwv -> minor ) == 0 )
2387
2412
need_ext_fw = 1 ;
2388
2413
} else
2389
2414
/* No way to check firmware version, reload to be sure */
@@ -2394,37 +2419,37 @@ static int at76_probe(struct usb_interface *interface,
2394
2419
"downloading external firmware\n" );
2395
2420
2396
2421
ret = at76_load_external_fw (udev , fwe );
2397
- if (ret )
2398
- goto error ;
2422
+ if (ret < 0 )
2423
+ goto exit ;
2399
2424
2400
2425
/* Re-check firmware version */
2401
- ret = at76_get_mib (udev , MIB_FW_VERSION , & fwv , sizeof (fwv ));
2426
+ ret = at76_get_mib (udev , MIB_FW_VERSION , fwv , sizeof (* fwv ));
2402
2427
if (ret < 0 ) {
2403
2428
dev_err (& interface -> dev ,
2404
2429
"error %d getting firmware version\n" , ret );
2405
- goto error ;
2430
+ goto exit ;
2406
2431
}
2407
2432
}
2408
2433
2409
2434
priv = at76_alloc_new_device (udev );
2410
2435
if (!priv ) {
2411
2436
ret = - ENOMEM ;
2412
- goto error ;
2437
+ goto exit ;
2413
2438
}
2414
2439
2415
2440
usb_set_intfdata (interface , priv );
2416
2441
2417
- memcpy (& priv -> fw_version , & fwv , sizeof (struct mib_fw_version ));
2442
+ memcpy (& priv -> fw_version , fwv , sizeof (struct mib_fw_version ));
2418
2443
priv -> board_type = board_type ;
2419
2444
2420
2445
ret = at76_init_new_device (priv , interface );
2421
2446
if (ret < 0 )
2422
2447
at76_delete_device (priv );
2423
2448
2424
- return ret ;
2425
-
2426
- error :
2427
- usb_put_dev (udev );
2449
+ exit :
2450
+ kfree ( fwv );
2451
+ if ( ret < 0 )
2452
+ usb_put_dev (udev );
2428
2453
return ret ;
2429
2454
}
2430
2455
0 commit comments