aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2012-09-28 03:12:42 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-30 02:10:36 -0400
commit0968169c9271ddf05a7531274ffe4829f9d068b2 (patch)
treef3accfb9486642d7d10b58ab997daeda505cf0b9 /drivers/net/ethernet/broadcom/tg3.c
parent6513859479b0fe1232cddd100db269191c1691e1 (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.c64
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
11391static 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
11416static 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
11387static void tg3_get_strings(struct net_device *dev, u32 stringset, u8 *buf) 11443static 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