Merge 0e36c21d76 ("Merge branch mana-ib-flex of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git") into android-mainline
Steps on the way to 6.10-rc1 Change-Id: Iafbb3782de0986b895ab1920cee9b71576485e91 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1035,6 +1035,165 @@ attribute-sets:
|
||||
type: sub-message
|
||||
sub-message: linkinfo-member-data-msg
|
||||
selector: slave-kind
|
||||
-
|
||||
name: linkinfo-bond-attrs
|
||||
name-prefix: ifla-bond-
|
||||
attributes:
|
||||
-
|
||||
name: mode
|
||||
type: u8
|
||||
-
|
||||
name: active-slave
|
||||
type: u32
|
||||
-
|
||||
name: miimon
|
||||
type: u32
|
||||
-
|
||||
name: updelay
|
||||
type: u32
|
||||
-
|
||||
name: downdelay
|
||||
type: u32
|
||||
-
|
||||
name: use-carrier
|
||||
type: u8
|
||||
-
|
||||
name: arp-interval
|
||||
type: u32
|
||||
-
|
||||
name: arp-ip-target
|
||||
type: indexed-array
|
||||
sub-type: u32
|
||||
byte-order: big-endian
|
||||
display-hint: ipv4
|
||||
-
|
||||
name: arp-validate
|
||||
type: u32
|
||||
-
|
||||
name: arp-all-targets
|
||||
type: u32
|
||||
-
|
||||
name: primary
|
||||
type: u32
|
||||
-
|
||||
name: primary-reselect
|
||||
type: u8
|
||||
-
|
||||
name: fail-over-mac
|
||||
type: u8
|
||||
-
|
||||
name: xmit-hash-policy
|
||||
type: u8
|
||||
-
|
||||
name: resend-igmp
|
||||
type: u32
|
||||
-
|
||||
name: num-peer-notif
|
||||
type: u8
|
||||
-
|
||||
name: all-slaves-active
|
||||
type: u8
|
||||
-
|
||||
name: min-links
|
||||
type: u32
|
||||
-
|
||||
name: lp-interval
|
||||
type: u32
|
||||
-
|
||||
name: packets-per-slave
|
||||
type: u32
|
||||
-
|
||||
name: ad-lacp-rate
|
||||
type: u8
|
||||
-
|
||||
name: ad-select
|
||||
type: u8
|
||||
-
|
||||
name: ad-info
|
||||
type: nest
|
||||
nested-attributes: bond-ad-info-attrs
|
||||
-
|
||||
name: ad-actor-sys-prio
|
||||
type: u16
|
||||
-
|
||||
name: ad-user-port-key
|
||||
type: u16
|
||||
-
|
||||
name: ad-actor-system
|
||||
type: binary
|
||||
display-hint: mac
|
||||
-
|
||||
name: tlb-dynamic-lb
|
||||
type: u8
|
||||
-
|
||||
name: peer-notif-delay
|
||||
type: u32
|
||||
-
|
||||
name: ad-lacp-active
|
||||
type: u8
|
||||
-
|
||||
name: missed-max
|
||||
type: u8
|
||||
-
|
||||
name: ns-ip6-target
|
||||
type: indexed-array
|
||||
sub-type: binary
|
||||
display-hint: ipv6
|
||||
-
|
||||
name: coupled-control
|
||||
type: u8
|
||||
-
|
||||
name: bond-ad-info-attrs
|
||||
name-prefix: ifla-bond-ad-info-
|
||||
attributes:
|
||||
-
|
||||
name: aggregator
|
||||
type: u16
|
||||
-
|
||||
name: num-ports
|
||||
type: u16
|
||||
-
|
||||
name: actor-key
|
||||
type: u16
|
||||
-
|
||||
name: partner-key
|
||||
type: u16
|
||||
-
|
||||
name: partner-mac
|
||||
type: binary
|
||||
display-hint: mac
|
||||
-
|
||||
name: bond-slave-attrs
|
||||
name-prefix: ifla-bond-slave-
|
||||
attributes:
|
||||
-
|
||||
name: state
|
||||
type: u8
|
||||
-
|
||||
name: mii-status
|
||||
type: u8
|
||||
-
|
||||
name: link-failure-count
|
||||
type: u32
|
||||
-
|
||||
name: perm-hwaddr
|
||||
type: binary
|
||||
display-hint: mac
|
||||
-
|
||||
name: queue-id
|
||||
type: u16
|
||||
-
|
||||
name: ad-aggregator-id
|
||||
type: u16
|
||||
-
|
||||
name: ad-actor-oper-port-state
|
||||
type: u8
|
||||
-
|
||||
name: ad-partner-oper-port-state
|
||||
type: u16
|
||||
-
|
||||
name: prio
|
||||
type: u32
|
||||
-
|
||||
name: linkinfo-bridge-attrs
|
||||
name-prefix: ifla-br-
|
||||
@@ -1722,6 +1881,9 @@ sub-messages:
|
||||
-
|
||||
name: linkinfo-data-msg
|
||||
formats:
|
||||
-
|
||||
value: bond
|
||||
attribute-set: linkinfo-bond-attrs
|
||||
-
|
||||
value: bridge
|
||||
attribute-set: linkinfo-bridge-attrs
|
||||
@@ -1760,6 +1922,7 @@ sub-messages:
|
||||
attribute-set: linkinfo-brport-attrs
|
||||
-
|
||||
value: bond
|
||||
attribute-set: bond-slave-attrs
|
||||
|
||||
operations:
|
||||
enum-model: directional
|
||||
|
||||
@@ -1254,9 +1254,9 @@ would be empty (no bit set).
|
||||
Additional hardware timestamping statistics response contents:
|
||||
|
||||
===================================== ====== ===================================
|
||||
``ETHTOOL_A_TS_STAT_TX_PKTS`` u64 Packets with Tx HW timestamps
|
||||
``ETHTOOL_A_TS_STAT_TX_LOST`` u64 Tx HW timestamp not arrived count
|
||||
``ETHTOOL_A_TS_STAT_TX_ERR`` u64 HW error request Tx timestamp count
|
||||
``ETHTOOL_A_TS_STAT_TX_PKTS`` uint Packets with Tx HW timestamps
|
||||
``ETHTOOL_A_TS_STAT_TX_LOST`` uint Tx HW timestamp not arrived count
|
||||
``ETHTOOL_A_TS_STAT_TX_ERR`` uint HW error request Tx timestamp count
|
||||
===================================== ====== ===================================
|
||||
|
||||
CABLE_TEST
|
||||
|
||||
@@ -15,15 +15,13 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
|
||||
struct mana_port_context *mpc = netdev_priv(ndev);
|
||||
struct mana_cfg_rx_steer_req_v2 *req;
|
||||
struct mana_cfg_rx_steer_resp resp = {};
|
||||
mana_handle_t *req_indir_tab;
|
||||
struct gdma_context *gc;
|
||||
u32 req_buf_size;
|
||||
int i, err;
|
||||
|
||||
gc = mdev_to_gc(dev);
|
||||
|
||||
req_buf_size =
|
||||
sizeof(*req) + sizeof(mana_handle_t) * MANA_INDIRECT_TABLE_SIZE;
|
||||
req_buf_size = struct_size(req, indir_tab, MANA_INDIRECT_TABLE_SIZE);
|
||||
req = kzalloc(req_buf_size, GFP_KERNEL);
|
||||
if (!req)
|
||||
return -ENOMEM;
|
||||
@@ -44,20 +42,20 @@ static int mana_ib_cfg_vport_steering(struct mana_ib_dev *dev,
|
||||
req->rss_enable = true;
|
||||
|
||||
req->num_indir_entries = MANA_INDIRECT_TABLE_SIZE;
|
||||
req->indir_tab_offset = sizeof(*req);
|
||||
req->indir_tab_offset = offsetof(struct mana_cfg_rx_steer_req_v2,
|
||||
indir_tab);
|
||||
req->update_indir_tab = true;
|
||||
req->cqe_coalescing_enable = 1;
|
||||
|
||||
req_indir_tab = (mana_handle_t *)(req + 1);
|
||||
/* The ind table passed to the hardware must have
|
||||
* MANA_INDIRECT_TABLE_SIZE entries. Adjust the verb
|
||||
* ind_table to MANA_INDIRECT_TABLE_SIZE if required
|
||||
*/
|
||||
ibdev_dbg(&dev->ib_dev, "ind table size %u\n", 1 << log_ind_tbl_size);
|
||||
for (i = 0; i < MANA_INDIRECT_TABLE_SIZE; i++) {
|
||||
req_indir_tab[i] = ind_table[i % (1 << log_ind_tbl_size)];
|
||||
req->indir_tab[i] = ind_table[i % (1 << log_ind_tbl_size)];
|
||||
ibdev_dbg(&dev->ib_dev, "index %u handle 0x%llx\n", i,
|
||||
req_indir_tab[i]);
|
||||
req->indir_tab[i]);
|
||||
}
|
||||
|
||||
req->update_hashkey = true;
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
NETIF_MSG_TX_ERR)
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Broadcom BCM573xx network driver");
|
||||
MODULE_DESCRIPTION("Broadcom NetXtreme network driver");
|
||||
|
||||
#define BNXT_RX_OFFSET (NET_SKB_PAD + NET_IP_ALIGN)
|
||||
#define BNXT_RX_DMA_OFFSET NET_SKB_PAD
|
||||
@@ -3897,13 +3897,12 @@ static int bnxt_alloc_cp_sub_ring(struct bnxt *bp,
|
||||
static int bnxt_alloc_cp_rings(struct bnxt *bp)
|
||||
{
|
||||
bool sh = !!(bp->flags & BNXT_FLAG_SHARED_RINGS);
|
||||
int i, j, rc, ulp_base_vec, ulp_msix;
|
||||
int i, j, rc, ulp_msix;
|
||||
int tcs = bp->num_tc;
|
||||
|
||||
if (!tcs)
|
||||
tcs = 1;
|
||||
ulp_msix = bnxt_get_ulp_msix_num(bp);
|
||||
ulp_base_vec = bnxt_get_ulp_msix_base(bp);
|
||||
for (i = 0, j = 0; i < bp->cp_nr_rings; i++) {
|
||||
struct bnxt_napi *bnapi = bp->bnapi[i];
|
||||
struct bnxt_cp_ring_info *cpr, *cpr2;
|
||||
@@ -3922,10 +3921,7 @@ static int bnxt_alloc_cp_rings(struct bnxt *bp)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (ulp_msix && i >= ulp_base_vec)
|
||||
ring->map_idx = i + ulp_msix;
|
||||
else
|
||||
ring->map_idx = i;
|
||||
ring->map_idx = ulp_msix + i;
|
||||
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
|
||||
continue;
|
||||
@@ -7339,17 +7335,7 @@ static int bnxt_hwrm_reserve_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
|
||||
|
||||
int bnxt_nq_rings_in_use(struct bnxt *bp)
|
||||
{
|
||||
int cp = bp->cp_nr_rings;
|
||||
int ulp_msix, ulp_base;
|
||||
|
||||
ulp_msix = bnxt_get_ulp_msix_num(bp);
|
||||
if (ulp_msix) {
|
||||
ulp_base = bnxt_get_ulp_msix_base(bp);
|
||||
cp += ulp_msix;
|
||||
if ((ulp_base + ulp_msix) > cp)
|
||||
cp = ulp_base + ulp_msix;
|
||||
}
|
||||
return cp;
|
||||
return bp->cp_nr_rings + bnxt_get_ulp_msix_num(bp);
|
||||
}
|
||||
|
||||
static int bnxt_cp_rings_in_use(struct bnxt *bp)
|
||||
@@ -7365,16 +7351,7 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp)
|
||||
|
||||
static int bnxt_get_func_stat_ctxs(struct bnxt *bp)
|
||||
{
|
||||
int ulp_stat = bnxt_get_ulp_stat_ctxs(bp);
|
||||
int cp = bp->cp_nr_rings;
|
||||
|
||||
if (!ulp_stat)
|
||||
return cp;
|
||||
|
||||
if (bnxt_nq_rings_in_use(bp) > cp + bnxt_get_ulp_msix_num(bp))
|
||||
return bnxt_get_ulp_msix_base(bp) + ulp_stat;
|
||||
|
||||
return cp + ulp_stat;
|
||||
return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp);
|
||||
}
|
||||
|
||||
static int bnxt_get_total_rss_ctxs(struct bnxt *bp, struct bnxt_hw_rings *hwr)
|
||||
@@ -7485,14 +7462,27 @@ static bool bnxt_rings_ok(struct bnxt *bp, struct bnxt_hw_rings *hwr)
|
||||
static int __bnxt_reserve_rings(struct bnxt *bp)
|
||||
{
|
||||
struct bnxt_hw_rings hwr = {0};
|
||||
int cp = bp->cp_nr_rings;
|
||||
int rx_rings, rc;
|
||||
int ulp_msix = 0;
|
||||
bool sh = false;
|
||||
int tx_cp;
|
||||
|
||||
if (!bnxt_need_reserve_rings(bp))
|
||||
return 0;
|
||||
|
||||
hwr.cp = bnxt_nq_rings_in_use(bp);
|
||||
if (!bnxt_ulp_registered(bp->edev)) {
|
||||
ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
|
||||
if (!ulp_msix)
|
||||
bnxt_set_ulp_stat_ctxs(bp, 0);
|
||||
|
||||
if (ulp_msix > bp->ulp_num_msix_want)
|
||||
ulp_msix = bp->ulp_num_msix_want;
|
||||
hwr.cp = cp + ulp_msix;
|
||||
} else {
|
||||
hwr.cp = bnxt_nq_rings_in_use(bp);
|
||||
}
|
||||
|
||||
hwr.tx = bp->tx_nr_rings;
|
||||
hwr.rx = bp->rx_nr_rings;
|
||||
if (bp->flags & BNXT_FLAG_SHARED_RINGS)
|
||||
@@ -7564,6 +7554,19 @@ static int __bnxt_reserve_rings(struct bnxt *bp)
|
||||
if (!netif_is_rxfh_configured(bp->dev))
|
||||
bnxt_set_dflt_rss_indir_tbl(bp, NULL);
|
||||
|
||||
if (!bnxt_ulp_registered(bp->edev) && BNXT_NEW_RM(bp)) {
|
||||
int resv_msix, resv_ctx, ulp_ctxs;
|
||||
struct bnxt_hw_resc *hw_resc;
|
||||
|
||||
hw_resc = &bp->hw_resc;
|
||||
resv_msix = hw_resc->resv_irqs - bp->cp_nr_rings;
|
||||
ulp_msix = min_t(int, resv_msix, ulp_msix);
|
||||
bnxt_set_ulp_msix_num(bp, ulp_msix);
|
||||
resv_ctx = hw_resc->resv_stat_ctxs - bp->cp_nr_rings;
|
||||
ulp_ctxs = min(resv_ctx, bnxt_get_ulp_stat_ctxs(bp));
|
||||
bnxt_set_ulp_stat_ctxs(bp, ulp_ctxs);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -10610,13 +10613,23 @@ int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
|
||||
{
|
||||
bool irq_cleared = false;
|
||||
int tcs = bp->num_tc;
|
||||
int irqs_required;
|
||||
int rc;
|
||||
|
||||
if (!bnxt_need_reserve_rings(bp))
|
||||
return 0;
|
||||
|
||||
if (irq_re_init && BNXT_NEW_RM(bp) &&
|
||||
bnxt_get_num_msix(bp) != bp->total_irqs) {
|
||||
if (!bnxt_ulp_registered(bp->edev)) {
|
||||
int ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
|
||||
|
||||
if (ulp_msix > bp->ulp_num_msix_want)
|
||||
ulp_msix = bp->ulp_num_msix_want;
|
||||
irqs_required = ulp_msix + bp->cp_nr_rings;
|
||||
} else {
|
||||
irqs_required = bnxt_get_num_msix(bp);
|
||||
}
|
||||
|
||||
if (irq_re_init && BNXT_NEW_RM(bp) && irqs_required != bp->total_irqs) {
|
||||
bnxt_ulp_irq_stop(bp);
|
||||
bnxt_clear_int_mode(bp);
|
||||
irq_cleared = true;
|
||||
@@ -13633,8 +13646,8 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
|
||||
return -ENOMEM;
|
||||
hwr.stat = hwr.cp;
|
||||
if (BNXT_NEW_RM(bp)) {
|
||||
hwr.cp += bnxt_get_ulp_msix_num(bp);
|
||||
hwr.stat += bnxt_get_ulp_stat_ctxs(bp);
|
||||
hwr.cp += bnxt_get_ulp_msix_num_in_use(bp);
|
||||
hwr.stat += bnxt_get_ulp_stat_ctxs_in_use(bp);
|
||||
hwr.grp = rx;
|
||||
hwr.rss_ctx = bnxt_get_total_rss_ctxs(bp, &hwr);
|
||||
}
|
||||
@@ -14808,10 +14821,13 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
||||
if (BNXT_PF(bp))
|
||||
bnxt_sriov_disable(bp);
|
||||
|
||||
bnxt_rdma_aux_device_uninit(bp);
|
||||
bnxt_rdma_aux_device_del(bp);
|
||||
|
||||
bnxt_ptp_clear(bp);
|
||||
unregister_netdev(dev);
|
||||
|
||||
bnxt_rdma_aux_device_uninit(bp);
|
||||
|
||||
bnxt_free_l2_filters(bp, true);
|
||||
bnxt_free_ntp_fltrs(bp, true);
|
||||
if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
|
||||
@@ -14904,8 +14920,9 @@ static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
|
||||
*max_rx = hw_resc->max_rx_rings;
|
||||
*max_cp = bnxt_get_max_func_cp_rings_for_en(bp);
|
||||
max_irq = min_t(int, bnxt_get_max_func_irqs(bp) -
|
||||
bnxt_get_ulp_msix_num(bp),
|
||||
hw_resc->max_stat_ctxs - bnxt_get_ulp_stat_ctxs(bp));
|
||||
bnxt_get_ulp_msix_num_in_use(bp),
|
||||
hw_resc->max_stat_ctxs -
|
||||
bnxt_get_ulp_stat_ctxs_in_use(bp));
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
|
||||
*max_cp = min_t(int, *max_cp, max_irq);
|
||||
max_ring_grps = hw_resc->max_hw_ring_grps;
|
||||
@@ -15001,6 +15018,7 @@ static void bnxt_trim_dflt_sh_rings(struct bnxt *bp)
|
||||
static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
|
||||
{
|
||||
int dflt_rings, max_rx_rings, max_tx_rings, rc;
|
||||
int avail_msix;
|
||||
|
||||
if (!bnxt_can_reserve_rings(bp))
|
||||
return 0;
|
||||
@@ -15028,6 +15046,14 @@ static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
|
||||
bp->cp_nr_rings = bp->tx_nr_rings_per_tc + bp->rx_nr_rings;
|
||||
bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
|
||||
|
||||
avail_msix = bnxt_get_max_func_irqs(bp) - bp->cp_nr_rings;
|
||||
if (avail_msix >= BNXT_MIN_ROCE_CP_RINGS) {
|
||||
int ulp_num_msix = min(avail_msix, bp->ulp_num_msix_want);
|
||||
|
||||
bnxt_set_ulp_msix_num(bp, ulp_num_msix);
|
||||
bnxt_set_dflt_ulp_stat_ctxs(bp);
|
||||
}
|
||||
|
||||
rc = __bnxt_reserve_rings(bp);
|
||||
if (rc && rc != -ENODEV)
|
||||
netdev_warn(bp->dev, "Unable to reserve tx rings\n");
|
||||
@@ -15377,6 +15403,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
bnxt_set_rx_skb_mode(bp, false);
|
||||
bnxt_set_tpa_flags(bp);
|
||||
bnxt_set_ring_params(bp);
|
||||
bnxt_rdma_aux_device_init(bp);
|
||||
rc = bnxt_set_dflt_rings(bp, true);
|
||||
if (rc) {
|
||||
if (BNXT_VF(bp) && rc == -ENODEV) {
|
||||
@@ -15430,13 +15457,14 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
|
||||
bnxt_init_multi_rss_ctx(bp);
|
||||
|
||||
|
||||
rc = register_netdev(dev);
|
||||
if (rc)
|
||||
goto init_err_cleanup;
|
||||
|
||||
bnxt_dl_fw_reporters_create(bp);
|
||||
|
||||
bnxt_rdma_aux_device_init(bp);
|
||||
bnxt_rdma_aux_device_add(bp);
|
||||
|
||||
bnxt_print_device_info(bp);
|
||||
|
||||
@@ -15444,6 +15472,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
return 0;
|
||||
init_err_cleanup:
|
||||
bnxt_rdma_aux_device_uninit(bp);
|
||||
bnxt_dl_unregister(bp);
|
||||
init_err_dl:
|
||||
bnxt_shutdown_tc(bp);
|
||||
|
||||
@@ -2303,6 +2303,7 @@ struct bnxt {
|
||||
|
||||
struct bnxt_irq *irq_tbl;
|
||||
int total_irqs;
|
||||
int ulp_num_msix_want;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
||||
#ifdef CONFIG_BNXT_DCB
|
||||
|
||||
@@ -1876,6 +1876,11 @@ static int bnxt_set_rxfh_context(struct bnxt *bp,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!netif_running(bp->dev)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unable to set RSS contexts when interface is down");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (*rss_context != ETH_RXFH_CONTEXT_ALLOC) {
|
||||
rss_ctx = bnxt_get_rss_ctx_from_index(bp, *rss_context);
|
||||
if (!rss_ctx) {
|
||||
|
||||
@@ -31,21 +31,74 @@ static DEFINE_IDA(bnxt_aux_dev_ids);
|
||||
static void bnxt_fill_msix_vecs(struct bnxt *bp, struct bnxt_msix_entry *ent)
|
||||
{
|
||||
struct bnxt_en_dev *edev = bp->edev;
|
||||
int num_msix, idx, i;
|
||||
int num_msix, i;
|
||||
|
||||
if (!edev->ulp_tbl->msix_requested) {
|
||||
netdev_warn(bp->dev, "Requested MSI-X vectors insufficient\n");
|
||||
return;
|
||||
}
|
||||
num_msix = edev->ulp_tbl->msix_requested;
|
||||
idx = edev->ulp_tbl->msix_base;
|
||||
for (i = 0; i < num_msix; i++) {
|
||||
ent[i].vector = bp->irq_tbl[idx + i].vector;
|
||||
ent[i].ring_idx = idx + i;
|
||||
ent[i].vector = bp->irq_tbl[i].vector;
|
||||
ent[i].ring_idx = i;
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
|
||||
ent[i].db_offset = bp->db_offset;
|
||||
else
|
||||
ent[i].db_offset = (idx + i) * 0x80;
|
||||
ent[i].db_offset = i * 0x80;
|
||||
}
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_msix_num(struct bnxt *bp)
|
||||
{
|
||||
if (bp->edev)
|
||||
return bp->edev->ulp_num_msix_vec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bnxt_set_ulp_msix_num(struct bnxt *bp, int num)
|
||||
{
|
||||
if (bp->edev)
|
||||
bp->edev->ulp_num_msix_vec = num;
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_msix_num_in_use(struct bnxt *bp)
|
||||
{
|
||||
if (bnxt_ulp_registered(bp->edev))
|
||||
return bp->edev->ulp_num_msix_vec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_stat_ctxs(struct bnxt *bp)
|
||||
{
|
||||
if (bp->edev)
|
||||
return bp->edev->ulp_num_ctxs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bnxt_set_ulp_stat_ctxs(struct bnxt *bp, int num_ulp_ctx)
|
||||
{
|
||||
if (bp->edev)
|
||||
bp->edev->ulp_num_ctxs = num_ulp_ctx;
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_stat_ctxs_in_use(struct bnxt *bp)
|
||||
{
|
||||
if (bnxt_ulp_registered(bp->edev))
|
||||
return bp->edev->ulp_num_ctxs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bnxt_set_dflt_ulp_stat_ctxs(struct bnxt *bp)
|
||||
{
|
||||
if (bp->edev) {
|
||||
bp->edev->ulp_num_ctxs = BNXT_MIN_ROCE_STAT_CTXS;
|
||||
/* Reserve one additional stat_ctx for PF0 (except
|
||||
* on 1-port NICs) as it also creates one stat_ctx
|
||||
* for PF1 in case of RoCE bonding.
|
||||
*/
|
||||
if (BNXT_PF(bp) && !bp->pf.port_id &&
|
||||
bp->port_count > 1)
|
||||
bp->edev->ulp_num_ctxs++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,25 +110,34 @@ int bnxt_register_dev(struct bnxt_en_dev *edev,
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
unsigned int max_stat_ctxs;
|
||||
struct bnxt_ulp *ulp;
|
||||
int rc = 0;
|
||||
|
||||
rtnl_lock();
|
||||
if (!bp->irq_tbl) {
|
||||
rc = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
max_stat_ctxs = bnxt_get_max_func_stat_ctxs(bp);
|
||||
if (max_stat_ctxs <= BNXT_MIN_ROCE_STAT_CTXS ||
|
||||
bp->cp_nr_rings == max_stat_ctxs)
|
||||
return -ENOMEM;
|
||||
bp->cp_nr_rings == max_stat_ctxs) {
|
||||
rc = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ulp = edev->ulp_tbl;
|
||||
if (!ulp)
|
||||
return -ENOMEM;
|
||||
|
||||
ulp->handle = handle;
|
||||
rcu_assign_pointer(ulp->ulp_ops, ulp_ops);
|
||||
|
||||
if (test_bit(BNXT_STATE_OPEN, &bp->state))
|
||||
bnxt_hwrm_vnic_cfg(bp, &bp->vnic_info[BNXT_VNIC_DEFAULT]);
|
||||
|
||||
edev->ulp_tbl->msix_requested = bnxt_get_ulp_msix_num(bp);
|
||||
|
||||
bnxt_fill_msix_vecs(bp, bp->edev->msix_entries);
|
||||
edev->flags |= BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
return 0;
|
||||
exit:
|
||||
rtnl_unlock();
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(bnxt_register_dev);
|
||||
|
||||
@@ -87,8 +149,10 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev)
|
||||
int i = 0;
|
||||
|
||||
ulp = edev->ulp_tbl;
|
||||
rtnl_lock();
|
||||
if (ulp->msix_requested)
|
||||
edev->flags &= ~BNXT_EN_FLAG_MSIX_REQUESTED;
|
||||
edev->ulp_tbl->msix_requested = 0;
|
||||
|
||||
if (ulp->max_async_event_id)
|
||||
bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, true);
|
||||
@@ -101,11 +165,12 @@ void bnxt_unregister_dev(struct bnxt_en_dev *edev)
|
||||
msleep(100);
|
||||
i++;
|
||||
}
|
||||
rtnl_unlock();
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(bnxt_unregister_dev);
|
||||
|
||||
int bnxt_get_ulp_msix_num(struct bnxt *bp)
|
||||
static int bnxt_set_dflt_ulp_msix(struct bnxt *bp)
|
||||
{
|
||||
u32 roce_msix = BNXT_VF(bp) ?
|
||||
BNXT_MAX_VF_ROCE_MSIX : BNXT_MAX_ROCE_MSIX;
|
||||
@@ -114,29 +179,6 @@ int bnxt_get_ulp_msix_num(struct bnxt *bp)
|
||||
min_t(u32, roce_msix, num_online_cpus()) : 0);
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_msix_base(struct bnxt *bp)
|
||||
{
|
||||
if (bnxt_ulp_registered(bp->edev)) {
|
||||
struct bnxt_en_dev *edev = bp->edev;
|
||||
|
||||
if (edev->ulp_tbl->msix_requested)
|
||||
return edev->ulp_tbl->msix_base;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_stat_ctxs(struct bnxt *bp)
|
||||
{
|
||||
if (bnxt_ulp_registered(bp->edev)) {
|
||||
struct bnxt_en_dev *edev = bp->edev;
|
||||
|
||||
if (edev->ulp_tbl->msix_requested)
|
||||
return BNXT_MIN_ROCE_STAT_CTXS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bnxt_send_msg(struct bnxt_en_dev *edev,
|
||||
struct bnxt_fw_msg *fw_msg)
|
||||
{
|
||||
@@ -309,7 +351,6 @@ void bnxt_rdma_aux_device_uninit(struct bnxt *bp)
|
||||
|
||||
aux_priv = bp->aux_priv;
|
||||
adev = &aux_priv->aux_dev;
|
||||
auxiliary_device_delete(adev);
|
||||
auxiliary_device_uninit(adev);
|
||||
}
|
||||
|
||||
@@ -327,6 +368,14 @@ static void bnxt_aux_dev_release(struct device *dev)
|
||||
bp->aux_priv = NULL;
|
||||
}
|
||||
|
||||
void bnxt_rdma_aux_device_del(struct bnxt *bp)
|
||||
{
|
||||
if (!bp->edev)
|
||||
return;
|
||||
|
||||
auxiliary_device_delete(&bp->aux_priv->aux_dev);
|
||||
}
|
||||
|
||||
static void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
|
||||
{
|
||||
edev->net = bp->dev;
|
||||
@@ -347,7 +396,23 @@ static void bnxt_set_edev_info(struct bnxt_en_dev *edev, struct bnxt *bp)
|
||||
edev->pf_port_id = bp->pf.port_id;
|
||||
edev->en_state = bp->state;
|
||||
edev->bar0 = bp->bar0;
|
||||
edev->ulp_tbl->msix_requested = bnxt_get_ulp_msix_num(bp);
|
||||
}
|
||||
|
||||
void bnxt_rdma_aux_device_add(struct bnxt *bp)
|
||||
{
|
||||
struct auxiliary_device *aux_dev;
|
||||
int rc;
|
||||
|
||||
if (!bp->edev)
|
||||
return;
|
||||
|
||||
aux_dev = &bp->aux_priv->aux_dev;
|
||||
rc = auxiliary_device_add(aux_dev);
|
||||
if (rc) {
|
||||
netdev_warn(bp->dev, "Failed to add auxiliary device for ROCE\n");
|
||||
auxiliary_device_uninit(aux_dev);
|
||||
bp->flags &= ~BNXT_FLAG_ROCE_CAP;
|
||||
}
|
||||
}
|
||||
|
||||
void bnxt_rdma_aux_device_init(struct bnxt *bp)
|
||||
@@ -404,13 +469,7 @@ void bnxt_rdma_aux_device_init(struct bnxt *bp)
|
||||
edev->ulp_tbl = ulp;
|
||||
bp->edev = edev;
|
||||
bnxt_set_edev_info(edev, bp);
|
||||
|
||||
rc = auxiliary_device_add(aux_dev);
|
||||
if (rc) {
|
||||
netdev_warn(bp->dev,
|
||||
"Failed to add auxiliary device for ROCE\n");
|
||||
goto aux_dev_uninit;
|
||||
}
|
||||
bp->ulp_num_msix_want = bnxt_set_dflt_ulp_msix(bp);
|
||||
|
||||
return;
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ struct bnxt_ulp {
|
||||
unsigned long *async_events_bmap;
|
||||
u16 max_async_event_id;
|
||||
u16 msix_requested;
|
||||
u16 msix_base;
|
||||
atomic_t ref_count;
|
||||
};
|
||||
|
||||
@@ -86,18 +85,25 @@ struct bnxt_en_dev {
|
||||
* updated in resume.
|
||||
*/
|
||||
void __iomem *bar0;
|
||||
|
||||
u16 ulp_num_msix_vec;
|
||||
u16 ulp_num_ctxs;
|
||||
};
|
||||
|
||||
static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev)
|
||||
{
|
||||
if (edev && edev->ulp_tbl)
|
||||
if (edev && rcu_access_pointer(edev->ulp_tbl->ulp_ops))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
int bnxt_get_ulp_msix_num(struct bnxt *bp);
|
||||
int bnxt_get_ulp_msix_base(struct bnxt *bp);
|
||||
int bnxt_get_ulp_msix_num_in_use(struct bnxt *bp);
|
||||
void bnxt_set_ulp_msix_num(struct bnxt *bp, int num);
|
||||
int bnxt_get_ulp_stat_ctxs(struct bnxt *bp);
|
||||
void bnxt_set_ulp_stat_ctxs(struct bnxt *bp, int num_ctxs);
|
||||
int bnxt_get_ulp_stat_ctxs_in_use(struct bnxt *bp);
|
||||
void bnxt_set_dflt_ulp_stat_ctxs(struct bnxt *bp);
|
||||
void bnxt_ulp_stop(struct bnxt *bp);
|
||||
void bnxt_ulp_start(struct bnxt *bp, int err);
|
||||
void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
|
||||
@@ -105,6 +111,8 @@ void bnxt_ulp_irq_stop(struct bnxt *bp);
|
||||
void bnxt_ulp_irq_restart(struct bnxt *bp, int err);
|
||||
void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl);
|
||||
void bnxt_rdma_aux_device_uninit(struct bnxt *bp);
|
||||
void bnxt_rdma_aux_device_del(struct bnxt *bp);
|
||||
void bnxt_rdma_aux_device_add(struct bnxt *bp);
|
||||
void bnxt_rdma_aux_device_init(struct bnxt *bp);
|
||||
int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,
|
||||
void *handle);
|
||||
|
||||
@@ -4786,8 +4786,11 @@ MLXSW_ITEM32(reg, ptys, an_status, 0x04, 28, 4);
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_50GAUI_1_LAUI_1_50GBASE_CR_KR BIT(8)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_CAUI_4_100GBASE_CR4_KR4 BIT(9)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_100GAUI_2_100GBASE_CR2_KR2 BIT(10)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_100GAUI_1_100GBASE_CR_KR BIT(11)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_4_200GBASE_CR4_KR4 BIT(12)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_2_200GBASE_CR2_KR2 BIT(13)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_400GAUI_8 BIT(15)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_400GAUI_4_400GBASE_CR4_KR4 BIT(16)
|
||||
#define MLXSW_REG_PTYS_EXT_ETH_SPEED_800GAUI_8 BIT(19)
|
||||
|
||||
/* reg_ptys_ext_eth_proto_cap
|
||||
|
||||
@@ -1648,6 +1648,18 @@ mlxsw_sp2_mask_ethtool_100gaui_2_100gbase_cr2_kr2[] = {
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_100GAUI_2_100GBASE_CR2_KR2_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_100gaui_2_100gbase_cr2_kr2)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_100gaui_1_100gbase_cr_kr[] = {
|
||||
ETHTOOL_LINK_MODE_100000baseKR_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_100000baseSR_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_100000baseCR_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_100000baseDR_Full_BIT,
|
||||
};
|
||||
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_100GAUI_1_100GBASE_CR_KR_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_100gaui_1_100gbase_cr_kr)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4[] = {
|
||||
ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT,
|
||||
@@ -1660,6 +1672,18 @@ mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4[] = {
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_200GAUI_4_200GBASE_CR4_KR4_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_200gaui_2_200gbase_cr2_kr2[] = {
|
||||
ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT,
|
||||
};
|
||||
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_200GAUI_2_200GBASE_CR2_KR2_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_200gaui_2_200gbase_cr2_kr2)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_400gaui_8[] = {
|
||||
ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT,
|
||||
@@ -1672,6 +1696,18 @@ mlxsw_sp2_mask_ethtool_400gaui_8[] = {
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_400GAUI_8_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_400gaui_8)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_400gaui_4_400gbase_cr4_kr4[] = {
|
||||
ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT,
|
||||
ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT,
|
||||
};
|
||||
|
||||
#define MLXSW_SP2_MASK_ETHTOOL_400GAUI_4_400GBASE_CR4_KR4_LEN \
|
||||
ARRAY_SIZE(mlxsw_sp2_mask_ethtool_400gaui_4_400gbase_cr4_kr4)
|
||||
|
||||
static const enum ethtool_link_mode_bit_indices
|
||||
mlxsw_sp2_mask_ethtool_800gaui_8[] = {
|
||||
ETHTOOL_LINK_MODE_800000baseCR8_Full_BIT,
|
||||
@@ -1816,6 +1852,14 @@ static const struct mlxsw_sp2_port_link_mode mlxsw_sp2_port_link_mode[] = {
|
||||
.speed = SPEED_100000,
|
||||
.width = 2,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_100GAUI_1_100GBASE_CR_KR,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_100gaui_1_100gbase_cr_kr,
|
||||
.m_ethtool_len = MLXSW_SP2_MASK_ETHTOOL_100GAUI_1_100GBASE_CR_KR_LEN,
|
||||
.mask_sup_width = MLXSW_SP_PORT_MASK_WIDTH_1X,
|
||||
.speed = SPEED_100000,
|
||||
.width = 1,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_4_200GBASE_CR4_KR4,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_200gaui_4_200gbase_cr4_kr4,
|
||||
@@ -1825,6 +1869,14 @@ static const struct mlxsw_sp2_port_link_mode mlxsw_sp2_port_link_mode[] = {
|
||||
.speed = SPEED_200000,
|
||||
.width = 4,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_200GAUI_2_200GBASE_CR2_KR2,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_200gaui_2_200gbase_cr2_kr2,
|
||||
.m_ethtool_len = MLXSW_SP2_MASK_ETHTOOL_200GAUI_2_200GBASE_CR2_KR2_LEN,
|
||||
.mask_sup_width = MLXSW_SP_PORT_MASK_WIDTH_2X,
|
||||
.speed = SPEED_200000,
|
||||
.width = 2,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_400GAUI_8,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_400gaui_8,
|
||||
@@ -1833,6 +1885,14 @@ static const struct mlxsw_sp2_port_link_mode mlxsw_sp2_port_link_mode[] = {
|
||||
.speed = SPEED_400000,
|
||||
.width = 8,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_400GAUI_4_400GBASE_CR4_KR4,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_400gaui_4_400gbase_cr4_kr4,
|
||||
.m_ethtool_len = MLXSW_SP2_MASK_ETHTOOL_400GAUI_4_400GBASE_CR4_KR4_LEN,
|
||||
.mask_sup_width = MLXSW_SP_PORT_MASK_WIDTH_4X,
|
||||
.speed = SPEED_400000,
|
||||
.width = 4,
|
||||
},
|
||||
{
|
||||
.mask = MLXSW_REG_PTYS_EXT_ETH_SPEED_800GAUI_8,
|
||||
.mask_ethtool = mlxsw_sp2_mask_ethtool_800gaui_8,
|
||||
|
||||
@@ -1058,11 +1058,10 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
|
||||
struct mana_cfg_rx_steer_req_v2 *req;
|
||||
struct mana_cfg_rx_steer_resp resp = {};
|
||||
struct net_device *ndev = apc->ndev;
|
||||
mana_handle_t *req_indir_tab;
|
||||
u32 req_buf_size;
|
||||
int err;
|
||||
|
||||
req_buf_size = sizeof(*req) + sizeof(mana_handle_t) * num_entries;
|
||||
req_buf_size = struct_size(req, indir_tab, num_entries);
|
||||
req = kzalloc(req_buf_size, GFP_KERNEL);
|
||||
if (!req)
|
||||
return -ENOMEM;
|
||||
@@ -1074,7 +1073,8 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
|
||||
|
||||
req->vport = apc->port_handle;
|
||||
req->num_indir_entries = num_entries;
|
||||
req->indir_tab_offset = sizeof(*req);
|
||||
req->indir_tab_offset = offsetof(struct mana_cfg_rx_steer_req_v2,
|
||||
indir_tab);
|
||||
req->rx_enable = rx;
|
||||
req->rss_enable = apc->rss_state;
|
||||
req->update_default_rxobj = update_default_rxobj;
|
||||
@@ -1086,11 +1086,9 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
|
||||
if (update_key)
|
||||
memcpy(&req->hashkey, apc->hashkey, MANA_HASH_KEY_SIZE);
|
||||
|
||||
if (update_tab) {
|
||||
req_indir_tab = (mana_handle_t *)(req + 1);
|
||||
memcpy(req_indir_tab, apc->rxobj_table,
|
||||
req->num_indir_entries * sizeof(mana_handle_t));
|
||||
}
|
||||
if (update_tab)
|
||||
memcpy(req->indir_tab, apc->rxobj_table,
|
||||
flex_array_size(req, indir_tab, req->num_indir_entries));
|
||||
|
||||
err = mana_send_request(apc->ac, req, req_buf_size, &resp,
|
||||
sizeof(resp));
|
||||
|
||||
@@ -2808,7 +2808,7 @@ static const struct genl_multicast_group team_nl_mcgrps[] = {
|
||||
static struct genl_family team_nl_family __ro_after_init = {
|
||||
.name = TEAM_GENL_NAME,
|
||||
.version = TEAM_GENL_VERSION,
|
||||
.maxattr = ARRAY_SIZE(team_nl_policy),
|
||||
.maxattr = ARRAY_SIZE(team_nl_policy) - 1,
|
||||
.policy = team_nl_policy,
|
||||
.netnsok = true,
|
||||
.module = THIS_MODULE,
|
||||
|
||||
@@ -765,15 +765,13 @@ framer_exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qmc_hdlc_remove(struct platform_device *pdev)
|
||||
static void qmc_hdlc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct qmc_hdlc *qmc_hdlc = platform_get_drvdata(pdev);
|
||||
|
||||
unregister_hdlc_device(qmc_hdlc->netdev);
|
||||
free_netdev(qmc_hdlc->netdev);
|
||||
qmc_hdlc_framer_exit(qmc_hdlc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id qmc_hdlc_id_table[] = {
|
||||
@@ -788,7 +786,7 @@ static struct platform_driver qmc_hdlc_driver = {
|
||||
.of_match_table = qmc_hdlc_id_table,
|
||||
},
|
||||
.probe = qmc_hdlc_probe,
|
||||
.remove = qmc_hdlc_remove,
|
||||
.remove_new = qmc_hdlc_remove,
|
||||
};
|
||||
module_platform_driver(qmc_hdlc_driver);
|
||||
|
||||
|
||||
@@ -670,6 +670,7 @@ struct mana_cfg_rx_steer_req_v2 {
|
||||
u8 hashkey[MANA_HASH_KEY_SIZE];
|
||||
u8 cqe_coalescing_enable;
|
||||
u8 reserved2[7];
|
||||
mana_handle_t indir_tab[] __counted_by(num_indir_entries);
|
||||
}; /* HW DATA */
|
||||
|
||||
struct mana_cfg_rx_steer_resp {
|
||||
|
||||
@@ -488,9 +488,9 @@ enum {
|
||||
enum {
|
||||
ETHTOOL_A_TS_STAT_UNSPEC,
|
||||
|
||||
ETHTOOL_A_TS_STAT_TX_PKTS, /* u64 */
|
||||
ETHTOOL_A_TS_STAT_TX_LOST, /* u64 */
|
||||
ETHTOOL_A_TS_STAT_TX_ERR, /* u64 */
|
||||
ETHTOOL_A_TS_STAT_TX_PKTS, /* uint */
|
||||
ETHTOOL_A_TS_STAT_TX_LOST, /* uint */
|
||||
ETHTOOL_A_TS_STAT_TX_ERR, /* uint */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TS_STAT_CNT,
|
||||
|
||||
@@ -9,6 +9,7 @@ PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no}
|
||||
|
||||
RTABLE=100
|
||||
RTABLE_PEER=101
|
||||
RTABLE_VRF=102
|
||||
GW_IP4=192.51.100.2
|
||||
SRC_IP=192.51.100.3
|
||||
GW_IP6=2001:db8:1::2
|
||||
@@ -17,7 +18,14 @@ SRC_IP6=2001:db8:1::3
|
||||
DEV_ADDR=192.51.100.1
|
||||
DEV_ADDR6=2001:db8:1::1
|
||||
DEV=dummy0
|
||||
TESTS="fib_rule6 fib_rule4 fib_rule6_connect fib_rule4_connect"
|
||||
TESTS="
|
||||
fib_rule6
|
||||
fib_rule4
|
||||
fib_rule6_connect
|
||||
fib_rule4_connect
|
||||
fib_rule6_vrf
|
||||
fib_rule4_vrf
|
||||
"
|
||||
|
||||
SELFTEST_PATH=""
|
||||
|
||||
@@ -27,13 +35,18 @@ log_test()
|
||||
local expected=$2
|
||||
local msg="$3"
|
||||
|
||||
$IP rule show | grep -q l3mdev
|
||||
if [ $? -eq 0 ]; then
|
||||
msg="$msg (VRF)"
|
||||
fi
|
||||
|
||||
if [ ${rc} -eq ${expected} ]; then
|
||||
nsuccess=$((nsuccess+1))
|
||||
printf "\n TEST: %-50s [ OK ]\n" "${msg}"
|
||||
printf "\n TEST: %-60s [ OK ]\n" "${msg}"
|
||||
else
|
||||
ret=1
|
||||
nfail=$((nfail+1))
|
||||
printf "\n TEST: %-50s [FAIL]\n" "${msg}"
|
||||
printf "\n TEST: %-60s [FAIL]\n" "${msg}"
|
||||
if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
|
||||
echo
|
||||
echo "hit enter to continue, 'q' to quit"
|
||||
@@ -130,6 +143,17 @@ cleanup_peer()
|
||||
ip netns del $peerns
|
||||
}
|
||||
|
||||
setup_vrf()
|
||||
{
|
||||
$IP link add name vrf0 up type vrf table $RTABLE_VRF
|
||||
$IP link set dev $DEV master vrf0
|
||||
}
|
||||
|
||||
cleanup_vrf()
|
||||
{
|
||||
$IP link del dev vrf0
|
||||
}
|
||||
|
||||
fib_check_iproute_support()
|
||||
{
|
||||
ip rule help 2>&1 | grep -q $1
|
||||
@@ -248,6 +272,13 @@ fib_rule6_test()
|
||||
fi
|
||||
}
|
||||
|
||||
fib_rule6_vrf_test()
|
||||
{
|
||||
setup_vrf
|
||||
fib_rule6_test
|
||||
cleanup_vrf
|
||||
}
|
||||
|
||||
# Verify that the IPV6_TCLASS option of UDPv6 and TCPv6 sockets is properly
|
||||
# taken into account when connecting the socket and when sending packets.
|
||||
fib_rule6_connect_test()
|
||||
@@ -385,6 +416,13 @@ fib_rule4_test()
|
||||
fi
|
||||
}
|
||||
|
||||
fib_rule4_vrf_test()
|
||||
{
|
||||
setup_vrf
|
||||
fib_rule4_test
|
||||
cleanup_vrf
|
||||
}
|
||||
|
||||
# Verify that the IP_TOS option of UDPv4 and TCPv4 sockets is properly taken
|
||||
# into account when connecting the socket and when sending packets.
|
||||
fib_rule4_connect_test()
|
||||
@@ -467,6 +505,8 @@ do
|
||||
fib_rule4_test|fib_rule4) fib_rule4_test;;
|
||||
fib_rule6_connect_test|fib_rule6_connect) fib_rule6_connect_test;;
|
||||
fib_rule4_connect_test|fib_rule4_connect) fib_rule4_connect_test;;
|
||||
fib_rule6_vrf_test|fib_rule6_vrf) fib_rule6_vrf_test;;
|
||||
fib_rule4_vrf_test|fib_rule4_vrf) fib_rule4_vrf_test;;
|
||||
|
||||
help) echo "Test names: $TESTS"; exit 0;;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user