From e952eaa112417637d67f1774e641c1cade49ed23 Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
Date: Fri, 4 Jan 2013 14:47:57 +0000
Subject: bcm63xx: Add Huawei HG556a support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add Huawei EchoLife HG556a support.

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
[jogo@openwrt.org: added some code style fixes]
Signed-off-by: Jonas Gorski <jogo@openwrt.org>

SVN-Revision: 35011
---
 .../etc/hotplug.d/firmware/10-rt2x00-eeprom        |   5 +-
 .../brcm63xx/base-files/etc/uci-defaults/network   |   1 +
 target/linux/brcm63xx/base-files/lib/brcm63xx.sh   |   5 +
 target/linux/brcm63xx/image/Makefile               |  12 +
 .../brcm63xx/patches-3.6/554-board_hw556.patch     | 439 +++++++++++++++++++++
 .../801-ssb_export_fallback_sprom.patch            |   4 +-
 target/linux/brcm63xx/profiles/201-HW556.mk        |  17 +
 7 files changed, 480 insertions(+), 3 deletions(-)
 create mode 100644 target/linux/brcm63xx/patches-3.6/554-board_hw556.patch
 create mode 100644 target/linux/brcm63xx/profiles/201-HW556.mk

diff --git a/target/linux/brcm63xx/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom b/target/linux/brcm63xx/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
index c03ba4c6ec..eeb66e0d18 100644
--- a/target/linux/brcm63xx/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
+++ b/target/linux/brcm63xx/base-files/etc/hotplug.d/firmware/10-rt2x00-eeprom
@@ -29,8 +29,11 @@ rt2x00_eeprom_extract() {
 board=$board_name
 
 case "$FIRMWARE" in
-"RT3062.eeprom" )
+"rt2x00.eeprom" )
 	case $board in
+	HW556_A)
+		rt2x00_eeprom_extract "cal_data" 130560 272
+		;;
 	*)
 		rt2x00_eeprom_die "board $board is not supported yet"
 		;;
diff --git a/target/linux/brcm63xx/base-files/etc/uci-defaults/network b/target/linux/brcm63xx/base-files/etc/uci-defaults/network
index 00914b3e3f..08b8558006 100755
--- a/target/linux/brcm63xx/base-files/etc/uci-defaults/network
+++ b/target/linux/brcm63xx/base-files/etc/uci-defaults/network
@@ -27,6 +27,7 @@ CPVA642 |\
 CT536_CT5621 |\
 D-4P-W |\
 "F@ST2604" |\
+HW556* |\
 NB6 |\
 SPW303V |\
 SPW500V |\
diff --git a/target/linux/brcm63xx/base-files/lib/brcm63xx.sh b/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
index 18df042610..999f775171 100755
--- a/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
+++ b/target/linux/brcm63xx/base-files/lib/brcm63xx.sh
@@ -56,6 +56,11 @@ brcm63xx_detect() {
 		brcm63xx_has_reset_button="true"
 		ifname=eth1
 		;;
+	HW556*)
+		status_led="HW556:red:power"
+		brcm63xx_has_reset_button="true"
+		ifname=eth0
+		;;
 	96348GW-11)
 		status_led="power"
 		brcm63xx_has_reset_button="true"
diff --git a/target/linux/brcm63xx/image/Makefile b/target/linux/brcm63xx/image/Makefile
index 99dc8c5be3..5811cdba69 100755
--- a/target/linux/brcm63xx/image/Makefile
+++ b/target/linux/brcm63xx/image/Makefile
@@ -60,6 +60,15 @@ define Image/Build/CFEHW553
 		--block-size 0x20000 --image-offset $(4)
 endef
 
+define Image/Build/CFEHW556
+	# Generate the tagged image
+	$(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \
+	--output $(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin \
+	--boardid $(2) --chipid $(3) --entry $(LOADADDR) \
+	--load-addr $(LOADADDR) --tag-version 8 --rsa-signature "$(5)" \
+	--image-offset $(4) --info1 "$(6)" --block-size 0x20000
+endef
+
 define Image/Build/CFEAGPF
 	# Generate the tagged image
 	$(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \
@@ -258,6 +267,9 @@ define Image/Build
 	#HW553
 	$(call Image/Build/CFEHW553,$(1),HW553,6358,0x20000,HW553)
 
+	#HW556
+	$(call Image/Build/CFEHW556,$(1),HW556,6358,0x20000,EchoLife_HG556a,OpenWRT-$(REVISION))
+
 	# T-Com Speedport W 303V Typ B
 	$(call Image/Build/SPW303V,$(1),96358-502V,6358,SPW303V)
 endef
diff --git a/target/linux/brcm63xx/patches-3.6/554-board_hw556.patch b/target/linux/brcm63xx/patches-3.6/554-board_hw556.patch
new file mode 100644
index 0000000000..3d07ca144f
--- /dev/null
+++ b/target/linux/brcm63xx/patches-3.6/554-board_hw556.patch
@@ -0,0 +1,439 @@
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -2923,6 +2923,366 @@ static struct board_info __initdata boar
+ 	},
+ };
+ 
++static struct board_info __initdata board_HW556 = {
++	.name					= "HW556",
++	.expected_cpu_id			= 0x6358,
++
++	.has_uart0				= 1,
++	.has_pci				= 1,
++	.has_ohci0				= 1,
++	.has_ehci0				= 1,
++
++	.has_caldata				= 1,
++	.caldata = {
++		{
++			.caldata_offset		= 0xe00000,
++		},
++	},
++
++	.has_enet1				= 1,
++	.enet1 = {
++		.force_speed_100		= 1,
++		.force_duplex_full		= 1,
++	},
++
++	.leds = {
++		{
++			.name			= "HW556:red:message",
++			.gpio			= 0,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:hspa",
++			.gpio			= 1,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:dsl",
++			.gpio			= 2,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:power",
++			.gpio			= 3,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++		{
++			.name			= "HW556:red:all",
++			.gpio			= 6,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++	},
++
++	.buttons = {
++		{
++			.desc			= "help",
++			.gpio			= 8,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_HELP,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "wlan",
++			.gpio			= 9,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_WLAN,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "restart",
++			.gpio			= 10,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_RESTART,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "reset",
++			.gpio			= 11,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_CONFIG,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++	},
++};
++static struct board_info __initdata board_HW556_A = {
++	.name					= "HW556_A",
++	.expected_cpu_id			= 0x6358,
++
++	.has_uart0				= 1,
++	.has_pci				= 1,
++	.has_ohci0				= 1,
++	.has_ehci0				= 1,
++
++	.has_caldata				= 1,
++	.caldata = {
++		{
++			.vendor			= PCI_VENDOR_ID_RALINK,
++			.caldata_offset		= 0xeffe00,
++			.slot			= 1,
++			.eeprom			= "rt2x00.eeprom",
++		},
++	},
++
++	.has_enet1				= 1,
++	.enet1 = {
++		.force_speed_100		= 1,
++		.force_duplex_full		= 1,
++	},
++
++	.leds = {
++		{
++			.name			= "HW556:red:message",
++			.gpio			= 0,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:hspa",
++			.gpio			= 1,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:dsl",
++			.gpio			= 2,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:power",
++			.gpio			= 3,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++		{
++			.name			= "HW556:red:all",
++			.gpio			= 6,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++	},
++
++	.buttons = {
++		{
++			.desc			= "help",
++			.gpio			= 8,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_HELP,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "wlan",
++			.gpio			= 9,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_WLAN,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "restart",
++			.gpio			= 10,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_RESTART,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "reset",
++			.gpio			= 11,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_CONFIG,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++	},
++};
++static struct board_info __initdata board_HW556_B = {
++	.name					= "HW556_B",
++	.expected_cpu_id			= 0x6358,
++
++	.has_uart0				= 1,
++	.has_pci				= 1,
++	.has_ohci0				= 1,
++	.has_ehci0				= 1,
++
++	.has_caldata				= 1,
++	.caldata = {
++		{
++			.vendor			= PCI_VENDOR_ID_ATHEROS,
++			.caldata_offset		= 0xf7e000,
++			.slot			= 1,
++			.endian_check		= 1,
++			.led_pin		= 2,
++		},
++	},
++
++	.has_enet1				= 1,
++	.enet1 = {
++		.force_speed_100		= 1,
++		.force_duplex_full		= 1,
++	},
++
++	.leds = {
++		{
++			.name			= "HW556:red:message",
++			.gpio			= 0,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:hspa",
++			.gpio			= 1,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:dsl",
++			.gpio			= 2,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:power",
++			.gpio			= 3,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++		{
++			.name			= "HW556:red:all",
++			.gpio			= 6,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++	},
++
++	.buttons = {
++		{
++			.desc			= "help",
++			.gpio			= 8,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_HELP,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "wlan",
++			.gpio			= 9,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_WLAN,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "restart",
++			.gpio			= 10,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_RESTART,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "reset",
++			.gpio			= 11,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_CONFIG,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++	},
++};
++static struct board_info __initdata board_HW556_C = {
++	.name					= "HW556_C",
++	.expected_cpu_id			= 0x6358,
++
++	.has_uart0				= 1,
++	.has_pci				= 1,
++	.has_ohci0				= 1,
++	.has_ehci0				= 1,
++
++	.has_caldata				= 1,
++	.caldata = {
++		{
++			.vendor			= PCI_VENDOR_ID_ATHEROS,
++			.caldata_offset		= 0xefe000,
++			.slot			= 1,
++			.endian_check		= 1,
++			.led_pin		= 2,
++		},
++	},
++
++	.has_enet1				= 1,
++	.enet1 = {
++		.force_speed_100		= 1,
++		.force_duplex_full		= 1,
++	},
++
++	.leds = {
++		{
++			.name			= "HW556:red:message",
++			.gpio			= 0,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:hspa",
++			.gpio			= 1,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:dsl",
++			.gpio			= 2,
++			.active_low		= 1,
++		},
++		{
++			.name			= "HW556:red:power",
++			.gpio			= 3,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++		{
++			.name			= "HW556:red:all",
++			.gpio			= 6,
++			.active_low		= 1,
++			.default_trigger	= "default-on",
++		},
++	},
++
++	.buttons = {
++		{
++			.desc			= "help",
++			.gpio			= 8,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_HELP,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "wlan",
++			.gpio			= 9,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_WLAN,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "restart",
++			.gpio			= 10,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_RESTART,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++		{
++			.desc			= "reset",
++			.gpio			= 11,
++			.active_low		= 1,
++			.type			= EV_KEY,
++			.code			= KEY_CONFIG,
++			.debounce_interval	= BCM963XX_KEYS_DEBOUNCE_INTERVAL,
++		},
++	},
++};
++
+  /* T-Home Speedport W 303V Typ B */
+ static struct board_info __initdata board_spw303v = {
+ 	.name			= "96358-502V",
+@@ -3349,6 +3709,10 @@ static const struct board_info __initdat
+ 	&board_nb4_fxc_r2,
+ 	&board_ct6373_1,
+ 	&board_HW553,
++	&board_HW556,
++	&board_HW556_A,
++	&board_HW556_B,
++	&board_HW556_C,
+ 	&board_spw303v,
+ 	&board_DVAG3810BN,
+ #endif
+@@ -3414,13 +3778,37 @@ static void __init boardid_fixup(u8 *boo
+ 	struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
+ 	char *board_name = (char *)bcm63xx_nvram_get_name();
+ 
+-	if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
+-		u8 *p = boot_addr + NB4_PID_OFFSET;
+-
+-		/* Extract nb4 PID */
+-		if (!memcmp(p, "NB4-", 4)) {
+-			memcpy(board_name, p, sizeof("NB4-XXX-rX"));
+-			return;
++	if (BCMCPU_IS_6358()) {
++		if (!strcmp(board_name, "96358VW")) {
++			u8 *p = boot_addr + NB4_PID_OFFSET;
++
++			/* Extract nb4 PID */
++			if (!memcmp(p, "NB4-", 4)) {
++				memcpy(board_name, p, sizeof("NB4-XXX-rX"));
++				return;
++			}
++		} else if (!strcmp(board_name, "HW556")) {
++			/*
++			 * HW556 has different wlan caldatas depending on
++			 * hardware version.
++			 * Detect hardware version and change board id
++			 */
++			u8 cal_data_ath9k[4] = { 0xa5, 0x5a, 0, 0 };
++			u8 cal_data_rt3062[4] = { 0x62, 0x30, 1, 0 };
++
++			if (!memcmp(boot_addr + 0xeffe00,
++				    &cal_data_rt3062, 4)) {
++				/* Ralink 0xeffe00 */
++				memcpy(board_name, "HW556_A", 7);
++			} else if (!memcmp(boot_addr + 0xf7e000,
++					   &cal_data_ath9k, 4)) {
++				/* Atheros 0xf7e000 */
++				memcpy(board_name, "HW556_B", 7);
++			} else if (!memcmp(boot_addr + 0xefe000,
++					   &cal_data_ath9k, 4)) {
++				/* Atheros 0xefe000 */
++				memcpy(board_name, "HW556_C", 7);
++			}
+ 		}
+ 	}
+ 
+--- a/drivers/mtd/bcm63xxpart.c
++++ b/drivers/mtd/bcm63xxpart.c
+@@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
+ 			      BCM63XX_CFE_BLOCK_SIZE);
+ 
+ 	cfelen = cfe_erasesize;
++
++	/* Fix HW556 MX29LV128DB */
++	if (!strncmp(bcm63xx_nvram_get_name(), "HW556", 5))
++		cfelen = 0x20000;
++
+ 	nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
+ 	nvramlen = roundup(nvramlen, cfe_erasesize);
+ 	nvramaddr = master->size - nvramlen;
diff --git a/target/linux/brcm63xx/patches-3.6/801-ssb_export_fallback_sprom.patch b/target/linux/brcm63xx/patches-3.6/801-ssb_export_fallback_sprom.patch
index c517fb46f2..7f3275d858 100644
--- a/target/linux/brcm63xx/patches-3.6/801-ssb_export_fallback_sprom.patch
+++ b/target/linux/brcm63xx/patches-3.6/801-ssb_export_fallback_sprom.patch
@@ -8,7 +8,7 @@
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_gpio.h>
  #include <linux/spi/74x164.h>
-@@ -3368,7 +3369,7 @@ static const struct board_info __initdat
+@@ -3732,7 +3733,7 @@ static const struct board_info __initdat
   * bcm4318 WLAN work
   */
  #ifdef CONFIG_SSB_PCIHOST
@@ -17,7 +17,7 @@
  	.revision		= 0x02,
  	.board_rev		= 0x17,
  	.country_code		= 0x0,
-@@ -3388,6 +3389,7 @@ static struct ssb_sprom bcm63xx_sprom =
+@@ -3752,6 +3753,7 @@ static struct ssb_sprom bcm63xx_sprom =
  	.boardflags_lo		= 0x2848,
  	.boardflags_hi		= 0x0000,
  };
diff --git a/target/linux/brcm63xx/profiles/201-HW556.mk b/target/linux/brcm63xx/profiles/201-HW556.mk
new file mode 100644
index 0000000000..68861b3ef2
--- /dev/null
+++ b/target/linux/brcm63xx/profiles/201-HW556.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2012 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+define Profile/HW556
+  NAME:=HW556 WiFi
+  PACKAGES:=kmod-rt2800-pci kmod-ath9k wpad-mini
+endef
+
+define Profile/HW556/Description
+	Package set compatible with hardware using Atheros or Ralink WiFi cards (Huawei HG556a)
+endef
+$(eval $(call Profile,HW556))
+
-- 
cgit v1.2.3