Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] bnx2: update firmware handshake for 5708

Dynamically determine the shared memory location where eeprom
parameters are stored instead of using a fixed location.

Add speed reporting to management firmware. This allows management
firmware to know the current speed without contending for MII
registers.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Michael Chan and committed by
John W. Linville
e3648b3d 37137709

+122 -15
+79 -15
drivers/net/bnx2.c
··· 437 437 } 438 438 439 439 static void 440 + bnx2_report_fw_link(struct bnx2 *bp) 441 + { 442 + u32 fw_link_status = 0; 443 + 444 + if (bp->link_up) { 445 + u32 bmsr; 446 + 447 + switch (bp->line_speed) { 448 + case SPEED_10: 449 + if (bp->duplex == DUPLEX_HALF) 450 + fw_link_status = BNX2_LINK_STATUS_10HALF; 451 + else 452 + fw_link_status = BNX2_LINK_STATUS_10FULL; 453 + break; 454 + case SPEED_100: 455 + if (bp->duplex == DUPLEX_HALF) 456 + fw_link_status = BNX2_LINK_STATUS_100HALF; 457 + else 458 + fw_link_status = BNX2_LINK_STATUS_100FULL; 459 + break; 460 + case SPEED_1000: 461 + if (bp->duplex == DUPLEX_HALF) 462 + fw_link_status = BNX2_LINK_STATUS_1000HALF; 463 + else 464 + fw_link_status = BNX2_LINK_STATUS_1000FULL; 465 + break; 466 + case SPEED_2500: 467 + if (bp->duplex == DUPLEX_HALF) 468 + fw_link_status = BNX2_LINK_STATUS_2500HALF; 469 + else 470 + fw_link_status = BNX2_LINK_STATUS_2500FULL; 471 + break; 472 + } 473 + 474 + fw_link_status |= BNX2_LINK_STATUS_LINK_UP; 475 + 476 + if (bp->autoneg) { 477 + fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED; 478 + 479 + bnx2_read_phy(bp, MII_BMSR, &bmsr); 480 + bnx2_read_phy(bp, MII_BMSR, &bmsr); 481 + 482 + if (!(bmsr & BMSR_ANEGCOMPLETE) || 483 + bp->phy_flags & PHY_PARALLEL_DETECT_FLAG) 484 + fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET; 485 + else 486 + fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE; 487 + } 488 + } 489 + else 490 + fw_link_status = BNX2_LINK_STATUS_LINK_DOWN; 491 + 492 + REG_WR_IND(bp, bp->shmem_base + BNX2_LINK_STATUS, fw_link_status); 493 + } 494 + 495 + static void 440 496 bnx2_report_link(struct bnx2 *bp) 441 497 { 442 498 if (bp->link_up) { ··· 523 467 netif_carrier_off(bp->dev); 524 468 printk(KERN_ERR PFX "%s NIC Link is Down\n", bp->dev->name); 525 469 } 470 + 471 + bnx2_report_fw_link(bp); 526 472 } 527 473 528 474 static void ··· 1181 1123 bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG); 1182 1124 } 1183 1125 1184 - val = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_PORT_HW_CFG_CONFIG) & 1126 + val = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG) & 1185 1127 BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK; 1186 1128 1187 1129 if (val) { 1188 1130 u32 is_backplane; 1189 1131 1190 - is_backplane = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + 1132 + is_backplane = REG_RD_IND(bp, bp->shmem_base + 1191 1133 BNX2_SHARED_HW_CFG_CONFIG); 1192 1134 if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) { 1193 1135 bnx2_write_phy(bp, BCM5708S_BLK_ADDR, ··· 1338 1280 bp->fw_wr_seq++; 1339 1281 msg_data |= bp->fw_wr_seq; 1340 1282 1341 - REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_MB, msg_data); 1283 + REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data); 1342 1284 1343 1285 /* wait for an acknowledgement. */ 1344 1286 for (i = 0; i < (FW_ACK_TIME_OUT_MS * 1000)/5; i++) { 1345 1287 udelay(5); 1346 1288 1347 - val = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_FW_MB); 1289 + val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_MB); 1348 1290 1349 1291 if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ)) 1350 1292 break; ··· 1357 1299 msg_data &= ~BNX2_DRV_MSG_CODE; 1358 1300 msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT; 1359 1301 1360 - REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_MB, msg_data); 1302 + REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data); 1361 1303 1362 1304 bp->fw_timed_out = 1; 1363 1305 ··· 2993 2935 2994 2936 /* Deposit a driver reset signature so the firmware knows that 2995 2937 * this is a soft reset. */ 2996 - REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_RESET_SIGNATURE, 2938 + REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_RESET_SIGNATURE, 2997 2939 BNX2_DRV_RESET_SIGNATURE_MAGIC); 2998 2940 2999 2941 bp->fw_timed_out = 0; ··· 4070 4012 goto bnx2_restart_timer; 4071 4013 4072 4014 msg = (u32) ++bp->fw_drv_pulse_wr_seq; 4073 - REG_WR_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DRV_PULSE_MB, msg); 4015 + REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB, msg); 4074 4016 4075 4017 if ((bp->phy_flags & PHY_SERDES_FLAG) && 4076 4018 (CHIP_NUM(bp) == CHIP_NUM_5706)) { ··· 5541 5483 5542 5484 bnx2_init_nvram(bp); 5543 5485 5486 + reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE); 5487 + 5488 + if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) == 5489 + BNX2_SHM_HDR_SIGNATURE_SIG) 5490 + bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0); 5491 + else 5492 + bp->shmem_base = HOST_VIEW_SHMEM_BASE; 5493 + 5544 5494 /* Get the permanent MAC address. First we need to make sure the 5545 5495 * firmware is actually running. 5546 5496 */ 5547 - reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_DEV_INFO_SIGNATURE); 5497 + reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_SIGNATURE); 5548 5498 5549 5499 if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != 5550 5500 BNX2_DEV_INFO_SIGNATURE_MAGIC) { ··· 5561 5495 goto err_out_unmap; 5562 5496 } 5563 5497 5564 - bp->fw_ver = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + 5565 - BNX2_DEV_INFO_BC_REV); 5498 + bp->fw_ver = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_BC_REV); 5566 5499 5567 - reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_PORT_HW_CFG_MAC_UPPER); 5500 + reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_UPPER); 5568 5501 bp->mac_addr[0] = (u8) (reg >> 8); 5569 5502 bp->mac_addr[1] = (u8) reg; 5570 5503 5571 - reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + BNX2_PORT_HW_CFG_MAC_LOWER); 5504 + reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_LOWER); 5572 5505 bp->mac_addr[2] = (u8) (reg >> 24); 5573 5506 bp->mac_addr[3] = (u8) (reg >> 16); 5574 5507 bp->mac_addr[4] = (u8) (reg >> 8); ··· 5603 5538 bp->flags |= NO_WOL_FLAG; 5604 5539 if (CHIP_NUM(bp) == CHIP_NUM_5708) { 5605 5540 bp->phy_addr = 2; 5606 - reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + 5541 + reg = REG_RD_IND(bp, bp->shmem_base + 5607 5542 BNX2_SHARED_HW_CFG_CONFIG); 5608 5543 if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G) 5609 5544 bp->phy_flags |= PHY_2_5G_CAPABLE_FLAG; ··· 5627 5562 if (bp->phy_flags & PHY_SERDES_FLAG) { 5628 5563 bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg; 5629 5564 5630 - reg = REG_RD_IND(bp, HOST_VIEW_SHMEM_BASE + 5631 - BNX2_PORT_HW_CFG_CONFIG); 5565 + reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG); 5632 5566 reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK; 5633 5567 if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) { 5634 5568 bp->autoneg = 0;
+43
drivers/net/bnx2.h
··· 3715 3715 #define BNX2_MCP_ROM 0x00150000 3716 3716 #define BNX2_MCP_SCRATCH 0x00160000 3717 3717 3718 + #define BNX2_SHM_HDR_SIGNATURE BNX2_MCP_SCRATCH 3719 + #define BNX2_SHM_HDR_SIGNATURE_SIG_MASK 0xffff0000 3720 + #define BNX2_SHM_HDR_SIGNATURE_SIG 0x53530000 3721 + #define BNX2_SHM_HDR_SIGNATURE_VER_MASK 0x000000ff 3722 + #define BNX2_SHM_HDR_SIGNATURE_VER_ONE 0x00000001 3723 + 3724 + #define BNX2_SHM_HDR_ADDR_0 BNX2_MCP_SCRATCH + 4 3725 + #define BNX2_SHM_HDR_ADDR_1 BNX2_MCP_SCRATCH + 8 3726 + 3718 3727 3719 3728 #define NUM_MC_HASH_REGISTERS 8 3720 3729 ··· 4061 4052 4062 4053 u8 mac_addr[8]; 4063 4054 4055 + u32 shmem_base; 4056 + 4064 4057 u32 fw_ver; 4065 4058 4066 4059 int pm_cap; ··· 4202 4191 #define BNX2_FW_MSG_STATUS_FAILURE 0x00ff0000 4203 4192 4204 4193 #define BNX2_LINK_STATUS 0x0000000c 4194 + #define BNX2_LINK_STATUS_INIT_VALUE 0xffffffff 4195 + #define BNX2_LINK_STATUS_LINK_UP 0x1 4196 + #define BNX2_LINK_STATUS_LINK_DOWN 0x0 4197 + #define BNX2_LINK_STATUS_SPEED_MASK 0x1e 4198 + #define BNX2_LINK_STATUS_AN_INCOMPLETE (0<<1) 4199 + #define BNX2_LINK_STATUS_10HALF (1<<1) 4200 + #define BNX2_LINK_STATUS_10FULL (2<<1) 4201 + #define BNX2_LINK_STATUS_100HALF (3<<1) 4202 + #define BNX2_LINK_STATUS_100BASE_T4 (4<<1) 4203 + #define BNX2_LINK_STATUS_100FULL (5<<1) 4204 + #define BNX2_LINK_STATUS_1000HALF (6<<1) 4205 + #define BNX2_LINK_STATUS_1000FULL (7<<1) 4206 + #define BNX2_LINK_STATUS_2500HALF (8<<1) 4207 + #define BNX2_LINK_STATUS_2500FULL (9<<1) 4208 + #define BNX2_LINK_STATUS_AN_ENABLED (1<<5) 4209 + #define BNX2_LINK_STATUS_AN_COMPLETE (1<<6) 4210 + #define BNX2_LINK_STATUS_PARALLEL_DET (1<<7) 4211 + #define BNX2_LINK_STATUS_RESERVED (1<<8) 4212 + #define BNX2_LINK_STATUS_PARTNER_AD_1000FULL (1<<9) 4213 + #define BNX2_LINK_STATUS_PARTNER_AD_1000HALF (1<<10) 4214 + #define BNX2_LINK_STATUS_PARTNER_AD_100BT4 (1<<11) 4215 + #define BNX2_LINK_STATUS_PARTNER_AD_100FULL (1<<12) 4216 + #define BNX2_LINK_STATUS_PARTNER_AD_100HALF (1<<13) 4217 + #define BNX2_LINK_STATUS_PARTNER_AD_10FULL (1<<14) 4218 + #define BNX2_LINK_STATUS_PARTNER_AD_10HALF (1<<15) 4219 + #define BNX2_LINK_STATUS_TX_FC_ENABLED (1<<16) 4220 + #define BNX2_LINK_STATUS_RX_FC_ENABLED (1<<17) 4221 + #define BNX2_LINK_STATUS_PARTNER_SYM_PAUSE_CAP (1<<18) 4222 + #define BNX2_LINK_STATUS_PARTNER_ASYM_PAUSE_CAP (1<<19) 4223 + #define BNX2_LINK_STATUS_SERDES_LINK (1<<20) 4224 + #define BNX2_LINK_STATUS_PARTNER_AD_2500FULL (1<<21) 4225 + #define BNX2_LINK_STATUS_PARTNER_AD_2500HALF (1<<22) 4205 4226 4206 4227 #define BNX2_DRV_PULSE_MB 0x00000010 4207 4228 #define BNX2_DRV_PULSE_SEQ_MASK 0x00007fff