ARM: rpi_b: query internal MAC address from firmware
The built-in SMSC 95xx chip doesn't know its own MAC address. Instead, we must query it from the VC firmware; it's probably encoded in fuses on the BCM2835. Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
This commit is contained in:
parent
72d5702c44
commit
4f80a06df3
|
@ -119,6 +119,20 @@ struct bcm2835_mbox_tag_hdr {
|
||||||
* };
|
* };
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define BCM2835_MBOX_TAG_GET_MAC_ADDRESS 0x00010003
|
||||||
|
|
||||||
|
struct bcm2835_mbox_tag_get_mac_address {
|
||||||
|
struct bcm2835_mbox_tag_hdr tag_hdr;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
} req;
|
||||||
|
struct {
|
||||||
|
u8 mac[6];
|
||||||
|
u8 pad[2];
|
||||||
|
} resp;
|
||||||
|
} body;
|
||||||
|
};
|
||||||
|
|
||||||
#define BCM2835_MBOX_TAG_GET_ARM_MEMORY 0x00010005
|
#define BCM2835_MBOX_TAG_GET_ARM_MEMORY 0x00010005
|
||||||
|
|
||||||
struct bcm2835_mbox_tag_get_arm_mem {
|
struct bcm2835_mbox_tag_get_arm_mem {
|
||||||
|
|
|
@ -31,6 +31,12 @@ struct msg_get_arm_mem {
|
||||||
u32 end_tag;
|
u32 end_tag;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct msg_get_mac_address {
|
||||||
|
struct bcm2835_mbox_hdr hdr;
|
||||||
|
struct bcm2835_mbox_tag_get_mac_address get_mac_address;
|
||||||
|
u32 end_tag;
|
||||||
|
};
|
||||||
|
|
||||||
struct msg_set_power_state {
|
struct msg_set_power_state {
|
||||||
struct bcm2835_mbox_hdr hdr;
|
struct bcm2835_mbox_hdr hdr;
|
||||||
struct bcm2835_mbox_tag_set_power_state set_power_state;
|
struct bcm2835_mbox_tag_set_power_state set_power_state;
|
||||||
|
@ -62,6 +68,29 @@ int dram_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int misc_init_r(void)
|
||||||
|
{
|
||||||
|
ALLOC_ALIGN_BUFFER(struct msg_get_mac_address, msg, 1, 16);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (getenv("usbethaddr"))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
BCM2835_MBOX_INIT_HDR(msg);
|
||||||
|
BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
|
||||||
|
|
||||||
|
ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
|
||||||
|
if (ret) {
|
||||||
|
printf("bcm2835: Could not query MAC address\n");
|
||||||
|
/* Ignore error; not critical */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
eth_setenv_enetaddr("usbethaddr", msg->get_mac_address.body.resp.mac);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int power_on_module(u32 module)
|
static int power_on_module(u32 module)
|
||||||
{
|
{
|
||||||
ALLOC_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1, 16);
|
ALLOC_ALIGN_BUFFER(struct msg_set_power_state, msg_pwr, 1, 16);
|
||||||
|
|
|
@ -182,6 +182,7 @@
|
||||||
#define CONFIG_USB_STORAGE
|
#define CONFIG_USB_STORAGE
|
||||||
#define CONFIG_USB_HOST_ETHER
|
#define CONFIG_USB_HOST_ETHER
|
||||||
#define CONFIG_USB_ETHER_SMSC95XX
|
#define CONFIG_USB_ETHER_SMSC95XX
|
||||||
|
#define CONFIG_MISC_INIT_R
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue