mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'net-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from netfilter and bpf.
Current release - regressions:
- sched: fix SKB_NOT_DROPPED_YET splat under debug config
Current release - new code bugs:
- tcp:
- fix usec timestamps with TCP fastopen
- fix possible out-of-bounds reads in tcp_hash_fail()
- fix SYN option room calculation for TCP-AO
- tcp_sigpool: fix some off by one bugs
- bpf: fix compilation error without CGROUPS
- ptp:
- ptp_read() should not release queue
- fix tsevqs corruption
Previous releases - regressions:
- llc: verify mac len before reading mac header
Previous releases - always broken:
- bpf:
- fix check_stack_write_fixed_off() to correctly spill imm
- fix precision tracking for BPF_ALU | BPF_TO_BE | BPF_END
- check map->usercnt after timer->timer is assigned
- dsa: lan9303: consequently nested-lock physical MDIO
- dccp/tcp: call security_inet_conn_request() after setting IP addr
- tg3: fix the TX ring stall due to incorrect full ring handling
- phylink: initialize carrier state at creation
- ice: fix direction of VF rules in switchdev mode
Misc:
- fill in a bunch of missing MODULE_DESCRIPTION()s, more to come"
* tag 'net-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (84 commits)
net: ti: icss-iep: fix setting counter value
ptp: fix corrupted list in ptp_open
ptp: ptp_read should not release queue
net_sched: sch_fq: better validate TCA_FQ_WEIGHTS and TCA_FQ_PRIOMAP
net: kcm: fill in MODULE_DESCRIPTION()
net/sched: act_ct: Always fill offloading tuple iifidx
netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses
netfilter: xt_recent: fix (increase) ipv6 literal buffer length
ipvs: add missing module descriptions
netfilter: nf_tables: remove catchall element in GC sync path
netfilter: add missing module descriptions
drivers/net/ppp: use standard array-copy-function
net: enetc: shorten enetc_setup_xdp_prog() error message to fit NETLINK_MAX_FMTMSG_LEN
virtio/vsock: Fix uninit-value in virtio_transport_recv_pkt()
r8169: respect userspace disabling IFF_MULTICAST
selftests/bpf: get trusted cgrp from bpf_iter__cgroup directly
bpf: Let verifier consider {task,cgroup} is trusted in bpf_iter_reg
net: phylink: initialize carrier state at creation
test/vsock: add dobule bind connect test
test/vsock: refactor vsock_accept
...
This commit is contained in:
@@ -37,16 +37,14 @@ prototype in a header for the wrapper kfunc.
|
||||
An example is given below::
|
||||
|
||||
/* Disables missing prototype warnings */
|
||||
__diag_push();
|
||||
__diag_ignore_all("-Wmissing-prototypes",
|
||||
"Global kfuncs as their definitions will be in BTF");
|
||||
__bpf_kfunc_start_defs();
|
||||
|
||||
__bpf_kfunc struct task_struct *bpf_find_get_task_by_vpid(pid_t nr)
|
||||
{
|
||||
return find_get_task_by_vpid(nr);
|
||||
}
|
||||
|
||||
__diag_pop();
|
||||
__bpf_kfunc_end_defs();
|
||||
|
||||
A wrapper kfunc is often needed when we need to annotate parameters of the
|
||||
kfunc. Otherwise one may directly make the kfunc visible to the BPF program by
|
||||
|
||||
@@ -71,6 +71,10 @@ definitions:
|
||||
name: roce-bit
|
||||
-
|
||||
name: migratable-bit
|
||||
-
|
||||
name: ipsec-crypto-bit
|
||||
-
|
||||
name: ipsec-packet-bit
|
||||
-
|
||||
type: enum
|
||||
name: sb-threshold-type
|
||||
|
||||
@@ -44,18 +44,16 @@ smcr_testlink_time - INTEGER
|
||||
|
||||
wmem - INTEGER
|
||||
Initial size of send buffer used by SMC sockets.
|
||||
The default value inherits from net.ipv4.tcp_wmem[1].
|
||||
|
||||
The minimum value is 16KiB and there is no hard limit for max value, but
|
||||
only allowed 512KiB for SMC-R and 1MiB for SMC-D.
|
||||
|
||||
Default: 16K
|
||||
Default: 64KiB
|
||||
|
||||
rmem - INTEGER
|
||||
Initial size of receive buffer (RMB) used by SMC sockets.
|
||||
The default value inherits from net.ipv4.tcp_rmem[1].
|
||||
|
||||
The minimum value is 16KiB and there is no hard limit for max value, but
|
||||
only allowed 512KiB for SMC-R and 1MiB for SMC-D.
|
||||
|
||||
Default: 128K
|
||||
Default: 64KiB
|
||||
|
||||
@@ -32,7 +32,7 @@ static int lan9303_mdio_write(void *ctx, uint32_t reg, uint32_t val)
|
||||
struct lan9303_mdio *sw_dev = (struct lan9303_mdio *)ctx;
|
||||
|
||||
reg <<= 2; /* reg num to offset */
|
||||
mutex_lock(&sw_dev->device->bus->mdio_lock);
|
||||
mutex_lock_nested(&sw_dev->device->bus->mdio_lock, MDIO_MUTEX_NESTED);
|
||||
lan9303_mdio_real_write(sw_dev->device, reg, val & 0xffff);
|
||||
lan9303_mdio_real_write(sw_dev->device, reg + 2, (val >> 16) & 0xffff);
|
||||
mutex_unlock(&sw_dev->device->bus->mdio_lock);
|
||||
@@ -50,7 +50,7 @@ static int lan9303_mdio_read(void *ctx, uint32_t reg, uint32_t *val)
|
||||
struct lan9303_mdio *sw_dev = (struct lan9303_mdio *)ctx;
|
||||
|
||||
reg <<= 2; /* reg num to offset */
|
||||
mutex_lock(&sw_dev->device->bus->mdio_lock);
|
||||
mutex_lock_nested(&sw_dev->device->bus->mdio_lock, MDIO_MUTEX_NESTED);
|
||||
*val = lan9303_mdio_real_read(sw_dev->device, reg);
|
||||
*val |= (lan9303_mdio_real_read(sw_dev->device, reg + 2) << 16);
|
||||
mutex_unlock(&sw_dev->device->bus->mdio_lock);
|
||||
|
||||
@@ -6647,9 +6647,9 @@ static void tg3_tx(struct tg3_napi *tnapi)
|
||||
|
||||
tnapi->tx_cons = sw_idx;
|
||||
|
||||
/* Need to make the tx_cons update visible to tg3_start_xmit()
|
||||
/* Need to make the tx_cons update visible to __tg3_start_xmit()
|
||||
* before checking for netif_queue_stopped(). Without the
|
||||
* memory barrier, there is a small possibility that tg3_start_xmit()
|
||||
* memory barrier, there is a small possibility that __tg3_start_xmit()
|
||||
* will miss it and cause the queue to be stopped forever.
|
||||
*/
|
||||
smp_mb();
|
||||
@@ -7889,7 +7889,7 @@ static bool tg3_tso_bug_gso_check(struct tg3_napi *tnapi, struct sk_buff *skb)
|
||||
return skb_shinfo(skb)->gso_segs < tnapi->tx_pending / 3;
|
||||
}
|
||||
|
||||
static netdev_tx_t tg3_start_xmit(struct sk_buff *, struct net_device *);
|
||||
static netdev_tx_t __tg3_start_xmit(struct sk_buff *, struct net_device *);
|
||||
|
||||
/* Use GSO to workaround all TSO packets that meet HW bug conditions
|
||||
* indicated in tg3_tx_frag_set()
|
||||
@@ -7923,7 +7923,7 @@ static int tg3_tso_bug(struct tg3 *tp, struct tg3_napi *tnapi,
|
||||
|
||||
skb_list_walk_safe(segs, seg, next) {
|
||||
skb_mark_not_on_list(seg);
|
||||
tg3_start_xmit(seg, tp->dev);
|
||||
__tg3_start_xmit(seg, tp->dev);
|
||||
}
|
||||
|
||||
tg3_tso_bug_end:
|
||||
@@ -7933,7 +7933,7 @@ tg3_tso_bug_end:
|
||||
}
|
||||
|
||||
/* hard_start_xmit for all devices */
|
||||
static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
static netdev_tx_t __tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
u32 len, entry, base_flags, mss, vlan = 0;
|
||||
@@ -8182,11 +8182,6 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netif_tx_wake_queue(txq);
|
||||
}
|
||||
|
||||
if (!netdev_xmit_more() || netif_xmit_stopped(txq)) {
|
||||
/* Packets are ready, update Tx producer idx on card. */
|
||||
tw32_tx_mbox(tnapi->prodmbox, entry);
|
||||
}
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
dma_error:
|
||||
@@ -8199,6 +8194,42 @@ drop_nofree:
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct netdev_queue *txq;
|
||||
u16 skb_queue_mapping;
|
||||
netdev_tx_t ret;
|
||||
|
||||
skb_queue_mapping = skb_get_queue_mapping(skb);
|
||||
txq = netdev_get_tx_queue(dev, skb_queue_mapping);
|
||||
|
||||
ret = __tg3_start_xmit(skb, dev);
|
||||
|
||||
/* Notify the hardware that packets are ready by updating the TX ring
|
||||
* tail pointer. We respect netdev_xmit_more() thus avoiding poking
|
||||
* the hardware for every packet. To guarantee forward progress the TX
|
||||
* ring must be drained when it is full as indicated by
|
||||
* netif_xmit_stopped(). This needs to happen even when the current
|
||||
* skb was dropped or rejected with NETDEV_TX_BUSY. Otherwise packets
|
||||
* queued by previous __tg3_start_xmit() calls might get stuck in
|
||||
* the queue forever.
|
||||
*/
|
||||
if (!netdev_xmit_more() || netif_xmit_stopped(txq)) {
|
||||
struct tg3_napi *tnapi;
|
||||
struct tg3 *tp;
|
||||
|
||||
tp = netdev_priv(dev);
|
||||
tnapi = &tp->napi[skb_queue_mapping];
|
||||
|
||||
if (tg3_flag(tp, ENABLE_TSS))
|
||||
tnapi++;
|
||||
|
||||
tw32_tx_mbox(tnapi->prodmbox, tnapi->tx_prod);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void tg3_mac_loopback(struct tg3 *tp, bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
@@ -17729,7 +17760,7 @@ static int tg3_init_one(struct pci_dev *pdev,
|
||||
* device behind the EPB cannot support DMA addresses > 40-bit.
|
||||
* On 64-bit systems with IOMMU, use 40-bit dma_mask.
|
||||
* On 64-bit systems without IOMMU, use 64-bit dma_mask and
|
||||
* do DMA address check in tg3_start_xmit().
|
||||
* do DMA address check in __tg3_start_xmit().
|
||||
*/
|
||||
if (tg3_flag(tp, IS_5788))
|
||||
persist_dma_mask = dma_mask = DMA_BIT_MASK(32);
|
||||
@@ -18127,7 +18158,8 @@ static void tg3_shutdown(struct pci_dev *pdev)
|
||||
if (netif_running(dev))
|
||||
dev_close(dev);
|
||||
|
||||
tg3_power_down(tp);
|
||||
if (system_state == SYSTEM_POWER_OFF)
|
||||
tg3_power_down(tp);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
|
||||
@@ -2769,7 +2769,7 @@ static int enetc_setup_xdp_prog(struct net_device *ndev, struct bpf_prog *prog,
|
||||
if (priv->min_num_stack_tx_queues + num_xdp_tx_queues >
|
||||
priv->num_tx_rings) {
|
||||
NL_SET_ERR_MSG_FMT_MOD(extack,
|
||||
"Reserving %d XDP TXQs does not leave a minimum of %d TXQs for network stack (total %d available)",
|
||||
"Reserving %d XDP TXQs does not leave a minimum of %d for stack (total %d)",
|
||||
num_xdp_tx_queues,
|
||||
priv->min_num_stack_tx_queues,
|
||||
priv->num_tx_rings);
|
||||
|
||||
@@ -231,6 +231,5 @@ int i40e_devlink_create_port(struct i40e_pf *pf)
|
||||
**/
|
||||
void i40e_devlink_destroy_port(struct i40e_pf *pf)
|
||||
{
|
||||
devlink_port_type_clear(&pf->devlink_port);
|
||||
devlink_port_unregister(&pf->devlink_port);
|
||||
}
|
||||
|
||||
@@ -14213,8 +14213,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
|
||||
}
|
||||
set_bit(__I40E_VSI_RELEASING, vsi->state);
|
||||
uplink_seid = vsi->uplink_seid;
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
|
||||
if (vsi->type != I40E_VSI_SRIOV) {
|
||||
if (vsi->netdev_registered) {
|
||||
vsi->netdev_registered = false;
|
||||
@@ -14228,6 +14227,9 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
|
||||
i40e_vsi_disable_irq(vsi);
|
||||
}
|
||||
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
|
||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||
|
||||
/* clear the sync flag on all filters */
|
||||
@@ -14402,14 +14404,14 @@ static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
|
||||
|
||||
err_rings:
|
||||
i40e_vsi_free_q_vectors(vsi);
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
if (vsi->netdev_registered) {
|
||||
vsi->netdev_registered = false;
|
||||
unregister_netdev(vsi->netdev);
|
||||
free_netdev(vsi->netdev);
|
||||
vsi->netdev = NULL;
|
||||
}
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
i40e_aq_delete_element(&pf->hw, vsi->seid, NULL);
|
||||
err_vsi:
|
||||
i40e_vsi_clear(vsi);
|
||||
|
||||
@@ -628,7 +628,7 @@ void ice_lag_move_new_vf_nodes(struct ice_vf *vf)
|
||||
INIT_LIST_HEAD(&ndlist.node);
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
|
||||
nl = kzalloc(sizeof(*nl), GFP_KERNEL);
|
||||
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
|
||||
if (!nl)
|
||||
break;
|
||||
|
||||
@@ -1555,18 +1555,12 @@ static void ice_lag_chk_disabled_bond(struct ice_lag *lag, void *ptr)
|
||||
*/
|
||||
static void ice_lag_disable_sriov_bond(struct ice_lag *lag)
|
||||
{
|
||||
struct ice_lag_netdev_list *entry;
|
||||
struct ice_netdev_priv *np;
|
||||
struct net_device *netdev;
|
||||
struct ice_pf *pf;
|
||||
|
||||
list_for_each_entry(entry, lag->netdev_head, node) {
|
||||
netdev = entry->netdev;
|
||||
np = netdev_priv(netdev);
|
||||
pf = np->vsi->back;
|
||||
|
||||
ice_clear_feature_support(pf, ICE_F_SRIOV_LAG);
|
||||
}
|
||||
np = netdev_priv(lag->netdev);
|
||||
pf = np->vsi->back;
|
||||
ice_clear_feature_support(pf, ICE_F_SRIOV_LAG);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1698,7 +1692,7 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(upper_netdev, tmp_nd) {
|
||||
nd_list = kzalloc(sizeof(*nd_list), GFP_KERNEL);
|
||||
nd_list = kzalloc(sizeof(*nd_list), GFP_ATOMIC);
|
||||
if (!nd_list)
|
||||
break;
|
||||
|
||||
@@ -2075,7 +2069,7 @@ void ice_lag_rebuild(struct ice_pf *pf)
|
||||
INIT_LIST_HEAD(&ndlist.node);
|
||||
rcu_read_lock();
|
||||
for_each_netdev_in_bond_rcu(lag->upper_netdev, tmp_nd) {
|
||||
nl = kzalloc(sizeof(*nl), GFP_KERNEL);
|
||||
nl = kzalloc(sizeof(*nl), GFP_ATOMIC);
|
||||
if (!nl)
|
||||
break;
|
||||
|
||||
|
||||
@@ -630,32 +630,83 @@ bool ice_is_tunnel_supported(struct net_device *dev)
|
||||
return ice_tc_tun_get_type(dev) != TNL_LAST;
|
||||
}
|
||||
|
||||
static int
|
||||
ice_eswitch_tc_parse_action(struct ice_tc_flower_fltr *fltr,
|
||||
struct flow_action_entry *act)
|
||||
static bool ice_tc_is_dev_uplink(struct net_device *dev)
|
||||
{
|
||||
return netif_is_ice(dev) || ice_is_tunnel_supported(dev);
|
||||
}
|
||||
|
||||
static int ice_tc_setup_redirect_action(struct net_device *filter_dev,
|
||||
struct ice_tc_flower_fltr *fltr,
|
||||
struct net_device *target_dev)
|
||||
{
|
||||
struct ice_repr *repr;
|
||||
|
||||
fltr->action.fltr_act = ICE_FWD_TO_VSI;
|
||||
|
||||
if (ice_is_port_repr_netdev(filter_dev) &&
|
||||
ice_is_port_repr_netdev(target_dev)) {
|
||||
repr = ice_netdev_to_repr(target_dev);
|
||||
|
||||
fltr->dest_vsi = repr->src_vsi;
|
||||
fltr->direction = ICE_ESWITCH_FLTR_EGRESS;
|
||||
} else if (ice_is_port_repr_netdev(filter_dev) &&
|
||||
ice_tc_is_dev_uplink(target_dev)) {
|
||||
repr = ice_netdev_to_repr(filter_dev);
|
||||
|
||||
fltr->dest_vsi = repr->src_vsi->back->switchdev.uplink_vsi;
|
||||
fltr->direction = ICE_ESWITCH_FLTR_EGRESS;
|
||||
} else if (ice_tc_is_dev_uplink(filter_dev) &&
|
||||
ice_is_port_repr_netdev(target_dev)) {
|
||||
repr = ice_netdev_to_repr(target_dev);
|
||||
|
||||
fltr->dest_vsi = repr->src_vsi;
|
||||
fltr->direction = ICE_ESWITCH_FLTR_INGRESS;
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(fltr->extack,
|
||||
"Unsupported netdevice in switchdev mode");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ice_tc_setup_drop_action(struct net_device *filter_dev,
|
||||
struct ice_tc_flower_fltr *fltr)
|
||||
{
|
||||
fltr->action.fltr_act = ICE_DROP_PACKET;
|
||||
|
||||
if (ice_is_port_repr_netdev(filter_dev)) {
|
||||
fltr->direction = ICE_ESWITCH_FLTR_EGRESS;
|
||||
} else if (ice_tc_is_dev_uplink(filter_dev)) {
|
||||
fltr->direction = ICE_ESWITCH_FLTR_INGRESS;
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(fltr->extack,
|
||||
"Unsupported netdevice in switchdev mode");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ice_eswitch_tc_parse_action(struct net_device *filter_dev,
|
||||
struct ice_tc_flower_fltr *fltr,
|
||||
struct flow_action_entry *act)
|
||||
{
|
||||
int err;
|
||||
|
||||
switch (act->id) {
|
||||
case FLOW_ACTION_DROP:
|
||||
fltr->action.fltr_act = ICE_DROP_PACKET;
|
||||
err = ice_tc_setup_drop_action(filter_dev, fltr);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
break;
|
||||
|
||||
case FLOW_ACTION_REDIRECT:
|
||||
fltr->action.fltr_act = ICE_FWD_TO_VSI;
|
||||
|
||||
if (ice_is_port_repr_netdev(act->dev)) {
|
||||
repr = ice_netdev_to_repr(act->dev);
|
||||
|
||||
fltr->dest_vsi = repr->src_vsi;
|
||||
fltr->direction = ICE_ESWITCH_FLTR_INGRESS;
|
||||
} else if (netif_is_ice(act->dev) ||
|
||||
ice_is_tunnel_supported(act->dev)) {
|
||||
fltr->direction = ICE_ESWITCH_FLTR_EGRESS;
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported netdevice in switchdev mode");
|
||||
return -EINVAL;
|
||||
}
|
||||
err = ice_tc_setup_redirect_action(filter_dev, fltr, act->dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
break;
|
||||
|
||||
@@ -696,10 +747,6 @@ ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* egress traffic is always redirect to uplink */
|
||||
if (fltr->direction == ICE_ESWITCH_FLTR_EGRESS)
|
||||
fltr->dest_vsi = vsi->back->switchdev.uplink_vsi;
|
||||
|
||||
rule_info.sw_act.fltr_act = fltr->action.fltr_act;
|
||||
if (fltr->action.fltr_act != ICE_DROP_PACKET)
|
||||
rule_info.sw_act.vsi_handle = fltr->dest_vsi->idx;
|
||||
@@ -713,13 +760,21 @@ ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
|
||||
rule_info.flags_info.act_valid = true;
|
||||
|
||||
if (fltr->direction == ICE_ESWITCH_FLTR_INGRESS) {
|
||||
/* Uplink to VF */
|
||||
rule_info.sw_act.flag |= ICE_FLTR_RX;
|
||||
rule_info.sw_act.src = hw->pf_id;
|
||||
rule_info.flags_info.act = ICE_SINGLE_ACT_LB_ENABLE;
|
||||
} else {
|
||||
} else if (fltr->direction == ICE_ESWITCH_FLTR_EGRESS &&
|
||||
fltr->dest_vsi == vsi->back->switchdev.uplink_vsi) {
|
||||
/* VF to Uplink */
|
||||
rule_info.sw_act.flag |= ICE_FLTR_TX;
|
||||
rule_info.sw_act.src = vsi->idx;
|
||||
rule_info.flags_info.act = ICE_SINGLE_ACT_LAN_ENABLE;
|
||||
} else {
|
||||
/* VF to VF */
|
||||
rule_info.sw_act.flag |= ICE_FLTR_TX;
|
||||
rule_info.sw_act.src = vsi->idx;
|
||||
rule_info.flags_info.act = ICE_SINGLE_ACT_LB_ENABLE;
|
||||
}
|
||||
|
||||
/* specify the cookie as filter_rule_id */
|
||||
@@ -1745,16 +1800,17 @@ ice_tc_parse_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr,
|
||||
|
||||
/**
|
||||
* ice_parse_tc_flower_actions - Parse the actions for a TC filter
|
||||
* @filter_dev: Pointer to device on which filter is being added
|
||||
* @vsi: Pointer to VSI
|
||||
* @cls_flower: Pointer to TC flower offload structure
|
||||
* @fltr: Pointer to TC flower filter structure
|
||||
*
|
||||
* Parse the actions for a TC filter
|
||||
*/
|
||||
static int
|
||||
ice_parse_tc_flower_actions(struct ice_vsi *vsi,
|
||||
struct flow_cls_offload *cls_flower,
|
||||
struct ice_tc_flower_fltr *fltr)
|
||||
static int ice_parse_tc_flower_actions(struct net_device *filter_dev,
|
||||
struct ice_vsi *vsi,
|
||||
struct flow_cls_offload *cls_flower,
|
||||
struct ice_tc_flower_fltr *fltr)
|
||||
{
|
||||
struct flow_rule *rule = flow_cls_offload_flow_rule(cls_flower);
|
||||
struct flow_action *flow_action = &rule->action;
|
||||
@@ -1769,7 +1825,7 @@ ice_parse_tc_flower_actions(struct ice_vsi *vsi,
|
||||
|
||||
flow_action_for_each(i, act, flow_action) {
|
||||
if (ice_is_eswitch_mode_switchdev(vsi->back))
|
||||
err = ice_eswitch_tc_parse_action(fltr, act);
|
||||
err = ice_eswitch_tc_parse_action(filter_dev, fltr, act);
|
||||
else
|
||||
err = ice_tc_parse_action(vsi, fltr, act);
|
||||
if (err)
|
||||
@@ -1856,7 +1912,7 @@ ice_add_tc_fltr(struct net_device *netdev, struct ice_vsi *vsi,
|
||||
if (err < 0)
|
||||
goto err;
|
||||
|
||||
err = ice_parse_tc_flower_actions(vsi, f, fltr);
|
||||
err = ice_parse_tc_flower_actions(netdev, vsi, f, fltr);
|
||||
if (err < 0)
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -2365,7 +2365,7 @@ static void idpf_tx_splitq_map(struct idpf_queue *tx_q,
|
||||
*/
|
||||
int idpf_tso(struct sk_buff *skb, struct idpf_tx_offload_params *off)
|
||||
{
|
||||
const struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||
const struct skb_shared_info *shinfo;
|
||||
union {
|
||||
struct iphdr *v4;
|
||||
struct ipv6hdr *v6;
|
||||
@@ -2379,13 +2379,15 @@ int idpf_tso(struct sk_buff *skb, struct idpf_tx_offload_params *off)
|
||||
u32 paylen, l4_start;
|
||||
int err;
|
||||
|
||||
if (!shinfo->gso_size)
|
||||
if (!skb_is_gso(skb))
|
||||
return 0;
|
||||
|
||||
err = skb_cow_head(skb, 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
shinfo = skb_shinfo(skb);
|
||||
|
||||
ip.hdr = skb_network_header(skb);
|
||||
l4.hdr = skb_transport_header(skb);
|
||||
|
||||
|
||||
@@ -818,7 +818,6 @@ void otx2_sqb_flush(struct otx2_nic *pfvf)
|
||||
int qidx, sqe_tail, sqe_head;
|
||||
struct otx2_snd_queue *sq;
|
||||
u64 incr, *ptr, val;
|
||||
int timeout = 1000;
|
||||
|
||||
ptr = (u64 *)otx2_get_regaddr(pfvf, NIX_LF_SQ_OP_STATUS);
|
||||
for (qidx = 0; qidx < otx2_get_total_tx_queues(pfvf); qidx++) {
|
||||
@@ -827,15 +826,11 @@ void otx2_sqb_flush(struct otx2_nic *pfvf)
|
||||
continue;
|
||||
|
||||
incr = (u64)qidx << 32;
|
||||
while (timeout) {
|
||||
val = otx2_atomic64_add(incr, ptr);
|
||||
sqe_head = (val >> 20) & 0x3F;
|
||||
sqe_tail = (val >> 28) & 0x3F;
|
||||
if (sqe_head == sqe_tail)
|
||||
break;
|
||||
usleep_range(1, 3);
|
||||
timeout--;
|
||||
}
|
||||
val = otx2_atomic64_add(incr, ptr);
|
||||
sqe_head = (val >> 20) & 0x3F;
|
||||
sqe_tail = (val >> 28) & 0x3F;
|
||||
if (sqe_head != sqe_tail)
|
||||
usleep_range(50, 60);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -977,6 +977,7 @@ int otx2_txschq_config(struct otx2_nic *pfvf, int lvl, int prio, bool pfc_en);
|
||||
int otx2_txsch_alloc(struct otx2_nic *pfvf);
|
||||
void otx2_txschq_stop(struct otx2_nic *pfvf);
|
||||
void otx2_txschq_free_one(struct otx2_nic *pfvf, u16 lvl, u16 schq);
|
||||
void otx2_free_pending_sqe(struct otx2_nic *pfvf);
|
||||
void otx2_sqb_flush(struct otx2_nic *pfvf);
|
||||
int otx2_alloc_rbuf(struct otx2_nic *pfvf, struct otx2_pool *pool,
|
||||
dma_addr_t *dma);
|
||||
|
||||
@@ -1193,31 +1193,32 @@ static char *nix_mnqerr_e_str[NIX_MNQERR_MAX] = {
|
||||
};
|
||||
|
||||
static char *nix_snd_status_e_str[NIX_SND_STATUS_MAX] = {
|
||||
"NIX_SND_STATUS_GOOD",
|
||||
"NIX_SND_STATUS_SQ_CTX_FAULT",
|
||||
"NIX_SND_STATUS_SQ_CTX_POISON",
|
||||
"NIX_SND_STATUS_SQB_FAULT",
|
||||
"NIX_SND_STATUS_SQB_POISON",
|
||||
"NIX_SND_STATUS_HDR_ERR",
|
||||
"NIX_SND_STATUS_EXT_ERR",
|
||||
"NIX_SND_STATUS_JUMP_FAULT",
|
||||
"NIX_SND_STATUS_JUMP_POISON",
|
||||
"NIX_SND_STATUS_CRC_ERR",
|
||||
"NIX_SND_STATUS_IMM_ERR",
|
||||
"NIX_SND_STATUS_SG_ERR",
|
||||
"NIX_SND_STATUS_MEM_ERR",
|
||||
"NIX_SND_STATUS_INVALID_SUBDC",
|
||||
"NIX_SND_STATUS_SUBDC_ORDER_ERR",
|
||||
"NIX_SND_STATUS_DATA_FAULT",
|
||||
"NIX_SND_STATUS_DATA_POISON",
|
||||
"NIX_SND_STATUS_NPC_DROP_ACTION",
|
||||
"NIX_SND_STATUS_LOCK_VIOL",
|
||||
"NIX_SND_STATUS_NPC_UCAST_CHAN_ERR",
|
||||
"NIX_SND_STATUS_NPC_MCAST_CHAN_ERR",
|
||||
"NIX_SND_STATUS_NPC_MCAST_ABORT",
|
||||
"NIX_SND_STATUS_NPC_VTAG_PTR_ERR",
|
||||
"NIX_SND_STATUS_NPC_VTAG_SIZE_ERR",
|
||||
"NIX_SND_STATUS_SEND_STATS_ERR",
|
||||
[NIX_SND_STATUS_GOOD] = "NIX_SND_STATUS_GOOD",
|
||||
[NIX_SND_STATUS_SQ_CTX_FAULT] = "NIX_SND_STATUS_SQ_CTX_FAULT",
|
||||
[NIX_SND_STATUS_SQ_CTX_POISON] = "NIX_SND_STATUS_SQ_CTX_POISON",
|
||||
[NIX_SND_STATUS_SQB_FAULT] = "NIX_SND_STATUS_SQB_FAULT",
|
||||
[NIX_SND_STATUS_SQB_POISON] = "NIX_SND_STATUS_SQB_POISON",
|
||||
[NIX_SND_STATUS_HDR_ERR] = "NIX_SND_STATUS_HDR_ERR",
|
||||
[NIX_SND_STATUS_EXT_ERR] = "NIX_SND_STATUS_EXT_ERR",
|
||||
[NIX_SND_STATUS_JUMP_FAULT] = "NIX_SND_STATUS_JUMP_FAULT",
|
||||
[NIX_SND_STATUS_JUMP_POISON] = "NIX_SND_STATUS_JUMP_POISON",
|
||||
[NIX_SND_STATUS_CRC_ERR] = "NIX_SND_STATUS_CRC_ERR",
|
||||
[NIX_SND_STATUS_IMM_ERR] = "NIX_SND_STATUS_IMM_ERR",
|
||||
[NIX_SND_STATUS_SG_ERR] = "NIX_SND_STATUS_SG_ERR",
|
||||
[NIX_SND_STATUS_MEM_ERR] = "NIX_SND_STATUS_MEM_ERR",
|
||||
[NIX_SND_STATUS_INVALID_SUBDC] = "NIX_SND_STATUS_INVALID_SUBDC",
|
||||
[NIX_SND_STATUS_SUBDC_ORDER_ERR] = "NIX_SND_STATUS_SUBDC_ORDER_ERR",
|
||||
[NIX_SND_STATUS_DATA_FAULT] = "NIX_SND_STATUS_DATA_FAULT",
|
||||
[NIX_SND_STATUS_DATA_POISON] = "NIX_SND_STATUS_DATA_POISON",
|
||||
[NIX_SND_STATUS_NPC_DROP_ACTION] = "NIX_SND_STATUS_NPC_DROP_ACTION",
|
||||
[NIX_SND_STATUS_LOCK_VIOL] = "NIX_SND_STATUS_LOCK_VIOL",
|
||||
[NIX_SND_STATUS_NPC_UCAST_CHAN_ERR] = "NIX_SND_STAT_NPC_UCAST_CHAN_ERR",
|
||||
[NIX_SND_STATUS_NPC_MCAST_CHAN_ERR] = "NIX_SND_STAT_NPC_MCAST_CHAN_ERR",
|
||||
[NIX_SND_STATUS_NPC_MCAST_ABORT] = "NIX_SND_STATUS_NPC_MCAST_ABORT",
|
||||
[NIX_SND_STATUS_NPC_VTAG_PTR_ERR] = "NIX_SND_STATUS_NPC_VTAG_PTR_ERR",
|
||||
[NIX_SND_STATUS_NPC_VTAG_SIZE_ERR] = "NIX_SND_STATUS_NPC_VTAG_SIZE_ERR",
|
||||
[NIX_SND_STATUS_SEND_MEM_FAULT] = "NIX_SND_STATUS_SEND_MEM_FAULT",
|
||||
[NIX_SND_STATUS_SEND_STATS_ERR] = "NIX_SND_STATUS_SEND_STATS_ERR",
|
||||
};
|
||||
|
||||
static irqreturn_t otx2_q_intr_handler(int irq, void *data)
|
||||
@@ -1238,14 +1239,16 @@ static irqreturn_t otx2_q_intr_handler(int irq, void *data)
|
||||
continue;
|
||||
|
||||
if (val & BIT_ULL(42)) {
|
||||
netdev_err(pf->netdev, "CQ%lld: error reading NIX_LF_CQ_OP_INT, NIX_LF_ERR_INT 0x%llx\n",
|
||||
netdev_err(pf->netdev,
|
||||
"CQ%lld: error reading NIX_LF_CQ_OP_INT, NIX_LF_ERR_INT 0x%llx\n",
|
||||
qidx, otx2_read64(pf, NIX_LF_ERR_INT));
|
||||
} else {
|
||||
if (val & BIT_ULL(NIX_CQERRINT_DOOR_ERR))
|
||||
netdev_err(pf->netdev, "CQ%lld: Doorbell error",
|
||||
qidx);
|
||||
if (val & BIT_ULL(NIX_CQERRINT_CQE_FAULT))
|
||||
netdev_err(pf->netdev, "CQ%lld: Memory fault on CQE write to LLC/DRAM",
|
||||
netdev_err(pf->netdev,
|
||||
"CQ%lld: Memory fault on CQE write to LLC/DRAM",
|
||||
qidx);
|
||||
}
|
||||
|
||||
@@ -1272,7 +1275,8 @@ static irqreturn_t otx2_q_intr_handler(int irq, void *data)
|
||||
(val & NIX_SQINT_BITS));
|
||||
|
||||
if (val & BIT_ULL(42)) {
|
||||
netdev_err(pf->netdev, "SQ%lld: error reading NIX_LF_SQ_OP_INT, NIX_LF_ERR_INT 0x%llx\n",
|
||||
netdev_err(pf->netdev,
|
||||
"SQ%lld: error reading NIX_LF_SQ_OP_INT, NIX_LF_ERR_INT 0x%llx\n",
|
||||
qidx, otx2_read64(pf, NIX_LF_ERR_INT));
|
||||
goto done;
|
||||
}
|
||||
@@ -1282,8 +1286,11 @@ static irqreturn_t otx2_q_intr_handler(int irq, void *data)
|
||||
goto chk_mnq_err_dbg;
|
||||
|
||||
sq_op_err_code = FIELD_GET(GENMASK(7, 0), sq_op_err_dbg);
|
||||
netdev_err(pf->netdev, "SQ%lld: NIX_LF_SQ_OP_ERR_DBG(%llx) err=%s\n",
|
||||
qidx, sq_op_err_dbg, nix_sqoperr_e_str[sq_op_err_code]);
|
||||
netdev_err(pf->netdev,
|
||||
"SQ%lld: NIX_LF_SQ_OP_ERR_DBG(0x%llx) err=%s(%#x)\n",
|
||||
qidx, sq_op_err_dbg,
|
||||
nix_sqoperr_e_str[sq_op_err_code],
|
||||
sq_op_err_code);
|
||||
|
||||
otx2_write64(pf, NIX_LF_SQ_OP_ERR_DBG, BIT_ULL(44));
|
||||
|
||||
@@ -1300,16 +1307,21 @@ chk_mnq_err_dbg:
|
||||
goto chk_snd_err_dbg;
|
||||
|
||||
mnq_err_code = FIELD_GET(GENMASK(7, 0), mnq_err_dbg);
|
||||
netdev_err(pf->netdev, "SQ%lld: NIX_LF_MNQ_ERR_DBG(%llx) err=%s\n",
|
||||
qidx, mnq_err_dbg, nix_mnqerr_e_str[mnq_err_code]);
|
||||
netdev_err(pf->netdev,
|
||||
"SQ%lld: NIX_LF_MNQ_ERR_DBG(0x%llx) err=%s(%#x)\n",
|
||||
qidx, mnq_err_dbg, nix_mnqerr_e_str[mnq_err_code],
|
||||
mnq_err_code);
|
||||
otx2_write64(pf, NIX_LF_MNQ_ERR_DBG, BIT_ULL(44));
|
||||
|
||||
chk_snd_err_dbg:
|
||||
snd_err_dbg = otx2_read64(pf, NIX_LF_SEND_ERR_DBG);
|
||||
if (snd_err_dbg & BIT(44)) {
|
||||
snd_err_code = FIELD_GET(GENMASK(7, 0), snd_err_dbg);
|
||||
netdev_err(pf->netdev, "SQ%lld: NIX_LF_SND_ERR_DBG:0x%llx err=%s\n",
|
||||
qidx, snd_err_dbg, nix_snd_status_e_str[snd_err_code]);
|
||||
netdev_err(pf->netdev,
|
||||
"SQ%lld: NIX_LF_SND_ERR_DBG:0x%llx err=%s(%#x)\n",
|
||||
qidx, snd_err_dbg,
|
||||
nix_snd_status_e_str[snd_err_code],
|
||||
snd_err_code);
|
||||
otx2_write64(pf, NIX_LF_SEND_ERR_DBG, BIT_ULL(44));
|
||||
}
|
||||
|
||||
@@ -1589,6 +1601,7 @@ static void otx2_free_hw_resources(struct otx2_nic *pf)
|
||||
else
|
||||
otx2_cleanup_tx_cqes(pf, cq);
|
||||
}
|
||||
otx2_free_pending_sqe(pf);
|
||||
|
||||
otx2_free_sq_res(pf);
|
||||
|
||||
|
||||
@@ -318,23 +318,23 @@ enum nix_snd_status_e {
|
||||
NIX_SND_STATUS_EXT_ERR = 0x6,
|
||||
NIX_SND_STATUS_JUMP_FAULT = 0x7,
|
||||
NIX_SND_STATUS_JUMP_POISON = 0x8,
|
||||
NIX_SND_STATUS_CRC_ERR = 0x9,
|
||||
NIX_SND_STATUS_IMM_ERR = 0x10,
|
||||
NIX_SND_STATUS_SG_ERR = 0x11,
|
||||
NIX_SND_STATUS_MEM_ERR = 0x12,
|
||||
NIX_SND_STATUS_INVALID_SUBDC = 0x13,
|
||||
NIX_SND_STATUS_SUBDC_ORDER_ERR = 0x14,
|
||||
NIX_SND_STATUS_DATA_FAULT = 0x15,
|
||||
NIX_SND_STATUS_DATA_POISON = 0x16,
|
||||
NIX_SND_STATUS_NPC_DROP_ACTION = 0x17,
|
||||
NIX_SND_STATUS_LOCK_VIOL = 0x18,
|
||||
NIX_SND_STATUS_NPC_UCAST_CHAN_ERR = 0x19,
|
||||
NIX_SND_STATUS_NPC_MCAST_CHAN_ERR = 0x20,
|
||||
NIX_SND_STATUS_NPC_MCAST_ABORT = 0x21,
|
||||
NIX_SND_STATUS_NPC_VTAG_PTR_ERR = 0x22,
|
||||
NIX_SND_STATUS_NPC_VTAG_SIZE_ERR = 0x23,
|
||||
NIX_SND_STATUS_SEND_MEM_FAULT = 0x24,
|
||||
NIX_SND_STATUS_SEND_STATS_ERR = 0x25,
|
||||
NIX_SND_STATUS_CRC_ERR = 0x10,
|
||||
NIX_SND_STATUS_IMM_ERR = 0x11,
|
||||
NIX_SND_STATUS_SG_ERR = 0x12,
|
||||
NIX_SND_STATUS_MEM_ERR = 0x13,
|
||||
NIX_SND_STATUS_INVALID_SUBDC = 0x14,
|
||||
NIX_SND_STATUS_SUBDC_ORDER_ERR = 0x15,
|
||||
NIX_SND_STATUS_DATA_FAULT = 0x16,
|
||||
NIX_SND_STATUS_DATA_POISON = 0x17,
|
||||
NIX_SND_STATUS_NPC_DROP_ACTION = 0x20,
|
||||
NIX_SND_STATUS_LOCK_VIOL = 0x21,
|
||||
NIX_SND_STATUS_NPC_UCAST_CHAN_ERR = 0x22,
|
||||
NIX_SND_STATUS_NPC_MCAST_CHAN_ERR = 0x23,
|
||||
NIX_SND_STATUS_NPC_MCAST_ABORT = 0x24,
|
||||
NIX_SND_STATUS_NPC_VTAG_PTR_ERR = 0x25,
|
||||
NIX_SND_STATUS_NPC_VTAG_SIZE_ERR = 0x26,
|
||||
NIX_SND_STATUS_SEND_MEM_FAULT = 0x27,
|
||||
NIX_SND_STATUS_SEND_STATS_ERR = 0x28,
|
||||
NIX_SND_STATUS_MAX,
|
||||
};
|
||||
|
||||
|
||||
@@ -1247,9 +1247,11 @@ void otx2_cleanup_rx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq, int q
|
||||
|
||||
void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
|
||||
{
|
||||
int tx_pkts = 0, tx_bytes = 0;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct otx2_snd_queue *sq;
|
||||
struct nix_cqe_tx_s *cqe;
|
||||
struct netdev_queue *txq;
|
||||
int processed_cqe = 0;
|
||||
struct sg_list *sg;
|
||||
int qidx;
|
||||
@@ -1270,12 +1272,20 @@ void otx2_cleanup_tx_cqes(struct otx2_nic *pfvf, struct otx2_cq_queue *cq)
|
||||
sg = &sq->sg[cqe->comp.sqe_id];
|
||||
skb = (struct sk_buff *)sg->skb;
|
||||
if (skb) {
|
||||
tx_bytes += skb->len;
|
||||
tx_pkts++;
|
||||
otx2_dma_unmap_skb_frags(pfvf, sg);
|
||||
dev_kfree_skb_any(skb);
|
||||
sg->skb = (u64)NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (likely(tx_pkts)) {
|
||||
if (qidx >= pfvf->hw.tx_queues)
|
||||
qidx -= pfvf->hw.xdp_queues;
|
||||
txq = netdev_get_tx_queue(pfvf->netdev, qidx);
|
||||
netdev_tx_completed_queue(txq, tx_pkts, tx_bytes);
|
||||
}
|
||||
/* Free CQEs to HW */
|
||||
otx2_write64(pfvf, NIX_LF_CQ_OP_DOOR,
|
||||
((u64)cq->cq_idx << 32) | processed_cqe);
|
||||
@@ -1302,6 +1312,38 @@ int otx2_rxtx_enable(struct otx2_nic *pfvf, bool enable)
|
||||
return err;
|
||||
}
|
||||
|
||||
void otx2_free_pending_sqe(struct otx2_nic *pfvf)
|
||||
{
|
||||
int tx_pkts = 0, tx_bytes = 0;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct otx2_snd_queue *sq;
|
||||
struct netdev_queue *txq;
|
||||
struct sg_list *sg;
|
||||
int sq_idx, sqe;
|
||||
|
||||
for (sq_idx = 0; sq_idx < pfvf->hw.tx_queues; sq_idx++) {
|
||||
sq = &pfvf->qset.sq[sq_idx];
|
||||
for (sqe = 0; sqe < sq->sqe_cnt; sqe++) {
|
||||
sg = &sq->sg[sqe];
|
||||
skb = (struct sk_buff *)sg->skb;
|
||||
if (skb) {
|
||||
tx_bytes += skb->len;
|
||||
tx_pkts++;
|
||||
otx2_dma_unmap_skb_frags(pfvf, sg);
|
||||
dev_kfree_skb_any(skb);
|
||||
sg->skb = (u64)NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!tx_pkts)
|
||||
continue;
|
||||
txq = netdev_get_tx_queue(pfvf->netdev, sq_idx);
|
||||
netdev_tx_completed_queue(txq, tx_pkts, tx_bytes);
|
||||
tx_pkts = 0;
|
||||
tx_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void otx2_xdp_sqe_add_sg(struct otx2_snd_queue *sq, u64 dma_addr,
|
||||
int len, int *offset)
|
||||
{
|
||||
|
||||
@@ -2582,9 +2582,13 @@ static void rtl_set_rx_mode(struct net_device *dev)
|
||||
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
rx_mode |= AcceptAllPhys;
|
||||
} else if (!(dev->flags & IFF_MULTICAST)) {
|
||||
rx_mode &= ~AcceptMulticast;
|
||||
} else if (netdev_mc_count(dev) > MC_FILTER_LIMIT ||
|
||||
dev->flags & IFF_ALLMULTI ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_35) {
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_35 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_46 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_48) {
|
||||
/* accept all multicasts */
|
||||
} else if (netdev_mc_empty(dev)) {
|
||||
rx_mode &= ~AcceptMulticast;
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
((val) << XGMAC_PPS_MINIDX(x))
|
||||
#define XGMAC_PPSCMD_START 0x2
|
||||
#define XGMAC_PPSCMD_STOP 0x5
|
||||
#define XGMAC_PPSEN0 BIT(4)
|
||||
#define XGMAC_PPSENx(x) BIT(4 + (x) * 8)
|
||||
#define XGMAC_PPSx_TARGET_TIME_SEC(x) (0x00000d80 + (x) * 0x10)
|
||||
#define XGMAC_PPSx_TARGET_TIME_NSEC(x) (0x00000d84 + (x) * 0x10)
|
||||
#define XGMAC_TRGTBUSY0 BIT(31)
|
||||
|
||||
@@ -1178,7 +1178,19 @@ static int dwxgmac2_flex_pps_config(void __iomem *ioaddr, int index,
|
||||
|
||||
val |= XGMAC_PPSCMDx(index, XGMAC_PPSCMD_START);
|
||||
val |= XGMAC_TRGTMODSELx(index, XGMAC_PPSCMD_START);
|
||||
val |= XGMAC_PPSEN0;
|
||||
|
||||
/* XGMAC Core has 4 PPS outputs at most.
|
||||
*
|
||||
* Prior XGMAC Core 3.20, Fixed mode or Flexible mode are selectable for
|
||||
* PPS0 only via PPSEN0. PPS{1,2,3} are in Flexible mode by default,
|
||||
* and can not be switched to Fixed mode, since PPSEN{1,2,3} are
|
||||
* read-only reserved to 0.
|
||||
* But we always set PPSEN{1,2,3} do not make things worse ;-)
|
||||
*
|
||||
* From XGMAC Core 3.20 and later, PPSEN{0,1,2,3} are writable and must
|
||||
* be set, or the PPS outputs stay in Fixed PPS mode by default.
|
||||
*/
|
||||
val |= XGMAC_PPSENx(index);
|
||||
|
||||
writel(cfg->start.tv_sec, ioaddr + XGMAC_PPSx_TARGET_TIME_SEC(index));
|
||||
|
||||
|
||||
@@ -1588,10 +1588,10 @@ static void am65_cpsw_nuss_mac_link_up(struct phylink_config *config, struct phy
|
||||
|
||||
/* rx_pause/tx_pause */
|
||||
if (rx_pause)
|
||||
mac_control |= CPSW_SL_CTL_RX_FLOW_EN;
|
||||
mac_control |= CPSW_SL_CTL_TX_FLOW_EN;
|
||||
|
||||
if (tx_pause)
|
||||
mac_control |= CPSW_SL_CTL_TX_FLOW_EN;
|
||||
mac_control |= CPSW_SL_CTL_RX_FLOW_EN;
|
||||
|
||||
cpsw_sl_ctl_set(port->slave.mac_sl, mac_control);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user