@@ -435,6 +435,29 @@ static int tb_drom_parse_entries(struct tb_switch *sw, size_t header_size)
435
435
return 0 ;
436
436
}
437
437
438
+ static int tb_switch_drom_alloc (struct tb_switch * sw , size_t size )
439
+ {
440
+ sw -> drom = kzalloc (size , GFP_KERNEL );
441
+ if (!sw -> drom )
442
+ return - ENOMEM ;
443
+
444
+ #ifdef CONFIG_DEBUG_FS
445
+ sw -> drom_blob .data = sw -> drom ;
446
+ sw -> drom_blob .size = size ;
447
+ #endif
448
+ return 0 ;
449
+ }
450
+
451
+ static void tb_switch_drom_free (struct tb_switch * sw )
452
+ {
453
+ #ifdef CONFIG_DEBUG_FS
454
+ sw -> drom_blob .data = NULL ;
455
+ sw -> drom_blob .size = 0 ;
456
+ #endif
457
+ kfree (sw -> drom );
458
+ sw -> drom = NULL ;
459
+ }
460
+
438
461
/*
439
462
* tb_drom_copy_efi - copy drom supplied by EFI to sw->drom if present
440
463
*/
@@ -447,9 +470,9 @@ static int tb_drom_copy_efi(struct tb_switch *sw, u16 *size)
447
470
if (len < 0 || len < sizeof (struct tb_drom_header ))
448
471
return - EINVAL ;
449
472
450
- sw -> drom = kmalloc ( len , GFP_KERNEL );
451
- if (! sw -> drom )
452
- return - ENOMEM ;
473
+ res = tb_switch_drom_alloc ( sw , len );
474
+ if (res )
475
+ return res ;
453
476
454
477
res = device_property_read_u8_array (dev , "ThunderboltDROM" , sw -> drom ,
455
478
len );
@@ -464,8 +487,7 @@ static int tb_drom_copy_efi(struct tb_switch *sw, u16 *size)
464
487
return 0 ;
465
488
466
489
err :
467
- kfree (sw -> drom );
468
- sw -> drom = NULL ;
490
+ tb_switch_drom_free (sw );
469
491
return - EINVAL ;
470
492
}
471
493
@@ -491,25 +513,22 @@ static int tb_drom_copy_nvm(struct tb_switch *sw, u16 *size)
491
513
492
514
/* Size includes CRC8 + UID + CRC32 */
493
515
* size += 1 + 8 + 4 ;
494
- sw -> drom = kzalloc ( * size , GFP_KERNEL );
495
- if (! sw -> drom )
496
- return - ENOMEM ;
516
+ ret = tb_switch_drom_alloc ( sw , * size );
517
+ if (ret )
518
+ return ret ;
497
519
498
520
ret = dma_port_flash_read (sw -> dma_port , drom_offset , sw -> drom , * size );
499
- if (ret )
500
- goto err_free ;
521
+ if (ret ) {
522
+ tb_switch_drom_free (sw );
523
+ return ret ;
524
+ }
501
525
502
526
/*
503
527
* Read UID from the minimal DROM because the one in NVM is just
504
528
* a placeholder.
505
529
*/
506
530
tb_drom_read_uid_only (sw , & sw -> uid );
507
531
return 0 ;
508
-
509
- err_free :
510
- kfree (sw -> drom );
511
- sw -> drom = NULL ;
512
- return ret ;
513
532
}
514
533
515
534
static int usb4_copy_drom (struct tb_switch * sw , u16 * size )
@@ -522,15 +541,13 @@ static int usb4_copy_drom(struct tb_switch *sw, u16 *size)
522
541
523
542
/* Size includes CRC8 + UID + CRC32 */
524
543
* size += 1 + 8 + 4 ;
525
- sw -> drom = kzalloc ( * size , GFP_KERNEL );
526
- if (! sw -> drom )
527
- return - ENOMEM ;
544
+ ret = tb_switch_drom_alloc ( sw , * size );
545
+ if (ret )
546
+ return ret ;
528
547
529
548
ret = usb4_switch_drom_read (sw , 0 , sw -> drom , * size );
530
- if (ret ) {
531
- kfree (sw -> drom );
532
- sw -> drom = NULL ;
533
- }
549
+ if (ret )
550
+ tb_switch_drom_free (sw );
534
551
535
552
return ret ;
536
553
}
@@ -552,19 +569,14 @@ static int tb_drom_bit_bang(struct tb_switch *sw, u16 *size)
552
569
return - EIO ;
553
570
}
554
571
555
- sw -> drom = kzalloc ( * size , GFP_KERNEL );
556
- if (! sw -> drom )
557
- return - ENOMEM ;
572
+ ret = tb_switch_drom_alloc ( sw , * size );
573
+ if (ret )
574
+ return ret ;
558
575
559
576
ret = tb_eeprom_read_n (sw , 0 , sw -> drom , * size );
560
577
if (ret )
561
- goto err ;
562
-
563
- return 0 ;
578
+ tb_switch_drom_free (sw );
564
579
565
- err :
566
- kfree (sw -> drom );
567
- sw -> drom = NULL ;
568
580
return ret ;
569
581
}
570
582
@@ -646,9 +658,7 @@ static int tb_drom_parse(struct tb_switch *sw, u16 size)
646
658
return 0 ;
647
659
648
660
err :
649
- kfree (sw -> drom );
650
- sw -> drom = NULL ;
651
-
661
+ tb_switch_drom_free (sw );
652
662
return ret ;
653
663
}
654
664
0 commit comments