[net-next,v3,1/2] dt-bindings: mt76: support setting per-band MAC address

Message ID d3130584b64309da28a04826100643ff6239f9ca.1690841657.git.daniel@makrotopia.org
State New
Headers
Series [net-next,v3,1/2] dt-bindings: mt76: support setting per-band MAC address |

Commit Message

Daniel Golle July 31, 2023, 10:23 p.m. UTC
  Introduce support for setting individual per-band MAC addresses using
NVMEM cells by adding a 'bands' object with enumerated child nodes
representing the 2.4 GHz, 5 GHz and 6 GHz bands.

In case it is defined, call of_get_mac_address for the per-band child
node, otherwise try with of_get_mac_address on the main device node and
fall back to a random address like it used to be.

While at it, add MAC address related properties also for the main node.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
Changes since v2:
 * drop items list with only a single item

Changes since v1:
 * add dt-bindings

 .../bindings/net/wireless/mediatek,mt76.yaml  | 58 ++++++++++++++++++-
 1 file changed, 57 insertions(+), 1 deletion(-)
  

Comments

Kalle Valo Aug. 1, 2023, 8:04 a.m. UTC | #1
Daniel Golle <daniel@makrotopia.org> writes:

> Introduce support for setting individual per-band MAC addresses using
> NVMEM cells by adding a 'bands' object with enumerated child nodes
> representing the 2.4 GHz, 5 GHz and 6 GHz bands.
>
> In case it is defined, call of_get_mac_address for the per-band child
> node, otherwise try with of_get_mac_address on the main device node and
> fall back to a random address like it used to be.
>
> While at it, add MAC address related properties also for the main node.
>
> Signed-off-by: Daniel Golle <daniel@makrotopia.org>

mt76 patches go to Felix's tree, not net-next. No need to resend because
of this.
  
Rob Herring Aug. 11, 2023, 7:09 p.m. UTC | #2
On Mon, Jul 31, 2023 at 11:23:16PM +0100, Daniel Golle wrote:
> Introduce support for setting individual per-band MAC addresses using
> NVMEM cells by adding a 'bands' object with enumerated child nodes
> representing the 2.4 GHz, 5 GHz and 6 GHz bands.
> 
> In case it is defined, call of_get_mac_address for the per-band child
> node, otherwise try with of_get_mac_address on the main device node and
> fall back to a random address like it used to be.
> 
> While at it, add MAC address related properties also for the main node.
> 
> Signed-off-by: Daniel Golle <daniel@makrotopia.org>
> ---
> Changes since v2:
>  * drop items list with only a single item
> 
> Changes since v1:
>  * add dt-bindings
> 
>  .../bindings/net/wireless/mediatek,mt76.yaml  | 58 ++++++++++++++++++-
>  1 file changed, 57 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> index 252207adbc54c..7eafed53da1de 100644
> --- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> +++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> @@ -37,6 +37,12 @@ properties:
>      description:
>        MT7986 should contain 3 regions consys, dcm, and sku, in this order.
>  
> +  '#address-cells':
> +    const: 1
> +
> +  '#size-cells':
> +    const: 0
> +
>    interrupts:
>      maxItems: 1
>  
> @@ -72,13 +78,23 @@ properties:
>  
>    ieee80211-freq-limit: true
>  
> +  address: true

What's this? Not a documented property.


> +
> +  local-mac-address: true
> +
> +  mac-address: true

You really need a ref to the schema defining these. But first we need to 
split them out from ethernet-controller.yaml. Which I think there were 
patches for, but it stalled out.

Anyways, it's fine for now if you're not up for that.

> +
>    nvmem-cells:
> +    minItems: 1
>      items:
>        - description: NVMEM cell with EEPROM
> +      - description: NVMEM cell with the MAC address
>  
>    nvmem-cell-names:
> +    minItems: 1
>      items:
>        - const: eeprom
> +      - const: mac-address
>  
>    mediatek,eeprom-data:
>      $ref: /schemas/types.yaml#/definitions/uint32-array
> @@ -213,6 +229,29 @@ properties:
>                      description:
>                        Half-dBm power delta for different numbers of antennas
>  
> +patternProperties:
> +  '^band@[0-2]+$':
> +    type: object
> +    additionalProperties: false
> +    properties:
> +      reg:
> +        maxItems: 1
> +
> +      address: true
> +      local-mac-address: true
> +      mac-address: true
> +
> +      nvmem-cells:
> +        description: NVMEM cell with the MAC address
> +
> +      nvmem-cell-names:
> +        const: mac-address
> +
> +    required:
> +      - reg
> +
> +    unevaluatedProperties: false
> +
>  required:
>    - compatible
>    - reg
> @@ -225,10 +264,13 @@ examples:
>        #address-cells = <3>;
>        #size-cells = <2>;
>        wifi@0,0 {
> +        #address-cells = <1>;
> +        #size-cells = <0>;
>          compatible = "mediatek,mt76";
>          reg = <0x0000 0 0 0 0>;
>          ieee80211-freq-limit = <5000000 6000000>;
> -        mediatek,mtd-eeprom = <&factory 0x8000>;
> +        nvmem-cells = <&factory_eeprom>;
> +        nvmem-cell-names = "eeprom";
>          big-endian;
>  
>          led {
> @@ -257,6 +299,20 @@ examples:
>               };
>            };
>          };
> +
> +        band@0 {
> +          /* 2.4 GHz */
> +          reg = <0>;
> +          nvmem-cells = <&macaddr 0x4>;
> +          nvmem-cell-names = "mac-address";
> +        };
> +
> +        band@1 {
> +          /* 5 GHz */
> +          reg = <1>;
> +          nvmem-cells = <&macaddr 0xa>;
> +          nvmem-cell-names = "mac-address";
> +        };
>        };
>      };
>  
> -- 
> 2.41.0
  
Daniel Golle Aug. 22, 2023, 11:35 a.m. UTC | #3
On Fri, Aug 11, 2023 at 01:09:44PM -0600, Rob Herring wrote:
> On Mon, Jul 31, 2023 at 11:23:16PM +0100, Daniel Golle wrote:
> > Introduce support for setting individual per-band MAC addresses using
> > NVMEM cells by adding a 'bands' object with enumerated child nodes
> > representing the 2.4 GHz, 5 GHz and 6 GHz bands.
> > 
> > In case it is defined, call of_get_mac_address for the per-band child
> > node, otherwise try with of_get_mac_address on the main device node and
> > fall back to a random address like it used to be.
> > 
> > While at it, add MAC address related properties also for the main node.
> > 
> > Signed-off-by: Daniel Golle <daniel@makrotopia.org>
> > ---
> > Changes since v2:
> >  * drop items list with only a single item
> > 
> > Changes since v1:
> >  * add dt-bindings
> > 
> >  .../bindings/net/wireless/mediatek,mt76.yaml  | 58 ++++++++++++++++++-
> >  1 file changed, 57 insertions(+), 1 deletion(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> > index 252207adbc54c..7eafed53da1de 100644
> > --- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> > +++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
> > @@ -37,6 +37,12 @@ properties:
> >      description:
> >        MT7986 should contain 3 regions consys, dcm, and sku, in this order.
> >  
> > +  '#address-cells':
> > +    const: 1
> > +
> > +  '#size-cells':
> > +    const: 0
> > +
> >    interrupts:
> >      maxItems: 1
> >  
> > @@ -72,13 +78,23 @@ properties:
> >  
> >    ieee80211-freq-limit: true
> >  
> > +  address: true
> 
> What's this? Not a documented property.

Maybe it should be documented then...?
See
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/core/of_net.c#n140

```
int of_get_mac_address(struct device_node *np, u8 *addr)
{
	int ret;

	if (!np)
		return -ENODEV;

	ret = of_get_mac_addr(np, "mac-address", addr);
	if (!ret)
		return 0;

	ret = of_get_mac_addr(np, "local-mac-address", addr);
	if (!ret)
		return 0;

	ret = of_get_mac_addr(np, "address", addr);
	if (!ret)
		return 0;

	return of_get_mac_address_nvmem(np, addr);
}
EXPORT_SYMBOL(of_get_mac_address);
```

> 
> 
> > +
> > +  local-mac-address: true
> > +
> > +  mac-address: true
> 
> You really need a ref to the schema defining these. But first we need to 
> split them out from ethernet-controller.yaml. Which I think there were 
> patches for, but it stalled out.
> 

I understand, so have a schema to include whenever of_net.c is used to
assign a MAC address, and then use that for ethernet-controller.yaml and
in places such as here.

If you point me to the existing patches I can pick them up and address
whatever needs to be addressed to get them merged.

> Anyways, it's fine for now if you're not up for that.

So just remove the (supposedly deprecated) "address: true" for now and
then create an of_net MAC-address related schema and move things there
after that?

> 
> > +
> >    nvmem-cells:
> > +    minItems: 1
> >      items:
> >        - description: NVMEM cell with EEPROM
> > +      - description: NVMEM cell with the MAC address
> >  
> >    nvmem-cell-names:
> > +    minItems: 1
> >      items:
> >        - const: eeprom
> > +      - const: mac-address
> >  
> >    mediatek,eeprom-data:
> >      $ref: /schemas/types.yaml#/definitions/uint32-array
> > @@ -213,6 +229,29 @@ properties:
> >                      description:
> >                        Half-dBm power delta for different numbers of antennas
> >  
> > +patternProperties:
> > +  '^band@[0-2]+$':
> > +    type: object
> > +    additionalProperties: false
> > +    properties:
> > +      reg:
> > +        maxItems: 1
> > +
> > +      address: true
> > +      local-mac-address: true
> > +      mac-address: true
> > +
> > +      nvmem-cells:
> > +        description: NVMEM cell with the MAC address
> > +
> > +      nvmem-cell-names:
> > +        const: mac-address
> > +
> > +    required:
> > +      - reg
> > +
> > +    unevaluatedProperties: false
> > +
> >  required:
> >    - compatible
> >    - reg
> > @@ -225,10 +264,13 @@ examples:
> >        #address-cells = <3>;
> >        #size-cells = <2>;
> >        wifi@0,0 {
> > +        #address-cells = <1>;
> > +        #size-cells = <0>;
> >          compatible = "mediatek,mt76";
> >          reg = <0x0000 0 0 0 0>;
> >          ieee80211-freq-limit = <5000000 6000000>;
> > -        mediatek,mtd-eeprom = <&factory 0x8000>;
> > +        nvmem-cells = <&factory_eeprom>;
> > +        nvmem-cell-names = "eeprom";
> >          big-endian;
> >  
> >          led {
> > @@ -257,6 +299,20 @@ examples:
> >               };
> >            };
> >          };
> > +
> > +        band@0 {
> > +          /* 2.4 GHz */
> > +          reg = <0>;
> > +          nvmem-cells = <&macaddr 0x4>;
> > +          nvmem-cell-names = "mac-address";
> > +        };
> > +
> > +        band@1 {
> > +          /* 5 GHz */
> > +          reg = <1>;
> > +          nvmem-cells = <&macaddr 0xa>;
> > +          nvmem-cell-names = "mac-address";
> > +        };
> >        };
> >      };
> >  
> > -- 
> > 2.41.0
  

Patch

diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
index 252207adbc54c..7eafed53da1de 100644
--- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
+++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.yaml
@@ -37,6 +37,12 @@  properties:
     description:
       MT7986 should contain 3 regions consys, dcm, and sku, in this order.
 
+  '#address-cells':
+    const: 1
+
+  '#size-cells':
+    const: 0
+
   interrupts:
     maxItems: 1
 
@@ -72,13 +78,23 @@  properties:
 
   ieee80211-freq-limit: true
 
+  address: true
+
+  local-mac-address: true
+
+  mac-address: true
+
   nvmem-cells:
+    minItems: 1
     items:
       - description: NVMEM cell with EEPROM
+      - description: NVMEM cell with the MAC address
 
   nvmem-cell-names:
+    minItems: 1
     items:
       - const: eeprom
+      - const: mac-address
 
   mediatek,eeprom-data:
     $ref: /schemas/types.yaml#/definitions/uint32-array
@@ -213,6 +229,29 @@  properties:
                     description:
                       Half-dBm power delta for different numbers of antennas
 
+patternProperties:
+  '^band@[0-2]+$':
+    type: object
+    additionalProperties: false
+    properties:
+      reg:
+        maxItems: 1
+
+      address: true
+      local-mac-address: true
+      mac-address: true
+
+      nvmem-cells:
+        description: NVMEM cell with the MAC address
+
+      nvmem-cell-names:
+        const: mac-address
+
+    required:
+      - reg
+
+    unevaluatedProperties: false
+
 required:
   - compatible
   - reg
@@ -225,10 +264,13 @@  examples:
       #address-cells = <3>;
       #size-cells = <2>;
       wifi@0,0 {
+        #address-cells = <1>;
+        #size-cells = <0>;
         compatible = "mediatek,mt76";
         reg = <0x0000 0 0 0 0>;
         ieee80211-freq-limit = <5000000 6000000>;
-        mediatek,mtd-eeprom = <&factory 0x8000>;
+        nvmem-cells = <&factory_eeprom>;
+        nvmem-cell-names = "eeprom";
         big-endian;
 
         led {
@@ -257,6 +299,20 @@  examples:
              };
           };
         };
+
+        band@0 {
+          /* 2.4 GHz */
+          reg = <0>;
+          nvmem-cells = <&macaddr 0x4>;
+          nvmem-cell-names = "mac-address";
+        };
+
+        band@1 {
+          /* 5 GHz */
+          reg = <1>;
+          nvmem-cells = <&macaddr 0xa>;
+          nvmem-cell-names = "mac-address";
+        };
       };
     };