diff --git a/include/net.h b/include/net.h
index b9c13f282cd347df2e2346f2c32267e90a5a64d4..d09bec9de1560e8c2443269fb2045f95ea84e7f7 100644
--- a/include/net.h
+++ b/include/net.h
@@ -119,7 +119,9 @@ enum eth_recv_flags {
  * mcast: Join or leave a multicast group (for TFTP) - optional
  * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
  *		 on some platforms like ARM). This function expects the
- *		 eth_pdata::enetaddr field to be populated - optional
+ *		 eth_pdata::enetaddr field to be populated. The method can
+ *		 return -ENOSYS to indicate that this is not implemented for
+		 this hardware - optional.
  * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
  *		    ROM on the board. This is how the driver should expose it
  *		    to the network stack. This function should fill in the
diff --git a/net/eth.c b/net/eth.c
index 72ce91c9d0bbb546c7d8b50098b161ca8cf124ea..d3ec8d64d596d3a8e51336617b8de0032c87812b 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -287,7 +287,13 @@ static int eth_write_hwaddr(struct udevice *dev)
 			return -EINVAL;
 		}
 
+		/*
+		 * Drivers are allowed to decide not to implement this at
+		 * run-time. E.g. Some devices may use it and some may not.
+		 */
 		ret = eth_get_ops(dev)->write_hwaddr(dev);
+		if (ret == -ENOSYS)
+			ret = 0;
 		if (ret)
 			printf("\nWarning: %s failed to set MAC address\n",
 			       dev->name);