aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2012-11-26 22:46:33 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-28 10:59:21 -0500
commit8203c4b6c9debbf19517cc6594d5d6779e2c57bf (patch)
tree4cc5a5989edbe21c751e18f283110ba130b66d14 /drivers/net
parent0f6bb03dd011a1fc1e9373efe3fe6f2cdc46f7a9 (diff)
bnx2x: Always take PHY lock
Taking PHY lock is not required on some older designs, but we are removing this complication and always taking it since it is always required on newer designs and does not worth the code complication on the older boards. Taking PHY lock was initially required only on specific boards which had their MDC/MDIO bus crossed, but since this lock is now always required, for example, when NCSI is present, the PHY lock will always be taken. 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')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h1
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c6
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c7
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c32
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h6
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c11
6 files changed, 11 insertions, 52 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index 19517b34d14..641d8847c32 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -936,7 +936,6 @@ struct bnx2x_port {
936 936
937 /* used to synchronize phy accesses */ 937 /* used to synchronize phy accesses */
938 struct mutex phy_mutex; 938 struct mutex phy_mutex;
939 int need_hw_lock;
940 939
941 u32 port_stx; 940 u32 port_stx;
942 941
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 2d30979e8da..8779ac1f89a 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -948,14 +948,12 @@ void bnx2x_acquire_phy_lock(struct bnx2x *bp)
948{ 948{
949 mutex_lock(&bp->port.phy_mutex); 949 mutex_lock(&bp->port.phy_mutex);
950 950
951 if (bp->port.need_hw_lock) 951 bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
952 bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
953} 952}
954 953
955void bnx2x_release_phy_lock(struct bnx2x *bp) 954void bnx2x_release_phy_lock(struct bnx2x *bp)
956{ 955{
957 if (bp->port.need_hw_lock) 956 bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
958 bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
959 957
960 mutex_unlock(&bp->port.phy_mutex); 958 mutex_unlock(&bp->port.phy_mutex);
961} 959}
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index c40c0253e10..e05f981398b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -2660,20 +2660,25 @@ static int bnx2x_set_phys_id(struct net_device *dev,
2660 return 1; /* cycle on/off once per second */ 2660 return 1; /* cycle on/off once per second */
2661 2661
2662 case ETHTOOL_ID_ON: 2662 case ETHTOOL_ID_ON:
2663 bnx2x_acquire_phy_lock(bp);
2663 bnx2x_set_led(&bp->link_params, &bp->link_vars, 2664 bnx2x_set_led(&bp->link_params, &bp->link_vars,
2664 LED_MODE_ON, SPEED_1000); 2665 LED_MODE_ON, SPEED_1000);
2666 bnx2x_release_phy_lock(bp);
2665 break; 2667 break;
2666 2668
2667 case ETHTOOL_ID_OFF: 2669 case ETHTOOL_ID_OFF:
2670 bnx2x_acquire_phy_lock(bp);
2668 bnx2x_set_led(&bp->link_params, &bp->link_vars, 2671 bnx2x_set_led(&bp->link_params, &bp->link_vars,
2669 LED_MODE_FRONT_PANEL_OFF, 0); 2672 LED_MODE_FRONT_PANEL_OFF, 0);
2670 2673 bnx2x_release_phy_lock(bp);
2671 break; 2674 break;
2672 2675
2673 case ETHTOOL_ID_INACTIVE: 2676 case ETHTOOL_ID_INACTIVE:
2677 bnx2x_acquire_phy_lock(bp);
2674 bnx2x_set_led(&bp->link_params, &bp->link_vars, 2678 bnx2x_set_led(&bp->link_params, &bp->link_vars,
2675 LED_MODE_OPER, 2679 LED_MODE_OPER,
2676 bp->link_vars.line_speed); 2680 bp->link_vars.line_speed);
2681 bnx2x_release_phy_lock(bp);
2677 } 2682 }
2678 2683
2679 return 0; 2684 return 0;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index f5a310ed61c..a5d7003eb8b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -11290,8 +11290,7 @@ static struct bnx2x_phy phy_warpcore = {
11290 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, 11290 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT,
11291 .addr = 0xff, 11291 .addr = 0xff,
11292 .def_md_devad = 0, 11292 .def_md_devad = 0,
11293 .flags = (FLAGS_HW_LOCK_REQUIRED | 11293 .flags = FLAGS_TX_ERROR_CHECK,
11294 FLAGS_TX_ERROR_CHECK),
11295 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11294 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
11296 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11295 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
11297 .mdio_ctrl = 0, 11296 .mdio_ctrl = 0,
@@ -11358,7 +11357,7 @@ static struct bnx2x_phy phy_8073 = {
11358 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073, 11357 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
11359 .addr = 0xff, 11358 .addr = 0xff,
11360 .def_md_devad = 0, 11359 .def_md_devad = 0,
11361 .flags = FLAGS_HW_LOCK_REQUIRED, 11360 .flags = 0,
11362 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11361 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
11363 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11362 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
11364 .mdio_ctrl = 0, 11363 .mdio_ctrl = 0,
@@ -11447,8 +11446,7 @@ static struct bnx2x_phy phy_8726 = {
11447 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726, 11446 .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,
11448 .addr = 0xff, 11447 .addr = 0xff,
11449 .def_md_devad = 0, 11448 .def_md_devad = 0,
11450 .flags = (FLAGS_HW_LOCK_REQUIRED | 11449 .flags = (FLAGS_INIT_XGXS_FIRST |
11451 FLAGS_INIT_XGXS_FIRST |
11452 FLAGS_TX_ERROR_CHECK), 11450 FLAGS_TX_ERROR_CHECK),
11453 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11451 .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
11454 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, 11452 .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff},
@@ -12001,12 +11999,6 @@ static int bnx2x_populate_ext_phy(struct bnx2x *bp,
12001 SUPPORTED_100baseT_Full); 11999 SUPPORTED_100baseT_Full);
12002 } 12000 }
12003 12001
12004 /* In case mdc/mdio_access of the external phy is different than the
12005 * mdc/mdio access of the XGXS, a HW lock must be taken in each access
12006 * to prevent one port interfere with another port's CL45 operations.
12007 */
12008 if (mdc_mdio_access != SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH)
12009 phy->flags |= FLAGS_HW_LOCK_REQUIRED;
12010 DP(NETIF_MSG_LINK, "phy_type 0x%x port %d found in index %d\n", 12002 DP(NETIF_MSG_LINK, "phy_type 0x%x port %d found in index %d\n",
12011 phy_type, port, phy_index); 12003 phy_type, port, phy_index);
12012 DP(NETIF_MSG_LINK, " addr=0x%x, mdio_ctl=0x%x\n", 12004 DP(NETIF_MSG_LINK, " addr=0x%x, mdio_ctl=0x%x\n",
@@ -13568,24 +13560,6 @@ void bnx2x_period_func(struct link_params *params, struct link_vars *vars)
13568 13560
13569} 13561}
13570 13562
13571u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base, u32 shmem2_base)
13572{
13573 u8 phy_index;
13574 struct bnx2x_phy phy;
13575 for (phy_index = INT_PHY; phy_index < MAX_PHYS;
13576 phy_index++) {
13577 if (bnx2x_populate_phy(bp, phy_index, shmem_base, shmem2_base,
13578 0, &phy) != 0) {
13579 DP(NETIF_MSG_LINK, "populate phy failed\n");
13580 return 0;
13581 }
13582
13583 if (phy.flags & FLAGS_HW_LOCK_REQUIRED)
13584 return 1;
13585 }
13586 return 0;
13587}
13588
13589u8 bnx2x_fan_failure_det_req(struct bnx2x *bp, 13563u8 bnx2x_fan_failure_det_req(struct bnx2x *bp,
13590 u32 shmem_base, 13564 u32 shmem_base,
13591 u32 shmem2_base, 13565 u32 shmem2_base,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
index 24246b9a0c5..c43259e5d4b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
@@ -139,8 +139,6 @@ struct bnx2x_phy {
139 u8 addr; 139 u8 addr;
140 u8 def_md_devad; 140 u8 def_md_devad;
141 u16 flags; 141 u16 flags;
142 /* Require HW lock */
143#define FLAGS_HW_LOCK_REQUIRED (1<<0)
144 /* No Over-Current detection */ 142 /* No Over-Current detection */
145#define FLAGS_NOC (1<<1) 143#define FLAGS_NOC (1<<1)
146 /* Fan failure detection required */ 144 /* Fan failure detection required */
@@ -423,10 +421,6 @@ int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,
423 421
424void bnx2x_hw_reset_phy(struct link_params *params); 422void bnx2x_hw_reset_phy(struct link_params *params);
425 423
426/* Checks if HW lock is required for this phy/board type */
427u8 bnx2x_hw_lock_required(struct bnx2x *bp, u32 shmem_base,
428 u32 shmem2_base);
429
430/* Check swap bit and adjust PHY order */ 424/* Check swap bit and adjust PHY order */
431u32 bnx2x_phy_selection(struct link_params *params); 425u32 bnx2x_phy_selection(struct link_params *params);
432 426
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 79e4b724556..b4659c4b6fb 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -10377,17 +10377,6 @@ static void __devinit bnx2x_get_port_hwinfo(struct bnx2x *bp)
10377 bp->mdio.prtad = 10377 bp->mdio.prtad =
10378 XGXS_EXT_PHY_ADDR(ext_phy_config); 10378 XGXS_EXT_PHY_ADDR(ext_phy_config);
10379 10379
10380 /*
10381 * Check if hw lock is required to access MDC/MDIO bus to the PHY(s)
10382 * In MF mode, it is set to cover self test cases
10383 */
10384 if (IS_MF(bp))
10385 bp->port.need_hw_lock = 1;
10386 else
10387 bp->port.need_hw_lock = bnx2x_hw_lock_required(bp,
10388 bp->common.shmem_base,
10389 bp->common.shmem2_base);
10390
10391 /* Configure link feature according to nvram value */ 10380 /* Configure link feature according to nvram value */
10392 eee_mode = (((SHMEM_RD(bp, dev_info. 10381 eee_mode = (((SHMEM_RD(bp, dev_info.
10393 port_feature_config[port].eee_power_mode)) & 10382 port_feature_config[port].eee_power_mode)) &