Ticket #10741: bcm63xx_hg556a.2.patch

File bcm63xx_hg556a.2.patch, 13.2 KB (added by danitool <dgcbueu@…>, 6 years ago)
  • new file target/linux/brcm63xx/base-files/etc/defconfig/HW556/network

    - +  
     1# Copyright (C) 2012 OpenWrt.org 
     2 
     3config interface loopback 
     4        option ifname   lo 
     5        option proto    static 
     6        option ipaddr   127.0.0.1 
     7        option netmask  255.0.0.0 
     8 
     9config interface lan 
     10        option ifname   eth0 
     11        option type     bridge 
     12        option proto    static 
     13        option ipaddr   192.168.1.1 
     14        option netmask  255.255.255.0 
  • target/linux/brcm63xx/image/Makefile

     
    6060                --block-size 0x20000 --image-offset $(4) 
    6161endef 
    6262 
     63define Image/Build/CFEHW556 
     64        # Generate the tagged image 
     65        $(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \ 
     66                --output $(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin \ 
     67                --boardid $(2) --chipid $(3) --entry $(LOADADDR) \ 
     68                --load-addr $(LOADADDR) --tag-version 8 --rsa-signature "$(5)" \ 
     69                --image-offset $(4) --info1 "$(6)" --block-size 0x20000 
     70endef 
     71 
    6372define Image/Build/CFEAGPF 
    6473        # Generate the tagged image 
    6574        $(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \ 
     
    236245        #HW553 
    237246        $(call Image/Build/CFEHW553,$(1),HW553,6358,0x20000,HW553) 
    238247 
     248        #HW556 
     249        $(call Image/Build/CFEHW556,$(1),HW556,6358,0x20000,EchoLife_HG556a,OpenWRT-$(REVISION)) 
     250 
    239251        # T-Com Speedport W 303V Typ B 
    240252        $(call Image/Build/SPW303V,$(1),96358-502V,6358,SPW303V) 
    241253endef 
  • new file target/linux/brcm63xx/patches-3.0/hg556a_kernel.patch

    - +  
     1--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c 
     2+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c 
     3@@ -20,6 +20,8 @@ 
     4 #include <linux/spi/spi.h> 
     5 #include <linux/spi/spi_gpio.h> 
     6 #include <linux/spi/74x164.h> 
     7+#include <linux/pci.h> 
     8+#include <linux/ath9k_platform.h> 
     9 #include <asm/addrspace.h> 
     10 #include <bcm63xx_board.h> 
     11 #include <bcm63xx_cpu.h> 
     12@@ -35,6 +37,7 @@ 
     13 #include <bcm63xx_dev_spi.h> 
     14 #include <board_bcm963xx.h> 
     15 #include <bcm_tag.h> 
     16+#include <pci-ath9k-fixup.h> 
     17  
     18 #define PFX    "board_bcm963xx: " 
     19  
     20@@ -2071,6 +2074,90 @@ 
     21        }, 
     22 }; 
     23  
     24+static struct board_info __initdata board_HW556 = { 
     25+       .name                           = "HW556", 
     26+       .expected_cpu_id                = 0x6358, 
     27+ 
     28+       .has_uart0                      = 1, 
     29+ 
     30+       .has_enet1                      = 1, 
     31+       .has_pci                        = 1, 
     32+ 
     33+       .enet1 = { 
     34+               .force_speed_100        = 1, 
     35+               .force_duplex_full      = 1, 
     36+       }, 
     37+ 
     38+       .has_ohci0 = 1, 
     39+       .has_ehci0 = 1, 
     40+ 
     41+       //TODO Si3050 DAA rstGpioPin=25, rlyGpioPin=14  
     42+ 
     43+       .leds = { 
     44+               { 
     45+                       .name           = "message", 
     46+                       .gpio           = 0, 
     47+                       .active_low     = 1, 
     48+               }, 
     49+               { 
     50+                       .name           = "hspa", 
     51+                       .gpio           = 1, 
     52+                       .active_low     = 1, 
     53+               }, 
     54+               { 
     55+                       .name           = "dsl", 
     56+                       .gpio           = 2, 
     57+                       .active_low     = 1, 
     58+               }, 
     59+               { 
     60+                       .name           = "power", 
     61+                       .gpio           = 3, 
     62+                       .active_low     = 1, 
     63+                       .default_trigger = "default-on", 
     64+               }, 
     65+               { 
     66+                       .name           = "all_leds", 
     67+                       .gpio           = 6, 
     68+                       .active_low     = 1, 
     69+                       .default_trigger = "default-on", 
     70+               }, 
     71+       }, 
     72+       .buttons = { 
     73+               { 
     74+                       .desc           = "diagnostic", 
     75+                       .gpio           = 8, 
     76+                       .active_low     = 1, 
     77+                       .type           = EV_KEY, 
     78+                       .code           = BTN_0, 
     79+                       .threshold      = 3, 
     80+               }, 
     81+               { 
     82+                       .desc           = "wifi", 
     83+                       .gpio           = 9, 
     84+                       .active_low     = 1, 
     85+                       .type           = EV_KEY, 
     86+                       .code           = KEY_WPS_BUTTON, 
     87+                       .threshold      = 3, 
     88+               }, 
     89+               { 
     90+                       .desc           = "restart", 
     91+                       .gpio           = 10, 
     92+                       .active_low     = 1, 
     93+                       .type           = EV_KEY, 
     94+                       .code           = BTN_1, 
     95+                       .threshold      = 3, 
     96+               }, 
     97+               { 
     98+                       .desc           = "reset", 
     99+                       .gpio           = 11, 
     100+                       .active_low     = 1, 
     101+                       .type           = EV_KEY, 
     102+                       .code           = KEY_RESTART, 
     103+                       .threshold      = 3, 
     104+               }, 
     105+       }, 
     106+}; 
     107+ 
     108  /* T-Home Speedport W 303V Typ B */ 
     109 static struct board_info __initdata board_spw303v = { 
     110        .name                   = "96358-502V", 
     111@@ -2185,6 +2272,7 @@ 
     112        &board_nb4_fxc_r1, 
     113        &board_nb4_fxc_r2, 
     114        &board_HW553, 
     115+       &board_HW556, 
     116        &board_spw303v, 
     117 #endif 
     118 }; 
     119@@ -2477,6 +2565,66 @@ 
     120        .id             = 0, 
     121        .dev.platform_data = &bcm63xx_gpio_buttons_data, 
     122 }; 
     123+/* 
     124+ * Atheros chipset (AR9223) fixup for the BCM96358 board. 
     125+ */ 
     126+#ifdef CONFIG_PCI 
     127+#define ATH_DATA_CAPS          0x105 /*0x20a>>1*/ 
     128+#define ATH_DATA_REGDOMAIN     0x104 /*0x208>>1*/ 
     129+ 
     130+static struct ath9k_platform_data bcm96358gw_ath9k_platform_data = { 
     131+       .led_pin = 2, // firmware original (cat /proc/sys/dev/wifi0/ledpin ) 
     132+}; 
     133+ 
     134+void __init bcm96358gw_register_ath9k(unsigned char *mac, u16 regdomain, u16 caps) 
     135+{ 
     136+       int i; 
     137+       unsigned int BCM96358_ATH_DATA_ADDR = 0x1EEFE000; /*0x1E000000+0x00EFE000=0x1EEFE000, offset used in two flash chip models*/ 
     138+       u16 *eepdata, sum, el; 
     139+       u8 *artva; 
     140+       const ushort cal_data0 = 0xa55a; 
     141+ 
     142+       artva = (u8 *)KSEG1ADDR(BCM96358_ATH_DATA_ADDR); 
     143+       if (memcmp(artva, &cal_data0, 2) != 0) { 
     144+               printk("cal_data0 = 0x%x%x ≠ 0xa55a, switching athdata address to 0x1EF7E000\n", artva[0], artva[1]); 
     145+               BCM96358_ATH_DATA_ADDR = 0x1EF7E000; /*0x1E000000+0x00F7E000=0x1EF7E000, offset used in MX29LV128DB flash chips*/ 
     146+               } 
     147+        
     148+       memcpy_fromio( 
     149+               bcm96358gw_ath9k_platform_data.eeprom_data,  
     150+               (void *) KSEG1ADDR(BCM96358_ATH_DATA_ADDR), 
     151+               sizeof(bcm96358gw_ath9k_platform_data.eeprom_data) 
     152+       ); 
     153+       if (regdomain) { 
     154+               bcm96358gw_ath9k_platform_data.eeprom_data[ATH_DATA_REGDOMAIN] = regdomain; 
     155+               printk("changed ath9k regdomain to 0x%x\n", regdomain); 
     156+       } 
     157+       if (caps) { 
     158+               bcm96358gw_ath9k_platform_data.eeprom_data[ATH_DATA_CAPS] = caps; 
     159+               printk("changed ath9k caps to 0x%x\n", caps); 
     160+       } 
     161+       if (regdomain | caps) { 
     162+               // recalc checksum for new regdomain 
     163+               sum = bcm96358gw_ath9k_platform_data.eeprom_data[0x200>>1]; 
     164+               el = sum / sizeof(u16) - 2;  // skip length and (old) checksum  
     165+               eepdata = (u16 *) (&bcm96358gw_ath9k_platform_data.eeprom_data[0x204>>1]); // after checksum 
     166+               for (i = 0; i < el; i++) 
     167+                       sum ^= *eepdata++; 
     168+               sum ^= 0xffff; 
     169+               bcm96358gw_ath9k_platform_data.eeprom_data[0x202>>1] = sum; 
     170+       }        
     171+ 
     172+       bcm96358gw_ath9k_platform_data.macaddr = mac;  
     173+       pci_enable_ath9k_fixup(1, bcm96358gw_ath9k_platform_data.eeprom_data); 
     174+} 
     175+ 
     176+void bcm96358gw_pci_plat_dev_init(struct pci_dev *dev) 
     177+{ 
     178+       printk(KERN_INFO PFX "Setting device platform data\n"); 
     179+       dev->dev.platform_data = &bcm96358gw_ath9k_platform_data; 
     180+} 
     181+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, bcm96358gw_pci_plat_dev_init); 
     182+#endif 
     183  
     184 /* 
     185  * third stage init callback, register all board devices. 
     186@@ -2570,5 +2718,12 @@ 
     187                platform_device_register(&bcm63xx_gpio_buttons_device); 
     188        } 
     189  
     190+#ifdef CONFIG_PCI 
     191+       if (!strcmp(board.name, "HW556")) { 
     192+               board_get_mac_address(board.enet0.mac_addr); 
     193+               bcm96358gw_register_ath9k(board.enet0.mac_addr, 0xFF, 0); 
     194+       } 
     195+#endif 
     196+ 
     197        return 0; 
     198 } 
     199--- a/arch/mips/bcm63xx/Makefile 
     200+++ b/arch/mips/bcm63xx/Makefile 
     201@@ -1,6 +1,6 @@ 
     202 obj-y          += clk.o cpu.o cs.o gpio.o irq.o prom.o setup.o timer.o \ 
     203                   dev-dsp.o dev-enet.o dev-pcmcia.o dev-uart.o dev-wdt.o \ 
     204-                  dev-usb-ohci.o dev-usb-ehci.o dev-spi.o 
     205+                  dev-usb-ohci.o dev-usb-ehci.o dev-spi.o pci-ath9k-fixup.o 
     206 obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o 
     207  
     208 obj-y          += boards/ 
     209--- /dev/null 
     210+++ b/arch/mips/bcm63xx/pci-ath9k-fixup.c 
     211@@ -0,0 +1,114 @@ 
     212+/* 
     213+ *  Atheros AP94 reference board PCI initialization 
     214+ * 
     215+ *  Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> 
     216+ * 
     217+ *  This program is free software; you can redistribute it and/or modify it 
     218+ *  under the terms of the GNU General Public License version 2 as published 
     219+ *  by the Free Software Foundation. 
     220+ */ 
     221+ 
     222+#include <linux/pci.h> 
     223+#include <linux/delay.h> 
     224+ 
     225+#include <asm/mach-bcm63xx/bcm63xx_io.h> 
     226+ 
     227+struct ath9k_fixup { 
     228+       u16             *cal_data; 
     229+       unsigned        slot; 
     230+}; 
     231+ 
     232+static int ath9k_num_fixups; 
     233+static struct ath9k_fixup ath9k_fixups[2]; 
     234+ 
     235+static void ath9k_pci_fixup(struct pci_dev *dev) 
     236+{ 
     237+       void __iomem *mem; 
     238+       u16 *cal_data = NULL; 
     239+       u16 cmd; 
     240+       u32 bar0; 
     241+       u32 val; 
     242+       unsigned i; 
     243+ 
     244+       for (i = 0; i < ath9k_num_fixups; i++) { 
     245+               if (ath9k_fixups[i].cal_data == NULL) 
     246+                       continue; 
     247+ 
     248+               if (ath9k_fixups[i].slot != PCI_SLOT(dev->devfn)) 
     249+                       continue; 
     250+ 
     251+               cal_data = ath9k_fixups[i].cal_data; 
     252+               break; 
     253+       } 
     254+ 
     255+       if (cal_data == NULL) 
     256+               return; 
     257+ 
     258+       if (*cal_data != 0xa55a) { 
     259+               pr_err("pci %s: invalid calibration data\n", pci_name(dev)); 
     260+               return; 
     261+       } 
     262+ 
     263+       pr_info("pci %s: fixup device configuration\n", pci_name(dev)); 
     264+ 
     265+#define ESTIMATED_PCI_MEM_BASE 0x30000000 
     266+ 
     267+       mem = ioremap(ESTIMATED_PCI_MEM_BASE, 0x10000); 
     268+       if (!mem) { 
     269+               pr_err("pci %s: ioremap error\n", pci_name(dev)); 
     270+               return; 
     271+       } 
     272+ 
     273+       pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); 
     274+       pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, ESTIMATED_PCI_MEM_BASE); 
     275+       /* pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0xffff); */ 
     276+       /* pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, 0x1000ffff); */ 
     277+ 
     278+       pci_read_config_word(dev, PCI_COMMAND, &cmd); 
     279+       cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; 
     280+       pci_write_config_word(dev, PCI_COMMAND, cmd); 
     281+ 
     282+       /* set pointer to first reg address */ 
     283+       cal_data += 3; 
     284+       while (*cal_data != 0xffff) { 
     285+               u32 reg; 
     286+               reg = *cal_data++; 
     287+               val = *cal_data++; 
     288+               val |= (*cal_data++) << 16; 
     289+ 
     290+               pr_info("pci-ath9k-fixup: Writing 0x%08x to register 0x%04x\n", val, reg); 
     291+ 
     292+               val = cpu_to_le32(val); 
     293+               __raw_writel(val, mem + reg); 
     294+               udelay(100); 
     295+       } 
     296+ 
     297+       pci_read_config_dword(dev, PCI_VENDOR_ID, &val); 
     298+       dev->vendor = val & 0xffff; 
     299+       dev->device = (val >> 16) & 0xffff; 
     300+ 
     301+       pr_info("pci-ath9k-fixup: Device vendor 0x%04x, id 0x%04x\n", dev->vendor, dev->device); 
     302+ 
     303+       pci_read_config_dword(dev, PCI_CLASS_REVISION, &val); 
     304+       dev->revision = val & 0xff; 
     305+       dev->class = val >> 8; /* upper 3 bytes */ 
     306+ 
     307+       pci_read_config_word(dev, PCI_COMMAND, &cmd); 
     308+       cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); 
     309+       pci_write_config_word(dev, PCI_COMMAND, cmd); 
     310+ 
     311+       pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0); 
     312+ 
     313+       iounmap(mem); 
     314+} 
     315+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath9k_pci_fixup); 
     316+ 
     317+void __init pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) 
     318+{ 
     319+       if (ath9k_num_fixups >= ARRAY_SIZE(ath9k_fixups)) 
     320+               return; 
     321+ 
     322+       ath9k_fixups[ath9k_num_fixups].slot = slot; 
     323+       ath9k_fixups[ath9k_num_fixups].cal_data = cal_data; 
     324+       ath9k_num_fixups++; 
     325+} 
     326--- /dev/null 
     327+++ b/arch/mips/include/asm/mach-bcm63xx/pci-ath9k-fixup.h 
     328@@ -0,0 +1,6 @@ 
     329+#ifndef _PCI_ATH9K_FIXUP 
     330+#define _PCI_ATH9K_FIXUP 
     331+ 
     332+void pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) __init; 
     333+ 
     334+#endif /* _PCI_ATH9K_FIXUP */ 
     335--- a/drivers/mtd/maps/bcm963xx-flash.c 
     336+++ b/drivers/mtd/maps/bcm963xx-flash.c 
     337@@ -63,8 +63,8 @@ 
     338        struct mtd_partition *parts; 
     339        int ret; 
     340        size_t retlen; 
     341-       unsigned int rootfsaddr, kerneladdr, spareaddr; 
     342-       unsigned int rootfslen, kernellen, sparelen; 
     343+       unsigned int rootfsaddr, kerneladdr, spareaddr, athaddr; 
     344+       unsigned int rootfslen, kernellen, sparelen, athlen; 
     345        int namelen = 0; 
     346        int i; 
     347        char *boardid; 
     348@@ -76,6 +76,7 @@ 
     349                return -ENOMEM; 
     350  
     351        /* Get the tag */ 
     352+       master->erasesize = 0x20000; //HW556, MX29LV128DB 
     353        ret = master->read(master, master->erasesize, sizeof(struct bcm_tag), 
     354                                                        &retlen, (void *)buf); 
     355        if (retlen != sizeof(struct bcm_tag)) { 
     356@@ -96,8 +97,10 @@ 
     357        rootfsaddr = kerneladdr + kernellen; 
     358        rootfslen = roundup(rootfslen, master->erasesize); 
     359        spareaddr = rootfsaddr + rootfslen; 
     360-       sparelen = master->size - spareaddr - master->erasesize; 
     361+       sparelen = 0x00E00000 - spareaddr; 
     362        rootfslen = spareaddr - rootfsaddr; 
     363+       athaddr = 0x00E00000; 
     364+       athlen = master->size - 0x00E00000 - master->erasesize; 
     365  
     366        /* Determine number of partitions */ 
     367        namelen = 8; 
     368@@ -109,7 +112,9 @@ 
     369                nrparts++; 
     370                namelen += 6; 
     371        }; 
     372+       nrparts++; //HW556 
     373  
     374+        
     375        /* Ask kernel for more memory */ 
     376        parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL); 
     377        if (!parts) { 
     378@@ -139,6 +144,12 @@ 
     379                curpart++; 
     380        }; 
     381  
     382+       parts[curpart].name = "ath_data"; 
     383+       parts[curpart].offset = athaddr;  
     384+       parts[curpart].size = athlen;  
     385+       curpart++;  
     386+ 
     387+ 
     388        parts[curpart].name = "nvram"; 
     389        parts[curpart].offset = master->size - master->erasesize; 
     390        parts[curpart].size = master->erasesize; 
     391@@ -147,7 +158,7 @@ 
     392        curpart++; 
     393        parts[curpart].name = "linux"; 
     394        parts[curpart].offset = parts[0].size; 
     395-       parts[curpart].size = master->size - parts[0].size - parts[3].size; 
     396+       parts[curpart].size = parts[3].offset - parts[0].size; //Hw556 
     397  
     398        for (i = 0; i < nrparts; i++) 
     399                printk(KERN_INFO PFX "Partition %d is %s offset %lx and " 
  • package/mac80211/patches/hg556a_athinit.patch

     
     1--- a/drivers/net/wireless/ath/ath9k/init.c 
     2+++ b/drivers/net/wireless/ath/ath9k/init.c 
     3@@ -526,7 +526,7 @@ 
     4        ah->reg_ops.rmw = ath9k_reg_rmw; 
     5        atomic_set(&ah->intr_ref_cnt, -1); 
     6        sc->sc_ah = ah; 
     7- 
     8+       ah->ah_flags |= AH_USE_EEPROM; //HW556 
     9        if (!pdata) { 
     10                ah->ah_flags |= AH_USE_EEPROM; 
     11                sc->sc_ah->led_pin = -1;