diff options
Diffstat (limited to 'drivers/net/bnx2x/bnx2x_ethtool.c')
-rw-r--r-- | drivers/net/bnx2x/bnx2x_ethtool.c | 58 |
1 files changed, 45 insertions, 13 deletions
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index 03012787de2f..bd94827e5e57 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c | |||
@@ -45,14 +45,9 @@ static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
45 | cmd->speed = bp->link_params.req_line_speed[cfg_idx]; | 45 | cmd->speed = bp->link_params.req_line_speed[cfg_idx]; |
46 | cmd->duplex = bp->link_params.req_duplex[cfg_idx]; | 46 | cmd->duplex = bp->link_params.req_duplex[cfg_idx]; |
47 | } | 47 | } |
48 | if (IS_MF(bp)) { | ||
49 | u16 vn_max_rate = ((bp->mf_config[BP_VN(bp)] & | ||
50 | FUNC_MF_CFG_MAX_BW_MASK) >> FUNC_MF_CFG_MAX_BW_SHIFT) * | ||
51 | 100; | ||
52 | 48 | ||
53 | if (vn_max_rate < cmd->speed) | 49 | if (IS_MF(bp)) |
54 | cmd->speed = vn_max_rate; | 50 | cmd->speed = bnx2x_get_mf_speed(bp); |
55 | } | ||
56 | 51 | ||
57 | if (bp->port.supported[cfg_idx] & SUPPORTED_TP) | 52 | if (bp->port.supported[cfg_idx] & SUPPORTED_TP) |
58 | cmd->port = PORT_TP; | 53 | cmd->port = PORT_TP; |
@@ -87,18 +82,57 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
87 | { | 82 | { |
88 | struct bnx2x *bp = netdev_priv(dev); | 83 | struct bnx2x *bp = netdev_priv(dev); |
89 | u32 advertising, cfg_idx, old_multi_phy_config, new_multi_phy_config; | 84 | u32 advertising, cfg_idx, old_multi_phy_config, new_multi_phy_config; |
85 | u32 speed; | ||
90 | 86 | ||
91 | if (IS_MF(bp)) | 87 | if (IS_MF_SD(bp)) |
92 | return 0; | 88 | return 0; |
93 | 89 | ||
94 | DP(NETIF_MSG_LINK, "ethtool_cmd: cmd %d\n" | 90 | DP(NETIF_MSG_LINK, "ethtool_cmd: cmd %d\n" |
95 | DP_LEVEL " supported 0x%x advertising 0x%x speed %d\n" | 91 | " supported 0x%x advertising 0x%x speed %d speed_hi %d\n" |
96 | DP_LEVEL " duplex %d port %d phy_address %d transceiver %d\n" | 92 | " duplex %d port %d phy_address %d transceiver %d\n" |
97 | DP_LEVEL " autoneg %d maxtxpkt %d maxrxpkt %d\n", | 93 | " autoneg %d maxtxpkt %d maxrxpkt %d\n", |
98 | cmd->cmd, cmd->supported, cmd->advertising, cmd->speed, | 94 | cmd->cmd, cmd->supported, cmd->advertising, cmd->speed, |
95 | cmd->speed_hi, | ||
99 | cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver, | 96 | cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver, |
100 | cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt); | 97 | cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt); |
101 | 98 | ||
99 | speed = cmd->speed; | ||
100 | speed |= (cmd->speed_hi << 16); | ||
101 | |||
102 | if (IS_MF_SI(bp)) { | ||
103 | u32 param = 0; | ||
104 | u32 line_speed = bp->link_vars.line_speed; | ||
105 | |||
106 | /* use 10G if no link detected */ | ||
107 | if (!line_speed) | ||
108 | line_speed = 10000; | ||
109 | |||
110 | if (bp->common.bc_ver < REQ_BC_VER_4_SET_MF_BW) { | ||
111 | BNX2X_DEV_INFO("To set speed BC %X or higher " | ||
112 | "is required, please upgrade BC\n", | ||
113 | REQ_BC_VER_4_SET_MF_BW); | ||
114 | return -EINVAL; | ||
115 | } | ||
116 | if (line_speed < speed) { | ||
117 | BNX2X_DEV_INFO("New speed should be less or equal " | ||
118 | "to actual line speed\n"); | ||
119 | return -EINVAL; | ||
120 | } | ||
121 | /* load old values */ | ||
122 | param = bp->mf_config[BP_VN(bp)]; | ||
123 | |||
124 | /* leave only MIN value */ | ||
125 | param &= FUNC_MF_CFG_MIN_BW_MASK; | ||
126 | |||
127 | /* set new MAX value */ | ||
128 | param |= (((speed * 100) / line_speed) | ||
129 | << FUNC_MF_CFG_MAX_BW_SHIFT) | ||
130 | & FUNC_MF_CFG_MAX_BW_MASK; | ||
131 | |||
132 | bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, param); | ||
133 | return 0; | ||
134 | } | ||
135 | |||
102 | cfg_idx = bnx2x_get_link_cfg_idx(bp); | 136 | cfg_idx = bnx2x_get_link_cfg_idx(bp); |
103 | old_multi_phy_config = bp->link_params.multi_phy_config; | 137 | old_multi_phy_config = bp->link_params.multi_phy_config; |
104 | switch (cmd->port) { | 138 | switch (cmd->port) { |
@@ -168,8 +202,6 @@ static int bnx2x_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
168 | 202 | ||
169 | } else { /* forced speed */ | 203 | } else { /* forced speed */ |
170 | /* advertise the requested speed and duplex if supported */ | 204 | /* advertise the requested speed and duplex if supported */ |
171 | u32 speed = cmd->speed; | ||
172 | speed |= (cmd->speed_hi << 16); | ||
173 | switch (speed) { | 205 | switch (speed) { |
174 | case SPEED_10: | 206 | case SPEED_10: |
175 | if (cmd->duplex == DUPLEX_FULL) { | 207 | if (cmd->duplex == DUPLEX_FULL) { |