|
@@ -3382,31 +3382,55 @@ static int hermon_bofm_update ( struct bofm_device *bofm, unsigned int mport,
|
3382
|
3382
|
union {
|
3383
|
3383
|
uint8_t bytes[8];
|
3384
|
3384
|
uint32_t dwords[2];
|
|
3385
|
+ uint64_t qword;
|
3385
|
3386
|
} buf;
|
|
3387
|
+ uint8_t *mac_copy = &buf.bytes[ sizeof ( buf.bytes ) - ETH_ALEN ];
|
3386
|
3388
|
int rc;
|
3387
|
3389
|
|
3388
|
3390
|
/* Prepare MAC address */
|
3389
|
3391
|
memset ( &buf, 0, sizeof ( buf ) );
|
3390
|
|
- memcpy ( &buf.bytes[ sizeof ( buf.bytes ) - ETH_ALEN ], mac,
|
3391
|
|
- ETH_ALEN );
|
|
3392
|
+ memcpy ( mac_copy, mac, ETH_ALEN );
|
3392
|
3393
|
|
3393
|
|
- /* Modify static configuration */
|
3394
|
|
- memset ( &stat_cfg, 0, sizeof ( stat_cfg ) );
|
3395
|
|
- MLX_FILL_2 ( &stat_cfg, 36,
|
3396
|
|
- mac_m, 1,
|
3397
|
|
- mac_high, ntohl ( buf.dwords[0] ) );
|
3398
|
|
- MLX_FILL_1 ( &stat_cfg, 37, mac_low, ntohl ( buf.dwords[1] ) );
|
3399
|
|
- if ( ( rc = hermon_mod_stat_cfg ( hermon, mport,
|
|
3394
|
+ /* Current BOFM versions are unable to create entries with
|
|
3395
|
+ * mport>1, which means that only the port 1 MAC address can
|
|
3396
|
+ * be explicitly specified. Work around this by using the
|
|
3397
|
+ * provided MAC address as a base address for all subsequent
|
|
3398
|
+ * ports. For example, if BOFM assigns the address
|
|
3399
|
+ *
|
|
3400
|
+ * 00:1A:64:76:00:09 for port 1
|
|
3401
|
+ *
|
|
3402
|
+ * then we will assign the addresses
|
|
3403
|
+ *
|
|
3404
|
+ * 00:1A:64:76:00:09 for port 1
|
|
3405
|
+ * 00:1A:64:76:00:0a for port 2
|
|
3406
|
+ *
|
|
3407
|
+ * Note that hermon->cap.num_ports is not yet defined at this
|
|
3408
|
+ * point.
|
|
3409
|
+ */
|
|
3410
|
+ for ( ; mport <= HERMON_MAX_PORTS ; mport++ ) {
|
|
3411
|
+
|
|
3412
|
+ /* Modify static configuration */
|
|
3413
|
+ memset ( &stat_cfg, 0, sizeof ( stat_cfg ) );
|
|
3414
|
+ MLX_FILL_2 ( &stat_cfg, 36,
|
|
3415
|
+ mac_m, 1,
|
|
3416
|
+ mac_high, ntohl ( buf.dwords[0] ) );
|
|
3417
|
+ MLX_FILL_1 ( &stat_cfg, 37, mac_low, ntohl ( buf.dwords[1] ) );
|
|
3418
|
+ if ( ( rc = hermon_mod_stat_cfg ( hermon, mport,
|
3400
|
3419
|
HERMON_MOD_STAT_CFG_SET,
|
3401
|
3420
|
HERMON_MOD_STAT_CFG_OFFSET ( mac_m ),
|
3402
|
3421
|
&stat_cfg ) ) != 0 ) {
|
3403
|
|
- DBGC ( hermon, "Hermon %p port %d could not modify "
|
3404
|
|
- "configuration: %s\n", hermon, mport, strerror ( rc ) );
|
3405
|
|
- return rc;
|
3406
|
|
- }
|
|
3422
|
+ DBGC ( hermon, "Hermon %p port %d could not modify "
|
|
3423
|
+ "configuration: %s\n",
|
|
3424
|
+ hermon, mport, strerror ( rc ) );
|
|
3425
|
+ return rc;
|
|
3426
|
+ }
|
3407
|
3427
|
|
3408
|
|
- DBGC ( hermon, "Hermon %p port %d updated MAC address to %s\n",
|
3409
|
|
- hermon, mport, eth_ntoa ( mac ) );
|
|
3428
|
+ DBGC ( hermon, "Hermon %p port %d updated MAC address to %s\n",
|
|
3429
|
+ hermon, mport, eth_ntoa ( mac_copy ) );
|
|
3430
|
+
|
|
3431
|
+ /* Increment MAC address */
|
|
3432
|
+ buf.qword = cpu_to_be64 ( be64_to_cpu ( buf.qword ) + 1 );
|
|
3433
|
+ }
|
3410
|
3434
|
|
3411
|
3435
|
return 0;
|
3412
|
3436
|
}
|