Al 22/05/11 15:08, En/na Luca Olivetti ha escrit: [Don't know why I still bother submitting it, since it will be duly ignored]
> Al 04/04/11 19:48, En/na Luca Olivetti ha escrit: >> The following patch adds ath9k support to the arv7518 board. >> >> The pci fixup routine (needed since the ar9223 has no onboard >> eeprom) is taken from the ar71xx: >> >> https://dev.openwrt.org/browser/trunk/target/linux/ar71xx/files/arch/mips/ar71xx/pci-ath9k-fixup.c >> https://dev.openwrt.org/browser/trunk/target/linux/ar71xx/files/arch/mips/ar71xx/pci-ath9k-fixup.h >> >> with a couple of changes. >> >> As I said, the ar9223 has no onboard eeprom, so it uses the system >> flash, which holds the fixup data as well as the calibration data, >> however the regdomain in the system flash is set at 0, and it will >> setup the card to the most restrictive mode (i.e. channels 12 and >> 13 aren't available). >> The original firmware overrides the regdomain and the device capabilities >> (I suppose that arcadyan uses the same caldata all over the world and then >> customizes the firmware instead of properly set the regdomain). >> The patch does the same only if in the kernel command line the parameter >> "ath9k_regdomain" and/or "ath9k_caps" are specified, hence the >> xway_cmdline parameter in image/Makefile has to be changed not >> to clobber the command line set in u-boot. Here's a revised version of the patch against current trunk. > >> I forgot to say that it needs this patch in mac80211 >> >> http://patchwork.midlink.org/patch/727/ >> >> without it, initialization of the card would fail (no other harm should be >> done). The current patch now includes the modification to ath9k, without an extra field (endianness is checked unconditionally). > > > At the risk of being called impatient, I'd like some feedback > (and some help in fixing the performance issues I encountered). The performance problem is still there (I get ~5Mbps) but I'm not asking for help, since I already know I won't get any. Signed-off-by: Luca Olivetti <l...@ventoso.org> --- Index: target/linux/lantiq/image/Makefile =================================================================== --- target/linux/lantiq/image/Makefile (revisión: 27363) +++ target/linux/lantiq/image/Makefile (copia de trabajo) @@ -10,7 +10,7 @@ JFFS2_BLOCKSIZE = 64k 128k 256k ase_cmdline=-console=ttyLTQ1,115200 rootfstype=squashfs,jffs2 -xway_cmdline=-console=ttyLTQ1,115200 rootfstype=squashfs,jffs2 +xway_cmdline=console=ttyLTQ1,115200 rootfstype=squashfs,jffs2 falcon_cmdline=-console=ttyLTQ0,115200 rootfstype=squashfs,jffs2 define CompressLzma Index: target/linux/lantiq/patches-2.6.39/750-arv75xx-ath9k.patch =================================================================== --- target/linux/lantiq/patches-2.6.39/750-arv75xx-ath9k.patch (revisión: 0) +++ target/linux/lantiq/patches-2.6.39/750-arv75xx-ath9k.patch (revisión: 0) @@ -0,0 +1,266 @@ +--- a/arch/mips/lantiq/xway/Kconfig ++++ b/arch/mips/lantiq/xway/Kconfig +@@ -8,6 +8,7 @@ config LANTIQ_MACH_EASY50712 + + config LANTIQ_MACH_ARV45XX + bool "ARV45XX" ++ select LANTIQ_PCI_ATH9K_FIXUP + default y + + config LANTIQ_MACH_NETGEAR +@@ -20,6 +21,9 @@ config LANTIQ_MACH_GIGASX76X + + endmenu + ++config LANTIQ_PCI_ATH9K_FIXUP ++ def_bool n ++ + endif + + if SOC_AMAZON_SE +--- a/arch/mips/lantiq/xway/Makefile ++++ b/arch/mips/lantiq/xway/Makefile +@@ -8,4 +8,5 @@ obj-$(CONFIG_LANTIQ_MACH_EASY50601) += m + obj-$(CONFIG_LANTIQ_MACH_ARV45XX) += mach-arv45xx.o + obj-$(CONFIG_LANTIQ_MACH_NETGEAR) += mach-netgear.o + obj-$(CONFIG_LANTIQ_MACH_GIGASX76X) += mach-gigasx76x.o ++obj-$(CONFIG_LANTIQ_PCI_ATH9K_FIXUP) += pci-ath9k-fixup.o + obj-y += dev-dwc_otg.o +--- /dev/null ++++ b/arch/mips/lantiq/xway/pci-ath9k-fixup.c +@@ -0,0 +1,105 @@ ++/* ++ * Adapted from: Atheros AP94 reference board PCI initialization ++ * ++ * Copyright (C) 2009-2010 Gabor Juhos <juh...@openwrt.org> ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 as published ++ * by the Free Software Foundation. ++ */ ++ ++#include <linux/pci.h> ++#include <linux/delay.h> ++ ++/* this is ugly but this constant isn't available in an header file */ ++#define LTQ_PCI_MEM_BASE 0x18000000 ++ ++struct ath9k_fixup { ++ u16 *cal_data; ++ unsigned slot; ++}; ++ ++static int ath9k_num_fixups; ++static struct ath9k_fixup ath9k_fixups[2]; ++ ++static void ath9k_pci_fixup(struct pci_dev *dev) ++{ ++ void __iomem *mem; ++ u16 *cal_data = NULL; ++ u16 cmd; ++ u32 bar0; ++ u32 val; ++ unsigned i; ++ ++ for (i = 0; i < ath9k_num_fixups; i++) { ++ if (ath9k_fixups[i].cal_data == NULL) ++ continue; ++ ++ if (ath9k_fixups[i].slot != PCI_SLOT(dev->devfn)) ++ continue; ++ ++ cal_data = ath9k_fixups[i].cal_data; ++ break; ++ } ++ ++ if (cal_data == NULL) ++ return; ++ ++ if (*cal_data != 0xa55a) { ++ pr_err("pci %s: invalid calibration data\n", pci_name(dev)); ++ return; ++ } ++ ++ pr_info("pci %s: fixup device configuration\n", pci_name(dev)); ++ ++ mem = ioremap(LTQ_PCI_MEM_BASE, 0x10000); ++ if (!mem) { ++ pr_err("pci %s: ioremap error\n", pci_name(dev)); ++ return; ++ } ++ ++ pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar0); ++ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, LTQ_PCI_MEM_BASE); ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY; ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++ ++ /* set pointer to first reg address */ ++ cal_data += 3; ++ while (*cal_data != 0xffff) { ++ u32 reg; ++ reg = *cal_data++; ++ val = *cal_data++; ++ val |= (*cal_data++) << 16; ++ ++ __raw_writel(cpu_to_le32(val), mem + reg); ++ udelay(100); ++ } ++ ++ pci_read_config_dword(dev, PCI_VENDOR_ID, &val); ++ dev->vendor = val & 0xffff; ++ dev->device = (val >> 16) & 0xffff; ++ ++ pci_read_config_dword(dev, PCI_CLASS_REVISION, &val); ++ dev->revision = val & 0xff; ++ dev->class = val >> 8; /* upper 3 bytes */ ++ ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ cmd &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY); ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++ ++ pci_write_config_dword(dev, PCI_BASE_ADDRESS_0, bar0); ++ ++ iounmap(mem); ++} ++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATHEROS, PCI_ANY_ID, ath9k_pci_fixup); ++ ++void __init pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) ++{ ++ if (ath9k_num_fixups >= ARRAY_SIZE(ath9k_fixups)) ++ return; ++ ++ ath9k_fixups[ath9k_num_fixups].slot = slot; ++ ath9k_fixups[ath9k_num_fixups].cal_data = cal_data; ++ ath9k_num_fixups++; ++} +--- /dev/null ++++ b/arch/mips/lantiq/xway/pci-ath9k-fixup.h +@@ -0,0 +1,6 @@ ++#ifndef _PCI_ATH9K_FIXUP ++#define _PCI_ATH9K_FIXUP ++ ++void pci_enable_ath9k_fixup(unsigned slot, u16 *cal_data) __init; ++ ++#endif /* _PCI_ATH9K_FIXUP */ +--- a/arch/mips/lantiq/xway/mach-arv45xx.c ++++ b/arch/mips/lantiq/xway/mach-arv45xx.c +@@ -17,6 +17,7 @@ + #include <linux/input.h> + #include <linux/etherdevice.h> + #include <linux/ath5k_platform.h> ++#include <linux/ath9k_platform.h> + #include <linux/pci.h> + + #include <lantiq_soc.h> +@@ -26,6 +27,9 @@ + #include "devices.h" + #include "dev-leds-gpio.h" + #include "dev-dwc_otg.h" ++#include "pci-ath9k-fixup.h" ++ ++extern int (*ltqpci_plat_dev_init)(struct pci_dev *dev); + + #ifdef CONFIG_MTD_PARTITIONS + static struct mtd_partition arv4510_partitions[] = +@@ -317,6 +321,48 @@ arv45xx_register_ath5k(void) + //lqpci_plat_dev_init = arv45xx_pci_plat_dev_init; + } + ++static struct ath9k_platform_data arv75xx_ath9k_platform_data = { ++ .led_pin = -1, ++}; ++ ++static int arv75xx_pci_plat_dev_init(struct pci_dev *dev) ++{ ++ dev->dev.platform_data = &arv75xx_ath9k_platform_data; ++ return 0; ++} ++ ++void __init ++arv75xx_register_ath9k(unsigned char *mac, u16 regdomain, u16 caps) ++{ ++#define ARV75XX_BRN_ATH 0xa07f0400 ++ int i; ++ u16 *eepdata, sum, el; ++ ++ memcpy_fromio(arv75xx_ath9k_platform_data.eeprom_data, ++ (void *)KSEG1ADDR(LTQ_FLASH_START + ARV75XX_BRN_ATH ),sizeof(arv75xx_ath9k_platform_data.eeprom_data)); ++ if (regdomain) { ++ arv75xx_ath9k_platform_data.eeprom_data[0x208>>1]=regdomain; ++ printk("changed ath9k regdomain to 0x%x\n", regdomain); ++ } ++ if (caps) { ++ arv75xx_ath9k_platform_data.eeprom_data[0x20a>>1]=caps; ++ printk("changed ath9k caps to 0x%x\n", caps); ++ } ++ if (regdomain | caps) { ++ /* recalc checksum for new regdomain */ ++ sum = arv75xx_ath9k_platform_data.eeprom_data[0x200>>1]; ++ el = sum / sizeof(u16) - 2; /* skip length and (old) checksum */ ++ eepdata = (u16 *) (&arv75xx_ath9k_platform_data.eeprom_data[0x204>>1]); /* after checksum */ ++ for (i = 0; i < el; i++) ++ sum ^= *eepdata++; ++ sum ^= 0xffff; ++ arv75xx_ath9k_platform_data.eeprom_data[0x202>>1]=sum; ++ } ++ arv75xx_ath9k_platform_data.macaddr = mac; ++ ltqpci_plat_dev_init = arv75xx_pci_plat_dev_init; ++ pci_enable_ath9k_fixup(14, arv75xx_ath9k_platform_data.eeprom_data); ++} ++ + static void __init + arv3527p_init(void) + { +@@ -454,6 +500,24 @@ MIPS_MACHINE(LANTIQ_MACH_ARV4525PW, + "ARV4525PW - Speedport W502V", + arv4525pw_init); + ++static int ath9k_regdomain; ++static int __init ++ath9k_regdomain_setup(char *str) ++{ ++ ath9k_regdomain = simple_strtoul(str, NULL, 0); ++ return 1; ++} ++__setup("ath9k_regdomain=", ath9k_regdomain_setup); ++ ++static u16 ath9k_caps; ++static int __init ++ath9k_caps_setup(char *str) ++{ ++ ath9k_caps = simple_strtoul(str, NULL, 0); ++ return 1; ++} ++__setup("ath9k_caps=", ath9k_caps_setup); ++ + static void __init + arv7518pw_init(void) + { +@@ -468,7 +532,7 @@ arv7518pw_init(void) + ltq_register_tapi(); + xway_register_dwc(ARV7518PW_USB); + arv75xx_register_ethernet(); +- //arv7518_register_ath9k(mac); ++ arv75xx_register_ath9k(ltq_eth_data.mac.sa_data, ath9k_regdomain, ath9k_caps); + } + + MIPS_MACHINE(LANTIQ_MACH_ARV7518PW, +--- a/include/linux/ath9k_platform.h ++++ b/include/linux/ath9k_platform.h +@@ -23,6 +23,15 @@ + + struct ath9k_platform_data { + u16 eeprom_data[ATH9K_PLAT_EEP_MAX_WORDS]; ++ u8 *macaddr; ++ ++ int led_pin; ++ u32 gpio_mask; ++ u32 gpio_val; ++ ++ bool is_clk_25mhz; ++ int (*get_mac_revision)(void); ++ int (*external_reset)(void); + }; + + #endif /* _LINUX_ATH9K_PLATFORM_H */ Index: package/mac80211/patches/412-ath9k-force-check-endianness.patch =================================================================== --- package/mac80211/patches/412-ath9k-force-check-endianness.patch (revisión: 0) +++ package/mac80211/patches/412-ath9k-force-check-endianness.patch (revisión: 0) @@ -0,0 +1,11 @@ +--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c 2011-02-08 17:33:42.000000000 +0100 ++++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c 2011-02-20 17:51:47.000000000 +0100 +@@ -147,7 +152,7 @@ + return false; + } + +- if (!ath9k_hw_use_flash(ah)) { ++ if (1) { + ath_dbg(common, ATH_DBG_EEPROM, + "Read Magic = 0x%04X\n", magic); + _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel