diff options
Diffstat (limited to 'drivers/net/bnx2.c')
-rw-r--r-- | drivers/net/bnx2.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 4dfd43917aea..2d0213ed6e7d 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -4255,35 +4255,43 @@ nvram_write_end: | |||
4255 | } | 4255 | } |
4256 | 4256 | ||
4257 | static void | 4257 | static void |
4258 | bnx2_init_remote_phy(struct bnx2 *bp) | 4258 | bnx2_init_fw_cap(struct bnx2 *bp) |
4259 | { | 4259 | { |
4260 | u32 val; | 4260 | u32 val, sig = 0; |
4261 | 4261 | ||
4262 | bp->phy_flags &= ~BNX2_PHY_FLAG_REMOTE_PHY_CAP; | 4262 | bp->phy_flags &= ~BNX2_PHY_FLAG_REMOTE_PHY_CAP; |
4263 | if (!(bp->phy_flags & BNX2_PHY_FLAG_SERDES)) | 4263 | bp->flags &= ~BNX2_FLAG_CAN_KEEP_VLAN; |
4264 | return; | 4264 | |
4265 | if (!(bp->flags & BNX2_FLAG_ASF_ENABLE)) | ||
4266 | bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN; | ||
4265 | 4267 | ||
4266 | val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB); | 4268 | val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB); |
4267 | if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE) | 4269 | if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE) |
4268 | return; | 4270 | return; |
4269 | 4271 | ||
4270 | if (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE) { | 4272 | if ((val & BNX2_FW_CAP_CAN_KEEP_VLAN) == BNX2_FW_CAP_CAN_KEEP_VLAN) { |
4273 | bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN; | ||
4274 | sig |= BNX2_DRV_ACK_CAP_SIGNATURE | BNX2_FW_CAP_CAN_KEEP_VLAN; | ||
4275 | } | ||
4276 | |||
4277 | if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && | ||
4278 | (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE)) { | ||
4279 | u32 link; | ||
4280 | |||
4271 | bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP; | 4281 | bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP; |
4272 | 4282 | ||
4273 | val = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); | 4283 | link = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); |
4274 | if (val & BNX2_LINK_STATUS_SERDES_LINK) | 4284 | if (link & BNX2_LINK_STATUS_SERDES_LINK) |
4275 | bp->phy_port = PORT_FIBRE; | 4285 | bp->phy_port = PORT_FIBRE; |
4276 | else | 4286 | else |
4277 | bp->phy_port = PORT_TP; | 4287 | bp->phy_port = PORT_TP; |
4278 | 4288 | ||
4279 | if (netif_running(bp->dev)) { | 4289 | sig |= BNX2_DRV_ACK_CAP_SIGNATURE | |
4280 | u32 sig; | 4290 | BNX2_FW_CAP_REMOTE_PHY_CAPABLE; |
4281 | |||
4282 | sig = BNX2_DRV_ACK_CAP_SIGNATURE | | ||
4283 | BNX2_FW_CAP_REMOTE_PHY_CAPABLE; | ||
4284 | bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig); | ||
4285 | } | ||
4286 | } | 4291 | } |
4292 | |||
4293 | if (netif_running(bp->dev) && sig) | ||
4294 | bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig); | ||
4287 | } | 4295 | } |
4288 | 4296 | ||
4289 | static void | 4297 | static void |
@@ -4380,7 +4388,7 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) | |||
4380 | 4388 | ||
4381 | spin_lock_bh(&bp->phy_lock); | 4389 | spin_lock_bh(&bp->phy_lock); |
4382 | old_port = bp->phy_port; | 4390 | old_port = bp->phy_port; |
4383 | bnx2_init_remote_phy(bp); | 4391 | bnx2_init_fw_cap(bp); |
4384 | if ((bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) && | 4392 | if ((bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) && |
4385 | old_port != bp->phy_port) | 4393 | old_port != bp->phy_port) |
4386 | bnx2_set_default_remote_link(bp); | 4394 | bnx2_set_default_remote_link(bp); |
@@ -5879,6 +5887,8 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) | |||
5879 | 5887 | ||
5880 | bp->vlgrp = vlgrp; | 5888 | bp->vlgrp = vlgrp; |
5881 | bnx2_set_rx_mode(dev); | 5889 | bnx2_set_rx_mode(dev); |
5890 | if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) | ||
5891 | bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); | ||
5882 | 5892 | ||
5883 | bnx2_netif_start(bp); | 5893 | bnx2_netif_start(bp); |
5884 | } | 5894 | } |
@@ -7483,8 +7493,6 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7483 | if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G) | 7493 | if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G) |
7484 | bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE; | 7494 | bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE; |
7485 | } | 7495 | } |
7486 | bnx2_init_remote_phy(bp); | ||
7487 | |||
7488 | } else if (CHIP_NUM(bp) == CHIP_NUM_5706 || | 7496 | } else if (CHIP_NUM(bp) == CHIP_NUM_5706 || |
7489 | CHIP_NUM(bp) == CHIP_NUM_5708) | 7497 | CHIP_NUM(bp) == CHIP_NUM_5708) |
7490 | bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX; | 7498 | bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX; |
@@ -7493,6 +7501,8 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7493 | CHIP_REV(bp) == CHIP_REV_Bx)) | 7501 | CHIP_REV(bp) == CHIP_REV_Bx)) |
7494 | bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC; | 7502 | bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC; |
7495 | 7503 | ||
7504 | bnx2_init_fw_cap(bp); | ||
7505 | |||
7496 | if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || | 7506 | if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || |
7497 | (CHIP_ID(bp) == CHIP_ID_5708_B0) || | 7507 | (CHIP_ID(bp) == CHIP_ID_5708_B0) || |
7498 | (CHIP_ID(bp) == CHIP_ID_5708_B1)) { | 7508 | (CHIP_ID(bp) == CHIP_ID_5708_B1)) { |