diff mbox

[U-Boot,v2] net: Update hardware MAC address if it changes in env

Message ID 1427182909-14529-1-git-send-email-joe.hershberger@ni.com
State Accepted
Delegated to: Joe Hershberger
Headers show

Commit Message

Joe Hershberger March 24, 2015, 7:41 a.m. UTC
When the ethaddr changes in the env, the hardware should also be updated
so that MAC filtering will work properly without resetting U-Boot.

Also remove the manual calls to set the hwaddr that was included in a
few drivers as a result of the framework not doing it.

Reported-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>

---

Changes in v2:
-Implement the check in non-DM eth_initialize also
-Use static helper function in DM case

 drivers/net/bcm-sf2-eth.c |  6 ----
 drivers/net/designware.c  |  4 ---
 drivers/net/macb.c        |  9 ------
 net/eth.c                 | 76 ++++++++++++++++++++++++++++++-----------------
 4 files changed, 48 insertions(+), 47 deletions(-)

Comments

Joe Hershberger March 30, 2015, 6:08 p.m. UTC | #1
Hi Michal,

On Tue, Mar 24, 2015 at 2:41 AM, Joe Hershberger <joe.hershberger@ni.com>
wrote:
>
> When the ethaddr changes in the env, the hardware should also be updated
> so that MAC filtering will work properly without resetting U-Boot.
>
> Also remove the manual calls to set the hwaddr that was included in a
> few drivers as a result of the framework not doing it.
>
> Reported-by: Michal Simek <michal.simek@xilinx.com>
> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>
> ---
>
> Changes in v2:
> -Implement the check in non-DM eth_initialize also
> -Use static helper function in DM case
>
>  drivers/net/bcm-sf2-eth.c |  6 ----
>  drivers/net/designware.c  |  4 ---
>  drivers/net/macb.c        |  9 ------
>  net/eth.c                 | 76
++++++++++++++++++++++++++++++-----------------
>  4 files changed, 48 insertions(+), 47 deletions(-)

Does this sufficiently resolve the issue you have?

Thanks,
-Joe
Michal Simek March 31, 2015, 11:41 a.m. UTC | #2
On 03/30/2015 08:08 PM, Joe Hershberger wrote:
> Hi Michal,
> 
> On Tue, Mar 24, 2015 at 2:41 AM, Joe Hershberger <joe.hershberger@ni.com>
> wrote:
>>
>> When the ethaddr changes in the env, the hardware should also be updated
>> so that MAC filtering will work properly without resetting U-Boot.
>>
>> Also remove the manual calls to set the hwaddr that was included in a
>> few drivers as a result of the framework not doing it.
>>
>> Reported-by: Michal Simek <michal.simek@xilinx.com>
>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>>
>> ---
>>
>> Changes in v2:
>> -Implement the check in non-DM eth_initialize also
>> -Use static helper function in DM case
>>
>>  drivers/net/bcm-sf2-eth.c |  6 ----
>>  drivers/net/designware.c  |  4 ---
>>  drivers/net/macb.c        |  9 ------
>>  net/eth.c                 | 76
> ++++++++++++++++++++++++++++++-----------------
>>  4 files changed, 48 insertions(+), 47 deletions(-)
> 
> Does this sufficiently resolve the issue you have?

I wouldn't say it was my issue. It was more about asking what's the
right thing to do.
But anyway I have tested it with our ethernet driver and it is working fine.

I have applied it on the top of u-boot-dm/next.

Tested-by: Michal Simek <michal.simek@xilinx.com>

Thanks,
Michal
Joe Hershberger April 21, 2015, 11:21 p.m. UTC | #3
On Tue, Mar 31, 2015 at 6:41 AM, Michal Simek <michal.simek@xilinx.com> wrote:
> On 03/30/2015 08:08 PM, Joe Hershberger wrote:
>> Hi Michal,
>>
>> On Tue, Mar 24, 2015 at 2:41 AM, Joe Hershberger <joe.hershberger@ni.com>
>> wrote:
>>>
>>> When the ethaddr changes in the env, the hardware should also be updated
>>> so that MAC filtering will work properly without resetting U-Boot.
>>>
>>> Also remove the manual calls to set the hwaddr that was included in a
>>> few drivers as a result of the framework not doing it.
>>>
>>> Reported-by: Michal Simek <michal.simek@xilinx.com>
>>> Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
>>>
>>> ---
>>>
>>> Changes in v2:
>>> -Implement the check in non-DM eth_initialize also
>>> -Use static helper function in DM case
>>>
>>>  drivers/net/bcm-sf2-eth.c |  6 ----
>>>  drivers/net/designware.c  |  4 ---
>>>  drivers/net/macb.c        |  9 ------
>>>  net/eth.c                 | 76
>> ++++++++++++++++++++++++++++++-----------------
>>>  4 files changed, 48 insertions(+), 47 deletions(-)
>>
>> Does this sufficiently resolve the issue you have?
>
> I wouldn't say it was my issue. It was more about asking what's the
> right thing to do.
> But anyway I have tested it with our ethernet driver and it is working fine.
>
> I have applied it on the top of u-boot-dm/next.
>
> Tested-by: Michal Simek <michal.simek@xilinx.com>

Applied to u-boot-net/next!
-Joe
diff mbox

Patch

diff --git a/drivers/net/bcm-sf2-eth.c b/drivers/net/bcm-sf2-eth.c
index 5252d49..9ae88d3 100644
--- a/drivers/net/bcm-sf2-eth.c
+++ b/drivers/net/bcm-sf2-eth.c
@@ -154,12 +154,6 @@  static int bcm_sf2_eth_open(struct eth_device *dev, bd_t *bt)
 
 	debug("Enabling BCM SF2 Ethernet.\n");
 
-	/* Set MAC address from env */
-	if (bcm_sf2_eth_write_hwaddr(dev) != 0) {
-		error("%s: MAC set error when opening !\n", __func__);
-		return -1;
-	}
-
 	eth->enable_mac();
 
 	/* enable tx and rx DMA */
diff --git a/drivers/net/designware.c b/drivers/net/designware.c
index cc01604..d35236b 100644
--- a/drivers/net/designware.c
+++ b/drivers/net/designware.c
@@ -244,10 +244,6 @@  static int dw_eth_init(struct eth_device *dev, bd_t *bis)
 		mdelay(100);
 	};
 
-	/* Soft reset above clears HW address registers.
-	 * So we have to set it here once again */
-	dw_write_hwaddr(dev);
-
 	rx_descs_init(dev);
 	tx_descs_init(dev);
 
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 170ff06..7d5b36b 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -525,7 +525,6 @@  static int macb_phy_init(struct macb_device *macb)
 	return 1;
 }
 
-static int macb_write_hwaddr(struct eth_device *dev);
 static int macb_init(struct eth_device *netdev, bd_t *bd)
 {
 	struct macb_device *macb = to_macb(netdev);
@@ -594,14 +593,6 @@  static int macb_init(struct eth_device *netdev, bd_t *bd)
 #endif /* CONFIG_RMII */
 	}
 
-	/* update the ethaddr */
-	if (is_valid_ether_addr(netdev->enetaddr)) {
-		macb_write_hwaddr(netdev);
-	} else {
-		printf("%s: mac address is not valid\n", netdev->name);
-		return -1;
-	}
-
 	if (!macb_phy_init(macb))
 		return -1;
 
diff --git a/net/eth.c b/net/eth.c
index 13b7723..ed2d52a 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -239,6 +239,31 @@  int eth_get_dev_index(void)
 	return -1;
 }
 
+static int eth_write_hwaddr(struct udevice *dev)
+{
+	struct eth_pdata *pdata = dev->platdata;
+	int ret = 0;
+
+	if (!dev || !device_active(dev))
+		return -EINVAL;
+
+	/* seq is valid since the device is active */
+	if (eth_get_ops(dev)->write_hwaddr && !eth_mac_skip(dev->seq)) {
+		if (!is_valid_ether_addr(pdata->enetaddr)) {
+			printf("\nError: %s address %pM illegal value\n",
+			       dev->name, pdata->enetaddr);
+			return -EINVAL;
+		}
+
+		ret = eth_get_ops(dev)->write_hwaddr(dev);
+		if (ret)
+			printf("\nWarning: %s failed to set MAC address\n",
+			       dev->name);
+	}
+
+	return ret;
+}
+
 int eth_init(void)
 {
 	struct udevice *current;
@@ -258,13 +283,22 @@  int eth_init(void)
 		if (device_active(current)) {
 			uchar env_enetaddr[6];
 			struct eth_pdata *pdata = current->platdata;
+			int enetaddr_changed = 0;
 
 			/* Sync environment with network device */
 			if (eth_getenv_enetaddr_by_index("eth", current->seq,
-							 env_enetaddr))
+							 env_enetaddr)) {
+				enetaddr_changed = memcmp(pdata->enetaddr,
+					env_enetaddr, 6);
 				memcpy(pdata->enetaddr, env_enetaddr, 6);
-			else
+			} else {
+				memset(env_enetaddr, 0, 6);
+				enetaddr_changed = memcmp(pdata->enetaddr,
+					env_enetaddr, 6);
 				memset(pdata->enetaddr, 0, 6);
+			}
+			if (enetaddr_changed)
+				eth_write_hwaddr(current);
 
 			ret = eth_get_ops(current)->start(current);
 			if (ret >= 0) {
@@ -356,31 +390,6 @@  int eth_rx(void)
 	return ret;
 }
 
-static int eth_write_hwaddr(struct udevice *dev)
-{
-	struct eth_pdata *pdata = dev->platdata;
-	int ret = 0;
-
-	if (!dev || !device_active(dev))
-		return -EINVAL;
-
-	/* seq is valid since the device is active */
-	if (eth_get_ops(dev)->write_hwaddr && !eth_mac_skip(dev->seq)) {
-		if (!is_valid_ether_addr(pdata->enetaddr)) {
-			printf("\nError: %s address %pM illegal value\n",
-			       dev->name, pdata->enetaddr);
-			return -EINVAL;
-		}
-
-		ret = eth_get_ops(dev)->write_hwaddr(dev);
-		if (ret)
-			printf("\nWarning: %s failed to set MAC address\n",
-			       dev->name);
-	}
-
-	return ret;
-}
-
 int eth_initialize(void)
 {
 	int num_devices = 0;
@@ -820,10 +829,21 @@  int eth_init(void)
 	dev = eth_devices;
 	do {
 		uchar env_enetaddr[6];
+		int enetaddr_changed = 0;
 
 		if (eth_getenv_enetaddr_by_index("eth", dev->index,
-						 env_enetaddr))
+						 env_enetaddr)) {
+			enetaddr_changed = memcmp(dev->enetaddr,
+				env_enetaddr, 6);
 			memcpy(dev->enetaddr, env_enetaddr, 6);
+		} else {
+			memset(env_enetaddr, 0, 6);
+			enetaddr_changed = memcmp(dev->enetaddr,
+				env_enetaddr, 6);
+			memset(dev->enetaddr, 0, 6);
+		}
+		if (enetaddr_changed)
+			eth_write_hwaddr(dev, "eth", dev->index);
 
 		dev = dev->next;
 	} while (dev != eth_devices);