diff options
-rw-r--r-- | drivers/net/bnx2.c | 44 | ||||
-rw-r--r-- | drivers/net/bnx2.h | 6 |
2 files changed, 33 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)) { |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index efa0ca9a8fd3..7b882fd9d57f 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -6670,6 +6670,7 @@ struct bnx2 { | |||
6670 | #define BNX2_FLAG_USING_MSI_OR_MSIX (BNX2_FLAG_USING_MSI | \ | 6670 | #define BNX2_FLAG_USING_MSI_OR_MSIX (BNX2_FLAG_USING_MSI | \ |
6671 | BNX2_FLAG_USING_MSIX) | 6671 | BNX2_FLAG_USING_MSIX) |
6672 | #define BNX2_FLAG_JUMBO_BROKEN 0x00000800 | 6672 | #define BNX2_FLAG_JUMBO_BROKEN 0x00000800 |
6673 | #define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000 | ||
6673 | 6674 | ||
6674 | struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; | 6675 | struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; |
6675 | 6676 | ||
@@ -6951,6 +6952,7 @@ struct fw_info { | |||
6951 | #define BNX2_DRV_MSG_CODE_DIAG 0x07000000 | 6952 | #define BNX2_DRV_MSG_CODE_DIAG 0x07000000 |
6952 | #define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000 | 6953 | #define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000 |
6953 | #define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000 | 6954 | #define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000 |
6955 | #define BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE 0x0d000000 | ||
6954 | #define BNX2_DRV_MSG_CODE_CMD_SET_LINK 0x10000000 | 6956 | #define BNX2_DRV_MSG_CODE_CMD_SET_LINK 0x10000000 |
6955 | 6957 | ||
6956 | #define BNX2_DRV_MSG_DATA 0x00ff0000 | 6958 | #define BNX2_DRV_MSG_DATA 0x00ff0000 |
@@ -7279,6 +7281,10 @@ struct fw_info { | |||
7279 | #define BNX2_FW_CAP_SIGNATURE_MASK 0xffff0000 | 7281 | #define BNX2_FW_CAP_SIGNATURE_MASK 0xffff0000 |
7280 | #define BNX2_FW_CAP_REMOTE_PHY_CAPABLE 0x00000001 | 7282 | #define BNX2_FW_CAP_REMOTE_PHY_CAPABLE 0x00000001 |
7281 | #define BNX2_FW_CAP_REMOTE_PHY_PRESENT 0x00000002 | 7283 | #define BNX2_FW_CAP_REMOTE_PHY_PRESENT 0x00000002 |
7284 | #define BNX2_FW_CAP_MFW_CAN_KEEP_VLAN 0x00000008 | ||
7285 | #define BNX2_FW_CAP_BC_CAN_KEEP_VLAN 0x00000010 | ||
7286 | #define BNX2_FW_CAP_CAN_KEEP_VLAN (BNX2_FW_CAP_BC_CAN_KEEP_VLAN | \ | ||
7287 | BNX2_FW_CAP_MFW_CAN_KEEP_VLAN) | ||
7282 | 7288 | ||
7283 | #define BNX2_RPHY_SIGNATURE 0x36c | 7289 | #define BNX2_RPHY_SIGNATURE 0x36c |
7284 | #define BNX2_RPHY_LOAD_SIGNATURE 0x5a5a5a5a | 7290 | #define BNX2_RPHY_LOAD_SIGNATURE 0x5a5a5a5a |