176
177
if ((bp->state == BNX2X_STATE_OPEN) &&
177
178
!(bp->flags & MF_FUNC_DIS) &&
178
179
(bp->link_vars.link_up)) {
179
cmd->speed = bp->link_vars.line_speed;
180
ethtool_cmd_speed_set(cmd, bp->link_vars.line_speed);
180
181
cmd->duplex = bp->link_vars.duplex;
183
cmd->speed = bp->link_params.req_line_speed[cfg_idx];
183
ethtool_cmd_speed_set(
184
cmd, bp->link_params.req_line_speed[cfg_idx]);
184
185
cmd->duplex = bp->link_params.req_duplex[cfg_idx];
188
cmd->speed = bnx2x_get_mf_speed(bp);
189
ethtool_cmd_speed_set(cmd, bnx2x_get_mf_speed(bp));
190
191
if (bp->port.supported[cfg_idx] & SUPPORTED_TP)
191
192
cmd->port = PORT_TP;
206
207
cmd->maxrxpkt = 0;
208
209
DP(NETIF_MSG_LINK, "ethtool_cmd: cmd %d\n"
209
DP_LEVEL " supported 0x%x advertising 0x%x speed %d\n"
210
DP_LEVEL " supported 0x%x advertising 0x%x speed %u\n"
210
211
DP_LEVEL " duplex %d port %d phy_address %d transceiver %d\n"
211
212
DP_LEVEL " autoneg %d maxtxpkt %d maxrxpkt %d\n",
212
cmd->cmd, cmd->supported, cmd->advertising, cmd->speed,
213
cmd->cmd, cmd->supported, cmd->advertising,
214
ethtool_cmd_speed(cmd),
213
215
cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
214
216
cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
228
230
DP(NETIF_MSG_LINK, "ethtool_cmd: cmd %d\n"
229
" supported 0x%x advertising 0x%x speed %d speed_hi %d\n"
231
" supported 0x%x advertising 0x%x speed %u\n"
230
232
" duplex %d port %d phy_address %d transceiver %d\n"
231
233
" autoneg %d maxtxpkt %d maxrxpkt %d\n",
232
cmd->cmd, cmd->supported, cmd->advertising, cmd->speed,
234
cmd->cmd, cmd->supported, cmd->advertising,
235
ethtool_cmd_speed(cmd),
234
236
cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
235
237
cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
238
speed |= (cmd->speed_hi << 16);
239
speed = ethtool_cmd_speed(cmd);
240
241
if (IS_MF_SI(bp)) {
1302
static int bnx2x_set_flags(struct net_device *dev, u32 data)
1304
struct bnx2x *bp = netdev_priv(dev);
1308
if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
1309
printk(KERN_ERR "Handling parity error recovery. Try again later\n");
1313
if (!(data & ETH_FLAG_RXVLAN))
1316
if ((data & ETH_FLAG_LRO) && bp->rx_csum && bp->disable_tpa)
1319
rc = ethtool_op_set_flags(dev, data, ETH_FLAG_LRO | ETH_FLAG_RXVLAN |
1320
ETH_FLAG_TXVLAN | ETH_FLAG_RXHASH);
1324
/* TPA requires Rx CSUM offloading */
1325
if ((data & ETH_FLAG_LRO) && bp->rx_csum) {
1326
if (!(bp->flags & TPA_ENABLE_FLAG)) {
1327
bp->flags |= TPA_ENABLE_FLAG;
1330
} else if (bp->flags & TPA_ENABLE_FLAG) {
1331
dev->features &= ~NETIF_F_LRO;
1332
bp->flags &= ~TPA_ENABLE_FLAG;
1336
if (changed && netif_running(dev)) {
1337
bnx2x_nic_unload(bp, UNLOAD_NORMAL);
1338
rc = bnx2x_nic_load(bp, LOAD_NORMAL);
1344
static u32 bnx2x_get_rx_csum(struct net_device *dev)
1346
struct bnx2x *bp = netdev_priv(dev);
1351
static int bnx2x_set_rx_csum(struct net_device *dev, u32 data)
1353
struct bnx2x *bp = netdev_priv(dev);
1356
if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
1357
printk(KERN_ERR "Handling parity error recovery. Try again later\n");
1363
/* Disable TPA, when Rx CSUM is disabled. Otherwise all
1364
TPA'ed packets will be discarded due to wrong TCP CSUM */
1366
u32 flags = ethtool_op_get_flags(dev);
1368
rc = bnx2x_set_flags(dev, (flags & ~ETH_FLAG_LRO));
1374
static int bnx2x_set_tso(struct net_device *dev, u32 data)
1377
dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
1378
dev->features |= NETIF_F_TSO6;
1380
dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO_ECN);
1381
dev->features &= ~NETIF_F_TSO6;
1387
1304
static const struct {
1388
1305
char string[ETH_GSTRING_LEN];
1389
1306
} bnx2x_tests_str_arr[BNX2X_NUM_TESTS] = {
2100
static int bnx2x_phys_id(struct net_device *dev, u32 data)
2017
static int bnx2x_set_phys_id(struct net_device *dev,
2018
enum ethtool_phys_id_state state)
2102
2020
struct bnx2x *bp = netdev_priv(dev);
2105
2022
if (!netif_running(dev))
2108
2025
if (!bp->port.pmf)
2114
for (i = 0; i < (data * 2); i++) {
2116
bnx2x_set_led(&bp->link_params, &bp->link_vars,
2117
LED_MODE_OPER, SPEED_1000);
2119
bnx2x_set_led(&bp->link_params, &bp->link_vars,
2122
msleep_interruptible(500);
2123
if (signal_pending(current))
2127
if (bp->link_vars.link_up)
2128
bnx2x_set_led(&bp->link_params, &bp->link_vars, LED_MODE_OPER,
2029
case ETHTOOL_ID_ACTIVE:
2030
return 1; /* cycle on/off once per second */
2033
bnx2x_set_led(&bp->link_params, &bp->link_vars,
2034
LED_MODE_ON, SPEED_1000);
2037
case ETHTOOL_ID_OFF:
2038
bnx2x_set_led(&bp->link_params, &bp->link_vars,
2039
LED_MODE_FRONT_PANEL_OFF, 0);
2043
case ETHTOOL_ID_INACTIVE:
2044
bnx2x_set_led(&bp->link_params, &bp->link_vars,
2129
2046
bp->link_vars.line_speed);
2052
static int bnx2x_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
2053
void *rules __always_unused)
2055
struct bnx2x *bp = netdev_priv(dev);
2057
switch (info->cmd) {
2058
case ETHTOOL_GRXRINGS:
2059
info->data = BNX2X_NUM_ETH_QUEUES(bp);
2067
static int bnx2x_get_rxfh_indir(struct net_device *dev,
2068
struct ethtool_rxfh_indir *indir)
2070
struct bnx2x *bp = netdev_priv(dev);
2072
min_t(size_t, indir->size, TSTORM_INDIRECTION_TABLE_SIZE);
2074
if (bp->multi_mode == ETH_RSS_MODE_DISABLED)
2077
indir->size = TSTORM_INDIRECTION_TABLE_SIZE;
2078
memcpy(indir->ring_index, bp->rx_indir_table,
2079
copy_size * sizeof(bp->rx_indir_table[0]));
2083
static int bnx2x_set_rxfh_indir(struct net_device *dev,
2084
const struct ethtool_rxfh_indir *indir)
2086
struct bnx2x *bp = netdev_priv(dev);
2089
if (bp->multi_mode == ETH_RSS_MODE_DISABLED)
2092
/* Validate size and indices */
2093
if (indir->size != TSTORM_INDIRECTION_TABLE_SIZE)
2095
for (i = 0; i < TSTORM_INDIRECTION_TABLE_SIZE; i++)
2096
if (indir->ring_index[i] >= BNX2X_NUM_ETH_QUEUES(bp))
2099
memcpy(bp->rx_indir_table, indir->ring_index,
2100
indir->size * sizeof(bp->rx_indir_table[0]));
2101
bnx2x_push_indir_table(bp);
2152
2123
.set_ringparam = bnx2x_set_ringparam,
2153
2124
.get_pauseparam = bnx2x_get_pauseparam,
2154
2125
.set_pauseparam = bnx2x_set_pauseparam,
2155
.get_rx_csum = bnx2x_get_rx_csum,
2156
.set_rx_csum = bnx2x_set_rx_csum,
2157
.get_tx_csum = ethtool_op_get_tx_csum,
2158
.set_tx_csum = ethtool_op_set_tx_hw_csum,
2159
.set_flags = bnx2x_set_flags,
2160
.get_flags = ethtool_op_get_flags,
2161
.get_sg = ethtool_op_get_sg,
2162
.set_sg = ethtool_op_set_sg,
2163
.get_tso = ethtool_op_get_tso,
2164
.set_tso = bnx2x_set_tso,
2165
2126
.self_test = bnx2x_self_test,
2166
2127
.get_sset_count = bnx2x_get_sset_count,
2167
2128
.get_strings = bnx2x_get_strings,
2168
.phys_id = bnx2x_phys_id,
2129
.set_phys_id = bnx2x_set_phys_id,
2169
2130
.get_ethtool_stats = bnx2x_get_ethtool_stats,
2131
.get_rxnfc = bnx2x_get_rxnfc,
2132
.get_rxfh_indir = bnx2x_get_rxfh_indir,
2133
.set_rxfh_indir = bnx2x_set_rxfh_indir,
2172
2136
void bnx2x_set_ethtool_ops(struct net_device *netdev)