mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in late fixes to prepare for the 6.13 net-next PR. Conflicts: include/linux/phy.h41ffcd9501
net: phy: fix phylib's dual eee_enabled721aa69e70
net: phy: convert eee_broken_modes to a linkmode bitmap https://lore.kernel.org/all/20241118135512.1039208b@canb.auug.org.au/ drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c2160428bcb
net: txgbe: fix null pointer to pcs2160428bcb
net: txgbe: remove GPIO interrupt controller Adjacent commits: include/linux/phy.h41ffcd9501
net: phy: fix phylib's dual eee_enabled516a5f11eb
net: phy: respect cached advertising when re-enabling EEE Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
dd7207838d
@ -16091,7 +16091,9 @@ F: include/uapi/linux/net_shaper.h
|
||||
F: include/uapi/linux/netdev*
|
||||
F: tools/testing/selftests/drivers/net/
|
||||
X: Documentation/devicetree/bindings/net/bluetooth/
|
||||
X: Documentation/devicetree/bindings/net/can/
|
||||
X: Documentation/devicetree/bindings/net/wireless/
|
||||
X: drivers/net/can/
|
||||
X: drivers/net/wireless/
|
||||
|
||||
NETWORKING DRIVERS (WIRELESS)
|
||||
@ -16180,6 +16182,7 @@ X: include/net/mac80211.h
|
||||
X: include/net/wext.h
|
||||
X: net/9p/
|
||||
X: net/bluetooth/
|
||||
X: net/can/
|
||||
X: net/mac80211/
|
||||
X: net/rfkill/
|
||||
X: net/wireless/
|
||||
|
@ -1248,10 +1248,10 @@ gve_adminq_configure_flow_rule(struct gve_priv *priv,
|
||||
sizeof(struct gve_adminq_configure_flow_rule),
|
||||
flow_rule_cmd);
|
||||
|
||||
if (err) {
|
||||
if (err == -ETIME) {
|
||||
dev_err(&priv->pdev->dev, "Timeout to configure the flow rule, trigger reset");
|
||||
gve_reset(priv, true);
|
||||
} else {
|
||||
} else if (!err) {
|
||||
priv->flow_rules_cache.rules_cache_synced = false;
|
||||
}
|
||||
|
||||
|
@ -5299,7 +5299,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
|
||||
}
|
||||
|
||||
flags_complete:
|
||||
bitmap_xor(changed_flags, pf->flags, orig_flags, I40E_PF_FLAGS_NBITS);
|
||||
bitmap_xor(changed_flags, new_flags, orig_flags, I40E_PF_FLAGS_NBITS);
|
||||
|
||||
if (test_bit(I40E_FLAG_FW_LLDP_DIS, changed_flags))
|
||||
reset_needed = I40E_PF_RESET_AND_REBUILD_FLAG;
|
||||
|
@ -334,7 +334,6 @@ static int fbnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
free_irqs:
|
||||
fbnic_free_irqs(fbd);
|
||||
free_fbd:
|
||||
pci_disable_device(pdev);
|
||||
fbnic_devlink_free(fbd);
|
||||
|
||||
return err;
|
||||
@ -367,7 +366,6 @@ static void fbnic_remove(struct pci_dev *pdev)
|
||||
fbnic_fw_disable_mbx(fbd);
|
||||
fbnic_free_irqs(fbd);
|
||||
|
||||
pci_disable_device(pdev);
|
||||
fbnic_devlink_free(fbd);
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,7 @@ static struct phylink_pcs *txgbe_phylink_mac_select(struct phylink_config *confi
|
||||
struct wx *wx = phylink_to_wx(config);
|
||||
struct txgbe *txgbe = wx->priv;
|
||||
|
||||
if (interface == PHY_INTERFACE_MODE_10GBASER)
|
||||
if (wx->media_type != sp_media_copper)
|
||||
return txgbe->pcs;
|
||||
|
||||
return NULL;
|
||||
|
@ -153,18 +153,31 @@ struct dp83869_private {
|
||||
int mode;
|
||||
};
|
||||
|
||||
static int dp83869_config_aneg(struct phy_device *phydev)
|
||||
{
|
||||
struct dp83869_private *dp83869 = phydev->priv;
|
||||
|
||||
if (dp83869->mode != DP83869_RGMII_1000_BASE)
|
||||
return genphy_config_aneg(phydev);
|
||||
|
||||
return genphy_c37_config_aneg(phydev);
|
||||
}
|
||||
|
||||
static int dp83869_read_status(struct phy_device *phydev)
|
||||
{
|
||||
struct dp83869_private *dp83869 = phydev->priv;
|
||||
bool changed;
|
||||
int ret;
|
||||
|
||||
if (dp83869->mode == DP83869_RGMII_1000_BASE)
|
||||
return genphy_c37_read_status(phydev, &changed);
|
||||
|
||||
ret = genphy_read_status(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (linkmode_test_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, phydev->supported)) {
|
||||
if (dp83869->mode == DP83869_RGMII_100_BASE) {
|
||||
if (phydev->link) {
|
||||
if (dp83869->mode == DP83869_RGMII_100_BASE)
|
||||
phydev->speed = SPEED_100;
|
||||
} else {
|
||||
phydev->speed = SPEED_UNKNOWN;
|
||||
@ -898,6 +911,7 @@ static int dp83869_phy_reset(struct phy_device *phydev)
|
||||
.soft_reset = dp83869_phy_reset, \
|
||||
.config_intr = dp83869_config_intr, \
|
||||
.handle_interrupt = dp83869_handle_interrupt, \
|
||||
.config_aneg = dp83869_config_aneg, \
|
||||
.read_status = dp83869_read_status, \
|
||||
.get_tunable = dp83869_get_tunable, \
|
||||
.set_tunable = dp83869_set_tunable, \
|
||||
|
@ -941,7 +941,7 @@ EXPORT_SYMBOL_GPL(genphy_c45_read_eee_abilities);
|
||||
*/
|
||||
int genphy_c45_an_config_eee_aneg(struct phy_device *phydev)
|
||||
{
|
||||
if (!phydev->eee_enabled) {
|
||||
if (!phydev->eee_cfg.eee_enabled) {
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(adv) = {};
|
||||
|
||||
return genphy_c45_write_eee_adv(phydev, adv);
|
||||
@ -1571,8 +1571,6 @@ int genphy_c45_ethtool_set_eee(struct phy_device *phydev,
|
||||
}
|
||||
}
|
||||
|
||||
phydev->eee_enabled = data->eee_enabled;
|
||||
|
||||
ret = genphy_c45_an_config_eee_aneg(phydev);
|
||||
if (ret > 0) {
|
||||
ret = phy_restart_aneg(phydev);
|
||||
|
@ -3589,12 +3589,12 @@ static int phy_probe(struct device *dev)
|
||||
/* There is no "enabled" flag. If PHY is advertising, assume it is
|
||||
* kind of enabled.
|
||||
*/
|
||||
phydev->eee_enabled = !linkmode_empty(phydev->advertising_eee);
|
||||
phydev->eee_cfg.eee_enabled = !linkmode_empty(phydev->advertising_eee);
|
||||
|
||||
/* Some PHYs may advertise, by default, not support EEE modes. So,
|
||||
* we need to clean them.
|
||||
*/
|
||||
if (phydev->eee_enabled)
|
||||
if (phydev->eee_cfg.eee_enabled)
|
||||
linkmode_and(phydev->advertising_eee, phydev->supported_eee,
|
||||
phydev->advertising_eee);
|
||||
|
||||
|
@ -73,7 +73,7 @@ static inline void *netpoll_poll_lock(struct napi_struct *napi)
|
||||
{
|
||||
struct net_device *dev = napi->dev;
|
||||
|
||||
if (dev && dev->npinfo) {
|
||||
if (dev && rcu_access_pointer(dev->npinfo)) {
|
||||
int owner = smp_processor_id();
|
||||
|
||||
while (cmpxchg(&napi->poll_owner, -1, owner) != -1)
|
||||
|
@ -601,7 +601,6 @@ struct macsec_ops;
|
||||
* @adv_old: Saved advertised while power saving for WoL
|
||||
* @supported_eee: supported PHY EEE linkmodes
|
||||
* @advertising_eee: Currently advertised EEE linkmodes
|
||||
* @eee_enabled: Flag indicating whether the EEE feature is enabled
|
||||
* @enable_tx_lpi: When True, MAC should transmit LPI to PHY
|
||||
* @eee_cfg: User configuration of EEE
|
||||
* @lp_advertising: Current link partner advertised linkmodes
|
||||
@ -723,7 +722,6 @@ struct phy_device {
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_eee);
|
||||
/* Energy efficient ethernet modes which should be prohibited */
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(eee_broken_modes);
|
||||
bool eee_enabled;
|
||||
bool enable_tx_lpi;
|
||||
struct eee_config eee_cfg;
|
||||
|
||||
|
@ -233,6 +233,7 @@ int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
return -ENOMEM;
|
||||
|
||||
rtnl_lock();
|
||||
rcu_read_lock();
|
||||
|
||||
napi = napi_by_id(napi_id);
|
||||
if (napi) {
|
||||
@ -242,6 +243,7 @@ int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
err = -ENOENT;
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
rtnl_unlock();
|
||||
|
||||
if (err)
|
||||
|
@ -634,7 +634,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!ndev->npinfo) {
|
||||
if (!rcu_access_pointer(ndev->npinfo)) {
|
||||
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
|
||||
if (!npinfo) {
|
||||
err = -ENOMEM;
|
||||
|
@ -1117,9 +1117,9 @@ static void sk_psock_strp_data_ready(struct sock *sk)
|
||||
if (tls_sw_has_ctx_rx(sk)) {
|
||||
psock->saved_data_ready(sk);
|
||||
} else {
|
||||
write_lock_bh(&sk->sk_callback_lock);
|
||||
read_lock_bh(&sk->sk_callback_lock);
|
||||
strp_data_ready(&psock->strp);
|
||||
write_unlock_bh(&sk->sk_callback_lock);
|
||||
read_unlock_bh(&sk->sk_callback_lock);
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -163,11 +163,8 @@ bitmap_ip_uadt(struct ip_set *set, struct nlattr *tb[],
|
||||
ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (ip > ip_to) {
|
||||
if (ip > ip_to)
|
||||
swap(ip, ip_to);
|
||||
if (ip < map->first_ip)
|
||||
return -IPSET_ERR_BITMAP_RANGE;
|
||||
}
|
||||
} else if (tb[IPSET_ATTR_CIDR]) {
|
||||
u8 cidr = nla_get_u8(tb[IPSET_ATTR_CIDR]);
|
||||
|
||||
@ -178,7 +175,7 @@ bitmap_ip_uadt(struct ip_set *set, struct nlattr *tb[],
|
||||
ip_to = ip;
|
||||
}
|
||||
|
||||
if (ip_to > map->last_ip)
|
||||
if (ip < map->first_ip || ip_to > map->last_ip)
|
||||
return -IPSET_ERR_BITMAP_RANGE;
|
||||
|
||||
for (; !before(ip_to, ip); ip += map->hosts) {
|
||||
|
@ -675,6 +675,8 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
|
||||
len = desc->len;
|
||||
|
||||
if (!skb) {
|
||||
first_frag = true;
|
||||
|
||||
hr = max(NET_SKB_PAD, L1_CACHE_ALIGN(dev->needed_headroom));
|
||||
tr = dev->needed_tailroom;
|
||||
skb = sock_alloc_send_skb(&xs->sk, hr + len + tr, 1, &err);
|
||||
@ -685,12 +687,8 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
|
||||
skb_put(skb, len);
|
||||
|
||||
err = skb_store_bits(skb, 0, buffer, len);
|
||||
if (unlikely(err)) {
|
||||
kfree_skb(skb);
|
||||
if (unlikely(err))
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
first_frag = true;
|
||||
} else {
|
||||
int nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
struct page *page;
|
||||
@ -758,6 +756,9 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
|
||||
return skb;
|
||||
|
||||
free_err:
|
||||
if (first_frag && skb)
|
||||
kfree_skb(skb);
|
||||
|
||||
if (err == -EOVERFLOW) {
|
||||
/* Drop the packet */
|
||||
xsk_set_destructor_arg(xs->skb);
|
||||
|
@ -501,6 +501,58 @@ static void test_sockmap_skb_verdict_shutdown(void)
|
||||
test_sockmap_pass_prog__destroy(skel);
|
||||
}
|
||||
|
||||
static void test_sockmap_stream_pass(void)
|
||||
{
|
||||
int zero = 0, sent, recvd;
|
||||
int verdict, parser;
|
||||
int err, map;
|
||||
int c = -1, p = -1;
|
||||
struct test_sockmap_pass_prog *pass = NULL;
|
||||
char snd[256] = "0123456789";
|
||||
char rcv[256] = "0";
|
||||
|
||||
pass = test_sockmap_pass_prog__open_and_load();
|
||||
verdict = bpf_program__fd(pass->progs.prog_skb_verdict);
|
||||
parser = bpf_program__fd(pass->progs.prog_skb_parser);
|
||||
map = bpf_map__fd(pass->maps.sock_map_rx);
|
||||
|
||||
err = bpf_prog_attach(parser, map, BPF_SK_SKB_STREAM_PARSER, 0);
|
||||
if (!ASSERT_OK(err, "bpf_prog_attach stream parser"))
|
||||
goto out;
|
||||
|
||||
err = bpf_prog_attach(verdict, map, BPF_SK_SKB_STREAM_VERDICT, 0);
|
||||
if (!ASSERT_OK(err, "bpf_prog_attach stream verdict"))
|
||||
goto out;
|
||||
|
||||
err = create_pair(AF_INET, SOCK_STREAM, &c, &p);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* sk_data_ready of 'p' will be replaced by strparser handler */
|
||||
err = bpf_map_update_elem(map, &zero, &p, BPF_NOEXIST);
|
||||
if (!ASSERT_OK(err, "bpf_map_update_elem(p)"))
|
||||
goto out_close;
|
||||
|
||||
/*
|
||||
* as 'prog_skb_parser' return the original skb len and
|
||||
* 'prog_skb_verdict' return SK_PASS, the kernel will just
|
||||
* pass it through to original socket 'p'
|
||||
*/
|
||||
sent = xsend(c, snd, sizeof(snd), 0);
|
||||
ASSERT_EQ(sent, sizeof(snd), "xsend(c)");
|
||||
|
||||
recvd = recv_timeout(p, rcv, sizeof(rcv), SOCK_NONBLOCK,
|
||||
IO_TIMEOUT_SEC);
|
||||
ASSERT_EQ(recvd, sizeof(rcv), "recv_timeout(p)");
|
||||
|
||||
out_close:
|
||||
close(c);
|
||||
close(p);
|
||||
|
||||
out:
|
||||
test_sockmap_pass_prog__destroy(pass);
|
||||
}
|
||||
|
||||
static void test_sockmap_skb_verdict_fionread(bool pass_prog)
|
||||
{
|
||||
int err, map, verdict, c0 = -1, c1 = -1, p0 = -1, p1 = -1;
|
||||
@ -923,6 +975,8 @@ void test_sockmap_basic(void)
|
||||
test_sockmap_progs_query(BPF_SK_SKB_VERDICT);
|
||||
if (test__start_subtest("sockmap skb_verdict shutdown"))
|
||||
test_sockmap_skb_verdict_shutdown();
|
||||
if (test__start_subtest("sockmap stream parser and verdict pass"))
|
||||
test_sockmap_stream_pass();
|
||||
if (test__start_subtest("sockmap skb_verdict fionread"))
|
||||
test_sockmap_skb_verdict_fionread(true);
|
||||
if (test__start_subtest("sockmap skb_verdict fionread on drop"))
|
||||
|
@ -2,5 +2,6 @@
|
||||
audit_logread
|
||||
connect_close
|
||||
conntrack_dump_flush
|
||||
conntrack_reverse_clash
|
||||
sctp_collision
|
||||
nf_queue
|
||||
|
@ -43,6 +43,8 @@ static int build_cta_tuple_v4(struct nlmsghdr *nlh, int type,
|
||||
mnl_attr_nest_end(nlh, nest_proto);
|
||||
|
||||
mnl_attr_nest_end(nlh, nest);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int build_cta_tuple_v6(struct nlmsghdr *nlh, int type,
|
||||
@ -71,6 +73,8 @@ static int build_cta_tuple_v6(struct nlmsghdr *nlh, int type,
|
||||
mnl_attr_nest_end(nlh, nest_proto);
|
||||
|
||||
mnl_attr_nest_end(nlh, nest);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int build_cta_proto(struct nlmsghdr *nlh)
|
||||
@ -90,6 +94,8 @@ static int build_cta_proto(struct nlmsghdr *nlh)
|
||||
mnl_attr_nest_end(nlh, nest_proto);
|
||||
|
||||
mnl_attr_nest_end(nlh, nest);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int conntrack_data_insert(struct mnl_socket *sock, struct nlmsghdr *nlh,
|
||||
|
Loading…
Reference in New Issue
Block a user