From: Christian Marangi Date: Mon, 22 May 2023 00:34:20 +0000 (+0200) Subject: kernek: use struct_group to wipe ar8216 volatile priv data X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=0605fa693e3ae5266c6d9b0a291ee12a3adac09b;p=openwrt%2Fopenwrt.git kernek: use struct_group to wipe ar8216 volatile priv data Instead of reference vlan and do strange subtraction, use the handy struct_group() to create a virtual struct of the same size of the members. This permits to have a more secure memset and fix compilation warning in 6.1 where additional checks are done. Signed-off-by: Christian Marangi --- diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 876754597a..850bcefb74 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1419,8 +1419,7 @@ ar8xxx_sw_reset_switch(struct switch_dev *dev) int i; mutex_lock(&priv->reg_mutex); - memset(&priv->vlan, 0, sizeof(struct ar8xxx_priv) - - offsetof(struct ar8xxx_priv, vlan)); + memset(&priv->ar8xxx_priv_volatile, 0, sizeof(priv->ar8xxx_priv_volatile)); for (i = 0; i < dev->vlans; i++) priv->vlan_id[i] = i; @@ -2461,7 +2460,7 @@ ar8xxx_phy_config_init(struct phy_device *phydev) dev->phy_ptr = priv; #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0) dev->priv_flags |= IFF_NO_IP_ALIGN; -#else LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0) +#else dev->extra_priv_flags |= IFF_NO_IP_ALIGN; #endif dev->eth_mangle_rx = ar8216_mangle_rx; @@ -2700,7 +2699,7 @@ ar8xxx_phy_detach(struct phy_device *phydev) dev->phy_ptr = NULL; #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0) dev->priv_flags &= ~IFF_NO_IP_ALIGN; -#else LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0) +#else dev->extra_priv_flags &= ~IFF_NO_IP_ALIGN; #endif dev->eth_mangle_rx = NULL; diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.h b/target/linux/generic/files/drivers/net/phy/ar8216.h index d62cf60f57..f046b35f43 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.h +++ b/target/linux/generic/files/drivers/net/phy/ar8216.h @@ -506,20 +506,22 @@ struct ar8xxx_priv { unsigned int use_count; /* all fields below are cleared on reset */ - bool vlan; - - u16 vlan_id[AR8XXX_MAX_VLANS]; - u8 vlan_table[AR8XXX_MAX_VLANS]; - u8 vlan_tagged; - u16 pvid[AR8X16_MAX_PORTS]; - int arl_age_time; - - /* mirroring */ - bool mirror_rx; - bool mirror_tx; - int source_port; - int monitor_port; - u8 port_vlan_prio[AR8X16_MAX_PORTS]; + struct_group(ar8xxx_priv_volatile, + bool vlan; + + u16 vlan_id[AR8XXX_MAX_VLANS]; + u8 vlan_table[AR8XXX_MAX_VLANS]; + u8 vlan_tagged; + u16 pvid[AR8X16_MAX_PORTS]; + int arl_age_time; + + /* mirroring */ + bool mirror_rx; + bool mirror_tx; + int source_port; + int monitor_port; + u8 port_vlan_prio[AR8X16_MAX_PORTS]; + ); }; u32