Exemplo n.º 1
0
int __init routerboot_present(void)
{
	struct rb_bios_settings	*bs;
	u8 *base;
	u32 off, len;

	if (rb_found)
		goto out;

	base = (u8 *)KSEG1ADDR(ADM5120_SRAM0_BASE);
	bs = (struct rb_bios_settings *)(base + RB_BS_OFFS);

	off = prom_read_le32(&bs->hs_offs);
	len = prom_read_le32(&bs->hs_size);
	if (off > RB_OFFS_MAX)
		goto out;

	if (routerboot_load_hs(base+off, len) != 0)
		goto out;

	rb_found = 1;

out:
	return rb_found;
}
Exemplo n.º 2
0
static int __init routerboot_load_hs(u8 *buf, u16 buflen)
{
	u16 id, len;

	memset(&rb_hs, 0, sizeof(rb_hs));

	if (buflen < 4)
		return -1;

	if (prom_read_le32(buf) != RB_MAGIC_HARD)
		return -1;

	/* skip magic value */
	buf += 4;
	buflen -= 4;

	while (buflen > 2) {
		id = prom_read_le16(buf);
		buf += 2;
		buflen -= 2;
		if (id == RB_ID_TERMINATOR || buflen < 2)
			break;

		len = prom_read_le16(buf);
		buf += 2;
		buflen -= 2;

		if (buflen < len)
			break;

		switch (id) {
		case RB_ID_BIOS_VERSION:
			rb_hs.bios_ver = (char *)buf;
			break;
		case RB_ID_BOARD_NAME:
			rb_hs.name = (char *)buf;
			break;
		case RB_ID_MEMORY_SIZE:
			rb_hs.mem_size = prom_read_le32(buf);
			break;
		case RB_ID_MAC_ADDRESS_COUNT:
			rb_hs.mac_count = prom_read_le32(buf);
			break;
		case RB_ID_MAC_ADDRESS_PACK:
			if ((len / RB_MAC_SIZE) > 0)
				rb_hs.mac_base = buf;
			break;
		}

		buf += len;
		buflen -= len;

	}

	return 0;
}
Exemplo n.º 3
0
int __init admboot_get_mac_base(u32 offset, u32 len, u8 *mac)
{
	u8 *cfg;
	int i;

	cfg = (u8 *) KSEG1ADDR(ADM5120_SRAM0_BASE + offset);
	for (i = 0; i < len; i += 4) {
		u32 magic;

		magic = prom_read_le32(cfg + i);
		if (magic == ADMBOOT_MAGIC_MAC_BASE) {
			int j;

			for (j = 0; j < 6; j++)
				mac[j] = cfg[i + 4 + j];

			return 0;
		}
		if (magic == ADMBOOT_MAGIC_MAC_BASE_BR6104XX) {
			int j;

			for (j = 0; j < 6; j++)
				mac[j] = cfg[i + 7 + j];

			return 0;
		}
	}

	return -ENXIO;
}