Skip to content

Commit 6e6c5a5

Browse files
Michael Chandavem330
authored andcommitted
bnxt_en: Modify bnxt_get_max_rings() to support shared or non shared rings.
Add logic to calculate how many shared or non shared rings can be supported. Default is to use shared rings. Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b81a90d commit 6e6c5a5

File tree

3 files changed

+79
-25
lines changed

3 files changed

+79
-25
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 74 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4038,6 +4038,30 @@ static int bnxt_set_real_num_queues(struct bnxt *bp)
40384038
return rc;
40394039
}
40404040

4041+
static int bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
4042+
bool shared)
4043+
{
4044+
int _rx = *rx, _tx = *tx;
4045+
4046+
if (shared) {
4047+
*rx = min_t(int, _rx, max);
4048+
*tx = min_t(int, _tx, max);
4049+
} else {
4050+
if (max < 2)
4051+
return -ENOMEM;
4052+
4053+
while (_rx + _tx > max) {
4054+
if (_rx > _tx && _rx > 1)
4055+
_rx--;
4056+
else if (_tx > 1)
4057+
_tx--;
4058+
}
4059+
*rx = _rx;
4060+
*tx = _tx;
4061+
}
4062+
return 0;
4063+
}
4064+
40414065
static int bnxt_setup_msix(struct bnxt *bp)
40424066
{
40434067
struct msix_entry *msix_ent;
@@ -4068,8 +4092,11 @@ static int bnxt_setup_msix(struct bnxt *bp)
40684092
int tcs;
40694093

40704094
/* Trim rings based upon num of vectors allocated */
4071-
bp->rx_nr_rings = min_t(int, total_vecs, bp->rx_nr_rings);
4072-
bp->tx_nr_rings = min_t(int, total_vecs, bp->tx_nr_rings);
4095+
rc = bnxt_trim_rings(bp, &bp->rx_nr_rings, &bp->tx_nr_rings,
4096+
total_vecs, true);
4097+
if (rc)
4098+
goto msix_setup_exit;
4099+
40734100
bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
40744101
tcs = netdev_get_num_tc(dev);
40754102
if (tcs > 1) {
@@ -5337,10 +5364,10 @@ static int bnxt_setup_tc(struct net_device *dev, u8 tc)
53375364
return 0;
53385365

53395366
if (tc) {
5340-
int max_rx_rings, max_tx_rings;
5367+
int max_rx_rings, max_tx_rings, rc;
53415368

5342-
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings);
5343-
if (bp->tx_nr_rings_per_tc * tc > max_tx_rings)
5369+
rc = bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
5370+
if (rc || bp->tx_nr_rings_per_tc * tc > max_tx_rings)
53445371
return -ENOMEM;
53455372
}
53465373

@@ -5654,39 +5681,70 @@ static int bnxt_get_max_irq(struct pci_dev *pdev)
56545681
return (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1;
56555682
}
56565683

5657-
void bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx)
5684+
static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
5685+
int *max_cp)
56585686
{
5659-
int max_rings = 0, max_ring_grps = 0;
5687+
int max_ring_grps = 0;
56605688

56615689
if (BNXT_PF(bp)) {
56625690
*max_tx = bp->pf.max_tx_rings;
56635691
*max_rx = bp->pf.max_rx_rings;
5664-
max_rings = min_t(int, bp->pf.max_irqs, bp->pf.max_cp_rings);
5665-
max_rings = min_t(int, max_rings, bp->pf.max_stat_ctxs);
5692+
*max_cp = min_t(int, bp->pf.max_irqs, bp->pf.max_cp_rings);
5693+
*max_cp = min_t(int, *max_cp, bp->pf.max_stat_ctxs);
56665694
max_ring_grps = bp->pf.max_hw_ring_grps;
56675695
} else {
56685696
#ifdef CONFIG_BNXT_SRIOV
56695697
*max_tx = bp->vf.max_tx_rings;
56705698
*max_rx = bp->vf.max_rx_rings;
5671-
max_rings = min_t(int, bp->vf.max_irqs, bp->vf.max_cp_rings);
5672-
max_rings = min_t(int, max_rings, bp->vf.max_stat_ctxs);
5699+
*max_cp = min_t(int, bp->vf.max_irqs, bp->vf.max_cp_rings);
5700+
*max_cp = min_t(int, *max_cp, bp->vf.max_stat_ctxs);
56735701
max_ring_grps = bp->vf.max_hw_ring_grps;
56745702
#endif
56755703
}
56765704
if (bp->flags & BNXT_FLAG_AGG_RINGS)
56775705
*max_rx >>= 1;
5678-
5679-
*max_rx = min_t(int, *max_rx, max_rings);
56805706
*max_rx = min_t(int, *max_rx, max_ring_grps);
5681-
*max_tx = min_t(int, *max_tx, max_rings);
5707+
}
5708+
5709+
int bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, bool shared)
5710+
{
5711+
int rx, tx, cp;
5712+
5713+
_bnxt_get_max_rings(bp, &rx, &tx, &cp);
5714+
if (!rx || !tx || !cp)
5715+
return -ENOMEM;
5716+
5717+
*max_rx = rx;
5718+
*max_tx = tx;
5719+
return bnxt_trim_rings(bp, max_rx, max_tx, cp, shared);
5720+
}
5721+
5722+
static int bnxt_set_dflt_rings(struct bnxt *bp)
5723+
{
5724+
int dflt_rings, max_rx_rings, max_tx_rings, rc;
5725+
bool sh = true;
5726+
5727+
if (sh)
5728+
bp->flags |= BNXT_FLAG_SHARED_RINGS;
5729+
dflt_rings = netif_get_num_default_rss_queues();
5730+
rc = bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh);
5731+
if (rc)
5732+
return rc;
5733+
bp->rx_nr_rings = min_t(int, dflt_rings, max_rx_rings);
5734+
bp->tx_nr_rings_per_tc = min_t(int, dflt_rings, max_tx_rings);
5735+
bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
5736+
bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) :
5737+
bp->tx_nr_rings + bp->rx_nr_rings;
5738+
bp->num_stat_ctxs = bp->cp_nr_rings;
5739+
return rc;
56825740
}
56835741

56845742
static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
56855743
{
56865744
static int version_printed;
56875745
struct net_device *dev;
56885746
struct bnxt *bp;
5689-
int rc, max_rx_rings, max_tx_rings, max_irqs, dflt_rings;
5747+
int rc, max_irqs;
56905748

56915749
if (version_printed++ == 0)
56925750
pr_info("%s", version);
@@ -5765,19 +5823,13 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
57655823

57665824
bnxt_set_tpa_flags(bp);
57675825
bnxt_set_ring_params(bp);
5768-
dflt_rings = netif_get_num_default_rss_queues();
57695826
if (BNXT_PF(bp))
57705827
bp->pf.max_irqs = max_irqs;
57715828
#if defined(CONFIG_BNXT_SRIOV)
57725829
else
57735830
bp->vf.max_irqs = max_irqs;
57745831
#endif
5775-
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings);
5776-
bp->rx_nr_rings = min_t(int, dflt_rings, max_rx_rings);
5777-
bp->tx_nr_rings_per_tc = min_t(int, dflt_rings, max_tx_rings);
5778-
bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
5779-
bp->cp_nr_rings = max_t(int, bp->rx_nr_rings, bp->tx_nr_rings);
5780-
bp->num_stat_ctxs = bp->cp_nr_rings;
5832+
bnxt_set_dflt_rings(bp);
57815833

57825834
if (BNXT_PF(bp)) {
57835835
dev->hw_features |= NETIF_F_NTUPLE;

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,8 @@ struct bnxt {
877877
#define BNXT_FLAG_USING_MSIX 0x40
878878
#define BNXT_FLAG_MSIX_CAP 0x80
879879
#define BNXT_FLAG_RFS 0x100
880+
#define BNXT_FLAG_SHARED_RINGS 0x200
881+
880882
#define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \
881883
BNXT_FLAG_RFS | \
882884
BNXT_FLAG_STRIP_VLAN)
@@ -1096,5 +1098,5 @@ int bnxt_hwrm_set_pause(struct bnxt *);
10961098
int bnxt_hwrm_set_link_setting(struct bnxt *, bool);
10971099
int bnxt_open_nic(struct bnxt *, bool, bool);
10981100
int bnxt_close_nic(struct bnxt *, bool, bool);
1099-
void bnxt_get_max_rings(struct bnxt *, int *, int *);
1101+
int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);
11001102
#endif

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ static void bnxt_get_channels(struct net_device *dev,
211211
struct bnxt *bp = netdev_priv(dev);
212212
int max_rx_rings, max_tx_rings, tcs;
213213

214-
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings);
214+
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
215215
tcs = netdev_get_num_tc(dev);
216216
if (tcs > 1)
217217
max_tx_rings /= tcs;
@@ -235,7 +235,7 @@ static int bnxt_set_channels(struct net_device *dev,
235235
!channel->rx_count || !channel->tx_count)
236236
return -EINVAL;
237237

238-
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings);
238+
bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, true);
239239
tcs = netdev_get_num_tc(dev);
240240
if (tcs > 1)
241241
max_tx_rings /= tcs;

0 commit comments

Comments
 (0)