aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2014-01-01 04:06:43 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-01 22:09:47 -0500
commita429ec239cbc42dd3b2bc9933745103ca71d2b9d (patch)
tree6af84f938d02336d40c089a99821d31f85f81e22 /drivers/net/ethernet/broadcom
parente803d33a32213f2c28456faaa62b2a88f91de2ea (diff)
bnx2x: Fix Duplex setting for 54618se
BCM54618SE is used to advertise half-duplex even if HD was not requested by the user. This change makes the legacy speed/duplex advertisement for this PHY exactly according to the requested speed and duplex. Signed-off-by: Yaniv Rosner <yanivr@broadcom.com> Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index 000b6eec38a0..68417e1fb6df 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -10841,9 +10841,9 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy,
10841 (1<<11)); 10841 (1<<11));
10842 10842
10843 if (((phy->req_line_speed == SPEED_AUTO_NEG) && 10843 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
10844 (phy->speed_cap_mask & 10844 (phy->speed_cap_mask &
10845 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || 10845 PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
10846 (phy->req_line_speed == SPEED_1000)) { 10846 (phy->req_line_speed == SPEED_1000)) {
10847 an_1000_val |= (1<<8); 10847 an_1000_val |= (1<<8);
10848 autoneg_val |= (1<<9 | 1<<12); 10848 autoneg_val |= (1<<9 | 1<<12);
10849 if (phy->req_duplex == DUPLEX_FULL) 10849 if (phy->req_duplex == DUPLEX_FULL)
@@ -10859,30 +10859,32 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy,
10859 0x09, 10859 0x09,
10860 &an_1000_val); 10860 &an_1000_val);
10861 10861
10862 /* Set 100 speed advertisement */ 10862 /* Advertise 10/100 link speed */
10863 if (((phy->req_line_speed == SPEED_AUTO_NEG) && 10863 if (phy->req_line_speed == SPEED_AUTO_NEG) {
10864 (phy->speed_cap_mask & 10864 if (phy->speed_cap_mask &
10865 (PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL | 10865 PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF) {
10866 PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF)))) { 10866 an_10_100_val |= (1<<5);
10867 an_10_100_val |= (1<<7); 10867 autoneg_val |= (1<<9 | 1<<12);
10868 /* Enable autoneg and restart autoneg for legacy speeds */ 10868 DP(NETIF_MSG_LINK, "Advertising 10M-HD\n");
10869 autoneg_val |= (1<<9 | 1<<12); 10869 }
10870 10870 if (phy->speed_cap_mask &
10871 if (phy->req_duplex == DUPLEX_FULL) 10871 PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL) {
10872 an_10_100_val |= (1<<8);
10873 DP(NETIF_MSG_LINK, "Advertising 100M\n");
10874 }
10875
10876 /* Set 10 speed advertisement */
10877 if (((phy->req_line_speed == SPEED_AUTO_NEG) &&
10878 (phy->speed_cap_mask &
10879 (PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL |
10880 PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF)))) {
10881 an_10_100_val |= (1<<5);
10882 autoneg_val |= (1<<9 | 1<<12);
10883 if (phy->req_duplex == DUPLEX_FULL)
10884 an_10_100_val |= (1<<6); 10872 an_10_100_val |= (1<<6);
10885 DP(NETIF_MSG_LINK, "Advertising 10M\n"); 10873 autoneg_val |= (1<<9 | 1<<12);
10874 DP(NETIF_MSG_LINK, "Advertising 10M-FD\n");
10875 }
10876 if (phy->speed_cap_mask &
10877 PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF) {
10878 an_10_100_val |= (1<<7);
10879 autoneg_val |= (1<<9 | 1<<12);
10880 DP(NETIF_MSG_LINK, "Advertising 100M-HD\n");
10881 }
10882 if (phy->speed_cap_mask &
10883 PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL) {
10884 an_10_100_val |= (1<<8);
10885 autoneg_val |= (1<<9 | 1<<12);
10886 DP(NETIF_MSG_LINK, "Advertising 100M-FD\n");
10887 }
10886 } 10888 }
10887 10889
10888 /* Only 10/100 are allowed to work in FORCE mode */ 10890 /* Only 10/100 are allowed to work in FORCE mode */