linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] ethernet: aquantia: Try MAC address from device tree
@ 2021-11-28  2:37 Tianhao Chai
  2021-11-28 16:33 ` Andrew Lunn
  2021-11-29 22:11 ` Heiner Kallweit
  0 siblings, 2 replies; 8+ messages in thread
From: Tianhao Chai @ 2021-11-28  2:37 UTC (permalink / raw)
  To: Igor Russkikh, David S. Miller, Jakub Kicinski, netdev, linux-kernel
  Cc: Hector Martin, Sven Peter, Alyssa Rosenzweig

Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
card, but instead need to obtain MAC addresses from the device tree. In
this case the hardware will report an invalid MAC.

Currently atlantic driver does not query the DT for MAC address and will
randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
This patch causes the driver to perfer a valid MAC address from OF (if
present) over HW self-reported MAC and only fall back to a random MAC
address when neither of them is valid.

Signed-off-by: Tianhao Chai <cth451@gmail.com>
---
 .../net/ethernet/aquantia/atlantic/aq_nic.c   | 28 ++++++++++++-------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 1acf544afeb4..ae6c4a044390 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -316,18 +316,26 @@ int aq_nic_ndev_register(struct aq_nic_s *self)
 	aq_macsec_init(self);
 #endif
 
-	mutex_lock(&self->fwreq_mutex);
-	err = self->aq_fw_ops->get_mac_permanent(self->aq_hw, addr);
-	mutex_unlock(&self->fwreq_mutex);
-	if (err)
-		goto err_exit;
+	if (eth_platform_get_mac_address(&self->pdev->dev, addr) == 0 &&
+	    is_valid_ether_addr(addr)) {
+		// DT supplied a valid MAC address
+		eth_hw_addr_set(self->ndev, addr);
+	} else {
+		// If DT has none or an invalid one, ask device for MAC address
+		mutex_lock(&self->fwreq_mutex);
+		err = self->aq_fw_ops->get_mac_permanent(self->aq_hw, addr);
+		mutex_unlock(&self->fwreq_mutex);
 
-	eth_hw_addr_set(self->ndev, addr);
+		if (err)
+			goto err_exit;
 
-	if (!is_valid_ether_addr(self->ndev->dev_addr) ||
-	    !aq_nic_is_valid_ether_addr(self->ndev->dev_addr)) {
-		netdev_warn(self->ndev, "MAC is invalid, will use random.");
-		eth_hw_addr_random(self->ndev);
+		if (is_valid_ether_addr(addr) &&
+		    aq_nic_is_valid_ether_addr(addr)) {
+			eth_hw_addr_set(self->ndev, addr);
+		} else {
+			netdev_warn(self->ndev, "MAC is invalid, will use random.");
+			eth_hw_addr_random(self->ndev);
+		}
 	}
 
 #if defined(AQ_CFG_MAC_ADDR_PERMANENT)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-28  2:37 [PATCH] ethernet: aquantia: Try MAC address from device tree Tianhao Chai
@ 2021-11-28 16:33 ` Andrew Lunn
  2021-11-28 17:08   ` Hector Martin
  2021-11-29 22:11 ` Heiner Kallweit
  1 sibling, 1 reply; 8+ messages in thread
From: Andrew Lunn @ 2021-11-28 16:33 UTC (permalink / raw)
  To: Tianhao Chai
  Cc: Igor Russkikh, David S. Miller, Jakub Kicinski, netdev,
	linux-kernel, Hector Martin, Sven Peter, Alyssa Rosenzweig

On Sat, Nov 27, 2021 at 08:37:33PM -0600, Tianhao Chai wrote:
> Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
> card, but instead need to obtain MAC addresses from the device tree. In
> this case the hardware will report an invalid MAC.
> 
> Currently atlantic driver does not query the DT for MAC address and will
> randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
> This patch causes the driver to perfer a valid MAC address from OF (if
> present) over HW self-reported MAC and only fall back to a random MAC
> address when neither of them is valid.

This is a change in behaviour, and could cause regressions. It would
be better to keep with the current flow. Call
aq_fw_ops->get_mac_permanent() first. If that does not give a valid
MAC address, then try DT, and lastly use a random MAC address.

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-28 16:33 ` Andrew Lunn
@ 2021-11-28 17:08   ` Hector Martin
  2021-11-30  2:32     ` Andrew Lunn
  0 siblings, 1 reply; 8+ messages in thread
From: Hector Martin @ 2021-11-28 17:08 UTC (permalink / raw)
  To: Andrew Lunn, Tianhao Chai
  Cc: Igor Russkikh, David S. Miller, Jakub Kicinski, netdev,
	linux-kernel, Sven Peter, Alyssa Rosenzweig

On 29/11/2021 01.33, Andrew Lunn wrote:
> On Sat, Nov 27, 2021 at 08:37:33PM -0600, Tianhao Chai wrote:
>> Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
>> card, but instead need to obtain MAC addresses from the device tree. In
>> this case the hardware will report an invalid MAC.
>>
>> Currently atlantic driver does not query the DT for MAC address and will
>> randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
>> This patch causes the driver to perfer a valid MAC address from OF (if
>> present) over HW self-reported MAC and only fall back to a random MAC
>> address when neither of them is valid.
> 
> This is a change in behaviour, and could cause regressions. It would
> be better to keep with the current flow. Call
> aq_fw_ops->get_mac_permanent() first. If that does not give a valid
> MAC address, then try DT, and lastly use a random MAC address.

On DT platforms, it is expected that the device tree MAC will override 
whatever the device thinks is its MAC address. See tg3, igb, igc, r8169, 
for examples where eth_platform_get_mac_address takes precedence over 
everything else.

I would not expect any other existing platform to have a MAC assigned to 
the device in this way using these cards; if any platforms do, chances 
are they intended it for it to be used and this patch will fix a current 
bug. If some platforms out there really have bogus MACs assigned in this 
way, that's a firmware bug, and we'd have to find out and add explicit, 
targeted workaround code. Are you aware of any such platforms? :)

-- 
Hector Martin (marcan@marcan.st)
Public Key: https://mrcn.st/pub

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-28  2:37 [PATCH] ethernet: aquantia: Try MAC address from device tree Tianhao Chai
  2021-11-28 16:33 ` Andrew Lunn
@ 2021-11-29 22:11 ` Heiner Kallweit
  2021-11-30  3:12   ` Tianhao Chai
  1 sibling, 1 reply; 8+ messages in thread
From: Heiner Kallweit @ 2021-11-29 22:11 UTC (permalink / raw)
  To: Tianhao Chai, Igor Russkikh, David S. Miller, Jakub Kicinski,
	netdev, linux-kernel
  Cc: Hector Martin, Sven Peter, Alyssa Rosenzweig

On 28.11.2021 03:37, Tianhao Chai wrote:
> Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
> card, but instead need to obtain MAC addresses from the device tree. In
> this case the hardware will report an invalid MAC.
> 
> Currently atlantic driver does not query the DT for MAC address and will
> randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
> This patch causes the driver to perfer a valid MAC address from OF (if
> present) over HW self-reported MAC and only fall back to a random MAC
> address when neither of them is valid.
> 
> Signed-off-by: Tianhao Chai <cth451@gmail.com>
> ---
>  .../net/ethernet/aquantia/atlantic/aq_nic.c   | 28 ++++++++++++-------
>  1 file changed, 18 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> index 1acf544afeb4..ae6c4a044390 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
> @@ -316,18 +316,26 @@ int aq_nic_ndev_register(struct aq_nic_s *self)
>  	aq_macsec_init(self);
>  #endif
>  
> -	mutex_lock(&self->fwreq_mutex);
> -	err = self->aq_fw_ops->get_mac_permanent(self->aq_hw, addr);
> -	mutex_unlock(&self->fwreq_mutex);
> -	if (err)
> -		goto err_exit;
> +	if (eth_platform_get_mac_address(&self->pdev->dev, addr) == 0 &&
> +	    is_valid_ether_addr(addr)) {

Calling is_valid_ether_addr() shouldn't be needed here. of_get_mac_addr()
does this check already. If you should decide to keep this check:
Kernel doc of is_valid_ether_addr() states that argument must be
word-aligned. So you may need to add a __align(2) to the address char
array definition.

> +		// DT supplied a valid MAC address
> +		eth_hw_addr_set(self->ndev, addr);
> +	} else {
> +		// If DT has none or an invalid one, ask device for MAC address
> +		mutex_lock(&self->fwreq_mutex);
> +		err = self->aq_fw_ops->get_mac_permanent(self->aq_hw, addr);
> +		mutex_unlock(&self->fwreq_mutex);
>  
> -	eth_hw_addr_set(self->ndev, addr);
> +		if (err)
> +			goto err_exit;
>  
> -	if (!is_valid_ether_addr(self->ndev->dev_addr) ||
> -	    !aq_nic_is_valid_ether_addr(self->ndev->dev_addr)) {
> -		netdev_warn(self->ndev, "MAC is invalid, will use random.");
> -		eth_hw_addr_random(self->ndev);
> +		if (is_valid_ether_addr(addr) &&
> +		    aq_nic_is_valid_ether_addr(addr)) {
> +			eth_hw_addr_set(self->ndev, addr);
> +		} else {
> +			netdev_warn(self->ndev, "MAC is invalid, will use random.");
> +			eth_hw_addr_random(self->ndev);
> +		}
>  	}
>  
>  #if defined(AQ_CFG_MAC_ADDR_PERMANENT)
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-28 17:08   ` Hector Martin
@ 2021-11-30  2:32     ` Andrew Lunn
  2021-11-30  4:43       ` Tianhao Chai
  2021-12-02  5:10       ` Hector Martin
  0 siblings, 2 replies; 8+ messages in thread
From: Andrew Lunn @ 2021-11-30  2:32 UTC (permalink / raw)
  To: Hector Martin
  Cc: Tianhao Chai, Igor Russkikh, David S. Miller, Jakub Kicinski,
	netdev, linux-kernel, Sven Peter, Alyssa Rosenzweig

On Mon, Nov 29, 2021 at 02:08:28AM +0900, Hector Martin wrote:
> On 29/11/2021 01.33, Andrew Lunn wrote:
> > On Sat, Nov 27, 2021 at 08:37:33PM -0600, Tianhao Chai wrote:
> > > Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
> > > card, but instead need to obtain MAC addresses from the device tree. In
> > > this case the hardware will report an invalid MAC.
> > > 
> > > Currently atlantic driver does not query the DT for MAC address and will
> > > randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
> > > This patch causes the driver to perfer a valid MAC address from OF (if
> > > present) over HW self-reported MAC and only fall back to a random MAC
> > > address when neither of them is valid.
> > 
> > This is a change in behaviour, and could cause regressions. It would
> > be better to keep with the current flow. Call
> > aq_fw_ops->get_mac_permanent() first. If that does not give a valid
> > MAC address, then try DT, and lastly use a random MAC address.
> 
> On DT platforms, it is expected that the device tree MAC will override
> whatever the device thinks is its MAC address.

Can you point to any documentation of that expectation?

> I would not expect any other existing platform to have a MAC assigned to the
> device in this way using these cards; if any platforms do, chances are they
> intended it for it to be used and this patch will fix a current bug. If some
> platforms out there really have bogus MACs assigned in this way, that's a
> firmware bug, and we'd have to find out and add explicit, targeted
> workaround code. Are you aware of any such platforms? :)

I'm not aware of any, because i try to avoid making behaviour changes.

Anyway, lets go with this, and if stuff breaks we can always change
the order to what i suggested in order to unbreak stuff. I'm assuming
for Apple M1 Mac minis the order does not actually matter?

    Andrew

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-29 22:11 ` Heiner Kallweit
@ 2021-11-30  3:12   ` Tianhao Chai
  0 siblings, 0 replies; 8+ messages in thread
From: Tianhao Chai @ 2021-11-30  3:12 UTC (permalink / raw)
  To: Heiner Kallweit
  Cc: Igor Russkikh, David S. Miller, Jakub Kicinski, netdev,
	linux-kernel, Hector Martin, Sven Peter, Alyssa Rosenzweig

> Calling is_valid_ether_addr() shouldn't be needed here. of_get_mac_addr()
> does this check already.

You are right. I'll remove the check.

~cth451

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-30  2:32     ` Andrew Lunn
@ 2021-11-30  4:43       ` Tianhao Chai
  2021-12-02  5:10       ` Hector Martin
  1 sibling, 0 replies; 8+ messages in thread
From: Tianhao Chai @ 2021-11-30  4:43 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Hector Martin, Igor Russkikh, David S. Miller, Jakub Kicinski,
	netdev, linux-kernel, Sven Peter, Alyssa Rosenzweig

On Tue, Nov 30, 2021 at 03:32:10AM +0100, Andrew Lunn wrote:
> On Mon, Nov 29, 2021 at 02:08:28AM +0900, Hector Martin wrote:
> > On DT platforms, it is expected that the device tree MAC will override
> > whatever the device thinks is its MAC address.
> 
> Can you point to any documentation of that expectation?

Since other drivers will prefer DT provided MAC as well, I'd assume
this to be the case, though I'm not sure where this behavior is documented.
I'm new to embedded systems and maybe Hector knows better than I do.

I don't think this will cause regression on platforms that don't even use
DT, say amd64, but could be a change of behavior where DT and NIC both
report valid MACs on OF platforms.

> I'm assuming for Apple M1 Mac minis the order does not actually matter?

The order does not matter in this case. On my M1 mini the hardware
reports an all-zero MAC address. The MAC from DT matches the one printed
on the box, and we should use this one instead.

~cth451

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] ethernet: aquantia: Try MAC address from device tree
  2021-11-30  2:32     ` Andrew Lunn
  2021-11-30  4:43       ` Tianhao Chai
@ 2021-12-02  5:10       ` Hector Martin
  1 sibling, 0 replies; 8+ messages in thread
From: Hector Martin @ 2021-12-02  5:10 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Tianhao Chai, Igor Russkikh, David S. Miller, Jakub Kicinski,
	netdev, linux-kernel, Sven Peter, Alyssa Rosenzweig

On 30/11/2021 11.32, Andrew Lunn wrote:
> On Mon, Nov 29, 2021 at 02:08:28AM +0900, Hector Martin wrote:
>> On 29/11/2021 01.33, Andrew Lunn wrote:
>>> On Sat, Nov 27, 2021 at 08:37:33PM -0600, Tianhao Chai wrote:
>>>> Apple M1 Mac minis (2020) with 10GE NICs do not have MAC address in the
>>>> card, but instead need to obtain MAC addresses from the device tree. In
>>>> this case the hardware will report an invalid MAC.
>>>>
>>>> Currently atlantic driver does not query the DT for MAC address and will
>>>> randomly assign a MAC if the NIC doesn't have a permanent MAC burnt in.
>>>> This patch causes the driver to perfer a valid MAC address from OF (if
>>>> present) over HW self-reported MAC and only fall back to a random MAC
>>>> address when neither of them is valid.
>>>
>>> This is a change in behaviour, and could cause regressions. It would
>>> be better to keep with the current flow. Call
>>> aq_fw_ops->get_mac_permanent() first. If that does not give a valid
>>> MAC address, then try DT, and lastly use a random MAC address.
>>
>> On DT platforms, it is expected that the device tree MAC will override
>> whatever the device thinks is its MAC address.
> 
> Can you point to any documentation of that expectation?

I don't think this is explicitly clarified anywhere, but the DT binding 
says:

 > Specifies the MAC address that was assigned to the network device.

It certainly doesn't say this should be a fallback only to be used if 
the device doesn't have some idea of its MAC. Usually you'd expect 
firmware information to override whatever the device's built-in defaults 
are.

>> I would not expect any other existing platform to have a MAC assigned to the
>> device in this way using these cards; if any platforms do, chances are they
>> intended it for it to be used and this patch will fix a current bug. If some
>> platforms out there really have bogus MACs assigned in this way, that's a
>> firmware bug, and we'd have to find out and add explicit, targeted
>> workaround code. Are you aware of any such platforms? :)
> 
> I'm not aware of any, because i try to avoid making behaviour changes.
> 
> Anyway, lets go with this, and if stuff breaks we can always change
> the order to what i suggested in order to unbreak stuff. I'm assuming
> for Apple M1 Mac minis the order does not actually matter?

Correct, on these machines the burned-in MAC is invalid so it doesn't 
matter.


-- 
Hector Martin (marcan@marcan.st)
Public Key: https://mrcn.st/pub

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-12-02  5:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-28  2:37 [PATCH] ethernet: aquantia: Try MAC address from device tree Tianhao Chai
2021-11-28 16:33 ` Andrew Lunn
2021-11-28 17:08   ` Hector Martin
2021-11-30  2:32     ` Andrew Lunn
2021-11-30  4:43       ` Tianhao Chai
2021-12-02  5:10       ` Hector Martin
2021-11-29 22:11 ` Heiner Kallweit
2021-11-30  3:12   ` Tianhao Chai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).