aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/bnx2x
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2011-07-04 21:06:53 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-05 07:21:40 -0400
commit85242eea68f5039458afad0e4030828496bb4034 (patch)
treeefc81e33f4c680a570a21d09718e15046be35180 /drivers/net/bnx2x
parent985848f80ffc61a29d9a72fec46ddce3c9643636 (diff)
bnx2x: Fix false link indication at link partner when DAC is used
When driver is unloaded, disable PMD in addition to TX laser, provided that the management firmware will be able to enable it back. Signed-off-by: Yaniv Rosner <yanivr@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bnx2x')
-rw-r--r--drivers/net/bnx2x/bnx2x_hsi.h1
-rw-r--r--drivers/net/bnx2x/bnx2x_link.c35
-rw-r--r--drivers/net/bnx2x/bnx2x_link.h1
-rw-r--r--drivers/net/bnx2x/bnx2x_main.c4
-rw-r--r--drivers/net/bnx2x/bnx2x_reg.h1
5 files changed, 42 insertions, 0 deletions
diff --git a/drivers/net/bnx2x/bnx2x_hsi.h b/drivers/net/bnx2x/bnx2x_hsi.h
index e6f816df88b8..52c190f6529a 100644
--- a/drivers/net/bnx2x/bnx2x_hsi.h
+++ b/drivers/net/bnx2x/bnx2x_hsi.h
@@ -1236,6 +1236,7 @@ struct drv_func_mb {
1236 #define REQ_BC_VER_4_VRFY_FIRST_PHY_OPT_MDL 0x00050006 1236 #define REQ_BC_VER_4_VRFY_FIRST_PHY_OPT_MDL 0x00050006
1237 #define DRV_MSG_CODE_VRFY_SPECIFIC_PHY_OPT_MDL 0xa1000000 1237 #define DRV_MSG_CODE_VRFY_SPECIFIC_PHY_OPT_MDL 0xa1000000
1238 #define REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL 0x00050234 1238 #define REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL 0x00050234
1239 #define REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED 0x00070014
1239 1240
1240 #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000 1241 #define DRV_MSG_CODE_DCBX_ADMIN_PMF_MSG 0xb0000000
1241 #define DRV_MSG_CODE_DCBX_PMF_DRV_OK 0xb2000000 1242 #define DRV_MSG_CODE_DCBX_PMF_DRV_OK 0xb2000000
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c
index a04fa13ad1c2..144cfae39661 100644
--- a/drivers/net/bnx2x/bnx2x_link.c
+++ b/drivers/net/bnx2x/bnx2x_link.c
@@ -7195,6 +7195,30 @@ static u8 bnx2x_8705_read_status(struct bnx2x_phy *phy,
7195/******************************************************************/ 7195/******************************************************************/
7196/* SFP+ module Section */ 7196/* SFP+ module Section */
7197/******************************************************************/ 7197/******************************************************************/
7198static void bnx2x_set_disable_pmd_transmit(struct link_params *params,
7199 struct bnx2x_phy *phy,
7200 u8 pmd_dis)
7201{
7202 struct bnx2x *bp = params->bp;
7203 /*
7204 * Disable transmitter only for bootcodes which can enable it afterwards
7205 * (for D3 link)
7206 */
7207 if (pmd_dis) {
7208 if (params->feature_config_flags &
7209 FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED)
7210 DP(NETIF_MSG_LINK, "Disabling PMD transmitter\n");
7211 else {
7212 DP(NETIF_MSG_LINK, "NOT disabling PMD transmitter\n");
7213 return;
7214 }
7215 } else
7216 DP(NETIF_MSG_LINK, "Enabling PMD transmitter\n");
7217 bnx2x_cl45_write(bp, phy,
7218 MDIO_PMA_DEVAD,
7219 MDIO_PMA_REG_TX_DISABLE, pmd_dis);
7220}
7221
7198static u8 bnx2x_get_gpio_port(struct link_params *params) 7222static u8 bnx2x_get_gpio_port(struct link_params *params)
7199{ 7223{
7200 u8 gpio_port; 7224 u8 gpio_port;
@@ -8598,6 +8622,9 @@ static int bnx2x_8727_config_init(struct bnx2x_phy *phy,
8598 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs); 8622 MDIO_PMA_DEVAD, MDIO_PMA_REG_PHY_IDENTIFIER, mod_abs);
8599 8623
8600 8624
8625 /* Enable/Disable PHY transmitter output */
8626 bnx2x_set_disable_pmd_transmit(params, phy, 0);
8627
8601 /* Make MOD_ABS give interrupt on change */ 8628 /* Make MOD_ABS give interrupt on change */
8602 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL, 8629 bnx2x_cl45_read(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL,
8603 &val); 8630 &val);
@@ -8972,6 +8999,10 @@ static void bnx2x_8727_link_reset(struct bnx2x_phy *phy,
8972 struct link_params *params) 8999 struct link_params *params)
8973{ 9000{
8974 struct bnx2x *bp = params->bp; 9001 struct bnx2x *bp = params->bp;
9002
9003 /* Enable/Disable PHY transmitter output */
9004 bnx2x_set_disable_pmd_transmit(params, phy, 1);
9005
8975 /* Disable Transmitter */ 9006 /* Disable Transmitter */
8976 bnx2x_sfp_set_transmitter(params, phy, 0); 9007 bnx2x_sfp_set_transmitter(params, phy, 0);
8977 /* Clear LASI */ 9008 /* Clear LASI */
@@ -11895,6 +11926,10 @@ static int bnx2x_8727_common_init_phy(struct bnx2x *bp,
11895 if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port], 11926 if (bnx2x_8073_8727_external_rom_boot(bp, phy_blk[port],
11896 port_of_path)) 11927 port_of_path))
11897 return -EINVAL; 11928 return -EINVAL;
11929 /* Disable PHY transmitter output */
11930 bnx2x_cl45_write(bp, phy_blk[port],
11931 MDIO_PMA_DEVAD,
11932 MDIO_PMA_REG_TX_DISABLE, 1);
11898 11933
11899 } 11934 }
11900 return 0; 11935 return 0;
diff --git a/drivers/net/bnx2x/bnx2x_link.h b/drivers/net/bnx2x/bnx2x_link.h
index 6f299c2fd3e4..ba4d1f76283f 100644
--- a/drivers/net/bnx2x/bnx2x_link.h
+++ b/drivers/net/bnx2x/bnx2x_link.h
@@ -250,6 +250,7 @@ struct link_params {
250#define FEATURE_CONFIG_PFC_ENABLED (1<<1) 250#define FEATURE_CONFIG_PFC_ENABLED (1<<1)
251#define FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY (1<<2) 251#define FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY (1<<2)
252#define FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY (1<<3) 252#define FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY (1<<3)
253#define FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED (1<<10)
253 /* Will be populated during common init */ 254 /* Will be populated during common init */
254 struct bnx2x_phy phy[MAX_PHYS]; 255 struct bnx2x_phy phy[MAX_PHYS];
255 256
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c
index b6f82ebc30aa..98604350a811 100644
--- a/drivers/net/bnx2x/bnx2x_main.c
+++ b/drivers/net/bnx2x/bnx2x_main.c
@@ -8349,6 +8349,10 @@ static void __devinit bnx2x_get_common_hwinfo(struct bnx2x *bp)
8349 (val >= REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL) ? 8349 (val >= REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL) ?
8350 FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY : 0; 8350 FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY : 0;
8351 8351
8352 bp->link_params.feature_config_flags |=
8353 (val >= REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED) ?
8354 FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED : 0;
8355
8352 pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_PMC, &pmc); 8356 pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_PMC, &pmc);
8353 bp->flags |= (pmc & PCI_PM_CAP_PME_D3cold) ? 0 : NO_WOL_FLAG; 8357 bp->flags |= (pmc & PCI_PM_CAP_PME_D3cold) ? 0 : NO_WOL_FLAG;
8354 8358
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h
index c97ce37f62da..3c7702e449cd 100644
--- a/drivers/net/bnx2x/bnx2x_reg.h
+++ b/drivers/net/bnx2x/bnx2x_reg.h
@@ -6618,6 +6618,7 @@ Theotherbitsarereservedandshouldbezero*/
6618#define MDIO_PMA_REG_CTRL 0x0 6618#define MDIO_PMA_REG_CTRL 0x0
6619#define MDIO_PMA_REG_STATUS 0x1 6619#define MDIO_PMA_REG_STATUS 0x1
6620#define MDIO_PMA_REG_10G_CTRL2 0x7 6620#define MDIO_PMA_REG_10G_CTRL2 0x7
6621#define MDIO_PMA_REG_TX_DISABLE 0x0009
6621#define MDIO_PMA_REG_RX_SD 0xa 6622#define MDIO_PMA_REG_RX_SD 0xa
6622/*bcm*/ 6623/*bcm*/
6623#define MDIO_PMA_REG_BCM_CTRL 0x0096 6624#define MDIO_PMA_REG_BCM_CTRL 0x0096