From: Shiji Yang <yangshij...@qq.com> This patch allow user to perform basic bitwise clear/set operation on OF DT MAC address. We use two new added dt-bindings to specific the MAC address bits clear/set mask. "mac-address-bitwise-set" can be used to set bit. And "mac-address-bitwise-clear" can be used to clear bit.
Signed-off-by: Shiji Yang <yangshij...@qq.com> --- Hi! This patch can benefit a lot of devices. Git grep ref: macaddr_setbit_la https://git.openwrt.org/?p=openwrt%2Fopenwrt.git&a=search&h=HEAD&st=grep&s=macaddr_setbit_la&sr=1 macaddr_setbit https://git.openwrt.org/?p=openwrt%2Fopenwrt.git&a=search&h=HEAD&st=grep&s=macaddr_setbit&sr=1 macaddr_unsetbit https://git.openwrt.org/?p=openwrt%2Fopenwrt.git&a=search&h=HEAD&st=grep&s=macaddr_unsetbit&sr=1 If this hack/idea is unacceptable, please let me know. Thanks! Regards, Shiji Yang ...-cell-MAC-address-bitwise-operation-.patch | 101 ++++++++++++++++++ ...-cell-MAC-address-bitwise-operation-.patch | 101 ++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 target/linux/generic/hack-5.15/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch create mode 100644 target/linux/generic/hack-6.1/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch diff --git a/target/linux/generic/hack-5.15/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch b/target/linux/generic/hack-5.15/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch new file mode 100644 index 0000000000..396eed8f4a --- /dev/null +++ b/target/linux/generic/hack-5.15/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch @@ -0,0 +1,101 @@ +From: Shiji Yang <yangshij...@outlook.com> +Date: Sun, 16 Jul 2023 21:00:15 +0800 +Subject: [PATCH] of: net: add DT MAC address bitwise operation support + +This patch allow user to perform basic bitwise clear/set operation on +OF DT MAC address. We use two new added dt-bindings to specific the +MAC address bits clear/set mask. "mac-address-bitwise-set" can be used +to set bit. And "mac-address-bitwise-clear" can be used to clear bit. + +The "mac-address-bitwise-*" property consists of two 32-bit(4 Bytes) +hexadecimal. The first hex number mask the Byte[1-2] and the second +one mask the Byte[3-6]. Each MAC address bit corresponds to the unique +mask bit. When setting mask bit to "1", OF driver will clear/set the +corresponding MAC address bit. + +Sample MAC Address and Property Mask: +AA: BB : CC : DD : EE : FF --> mask: <0xAABB 0xCCDDEEFF> +^ ^ ^ +Byte[1] Byte[3] Byte[6] + +Usage Example: +Assuming the base MAC address is "00:11:22:33:44:55", and we have dts +as follows. then the final MAC address should be "ff:11:22:33:44:66". + +0xff1122334466 = 0x001122334455 & (~0x0000000000ff) | 0xff0000000066 + +&gmac0 { + nvmem-cells = <&macaddr_base>; + nvmem-cell-names = "mac-address"; + mac-address-bitwise-clear = <0x0000 0x000000ff>; + mac-address-bitwise-set = <0xff00 0x00000066>; +}; + +Signed-off-by: Shiji Yang <yangshij...@outlook.com> +--- + net/core/of_net.c | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -154,17 +154,10 @@ free: + */ + int of_get_mac_address(struct device_node *np, u8 *addr) + { +- u32 inc_idx, mac_inc, mac_val; ++ u32 inc_idx, mac_inc; ++ u64 mac_val, mac_msk; + int ret; + +- /* Check first if the increment byte is present and valid. +- * If not set assume to increment the last byte if found. +- */ +- if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) +- inc_idx = 5; +- if (inc_idx < 3 || inc_idx > 5) +- return -EINVAL; +- + if (!np) + return -ENODEV; + +@@ -185,16 +178,24 @@ int of_get_mac_address(struct device_nod + return ret; + + found: ++ mac_val = ether_addr_to_u64(addr); ++ ++ if (!of_property_read_u64(np, "mac-address-bitwise-clear", &mac_msk)) ++ mac_val &= ~mac_msk; ++ ++ if (!of_property_read_u64(np, "mac-address-bitwise-set", &mac_msk)) ++ mac_val |= mac_msk; ++ + if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) { +- /* Convert to a contiguous value */ +- mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5]; ++ /* Check first if the increment byte is present and valid. ++ * If not set assume to increment the last byte if found. ++ */ ++ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) ++ inc_idx = 5; ++ if (inc_idx < 3 || inc_idx > 5) ++ return -EINVAL; + mac_val += mac_inc << 8 * (5-inc_idx); + +- /* Apply the incremented value handling overflow case */ +- addr[3] = (mac_val >> 16) & 0xff; +- addr[4] = (mac_val >> 8) & 0xff; +- addr[5] = (mac_val >> 0) & 0xff; +- + /* Remove mac-address-increment and mac-address-increment-byte + * DT property to make sure MAC address would not get incremented + * more if this function is stared again. */ +@@ -202,6 +203,8 @@ found: + of_remove_property(np, of_find_property(np, "mac-address-increment-byte", NULL)); + } + ++ u64_to_ether_addr(mac_val, addr); ++ + of_add_mac_address(np, addr); + return ret; + } diff --git a/target/linux/generic/hack-6.1/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch b/target/linux/generic/hack-6.1/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch new file mode 100644 index 0000000000..396eed8f4a --- /dev/null +++ b/target/linux/generic/hack-6.1/686-of-net-add-NVMEM-cell-MAC-address-bitwise-operation-.patch @@ -0,0 +1,101 @@ +From: Shiji Yang <yangshij...@outlook.com> +Date: Sun, 16 Jul 2023 21:00:15 +0800 +Subject: [PATCH] of: net: add DT MAC address bitwise operation support + +This patch allow user to perform basic bitwise clear/set operation on +OF DT MAC address. We use two new added dt-bindings to specific the +MAC address bits clear/set mask. "mac-address-bitwise-set" can be used +to set bit. And "mac-address-bitwise-clear" can be used to clear bit. + +The "mac-address-bitwise-*" property consists of two 32-bit(4 Bytes) +hexadecimal. The first hex number mask the Byte[1-2] and the second +one mask the Byte[3-6]. Each MAC address bit corresponds to the unique +mask bit. When setting mask bit to "1", OF driver will clear/set the +corresponding MAC address bit. + +Sample MAC Address and Property Mask: +AA: BB : CC : DD : EE : FF --> mask: <0xAABB 0xCCDDEEFF> +^ ^ ^ +Byte[1] Byte[3] Byte[6] + +Usage Example: +Assuming the base MAC address is "00:11:22:33:44:55", and we have dts +as follows. then the final MAC address should be "ff:11:22:33:44:66". + +0xff1122334466 = 0x001122334455 & (~0x0000000000ff) | 0xff0000000066 + +&gmac0 { + nvmem-cells = <&macaddr_base>; + nvmem-cell-names = "mac-address"; + mac-address-bitwise-clear = <0x0000 0x000000ff>; + mac-address-bitwise-set = <0xff00 0x00000066>; +}; + +Signed-off-by: Shiji Yang <yangshij...@outlook.com> +--- + net/core/of_net.c | 35 +++++++++++++++++++---------------- + 1 file changed, 19 insertions(+), 16 deletions(-) + +--- a/net/core/of_net.c ++++ b/net/core/of_net.c +@@ -154,17 +154,10 @@ free: + */ + int of_get_mac_address(struct device_node *np, u8 *addr) + { +- u32 inc_idx, mac_inc, mac_val; ++ u32 inc_idx, mac_inc; ++ u64 mac_val, mac_msk; + int ret; + +- /* Check first if the increment byte is present and valid. +- * If not set assume to increment the last byte if found. +- */ +- if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) +- inc_idx = 5; +- if (inc_idx < 3 || inc_idx > 5) +- return -EINVAL; +- + if (!np) + return -ENODEV; + +@@ -185,16 +178,24 @@ int of_get_mac_address(struct device_nod + return ret; + + found: ++ mac_val = ether_addr_to_u64(addr); ++ ++ if (!of_property_read_u64(np, "mac-address-bitwise-clear", &mac_msk)) ++ mac_val &= ~mac_msk; ++ ++ if (!of_property_read_u64(np, "mac-address-bitwise-set", &mac_msk)) ++ mac_val |= mac_msk; ++ + if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) { +- /* Convert to a contiguous value */ +- mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5]; ++ /* Check first if the increment byte is present and valid. ++ * If not set assume to increment the last byte if found. ++ */ ++ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) ++ inc_idx = 5; ++ if (inc_idx < 3 || inc_idx > 5) ++ return -EINVAL; + mac_val += mac_inc << 8 * (5-inc_idx); + +- /* Apply the incremented value handling overflow case */ +- addr[3] = (mac_val >> 16) & 0xff; +- addr[4] = (mac_val >> 8) & 0xff; +- addr[5] = (mac_val >> 0) & 0xff; +- + /* Remove mac-address-increment and mac-address-increment-byte + * DT property to make sure MAC address would not get incremented + * more if this function is stared again. */ +@@ -202,6 +203,8 @@ found: + of_remove_property(np, of_find_property(np, "mac-address-increment-byte", NULL)); + } + ++ u64_to_ether_addr(mac_val, addr); ++ + of_add_mac_address(np, addr); + return ret; + } -- 2.39.2 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel