static void board_init_enetaddr(uchar *mac_addr) { bool valid_mac = false; /* the MAC is stored in OTP memory page 0xDF */ uint32_t ret; uint64_t otp_mac; ret = bfrom_OtpRead(0xDF, OTP_LOWER_HALF, &otp_mac); if (!(ret & OTP_MASTER_ERROR)) { uchar *otp_mac_p = (uchar *)&otp_mac; for (ret = 0; ret < 6; ++ret) mac_addr[ret] = otp_mac_p[5 - ret]; if (is_valid_ether_addr(mac_addr)) valid_mac = true; } if (!valid_mac) { puts("Warning: Generating 'random' MAC address\n"); bfin_gen_rand_mac(mac_addr); } eth_setenv_enetaddr("ethaddr", mac_addr); }
static void board_init_enetaddr(uchar *mac_addr) { /* the MAC is stored in OTP memory page 0xDF */ uint32_t ret; uint64_t otp_mac; ret = bfrom_OtpRead(0xDF, OTP_LOWER_HALF, &otp_mac); if (!(ret & OTP_MASTER_ERROR)) { uchar *otp_mac_p = (uchar *)&otp_mac; for (ret = 0; ret < 6; ++ret) mac_addr[ret] = otp_mac_p[5 - ret]; if (is_valid_ethaddr(mac_addr)) eth_setenv_enetaddr("ethaddr", mac_addr); } }
/** * bfin_otp_read - Read OTP pages * * All reads must be in half page chunks (half page == 64 bits). */ static ssize_t bfin_otp_read(struct file *file, char __user *buff, size_t count, loff_t *pos) { ssize_t bytes_done; u32 page, flags, ret; u64 content; stampit(); if (count % sizeof(u64)) return -EMSGSIZE; if (mutex_lock_interruptible(&bfin_otp_lock)) return -ERESTARTSYS; bytes_done = 0; page = *pos / (sizeof(u64) * 2); while (bytes_done < count) { flags = (*pos % (sizeof(u64) * 2) ? OTP_UPPER_HALF : OTP_LOWER_HALF); stamp("processing page %i (0x%x:%s)", page, flags, (flags & OTP_UPPER_HALF ? "upper" : "lower")); ret = bfrom_OtpRead(page, flags, &content); if (ret & OTP_MASTER_ERROR) { stamp("error from otp: 0x%x", ret); bytes_done = -EIO; break; } if (copy_to_user(buff + bytes_done, &content, sizeof(content))) { bytes_done = -EFAULT; break; } if (flags & OTP_UPPER_HALF) ++page; bytes_done += sizeof(content); *pos += sizeof(content); } mutex_unlock(&bfin_otp_lock); return bytes_done; }