2010.07.13. 19:22 keltezéssel, [email protected] írta:
> This patch adds support for reading MAC addresses as well as wireless
> interface callibration-data from the board flash of the EAP7660D.
>
> Signed-off-by: Daniel Golle <[email protected]>
>
> Index: target/linux/ar71xx/files/include/linux/ath_platform.h
> ===================================================================
> --- target/linux/ar71xx/files/include/linux/ath_platform.h (revision 0)
> +++ target/linux/ar71xx/files/include/linux/ath_platform.h (revision 0)
> @@ -0,0 +1,30 @@
> +/*
> + * Copyright (c) 2008 Atheros Communications Inc.
> + * Copyright (c) 2009 Gabor Juhos <[email protected]>
> + * Copyright (c) 2009 Imre Kaloz <[email protected]>
> + * Copyright (c) 2010 Daniel Golle <[email protected]>
> + *
> + * Permission to use, copy, modify, and/or distribute this software for any
> + * purpose with or without fee is hereby granted, provided that the above
> + * copyright notice and this permission notice appear in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#ifndef _LINUX_ATH_PLATFORM_H
> +#define _LINUX_ATH_PLATFORM_H
> +
> +#define ATH_PLAT_EEP_MAX_WORDS 2048
> +
> +struct ath_platform_data {
> + u16 *eeprom_data;
> + u8 *macaddr;
> +};
> +
> +#endif /* _LINUX_ATH_PLATFORM_H */
Now that this will be used for ath5k devices only, it would be better to rename
it to ath5k_platform.h, and change the ath prefixes to ath5k as well.
> Index: target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig
> ===================================================================
> --- target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig (revision 22105)
> +++ target/linux/ar71xx/files/arch/mips/ar71xx/Kconfig (working copy)
> @@ -226,7 +226,6 @@
> config AR71XX_MACH_EAP7660D
> bool "Senao EAP7660D support"
> select AR71XX_DEV_M25P80
> - select AR71XX_DEV_PB42_PCI if PCI
> select AR71XX_DEV_GPIO_BUTTONS
> select AR71XX_DEV_LEDS_GPIO
> default n
> Index: target/linux/ar71xx/files/arch/mips/ar71xx/mach-eap7660d.c
> ===================================================================
> --- target/linux/ar71xx/files/arch/mips/ar71xx/mach-eap7660d.c
> (revision 22105)
> +++ target/linux/ar71xx/files/arch/mips/ar71xx/mach-eap7660d.c
> (working copy)
> @@ -10,13 +10,16 @@
> * by the Free Software Foundation.
> */
>
> +#include <linux/pci.h>
> +#include <linux/ath_platform.h>
> +#include <linux/delay.h>
> #include <asm/mach-ar71xx/ar71xx.h>
> +#include <asm/mach-ar71xx/pci.h>
>
> #include "machtype.h"
> #include "devices.h"
> #include "dev-gpio-buttons.h"
> #include "dev-leds-gpio.h"
> -#include "dev-pb42-pci.h"
> #include "dev-m25p80.h"
>
> #define EAP7660D_BUTTONS_POLL_INTERVAL 20
> @@ -27,7 +30,77 @@
> #define EAP7660D_GPIO_SW1 3
> #define EAP7660D_GPIO_SW3 8
> #define EAP7660D_PHYMASK BIT(20)
> +#define EAP7660D_BOARDCONFIG 0x1F7F0000
> +#define EAP7660D_GBIC_MAC_OFFSET 0x1000
> +#define EAP7660D_WMAC0_MAC_OFFSET 0x1010
> +#define EAP7660D_WMAC1_MAC_OFFSET 0x1016
> +#define EAP7660D_WMAC0_CALDATA_OFFSET 0x2000
> +#define EAP7660D_WMAC1_CALDATA_OFFSET 0x3000
>
> +static struct ath_platform_data eap7660d_wmac0_data;
> +static struct ath_platform_data eap7660d_wmac1_data;
> +static char eap7660d_wmac0_mac[6];
> +static char eap7660d_wmac1_mac[6];
> +static __u16 eap7660d_wmac0_eeprom[ATH_PLAT_EEP_MAX_WORDS];
> +static __u16 eap7660d_wmac1_eeprom[ATH_PLAT_EEP_MAX_WORDS];
The __xx types are used in the header files which are exported to used-space.
You should use 'u16' here.
> +static int ap94_pci_fixup_enabled;
This variable is not needed.
> +
> +static struct ar71xx_pci_irq eap7660d_pci_irqs[] __initdata = {
> + {
> + .slot = 0,
> + .pin = 1,
> + .irq = AR71XX_PCI_IRQ_DEV0,
> + }, {
> + .slot = 1,
> + .pin = 1,
> + .irq = AR71XX_PCI_IRQ_DEV1,
> + }
> +};
> +
> +static int eap7660d_pci_plat_dev_init(struct pci_dev *dev)
> +{
> + switch(PCI_SLOT(dev->devfn)) {
> + case 17:
> + dev->dev.platform_data = &eap7660d_wmac0_data;
> + break;
> +
> + case 18:
> + dev->dev.platform_data = &eap7660d_wmac1_data;
> + break;
> + }
> +
> + return 0;
> +}
> +
> +void __init eap7660d_pci_init(u8 *cal_data0, u8 *mac_addr0,
> + u8 *cal_data1, u8 *mac_addr1)
> +{
> + if (cal_data0 && *cal_data0 == 0xa55a) {
> + memcpy(eap7660d_wmac0_eeprom, cal_data0,
> + ATH_PLAT_EEP_MAX_WORDS);
> + eap7660d_wmac0_data.eeprom_data = eap7660d_wmac0_eeprom;
> + }
> +
> + if (cal_data1 && *cal_data1 == 0xa55a) {
> + memcpy(eap7660d_wmac1_eeprom, cal_data1,
> + ATH_PLAT_EEP_MAX_WORDS);
> + eap7660d_wmac1_data.eeprom_data = eap7660d_wmac1_eeprom;
> + }
> +
> + if (mac_addr0) {
> + memcpy(eap7660d_wmac0_mac, mac_addr0,
> sizeof(eap7660d_wmac0_mac));
> + eap7660d_wmac0_data.macaddr = eap7660d_wmac0_mac;
> + }
> +
> + if (mac_addr1) {
> + memcpy(eap7660d_wmac1_mac, mac_addr1,
> sizeof(eap7660d_wmac1_mac));
> + eap7660d_wmac1_data.macaddr = eap7660d_wmac1_mac;
> + }
> +
> + ar71xx_pci_plat_dev_init = eap7660d_pci_plat_dev_init;
> + ar71xx_pci_init(ARRAY_SIZE(eap7660d_pci_irqs), eap7660d_pci_irqs);
> +}
> +
> static struct gpio_led eap7660d_leds_gpio[] __initdata = {
> {
> .name = "eap7660d:green:ds8",
> @@ -72,6 +145,10 @@
>
> static void __init eap7660d_setup(void)
> {
> + u8 *boardconfig = (u8 *) KSEG1ADDR(EAP7660D_BOARDCONFIG);
> + u8 mac[6];
> + memcpy(mac, boardconfig + EAP7660D_GBIC_MAC_OFFSET, 6);
> + ar71xx_set_mac_base(mac);
You can use 'boardconfig + EAP7660D_GBIC_MAC_OFFSET' directly with
ar71xx_set_mac_base, so you can get rid of the local mac variable and of the
memcpy call.
> ar71xx_add_device_mdio(~EAP7660D_PHYMASK);
> ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
> ar71xx_eth0_data.phy_mask = EAP7660D_PHYMASK;
> @@ -82,7 +159,10 @@
> ar71xx_add_device_gpio_buttons(-1, EAP7660D_BUTTONS_POLL_INTERVAL,
> ARRAY_SIZE(eap7660d_gpio_buttons),
> eap7660d_gpio_buttons);
> - pb42_pci_init();
> + eap7660d_pci_init(boardconfig + EAP7660D_WMAC0_CALDATA_OFFSET,
> + boardconfig + EAP7660D_WMAC0_MAC_OFFSET,
> + boardconfig + EAP7660D_WMAC1_CALDATA_OFFSET,
> + boardconfig + EAP7660D_WMAC1_MAC_OFFSET);
> };
>
> MIPS_MACHINE(AR71XX_MACH_EAP7660D, "EAP7660D", "Senao EAP7660D",
> _______________________________________________
> openwrt-devel mailing list
> [email protected]
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
>
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel