]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
authorJakub Kicinski <kuba@kernel.org>
Thu, 21 May 2026 22:02:54 +0000 (15:02 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 May 2026 21:02:21 +0000 (14:02 -0700)
Cross-merge networking fixes after downstream PR (net-7.1-rc6).

Conflicts:

drivers/net/phy/air_en8811h.c
  d895767c33781 ("net: phy: air_en8811h: add AN8811HB MCU assert/deassert support")
  dddfadd75197e ("net: phy: Add Airoha phy library for shared code")
  5226bb6634cdf ("net: phy: air_phy_lib: Factorize BuckPBus register accessors")
  e08f0ea6daf2e ("net: phy: Rename Airoha common BuckPBus register accessors")

net/sched/sch_netem.c
  a2f6ed7b4873 ("net/sched: netem: add per-impairment extended statistics")
  9552b11e3eda ("net/sched: fix packet loop on netem when duplicate is on")

Adjacent changes:

drivers/dpll/zl3073x/core.c
  c1224569cef0 ("dpll: zl3073x: make frequency monitor a per-device attribute")
  54e65df8cf18 ("dpll: zl3073x: report FFO as DPLL vs input reference offset")

net/iucv/af_iucv.c
  347fdd4df85f ("af_iucv: convert to getsockopt_iter")
  3589d20a666c ("net/iucv: fix locking in .getsockopt")

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
24 files changed:
1  2 
MAINTAINERS
drivers/dpll/dpll_netlink.c
drivers/dpll/zl3073x/core.c
drivers/dpll/zl3073x/dpll.c
drivers/net/ethernet/hisilicon/hibmcge/hbg_main.c
drivers/net/phy/air_en8811h.c
drivers/net/phy/air_phy_lib.c
drivers/net/phy/air_phy_lib.h
drivers/net/tun.c
drivers/net/vxlan/vxlan_core.c
include/linux/dpll.h
include/linux/skbuff.h
net/bridge/br_netlink.c
net/bridge/netfilter/ebtables.c
net/core/skbuff.c
net/ethtool/tsconfig.c
net/hsr/hsr_forward.c
net/iucv/af_iucv.c
net/l2tp/l2tp_core.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netlink/af_netlink.c
net/sched/sch_netem.c
net/vmw_vsock/af_vsock.c
tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json

diff --cc MAINTAINERS
Simple merge
Simple merge
index b3345060490dbb6168405edb557ab1e2e32a7394,0a133b0f2d9728920d3c21bb3857281a031d2747..8e6416a4741de5959b094f6b8be25de412912612
@@@ -724,20 -762,24 +724,17 @@@ zl3073x_dev_periodic_work(struct kthrea
                dev_warn(zldev->dev, "Failed to update phase offsets: %pe\n",
                         ERR_PTR(rc));
  
-       /* Update measured input reference frequencies if any DPLL has
-        * frequency monitoring enabled.
+       /* Update measured input reference frequencies if frequency
+        * monitoring is enabled.
         */
-       list_for_each_entry(zldpll, &zldev->dplls, list) {
-               if (zldpll->freq_monitor) {
-                       rc = zl3073x_ref_freq_meas_update(zldev);
-                       if (rc)
-                               dev_warn(zldev->dev,
-                                        "Failed to update measured frequencies: %pe\n",
-                                        ERR_PTR(rc));
-                       break;
-               }
+       if (zldev->freq_monitor) {
+               rc = zl3073x_ref_freq_meas_update(zldev);
+               if (rc)
+                       dev_warn(zldev->dev,
+                                "Failed to update measured frequencies: %pe\n",
+                                ERR_PTR(rc));
        }
  
 -      /* Update references' fractional frequency offsets */
 -      rc = zl3073x_ref_ffo_update(zldev);
 -      if (rc)
 -              dev_warn(zldev->dev,
 -                       "Failed to update fractional frequency offsets: %pe\n",
 -                       ERR_PTR(rc));
 -
        list_for_each_entry(zldpll, &zldev->dplls, list)
                zl3073x_dpll_changes_check(zldpll);
  
Simple merge
index a42898ae41358fe86072a55528a0ecff0eb5ec19,a86129ce693c254b144f0a9900e177afb9c47891..edd49c193e47683820b4af665f31e7f4c92a1bf4
@@@ -229,6 -260,218 +245,31 @@@ static const unsigned long en8811h_led_
                                              BIT(TRIGGER_NETDEV_RX)          |
                                              BIT(TRIGGER_NETDEV_TX);
  
 -static int air_phy_read_page(struct phy_device *phydev)
 -{
 -      return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
 -}
 -
 -static int air_phy_write_page(struct phy_device *phydev, int page)
 -{
 -      return __phy_write(phydev, AIR_EXT_PAGE_ACCESS, page);
 -}
 -
+ static int __air_pbus_reg_write(struct mdio_device *mdiodev,
+                               u32 pbus_reg, u32 pbus_data)
+ {
+       int ret;
+       ret = __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_EXT_PAGE_ACCESS,
+                             upper_16_bits(pbus_reg));
+       if (ret < 0)
+               return ret;
+       ret = __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_PBUS_ADDR_HIGH,
+                             FIELD_GET(AIR_PBUS_REG_ADDR_HIGH_MASK, pbus_reg));
+       if (ret < 0)
+               return ret;
+       ret = __mdiobus_write(mdiodev->bus, mdiodev->addr,
+                             FIELD_GET(AIR_PBUS_REG_ADDR_LOW_MASK, pbus_reg),
+                             lower_16_bits(pbus_data));
+       if (ret < 0)
+               return ret;
+       return __mdiobus_write(mdiodev->bus, mdiodev->addr, AIR_PBUS_DATA_HIGH,
+                              upper_16_bits(pbus_data));
+ }
 -static int __air_buckpbus_reg_write(struct phy_device *phydev,
 -                                  u32 pbus_address, u32 pbus_data)
 -{
 -      int ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
 -                        upper_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
 -                        lower_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
 -                        upper_16_bits(pbus_data));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
 -                        lower_16_bits(pbus_data));
 -      if (ret < 0)
 -              return ret;
 -
 -      return 0;
 -}
 -
 -static int air_buckpbus_reg_write(struct phy_device *phydev,
 -                                u32 pbus_address, u32 pbus_data)
 -{
 -      int saved_page;
 -      int ret = 0;
 -
 -      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 -
 -      if (saved_page >= 0) {
 -              ret = __air_buckpbus_reg_write(phydev, pbus_address,
 -                                             pbus_data);
 -              if (ret < 0)
 -                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 -                                 pbus_address, ret);
 -      }
 -
 -      return phy_restore_page(phydev, saved_page, ret);
 -}
 -
 -static int __air_buckpbus_reg_read(struct phy_device *phydev,
 -                                 u32 pbus_address, u32 *pbus_data)
 -{
 -      int pbus_data_low, pbus_data_high;
 -      int ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
 -                        upper_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
 -                        lower_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
 -      if (pbus_data_high < 0)
 -              return pbus_data_high;
 -
 -      pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
 -      if (pbus_data_low < 0)
 -              return pbus_data_low;
 -
 -      *pbus_data = pbus_data_low | (pbus_data_high << 16);
 -      return 0;
 -}
 -
 -static int air_buckpbus_reg_read(struct phy_device *phydev,
 -                               u32 pbus_address, u32 *pbus_data)
 -{
 -      int saved_page;
 -      int ret = 0;
 -
 -      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 -
 -      if (saved_page >= 0) {
 -              ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
 -              if (ret < 0)
 -                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 -                                 pbus_address, ret);
 -      }
 -
 -      return phy_restore_page(phydev, saved_page, ret);
 -}
 -
 -static int __air_buckpbus_reg_modify(struct phy_device *phydev,
 -                                   u32 pbus_address, u32 mask, u32 set)
 -{
 -      int pbus_data_low, pbus_data_high;
 -      u32 pbus_data_old, pbus_data_new;
 -      int ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
 -                        upper_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
 -                        lower_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
 -      if (pbus_data_high < 0)
 -              return pbus_data_high;
 -
 -      pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
 -      if (pbus_data_low < 0)
 -              return pbus_data_low;
 -
 -      pbus_data_old = pbus_data_low | (pbus_data_high << 16);
 -      pbus_data_new = (pbus_data_old & ~mask) | set;
 -      if (pbus_data_new == pbus_data_old)
 -              return 0;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
 -                        upper_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
 -                        lower_16_bits(pbus_address));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
 -                        upper_16_bits(pbus_data_new));
 -      if (ret < 0)
 -              return ret;
 -
 -      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
 -                        lower_16_bits(pbus_data_new));
 -      if (ret < 0)
 -              return ret;
 -
 -      return 0;
 -}
 -
 -static int air_buckpbus_reg_modify(struct phy_device *phydev,
 -                                 u32 pbus_address, u32 mask, u32 set)
 -{
 -      int saved_page;
 -      int ret = 0;
 -
 -      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 -
 -      if (saved_page >= 0) {
 -              ret = __air_buckpbus_reg_modify(phydev, pbus_address, mask,
 -                                              set);
 -              if (ret < 0)
 -                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 -                                 pbus_address, ret);
 -      }
 -
 -      return phy_restore_page(phydev, saved_page, ret);
 -}
 -
  static int __air_write_buf(struct phy_device *phydev, u32 address,
                           const struct firmware *fw)
  {
@@@ -373,8 -664,16 +463,16 @@@ static int an8811hb_load_firmware(struc
  {
        int ret;
  
 -      ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
 -                                   EN8811H_FW_CTRL_1_START);
+       ret = an8811hb_mcu_assert(phydev);
+       if (ret < 0)
+               return ret;
+       ret = an8811hb_mcu_deassert(phydev);
+       if (ret < 0)
+               return ret;
 +      ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
 +                                       EN8811H_FW_CTRL_1_START);
        if (ret < 0)
                return ret;
  
@@@ -461,8 -760,18 +559,18 @@@ static int en8811h_restart_mcu(struct p
  {
        int ret;
  
 -      ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
 -                                   EN8811H_FW_CTRL_1_START);
+       if (phy_id_compare_model(phydev->phy_id, AN8811HB_PHY_ID)) {
+               ret = an8811hb_mcu_assert(phydev);
+               if (ret < 0)
+                       return ret;
+               ret = an8811hb_mcu_deassert(phydev);
+               if (ret < 0)
+                       return ret;
+       }
 +      ret = air_phy_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
 +                                       EN8811H_FW_CTRL_1_START);
        if (ret < 0)
                return ret;
  
@@@ -996,16 -1324,23 +1123,23 @@@ static int an8811hb_probe(struct phy_de
        /* Co-Clock Output */
        ret = an8811hb_clk_provider_setup(&phydev->mdio.dev, &priv->hw);
        if (ret)
-               return ret;
+               goto err_dev_create;
  
        /* Configure led gpio pins as output */
 -      ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
 -                                    AN8811HB_GPIO_OUTPUT_345,
 -                                    AN8811HB_GPIO_OUTPUT_345);
 +      ret = air_phy_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
 +                                        AN8811HB_GPIO_OUTPUT_345,
 +                                        AN8811HB_GPIO_OUTPUT_345);
        if (ret < 0)
-               return ret;
+               goto err_dev_create;
  
        return 0;
+ err_dev_create:
+       mdio_device_remove(mdiodev);
+ err_dev_free:
+       mdio_device_free(mdiodev);
+       return ret;
  }
  
  static int en8811h_probe(struct phy_device *phydev)
index 859fa41406d1c2a3902eee94ebeac71d3e5540fb,0000000000000000000000000000000000000000..5141db19fa5eee230edb2581b58157c369cb4360
mode 100644,000000..100644
--- /dev/null
@@@ -1,213 -1,0 +1,211 @@@
- #define AIR_EXT_PAGE_ACCESS           0x1f
 +// SPDX-License-Identifier: GPL-2.0+
 +/*
 + * Airoha Ethernet PHY common library
 + *
 + * Copyright (C) 2026 Airoha Technology Corp.
 + * Copyright (C) 2026 Collabora Ltd.
 + *                    Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
 + */
 +
 +#include <linux/export.h>
 +#include <linux/module.h>
 +#include <linux/phy.h>
 +#include <linux/wordpart.h>
 +
 +#include "air_phy_lib.h"
 +
 +static int __air_buckpbus_reg_read(struct phy_device *phydev,
 +                                 u32 pbus_address, u32 *pbus_data)
 +{
 +      int pbus_data_low, pbus_data_high;
 +      int ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
 +                        upper_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
 +                        lower_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
 +      if (pbus_data_high < 0)
 +              return pbus_data_high;
 +
 +      pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
 +      if (pbus_data_low < 0)
 +              return pbus_data_low;
 +
 +      *pbus_data = pbus_data_low | (pbus_data_high << 16);
 +      return 0;
 +}
 +
 +static int __air_buckpbus_reg_write(struct phy_device *phydev,
 +                                  u32 pbus_address, u32 pbus_data)
 +{
 +      int ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
 +                        upper_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
 +                        lower_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
 +                        upper_16_bits(pbus_data));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
 +                        lower_16_bits(pbus_data));
 +      if (ret < 0)
 +              return ret;
 +
 +      return 0;
 +}
 +
 +static int __air_buckpbus_reg_modify(struct phy_device *phydev,
 +                                   u32 pbus_address, u32 mask, u32 set)
 +{
 +      int pbus_data_low, pbus_data_high;
 +      u32 pbus_data_old, pbus_data_new;
 +      int ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
 +                        upper_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
 +                        lower_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
 +      if (pbus_data_high < 0)
 +              return pbus_data_high;
 +
 +      pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
 +      if (pbus_data_low < 0)
 +              return pbus_data_low;
 +
 +      pbus_data_old = pbus_data_low | (pbus_data_high << 16);
 +      pbus_data_new = (pbus_data_old & ~mask) | set;
 +      if (pbus_data_new == pbus_data_old)
 +              return 0;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
 +                        upper_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
 +                        lower_16_bits(pbus_address));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
 +                        upper_16_bits(pbus_data_new));
 +      if (ret < 0)
 +              return ret;
 +
 +      ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
 +                        lower_16_bits(pbus_data_new));
 +      if (ret < 0)
 +              return ret;
 +
 +      return 0;
 +}
 +
 +int air_phy_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
 +                            u32 *pbus_data)
 +{
 +      int saved_page;
 +      int ret = 0;
 +
 +      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 +
 +      if (saved_page >= 0) {
 +              ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
 +              if (ret < 0)
 +                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 +                                 pbus_address, ret);
 +      }
 +
 +      return phy_restore_page(phydev, saved_page, ret);
 +}
 +EXPORT_SYMBOL_GPL(air_phy_buckpbus_reg_read);
 +
 +int air_phy_buckpbus_reg_write(struct phy_device *phydev, u32 pbus_address,
 +                             u32 pbus_data)
 +{
 +      int saved_page;
 +      int ret = 0;
 +
 +      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 +
 +      if (saved_page >= 0) {
 +              ret = __air_buckpbus_reg_write(phydev, pbus_address,
 +                                             pbus_data);
 +              if (ret < 0)
 +                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 +                                 pbus_address, ret);
 +      }
 +
 +      return phy_restore_page(phydev, saved_page, ret);
 +}
 +EXPORT_SYMBOL_GPL(air_phy_buckpbus_reg_write);
 +
 +int air_phy_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
 +                              u32 mask, u32 set)
 +{
 +      int saved_page;
 +      int ret = 0;
 +
 +      saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
 +
 +      if (saved_page >= 0) {
 +              ret = __air_buckpbus_reg_modify(phydev, pbus_address, mask,
 +                                              set);
 +              if (ret < 0)
 +                      phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
 +                                 pbus_address, ret);
 +      }
 +
 +      return phy_restore_page(phydev, saved_page, ret);
 +}
 +EXPORT_SYMBOL_GPL(air_phy_buckpbus_reg_modify);
 +
 +int air_phy_read_page(struct phy_device *phydev)
 +{
 +      return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
 +}
 +EXPORT_SYMBOL_GPL(air_phy_read_page);
 +
 +int air_phy_write_page(struct phy_device *phydev, int page)
 +{
 +      return __phy_write(phydev, AIR_EXT_PAGE_ACCESS, page);
 +}
 +EXPORT_SYMBOL_GPL(air_phy_write_page);
 +
 +MODULE_DESCRIPTION("Airoha PHY Library");
 +MODULE_LICENSE("GPL");
 +MODULE_AUTHOR("Louis-Alexis Eyraud");
index a2f8b3725761a68902259fe088f47c2d37e58619,0000000000000000000000000000000000000000..01bb32e7c7c95d857b69f60faceae668661c36ed
mode 100644,000000..100644
--- /dev/null
@@@ -1,39 -1,0 +1,41 @@@
 +/* SPDX-License-Identifier: GPL-2.0+ */
 +/*
 + * Copyright (C) 2026 Airoha Technology Corp.
 + * Copyright (C) 2026 Collabora Ltd.
 + *                    Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
 + */
 +
 +#ifndef __AIR_PHY_LIB_H
 +#define __AIR_PHY_LIB_H
 +
 +#include <linux/phy.h>
 +
++#define AIR_EXT_PAGE_ACCESS           0x1f
++
 +#define AIR_PHY_PAGE_STANDARD         0x0000
 +#define AIR_PHY_PAGE_EXTENDED_1               0x0001
 +#define AIR_PHY_PAGE_EXTENDED_4               0x0004
 +
 +/* MII Registers Page 4*/
 +#define AIR_BPBUS_MODE                        0x10
 +#define   AIR_BPBUS_MODE_ADDR_FIXED           0x0000
 +#define   AIR_BPBUS_MODE_ADDR_INCR            BIT(15)
 +#define AIR_BPBUS_WR_ADDR_HIGH                0x11
 +#define AIR_BPBUS_WR_ADDR_LOW         0x12
 +#define AIR_BPBUS_WR_DATA_HIGH                0x13
 +#define AIR_BPBUS_WR_DATA_LOW         0x14
 +#define AIR_BPBUS_RD_ADDR_HIGH                0x15
 +#define AIR_BPBUS_RD_ADDR_LOW         0x16
 +#define AIR_BPBUS_RD_DATA_HIGH                0x17
 +#define AIR_BPBUS_RD_DATA_LOW         0x18
 +
 +int air_phy_buckpbus_reg_modify(struct phy_device *phydev, u32 pbus_address,
 +                              u32 mask, u32 set);
 +int air_phy_buckpbus_reg_read(struct phy_device *phydev, u32 pbus_address,
 +                            u32 *pbus_data);
 +int air_phy_buckpbus_reg_write(struct phy_device *phydev, u32 pbus_address,
 +                             u32 pbus_data);
 +int air_phy_read_page(struct phy_device *phydev);
 +int air_phy_write_page(struct phy_device *phydev, int page);
 +
 +#endif /* __AIR_PHY_LIB_H */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 7a5ce93a83d9c65b7701d16a50e8f249de5d9f52,c2dc3338670e83c2882534f9ac5a21bacfadb9c2..fed240b453bd9b517a571d65640f939fa3bbfd0d
@@@ -1570,11 -1574,17 +1573,16 @@@ static int iucv_sock_getsockopt(struct 
                                0x7fffffff;
                break;
        default:
-               return -ENOPROTOOPT;
+               rc = -ENOPROTOOPT;
+               break;
        }
+       release_sock(sk);
+       if (rc)
+               return rc;
  
 -      if (put_user(len, optlen))
 -              return -EFAULT;
 -      if (copy_to_user(optval, &val, len))
 +      opt->optlen = len;
 +      if (copy_to_iter(&val, len, &opt->iter_out) != len)
                return -EFAULT;
  
        return 0;
Simple merge
Simple merge
index 6cd1838e09e7d5f291b75ad2cdcd7b9b2ad912b0,17a79fe2f0911d2879748cbd5ba3ab78e0230e26..8a1b89a289d8ff3adcfbc106236f6887db60fd44
@@@ -471,10 -461,9 +471,11 @@@ static int netem_enqueue(struct sk_buf
        skb->prev = NULL;
  
        /* Random duplication */
-       if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor, &q->prng)) {
+       if (q->duplicate && skb->tc_depth == 0 &&
 -          q->duplicate >= get_crandom(&q->dup_cor, &q->prng))
++          q->duplicate >= get_crandom(&q->dup_cor, &q->prng)) {
                ++count;
 +              WRITE_ONCE(q->duplicated, q->duplicated + 1);
 +      }
  
        /* Drop packet? */
        if (loss_event(q)) {
Simple merge