diff options
author | Michael Chan <mchan@broadcom.com> | 2012-09-28 03:12:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-09-30 02:10:36 -0400 |
commit | 0968169c9271ddf05a7531274ffe4829f9d068b2 (patch) | |
tree | f3accfb9486642d7d10b58ab997daeda505cf0b9 /drivers/net/ethernet/broadcom/tg3.c | |
parent | 6513859479b0fe1232cddd100db269191c1691e1 (diff) |
tg3: Add support for ethtool -L|-l to get/set the number of rings.
Default remains the same.
Reviewed-by: Nithin Nayak Sujir <nsujir@broadcom.com>
Reviewed-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 3f2197e41a52..74eea2fbb4fe 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -10239,11 +10239,15 @@ static bool tg3_enable_msix(struct tg3 *tp) | |||
10239 | int i, rc; | 10239 | int i, rc; |
10240 | struct msix_entry msix_ent[tp->irq_max]; | 10240 | struct msix_entry msix_ent[tp->irq_max]; |
10241 | 10241 | ||
10242 | tp->rxq_cnt = netif_get_num_default_rss_queues(); | 10242 | tp->txq_cnt = tp->txq_req; |
10243 | tp->rxq_cnt = tp->rxq_req; | ||
10244 | if (!tp->rxq_cnt) | ||
10245 | tp->rxq_cnt = netif_get_num_default_rss_queues(); | ||
10243 | if (tp->rxq_cnt > tp->rxq_max) | 10246 | if (tp->rxq_cnt > tp->rxq_max) |
10244 | tp->rxq_cnt = tp->rxq_max; | 10247 | tp->rxq_cnt = tp->rxq_max; |
10245 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || | 10248 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 || |
10246 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) | 10249 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720) && |
10250 | !tp->txq_req) | ||
10247 | tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max); | 10251 | tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max); |
10248 | 10252 | ||
10249 | tp->irq_cnt = tg3_irq_count(tp); | 10253 | tp->irq_cnt = tg3_irq_count(tp); |
@@ -11384,6 +11388,58 @@ static int tg3_set_rxfh_indir(struct net_device *dev, const u32 *indir) | |||
11384 | return 0; | 11388 | return 0; |
11385 | } | 11389 | } |
11386 | 11390 | ||
11391 | static void tg3_get_channels(struct net_device *dev, | ||
11392 | struct ethtool_channels *channel) | ||
11393 | { | ||
11394 | struct tg3 *tp = netdev_priv(dev); | ||
11395 | u32 deflt_qs = netif_get_num_default_rss_queues(); | ||
11396 | |||
11397 | channel->max_rx = tp->rxq_max; | ||
11398 | channel->max_tx = tp->txq_max; | ||
11399 | |||
11400 | if (netif_running(dev)) { | ||
11401 | channel->rx_count = tp->rxq_cnt; | ||
11402 | channel->tx_count = tp->txq_cnt; | ||
11403 | } else { | ||
11404 | if (tp->rxq_req) | ||
11405 | channel->rx_count = tp->rxq_req; | ||
11406 | else | ||
11407 | channel->rx_count = min(deflt_qs, tp->rxq_max); | ||
11408 | |||
11409 | if (tp->txq_req) | ||
11410 | channel->tx_count = tp->txq_req; | ||
11411 | else | ||
11412 | channel->tx_count = min(deflt_qs, tp->txq_max); | ||
11413 | } | ||
11414 | } | ||
11415 | |||
11416 | static int tg3_set_channels(struct net_device *dev, | ||
11417 | struct ethtool_channels *channel) | ||
11418 | { | ||
11419 | struct tg3 *tp = netdev_priv(dev); | ||
11420 | |||
11421 | if (!tg3_flag(tp, SUPPORT_MSIX)) | ||
11422 | return -EOPNOTSUPP; | ||
11423 | |||
11424 | if (channel->rx_count > tp->rxq_max || | ||
11425 | channel->tx_count > tp->txq_max) | ||
11426 | return -EINVAL; | ||
11427 | |||
11428 | tp->rxq_req = channel->rx_count; | ||
11429 | tp->txq_req = channel->tx_count; | ||
11430 | |||
11431 | if (!netif_running(dev)) | ||
11432 | return 0; | ||
11433 | |||
11434 | tg3_stop(tp); | ||
11435 | |||
11436 | netif_carrier_off(dev); | ||
11437 | |||
11438 | tg3_start(tp, true, false); | ||
11439 | |||
11440 | return 0; | ||
11441 | } | ||
11442 | |||
11387 | static void tg3_get_strings(struct net_device *dev, u32 stringset, u8 *buf) | 11443 | static void tg3_get_strings(struct net_device *dev, u32 stringset, u8 *buf) |
11388 | { | 11444 | { |
11389 | switch (stringset) { | 11445 | switch (stringset) { |
@@ -12632,6 +12688,8 @@ static const struct ethtool_ops tg3_ethtool_ops = { | |||
12632 | .get_rxfh_indir_size = tg3_get_rxfh_indir_size, | 12688 | .get_rxfh_indir_size = tg3_get_rxfh_indir_size, |
12633 | .get_rxfh_indir = tg3_get_rxfh_indir, | 12689 | .get_rxfh_indir = tg3_get_rxfh_indir, |
12634 | .set_rxfh_indir = tg3_set_rxfh_indir, | 12690 | .set_rxfh_indir = tg3_set_rxfh_indir, |
12691 | .get_channels = tg3_get_channels, | ||
12692 | .set_channels = tg3_set_channels, | ||
12635 | .get_ts_info = ethtool_op_get_ts_info, | 12693 | .get_ts_info = ethtool_op_get_ts_info, |
12636 | }; | 12694 | }; |
12637 | 12695 | ||