diff mbox

net: usb: asix: allow optionally getting mac address from device tree

Message ID 20180625080108.32441-1-marcel@ziswiler.com (mailing list archive)
State New, archived
Headers show

Commit Message

Marcel Ziswiler June 25, 2018, 8:01 a.m. UTC
From: Marcel Ziswiler <marcel.ziswiler@toradex.com>

For Embedded use where e.g. AX88772B chips may be used without external
EEPROMs the boot loader may choose to pass the MAC address to be used
via device tree. Therefore, allow for optionally getting the MAC
address from device tree data e.g. as follows (excerpt from a T30 based
board, local-mac-address to be filled in by boot loader):

/* EHCI instance 1: USB2_DP/N -> AX88772B */
usb@7d004000 {
	status = "okay";
	#address-cells = <1>;
	#size-cells = <0>;
	asix@1 {
		reg = <1>;
		local-mac-address = [00 00 00 00 00 00];
	};
};

Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>

---

 drivers/net/usb/asix.h         |  1 +
 drivers/net/usb/asix_devices.c | 39 ++++++++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 15 deletions(-)

Comments

Marcel Ziswiler June 25, 2018, 11:26 a.m. UTC | #1
SGkgRGF2aWQNCg0KT24gTW9uLCAyMDE4LTA2LTI1IGF0IDEwOjAxICswMjAwLCBNYXJjZWwgWmlz
d2lsZXIgd3JvdGU6DQo+IEZyb206IE1hcmNlbCBaaXN3aWxlciA8bWFyY2VsLnppc3dpbGVyQHRv
cmFkZXguY29tPg0KPiANCj4gRm9yIEVtYmVkZGVkIHVzZSB3aGVyZSBlLmcuIEFYODg3NzJCIGNo
aXBzIG1heSBiZSB1c2VkIHdpdGhvdXQNCj4gZXh0ZXJuYWwNCj4gRUVQUk9NcyB0aGUgYm9vdCBs
b2FkZXIgbWF5IGNob29zZSB0byBwYXNzIHRoZSBNQUMgYWRkcmVzcyB0byBiZSB1c2VkDQo+IHZp
YSBkZXZpY2UgdHJlZS4gVGhlcmVmb3JlLCBhbGxvdyBmb3Igb3B0aW9uYWxseSBnZXR0aW5nIHRo
ZSBNQUMNCj4gYWRkcmVzcyBmcm9tIGRldmljZSB0cmVlIGRhdGEgZS5nLiBhcyBmb2xsb3dzIChl
eGNlcnB0IGZyb20gYSBUMzANCj4gYmFzZWQNCj4gYm9hcmQsIGxvY2FsLW1hYy1hZGRyZXNzIHRv
IGJlIGZpbGxlZCBpbiBieSBib290IGxvYWRlcik6DQo+IA0KPiAvKiBFSENJIGluc3RhbmNlIDE6
IFVTQjJfRFAvTiAtPiBBWDg4NzcyQiAqLw0KPiB1c2JAN2QwMDQwMDAgew0KPiAJc3RhdHVzID0g
Im9rYXkiOw0KPiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47DQo+IAkjc2l6ZS1jZWxscyA9IDwwPjsN
Cj4gCWFzaXhAMSB7DQo+IAkJcmVnID0gPDE+Ow0KPiAJCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAw
IDAwIDAwIDAwIDAwIDAwXTsNCj4gCX07DQo+IH07DQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBNYXJj
ZWwgWmlzd2lsZXIgPG1hcmNlbC56aXN3aWxlckB0b3JhZGV4LmNvbT4NCj4gDQo+IC0tLQ0KPiAN
Cj4gIGRyaXZlcnMvbmV0L3VzYi9hc2l4LmggICAgICAgICB8ICAxICsNCj4gIGRyaXZlcnMvbmV0
L3VzYi9hc2l4X2RldmljZXMuYyB8IDM5ICsrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLQ0K
PiAtLS0tLS0tLS0NCj4gIDIgZmlsZXMgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMTUgZGVs
ZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXguaCBiL2Ry
aXZlcnMvbmV0L3VzYi9hc2l4LmgNCj4gaW5kZXggOWE0MTcxYjkwOTQ3Li5jODE2MTk2MGNlZjIg
MTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmgNCj4gKysrIGIvZHJpdmVycy9u
ZXQvdXNiL2FzaXguaA0KPiBAQCAtMzcsNiArMzcsNyBAQA0KPiAgI2luY2x1ZGUgPGxpbnV4L3Vz
Yi91c2JuZXQuaD4NCj4gICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+ICAjaW5jbHVkZSA8bGlu
dXgvaWZfdmxhbi5oPg0KPiArI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPg0KPiAgDQo+ICAjZGVm
aW5lIERSSVZFUl9WRVJTSU9OICIyMi1EZWMtMjAxMSINCj4gICNkZWZpbmUgRFJJVkVSX05BTUUg
ImFzaXgiDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMNCj4g
Yi9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMNCj4gaW5kZXggM2Q0Zjc5NTlkYWJiLi5h
ODhkNjVkZmM2NGMgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMu
Yw0KPiArKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMNCj4gQEAgLTY5MCwyNSAr
NjkwLDM0IEBAIHN0YXRpYyBpbnQgYXg4ODc3Ml9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwNCj4g
c3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpDQo+ICAJdTggYnVmW0VUSF9BTEVOXSwgY2hpcGNv
ZGUgPSAwOw0KPiAgCXUzMiBwaHlpZDsNCj4gIAlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAq
cHJpdjsNCj4gKwljb25zdCB1OCAqbWFjX2FkZHI7DQo+ICANCj4gLQl1c2JuZXRfZ2V0X2VuZHBv
aW50cyhkZXYsaW50Zik7DQo+ICsJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LCBpbnRmKTsNCj4g
IA0KPiAtCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8NCj4gLQlpZiAoZGV2LT5kcml2ZXJfaW5m
by0+ZGF0YSAmIEZMQUdfRUVQUk9NX01BQykgew0KPiAtCQlmb3IgKGkgPSAwOyBpIDwgKEVUSF9B
TEVOID4+IDEpOyBpKyspIHsNCj4gLQkJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURf
UkVBRF9FRVBST00sDQo+IDB4MDQgKyBpLA0KPiAtCQkJCQkgICAgMCwgMiwgYnVmICsgaSAqIDIs
IDApOw0KPiAtCQkJaWYgKHJldCA8IDApDQo+IC0JCQkJYnJlYWs7DQo+IC0JCX0NCj4gKwkvKiBN
YXliZSB0aGUgYm9vdCBsb2FkZXIgcGFzc2VkIHRoZSBNQUMgYWRkcmVzcyB2aWEgZGV2aWNlDQo+
IHRyZWUgKi8NCj4gKwltYWNfYWRkciA9IG9mX2dldF9tYWNfYWRkcmVzcyhkZXYtPnVkZXYtPmRl
di5vZl9ub2RlKTsNCj4gKwlpZiAobWFjX2FkZHIpIHsNCj4gKwkJbWVtY3B5KGJ1ZiwgbWFjX2Fk
ZHIsIEVUSF9BTEVOKTsNCj4gIAl9IGVsc2Ugew0KPiAtCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRl
diwgQVhfQ01EX1JFQURfTk9ERV9JRCwNCj4gLQkJCQkwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsN
Cj4gLQl9DQo+ICsJCS8qIFRyeSBnZXR0aW5nIHRoZSBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAq
Lw0KPiArCQlpZiAoZGV2LT5kcml2ZXJfaW5mby0+ZGF0YSAmIEZMQUdfRUVQUk9NX01BQykgew0K
PiArCQkJZm9yIChpID0gMDsgaSA8IChFVEhfQUxFTiA+PiAxKTsgaSsrKSB7DQo+ICsJCQkJcmV0
ID0gYXNpeF9yZWFkX2NtZChkZXYsDQo+IEFYX0NNRF9SRUFEX0VFUFJPTSwNCj4gKwkJCQkJCSAg
ICAweDA0ICsgaSwgMCwgMiwNCj4gYnVmICsgaSAqIDIsDQo+ICsJCQkJCQkgICAgMCk7DQo+ICsJ
CQkJaWYgKHJldCA8IDApDQo+ICsJCQkJCWJyZWFrOw0KPiArCQkJfQ0KPiArCQl9IGVsc2Ugew0K
PiArCQkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsDQo+IEFYX0NNRF9SRUFEX05PREVfSUQsDQo+
ICsJCQkJCSAgICAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsNCj4gKwkJfQ0KPiAgDQo+IC0JaWYg
KHJldCA8IDApIHsNCj4gLQkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIkZhaWxlZCB0byByZWFkIE1B
QyBhZGRyZXNzOg0KPiAlZFxuIiwgcmV0KTsNCj4gLQkJcmV0dXJuIHJldDsNCj4gKwkJaWYgKHJl
dCA8IDApIHsNCj4gKwkJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCBNQUMN
Cj4gYWRkcmVzczogJWRcbiIsDQo+ICsJCQkJICAgcmV0KTsNCj4gKwkJCXJldHVybiByZXQ7DQo+
ICsJCX0NCj4gIAl9DQo+ICANCj4gIAlhc2l4X3NldF9uZXRkZXZfZGV2X2FkZHIoZGV2LCBidWYp
Ow0KDQpOb3cgdGhhdCB5b3UgbWVudGlvbmVkIGV0aF9wbGF0Zm9ybV9nZXRfbWFjX2FkZHJlc3Mo
KSBvbiBteSBpZ2IgYXR0ZW1wdCBJIGFtDQp3b25kZXJpbmcgd2hldGhlciB0aGF0IHdvdWxkIG5v
dCBhbHNvIGJlIHRoZSBiZXR0ZXIgYXBwcm9hY2ggZm9yIEFTSVggVVNCIG5ldA0KdXNlLiBMb29r
cyBsaWtlIGF0IGxlYXN0IGxhbjc4eHggYWxyZWFkeSBkb2VzIGl0IHRoYXQgd2F5IGFzIHdlbGwu
DQoNCldoYXQgZG8geW91IHRoaW5rPw0KDQpDaGVlcnMNCg0KTWFyY2Vs
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Lunn June 25, 2018, 3:28 p.m. UTC | #2
> Now that you mentioned eth_platform_get_mac_address() on my igb attempt I am
> wondering whether that would not also be the better approach for ASIX USB net
> use. Looks like at least lan78xx already does it that way as well.
> 
> What do you think?

Hi Marcel

eth_platform_get_mac_address() is preferred, since it will try DT,
ACPI, and anything else the platform supports.

      Andrew
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/usb/asix.h b/drivers/net/usb/asix.h
index 9a4171b90947..c8161960cef2 100644
--- a/drivers/net/usb/asix.h
+++ b/drivers/net/usb/asix.h
@@ -37,6 +37,7 @@ 
 #include <linux/usb/usbnet.h>
 #include <linux/slab.h>
 #include <linux/if_vlan.h>
+#include <linux/of_net.h>
 
 #define DRIVER_VERSION "22-Dec-2011"
 #define DRIVER_NAME "asix"
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
index 3d4f7959dabb..a88d65dfc64c 100644
--- a/drivers/net/usb/asix_devices.c
+++ b/drivers/net/usb/asix_devices.c
@@ -690,25 +690,34 @@  static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 	u8 buf[ETH_ALEN], chipcode = 0;
 	u32 phyid;
 	struct asix_common_private *priv;
+	const u8 *mac_addr;
 
-	usbnet_get_endpoints(dev,intf);
+	usbnet_get_endpoints(dev, intf);
 
-	/* Get the MAC address */
-	if (dev->driver_info->data & FLAG_EEPROM_MAC) {
-		for (i = 0; i < (ETH_ALEN >> 1); i++) {
-			ret = asix_read_cmd(dev, AX_CMD_READ_EEPROM, 0x04 + i,
-					    0, 2, buf + i * 2, 0);
-			if (ret < 0)
-				break;
-		}
+	/* Maybe the boot loader passed the MAC address via device tree */
+	mac_addr = of_get_mac_address(dev->udev->dev.of_node);
+	if (mac_addr) {
+		memcpy(buf, mac_addr, ETH_ALEN);
 	} else {
-		ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID,
-				0, 0, ETH_ALEN, buf, 0);
-	}
+		/* Try getting the MAC address from EEPROM */
+		if (dev->driver_info->data & FLAG_EEPROM_MAC) {
+			for (i = 0; i < (ETH_ALEN >> 1); i++) {
+				ret = asix_read_cmd(dev, AX_CMD_READ_EEPROM,
+						    0x04 + i, 0, 2, buf + i * 2,
+						    0);
+				if (ret < 0)
+					break;
+			}
+		} else {
+			ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID,
+					    0, 0, ETH_ALEN, buf, 0);
+		}
 
-	if (ret < 0) {
-		netdev_dbg(dev->net, "Failed to read MAC address: %d\n", ret);
-		return ret;
+		if (ret < 0) {
+			netdev_dbg(dev->net, "Failed to read MAC address: %d\n",
+				   ret);
+			return ret;
+		}
 	}
 
 	asix_set_netdev_dev_addr(dev, buf);