74
74
__stringify(BCM_5710_FW_MINOR_VERSION) "." \
75
75
__stringify(BCM_5710_FW_REVISION_VERSION) "." \
76
76
__stringify(BCM_5710_FW_ENGINEERING_VERSION)
77
+
78
+ #define FW_FILE_VERSION_V15 \
79
+ __stringify(BCM_5710_FW_MAJOR_VERSION) "." \
80
+ __stringify(BCM_5710_FW_MINOR_VERSION) "." \
81
+ __stringify(BCM_5710_FW_REVISION_VERSION_V15) "." \
82
+ __stringify(BCM_5710_FW_ENGINEERING_VERSION)
83
+
77
84
#define FW_FILE_NAME_E1 "bnx2x/bnx2x-e1-" FW_FILE_VERSION ".fw"
78
85
#define FW_FILE_NAME_E1H "bnx2x/bnx2x-e1h-" FW_FILE_VERSION ".fw"
79
86
#define FW_FILE_NAME_E2 "bnx2x/bnx2x-e2-" FW_FILE_VERSION ".fw"
87
+ #define FW_FILE_NAME_E1_V15 "bnx2x/bnx2x-e1-" FW_FILE_VERSION_V15 ".fw"
88
+ #define FW_FILE_NAME_E1H_V15 "bnx2x/bnx2x-e1h-" FW_FILE_VERSION_V15 ".fw"
89
+ #define FW_FILE_NAME_E2_V15 "bnx2x/bnx2x-e2-" FW_FILE_VERSION_V15 ".fw"
80
90
81
91
/* Time in jiffies before concluding the transmitter is hung */
82
92
#define TX_TIMEOUT (5*HZ)
@@ -747,9 +757,7 @@ static int bnx2x_mc_assert(struct bnx2x *bp)
747
757
CHIP_IS_E1 (bp ) ? "everest1" :
748
758
CHIP_IS_E1H (bp ) ? "everest1h" :
749
759
CHIP_IS_E2 (bp ) ? "everest2" : "everest3" ,
750
- BCM_5710_FW_MAJOR_VERSION ,
751
- BCM_5710_FW_MINOR_VERSION ,
752
- BCM_5710_FW_REVISION_VERSION );
760
+ bp -> fw_major , bp -> fw_minor , bp -> fw_rev );
753
761
754
762
return rc ;
755
763
}
@@ -12308,6 +12316,15 @@ static int bnx2x_init_bp(struct bnx2x *bp)
12308
12316
12309
12317
bnx2x_read_fwinfo (bp );
12310
12318
12319
+ if (IS_PF (bp )) {
12320
+ rc = bnx2x_init_firmware (bp );
12321
+
12322
+ if (rc ) {
12323
+ bnx2x_free_mem_bp (bp );
12324
+ return rc ;
12325
+ }
12326
+ }
12327
+
12311
12328
func = BP_FUNC (bp );
12312
12329
12313
12330
/* need to reset chip if undi was active */
@@ -12320,6 +12337,7 @@ static int bnx2x_init_bp(struct bnx2x *bp)
12320
12337
12321
12338
rc = bnx2x_prev_unload (bp );
12322
12339
if (rc ) {
12340
+ bnx2x_release_firmware (bp );
12323
12341
bnx2x_free_mem_bp (bp );
12324
12342
return rc ;
12325
12343
}
@@ -13317,16 +13335,11 @@ static int bnx2x_check_firmware(struct bnx2x *bp)
13317
13335
/* Check FW version */
13318
13336
offset = be32_to_cpu (fw_hdr -> fw_version .offset );
13319
13337
fw_ver = firmware -> data + offset ;
13320
- if ((fw_ver [0 ] != BCM_5710_FW_MAJOR_VERSION ) ||
13321
- (fw_ver [1 ] != BCM_5710_FW_MINOR_VERSION ) ||
13322
- (fw_ver [2 ] != BCM_5710_FW_REVISION_VERSION ) ||
13323
- (fw_ver [3 ] != BCM_5710_FW_ENGINEERING_VERSION )) {
13338
+ if (fw_ver [0 ] != bp -> fw_major || fw_ver [1 ] != bp -> fw_minor ||
13339
+ fw_ver [2 ] != bp -> fw_rev || fw_ver [3 ] != bp -> fw_eng ) {
13324
13340
BNX2X_ERR ("Bad FW version:%d.%d.%d.%d. Should be %d.%d.%d.%d\n" ,
13325
- fw_ver [0 ], fw_ver [1 ], fw_ver [2 ], fw_ver [3 ],
13326
- BCM_5710_FW_MAJOR_VERSION ,
13327
- BCM_5710_FW_MINOR_VERSION ,
13328
- BCM_5710_FW_REVISION_VERSION ,
13329
- BCM_5710_FW_ENGINEERING_VERSION );
13341
+ fw_ver [0 ], fw_ver [1 ], fw_ver [2 ], fw_ver [3 ],
13342
+ bp -> fw_major , bp -> fw_minor , bp -> fw_rev , bp -> fw_eng );
13330
13343
return - EINVAL ;
13331
13344
}
13332
13345
@@ -13404,34 +13417,51 @@ do { \
13404
13417
(u8 *)bp->arr, len); \
13405
13418
} while (0)
13406
13419
13407
- static int bnx2x_init_firmware (struct bnx2x * bp )
13420
+ int bnx2x_init_firmware (struct bnx2x * bp )
13408
13421
{
13409
- const char * fw_file_name ;
13422
+ const char * fw_file_name , * fw_file_name_v15 ;
13410
13423
struct bnx2x_fw_file_hdr * fw_hdr ;
13411
13424
int rc ;
13412
13425
13413
13426
if (bp -> firmware )
13414
13427
return 0 ;
13415
13428
13416
- if (CHIP_IS_E1 (bp ))
13429
+ if (CHIP_IS_E1 (bp )) {
13417
13430
fw_file_name = FW_FILE_NAME_E1 ;
13418
- else if (CHIP_IS_E1H (bp ))
13431
+ fw_file_name_v15 = FW_FILE_NAME_E1_V15 ;
13432
+ } else if (CHIP_IS_E1H (bp )) {
13419
13433
fw_file_name = FW_FILE_NAME_E1H ;
13420
- else if (!CHIP_IS_E1x (bp ))
13434
+ fw_file_name_v15 = FW_FILE_NAME_E1H_V15 ;
13435
+ } else if (!CHIP_IS_E1x (bp )) {
13421
13436
fw_file_name = FW_FILE_NAME_E2 ;
13422
- else {
13437
+ fw_file_name_v15 = FW_FILE_NAME_E2_V15 ;
13438
+ } else {
13423
13439
BNX2X_ERR ("Unsupported chip revision\n" );
13424
13440
return - EINVAL ;
13425
13441
}
13442
+
13426
13443
BNX2X_DEV_INFO ("Loading %s\n" , fw_file_name );
13427
13444
13428
13445
rc = request_firmware (& bp -> firmware , fw_file_name , & bp -> pdev -> dev );
13429
13446
if (rc ) {
13430
- BNX2X_ERR ("Can't load firmware file %s\n" ,
13431
- fw_file_name );
13432
- goto request_firmware_exit ;
13447
+ BNX2X_DEV_INFO ("Trying to load older fw %s\n" , fw_file_name_v15 );
13448
+
13449
+ /* try to load prev version */
13450
+ rc = request_firmware (& bp -> firmware , fw_file_name_v15 , & bp -> pdev -> dev );
13451
+
13452
+ if (rc )
13453
+ goto request_firmware_exit ;
13454
+
13455
+ bp -> fw_rev = BCM_5710_FW_REVISION_VERSION_V15 ;
13456
+ } else {
13457
+ bp -> fw_cap |= FW_CAP_INVALIDATE_VF_FP_HSI ;
13458
+ bp -> fw_rev = BCM_5710_FW_REVISION_VERSION ;
13433
13459
}
13434
13460
13461
+ bp -> fw_major = BCM_5710_FW_MAJOR_VERSION ;
13462
+ bp -> fw_minor = BCM_5710_FW_MINOR_VERSION ;
13463
+ bp -> fw_eng = BCM_5710_FW_ENGINEERING_VERSION ;
13464
+
13435
13465
rc = bnx2x_check_firmware (bp );
13436
13466
if (rc ) {
13437
13467
BNX2X_ERR ("Corrupt firmware file %s\n" , fw_file_name );
@@ -13487,7 +13517,7 @@ static int bnx2x_init_firmware(struct bnx2x *bp)
13487
13517
return rc ;
13488
13518
}
13489
13519
13490
- static void bnx2x_release_firmware (struct bnx2x * bp )
13520
+ void bnx2x_release_firmware (struct bnx2x * bp )
13491
13521
{
13492
13522
kfree (bp -> init_ops_offsets );
13493
13523
kfree (bp -> init_ops );
@@ -14004,6 +14034,7 @@ static int bnx2x_init_one(struct pci_dev *pdev,
14004
14034
return 0 ;
14005
14035
14006
14036
init_one_freemem :
14037
+ bnx2x_release_firmware (bp );
14007
14038
bnx2x_free_mem_bp (bp );
14008
14039
14009
14040
init_one_exit :
0 commit comments