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.h
  41ffcd9501 net: phy: fix phylib's dual eee_enabled
  721aa69e70 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.c
  2160428bcb net: txgbe: fix null pointer to pcs
  2160428bcb net: txgbe: remove GPIO interrupt controller

Adjacent commits:

include/linux/phy.h
  41ffcd9501 net: phy: fix phylib's dual eee_enabled
  516a5f11eb net: phy: respect cached advertising when re-enabling EEE

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Paolo Abeni 2024-11-19 13:27:50 +01:00
commit dd7207838d
18 changed files with 102 additions and 30 deletions

View file

@ -16091,7 +16091,9 @@ F: include/uapi/linux/net_shaper.h
F: include/uapi/linux/netdev* F: include/uapi/linux/netdev*
F: tools/testing/selftests/drivers/net/ F: tools/testing/selftests/drivers/net/
X: Documentation/devicetree/bindings/net/bluetooth/ X: Documentation/devicetree/bindings/net/bluetooth/
X: Documentation/devicetree/bindings/net/can/
X: Documentation/devicetree/bindings/net/wireless/ X: Documentation/devicetree/bindings/net/wireless/
X: drivers/net/can/
X: drivers/net/wireless/ X: drivers/net/wireless/
NETWORKING DRIVERS (WIRELESS) NETWORKING DRIVERS (WIRELESS)
@ -16180,6 +16182,7 @@ X: include/net/mac80211.h
X: include/net/wext.h X: include/net/wext.h
X: net/9p/ X: net/9p/
X: net/bluetooth/ X: net/bluetooth/
X: net/can/
X: net/mac80211/ X: net/mac80211/
X: net/rfkill/ X: net/rfkill/
X: net/wireless/ X: net/wireless/

View file

@ -1248,10 +1248,10 @@ gve_adminq_configure_flow_rule(struct gve_priv *priv,
sizeof(struct gve_adminq_configure_flow_rule), sizeof(struct gve_adminq_configure_flow_rule),
flow_rule_cmd); flow_rule_cmd);
if (err) { if (err == -ETIME) {
dev_err(&priv->pdev->dev, "Timeout to configure the flow rule, trigger reset"); dev_err(&priv->pdev->dev, "Timeout to configure the flow rule, trigger reset");
gve_reset(priv, true); gve_reset(priv, true);
} else { } else if (!err) {
priv->flow_rules_cache.rules_cache_synced = false; priv->flow_rules_cache.rules_cache_synced = false;
} }

View file

@ -5299,7 +5299,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
} }
flags_complete: 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)) if (test_bit(I40E_FLAG_FW_LLDP_DIS, changed_flags))
reset_needed = I40E_PF_RESET_AND_REBUILD_FLAG; reset_needed = I40E_PF_RESET_AND_REBUILD_FLAG;

View file

@ -334,7 +334,6 @@ static int fbnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
free_irqs: free_irqs:
fbnic_free_irqs(fbd); fbnic_free_irqs(fbd);
free_fbd: free_fbd:
pci_disable_device(pdev);
fbnic_devlink_free(fbd); fbnic_devlink_free(fbd);
return err; return err;
@ -367,7 +366,6 @@ static void fbnic_remove(struct pci_dev *pdev)
fbnic_fw_disable_mbx(fbd); fbnic_fw_disable_mbx(fbd);
fbnic_free_irqs(fbd); fbnic_free_irqs(fbd);
pci_disable_device(pdev);
fbnic_devlink_free(fbd); fbnic_devlink_free(fbd);
} }

View file

@ -162,7 +162,7 @@ static struct phylink_pcs *txgbe_phylink_mac_select(struct phylink_config *confi
struct wx *wx = phylink_to_wx(config); struct wx *wx = phylink_to_wx(config);
struct txgbe *txgbe = wx->priv; struct txgbe *txgbe = wx->priv;
if (interface == PHY_INTERFACE_MODE_10GBASER) if (wx->media_type != sp_media_copper)
return txgbe->pcs; return txgbe->pcs;
return NULL; return NULL;

View file

@ -153,19 +153,32 @@ struct dp83869_private {
int mode; 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) static int dp83869_read_status(struct phy_device *phydev)
{ {
struct dp83869_private *dp83869 = phydev->priv; struct dp83869_private *dp83869 = phydev->priv;
bool changed;
int ret; int ret;
if (dp83869->mode == DP83869_RGMII_1000_BASE)
return genphy_c37_read_status(phydev, &changed);
ret = genphy_read_status(phydev); ret = genphy_read_status(phydev);
if (ret) if (ret)
return 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 (phydev->link) {
if (dp83869->mode == DP83869_RGMII_100_BASE) phydev->speed = SPEED_100;
phydev->speed = SPEED_100;
} else { } else {
phydev->speed = SPEED_UNKNOWN; phydev->speed = SPEED_UNKNOWN;
phydev->duplex = DUPLEX_UNKNOWN; phydev->duplex = DUPLEX_UNKNOWN;
@ -898,6 +911,7 @@ static int dp83869_phy_reset(struct phy_device *phydev)
.soft_reset = dp83869_phy_reset, \ .soft_reset = dp83869_phy_reset, \
.config_intr = dp83869_config_intr, \ .config_intr = dp83869_config_intr, \
.handle_interrupt = dp83869_handle_interrupt, \ .handle_interrupt = dp83869_handle_interrupt, \
.config_aneg = dp83869_config_aneg, \
.read_status = dp83869_read_status, \ .read_status = dp83869_read_status, \
.get_tunable = dp83869_get_tunable, \ .get_tunable = dp83869_get_tunable, \
.set_tunable = dp83869_set_tunable, \ .set_tunable = dp83869_set_tunable, \

View file

@ -941,7 +941,7 @@ EXPORT_SYMBOL_GPL(genphy_c45_read_eee_abilities);
*/ */
int genphy_c45_an_config_eee_aneg(struct phy_device *phydev) 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) = {}; __ETHTOOL_DECLARE_LINK_MODE_MASK(adv) = {};
return genphy_c45_write_eee_adv(phydev, 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); ret = genphy_c45_an_config_eee_aneg(phydev);
if (ret > 0) { if (ret > 0) {
ret = phy_restart_aneg(phydev); ret = phy_restart_aneg(phydev);

View file

@ -3589,12 +3589,12 @@ static int phy_probe(struct device *dev)
/* There is no "enabled" flag. If PHY is advertising, assume it is /* There is no "enabled" flag. If PHY is advertising, assume it is
* kind of enabled. * 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, /* Some PHYs may advertise, by default, not support EEE modes. So,
* we need to clean them. * we need to clean them.
*/ */
if (phydev->eee_enabled) if (phydev->eee_cfg.eee_enabled)
linkmode_and(phydev->advertising_eee, phydev->supported_eee, linkmode_and(phydev->advertising_eee, phydev->supported_eee,
phydev->advertising_eee); phydev->advertising_eee);

View file

@ -73,7 +73,7 @@ static inline void *netpoll_poll_lock(struct napi_struct *napi)
{ {
struct net_device *dev = napi->dev; struct net_device *dev = napi->dev;
if (dev && dev->npinfo) { if (dev && rcu_access_pointer(dev->npinfo)) {
int owner = smp_processor_id(); int owner = smp_processor_id();
while (cmpxchg(&napi->poll_owner, -1, owner) != -1) while (cmpxchg(&napi->poll_owner, -1, owner) != -1)

View file

@ -601,7 +601,6 @@ struct macsec_ops;
* @adv_old: Saved advertised while power saving for WoL * @adv_old: Saved advertised while power saving for WoL
* @supported_eee: supported PHY EEE linkmodes * @supported_eee: supported PHY EEE linkmodes
* @advertising_eee: Currently advertised 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 * @enable_tx_lpi: When True, MAC should transmit LPI to PHY
* @eee_cfg: User configuration of EEE * @eee_cfg: User configuration of EEE
* @lp_advertising: Current link partner advertised linkmodes * @lp_advertising: Current link partner advertised linkmodes
@ -723,7 +722,6 @@ struct phy_device {
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_eee); __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_eee);
/* Energy efficient ethernet modes which should be prohibited */ /* Energy efficient ethernet modes which should be prohibited */
__ETHTOOL_DECLARE_LINK_MODE_MASK(eee_broken_modes); __ETHTOOL_DECLARE_LINK_MODE_MASK(eee_broken_modes);
bool eee_enabled;
bool enable_tx_lpi; bool enable_tx_lpi;
struct eee_config eee_cfg; struct eee_config eee_cfg;

View file

@ -233,6 +233,7 @@ int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info)
return -ENOMEM; return -ENOMEM;
rtnl_lock(); rtnl_lock();
rcu_read_lock();
napi = napi_by_id(napi_id); napi = napi_by_id(napi_id);
if (napi) { if (napi) {
@ -242,6 +243,7 @@ int netdev_nl_napi_get_doit(struct sk_buff *skb, struct genl_info *info)
err = -ENOENT; err = -ENOENT;
} }
rcu_read_unlock();
rtnl_unlock(); rtnl_unlock();
if (err) if (err)

View file

@ -634,7 +634,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
goto out; goto out;
} }
if (!ndev->npinfo) { if (!rcu_access_pointer(ndev->npinfo)) {
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL); npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
if (!npinfo) { if (!npinfo) {
err = -ENOMEM; err = -ENOMEM;

View file

@ -1117,9 +1117,9 @@ static void sk_psock_strp_data_ready(struct sock *sk)
if (tls_sw_has_ctx_rx(sk)) { if (tls_sw_has_ctx_rx(sk)) {
psock->saved_data_ready(sk); psock->saved_data_ready(sk);
} else { } else {
write_lock_bh(&sk->sk_callback_lock); read_lock_bh(&sk->sk_callback_lock);
strp_data_ready(&psock->strp); strp_data_ready(&psock->strp);
write_unlock_bh(&sk->sk_callback_lock); read_unlock_bh(&sk->sk_callback_lock);
} }
} }
rcu_read_unlock(); rcu_read_unlock();

View file

@ -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); ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to);
if (ret) if (ret)
return ret; return ret;
if (ip > ip_to) { if (ip > ip_to)
swap(ip, ip_to); swap(ip, ip_to);
if (ip < map->first_ip)
return -IPSET_ERR_BITMAP_RANGE;
}
} else if (tb[IPSET_ATTR_CIDR]) { } else if (tb[IPSET_ATTR_CIDR]) {
u8 cidr = nla_get_u8(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; ip_to = ip;
} }
if (ip_to > map->last_ip) if (ip < map->first_ip || ip_to > map->last_ip)
return -IPSET_ERR_BITMAP_RANGE; return -IPSET_ERR_BITMAP_RANGE;
for (; !before(ip_to, ip); ip += map->hosts) { for (; !before(ip_to, ip); ip += map->hosts) {

View file

@ -675,6 +675,8 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
len = desc->len; len = desc->len;
if (!skb) { if (!skb) {
first_frag = true;
hr = max(NET_SKB_PAD, L1_CACHE_ALIGN(dev->needed_headroom)); hr = max(NET_SKB_PAD, L1_CACHE_ALIGN(dev->needed_headroom));
tr = dev->needed_tailroom; tr = dev->needed_tailroom;
skb = sock_alloc_send_skb(&xs->sk, hr + len + tr, 1, &err); 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); skb_put(skb, len);
err = skb_store_bits(skb, 0, buffer, len); err = skb_store_bits(skb, 0, buffer, len);
if (unlikely(err)) { if (unlikely(err))
kfree_skb(skb);
goto free_err; goto free_err;
}
first_frag = true;
} else { } else {
int nr_frags = skb_shinfo(skb)->nr_frags; int nr_frags = skb_shinfo(skb)->nr_frags;
struct page *page; struct page *page;
@ -758,6 +756,9 @@ static struct sk_buff *xsk_build_skb(struct xdp_sock *xs,
return skb; return skb;
free_err: free_err:
if (first_frag && skb)
kfree_skb(skb);
if (err == -EOVERFLOW) { if (err == -EOVERFLOW) {
/* Drop the packet */ /* Drop the packet */
xsk_set_destructor_arg(xs->skb); xsk_set_destructor_arg(xs->skb);

View file

@ -501,6 +501,58 @@ static void test_sockmap_skb_verdict_shutdown(void)
test_sockmap_pass_prog__destroy(skel); 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) static void test_sockmap_skb_verdict_fionread(bool pass_prog)
{ {
int err, map, verdict, c0 = -1, c1 = -1, p0 = -1, p1 = -1; 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); test_sockmap_progs_query(BPF_SK_SKB_VERDICT);
if (test__start_subtest("sockmap skb_verdict shutdown")) if (test__start_subtest("sockmap skb_verdict shutdown"))
test_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")) if (test__start_subtest("sockmap skb_verdict fionread"))
test_sockmap_skb_verdict_fionread(true); test_sockmap_skb_verdict_fionread(true);
if (test__start_subtest("sockmap skb_verdict fionread on drop")) if (test__start_subtest("sockmap skb_verdict fionread on drop"))

View file

@ -2,5 +2,6 @@
audit_logread audit_logread
connect_close connect_close
conntrack_dump_flush conntrack_dump_flush
conntrack_reverse_clash
sctp_collision sctp_collision
nf_queue nf_queue

View file

@ -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_proto);
mnl_attr_nest_end(nlh, nest); mnl_attr_nest_end(nlh, nest);
return 0;
} }
static int build_cta_tuple_v6(struct nlmsghdr *nlh, int type, 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_proto);
mnl_attr_nest_end(nlh, nest); mnl_attr_nest_end(nlh, nest);
return 0;
} }
static int build_cta_proto(struct nlmsghdr *nlh) 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_proto);
mnl_attr_nest_end(nlh, nest); mnl_attr_nest_end(nlh, nest);
return 0;
} }
static int conntrack_data_insert(struct mnl_socket *sock, struct nlmsghdr *nlh, static int conntrack_data_insert(struct mnl_socket *sock, struct nlmsghdr *nlh,