/branches/18.06.1/target/linux/brcm63xx/patches-4.9/422-BCM63XX-add-a-fixup-for-rt2x00-devices.patch |
@@ -0,0 +1,185 @@ |
From 5ed5b5e9614fa5b02da699ab565af76c7e63d64d Mon Sep 17 00:00:00 2001 |
From: Jonas Gorski <jogo@openwrt.org> |
Date: Mon, 7 Jan 2013 17:45:39 +0100 |
Subject: [PATCH 72/72] 446-BCM63XX-add-a-fixup-for-rt2x00-devices |
|
--- |
arch/mips/bcm63xx/Makefile | 2 +- |
arch/mips/bcm63xx/boards/board_bcm963xx.c | 17 ++++- |
arch/mips/bcm63xx/dev-flash.c | 2 +- |
arch/mips/bcm63xx/pci-rt2x00-fixup.c | 71 ++++++++++++++++++++ |
.../include/asm/mach-bcm63xx/bcm63xx_dev_flash.h | 2 +- |
.../mips/include/asm/mach-bcm63xx/board_bcm963xx.h | 9 ++- |
.../include/asm/mach-bcm63xx/pci_rt2x00_fixup.h | 9 +++ |
7 files changed, 104 insertions(+), 8 deletions(-) |
create mode 100644 arch/mips/bcm63xx/pci-rt2x00-fixup.c |
create mode 100644 arch/mips/include/asm/mach-bcm63xx/pci_rt2x00_fixup.h |
|
--- a/arch/mips/bcm63xx/Makefile |
+++ b/arch/mips/bcm63xx/Makefile |
@@ -2,7 +2,7 @@ obj-y += clk.o cpu.o cs.o gpio.o irq.o |
setup.o timer.o dev-enet.o dev-flash.o dev-pcmcia.o \ |
dev-rng.o dev-wdt.o \ |
dev-usb-ehci.o dev-usb-ohci.o dev-usb-usbd.o usb-common.o \ |
- pci-ath9k-fixup.o sprom.o |
+ pci-ath9k-fixup.o pci-rt2x00-fixup.o sprom.o |
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
|
obj-y += boards/ |
--- a/arch/mips/bcm63xx/boards/board_common.c |
+++ b/arch/mips/bcm63xx/boards/board_common.c |
@@ -32,6 +32,7 @@ |
#include <bcm63xx_dev_usb_usbd.h> |
#include <board_bcm963xx.h> |
#include <pci_ath9k_fixup.h> |
+#include <pci_rt2x00_fixup.h> |
|
#include "board_common.h" |
|
@@ -244,9 +245,19 @@ int __init board_register_devices(void) |
} |
|
/* register any fixups */ |
- for (i = 0; i < board.has_caldata; i++) |
- pci_enable_ath9k_fixup(board.caldata[i].slot, board.caldata[i].caldata_offset, |
- board.caldata[i].endian_check, board.caldata[i].led_pin, board.caldata[i].led_active_high); |
+ for (i = 0; i < board.has_caldata; i++) { |
+ switch (board.caldata[i].vendor) { |
+ case PCI_VENDOR_ID_ATHEROS: |
+ pci_enable_ath9k_fixup(board.caldata[i].slot, |
+ board.caldata[i].caldata_offset, board.caldata[i].endian_check, |
+ board.caldata[i].led_pin, board.caldata[i].led_active_high); |
+ break; |
+ case PCI_VENDOR_ID_RALINK: |
+ pci_enable_rt2x00_fixup(board.caldata[i].slot, |
+ board.caldata[i].eeprom); |
+ break; |
+ } |
+ } |
|
return 0; |
} |
--- /dev/null |
+++ b/arch/mips/bcm63xx/pci-rt2x00-fixup.c |
@@ -0,0 +1,72 @@ |
+/* |
+ * Broadcom BCM63XX RT2x00 EEPROM fixup helper. |
+ * |
+ * Copyright (C) 2012 Álvaro Fernández Rojas <noltari@gmail.com> |
+ * |
+ * Based on |
+ * |
+ * Broadcom BCM63XX Ath9k EEPROM fixup helper. |
+ * |
+ * Copyright (C) 2012 Jonas Gorski <jonas.gorski@gmail.com> |
+ * |
+ * 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/if_ether.h> |
+#include <linux/pci.h> |
+#include <linux/platform_device.h> |
+#include <linux/rt2x00_platform.h> |
+ |
+#include <bcm63xx_nvram.h> |
+#include <pci_rt2x00_fixup.h> |
+ |
+struct rt2x00_fixup { |
+ unsigned slot; |
+ u8 mac[ETH_ALEN]; |
+ struct rt2x00_platform_data pdata; |
+}; |
+ |
+static int rt2x00_num_fixups; |
+static struct rt2x00_fixup rt2x00_fixups[2] = { |
+ { |
+ .slot = 255, |
+ }, |
+ { |
+ .slot = 255, |
+ }, |
+}; |
+ |
+static void rt2x00_pci_fixup(struct pci_dev *dev) |
+{ |
+ unsigned i; |
+ struct rt2x00_platform_data *pdata = NULL; |
+ |
+ for (i = 0; i < rt2x00_num_fixups; i++) { |
+ if (rt2x00_fixups[i].slot != PCI_SLOT(dev->devfn)) |
+ continue; |
+ |
+ pdata = &rt2x00_fixups[i].pdata; |
+ break; |
+ } |
+ |
+ dev->dev.platform_data = pdata; |
+} |
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_RALINK, PCI_ANY_ID, rt2x00_pci_fixup); |
+ |
+void __init pci_enable_rt2x00_fixup(unsigned slot, char* eeprom) |
+{ |
+ if (rt2x00_num_fixups >= ARRAY_SIZE(rt2x00_fixups)) |
+ return; |
+ |
+ rt2x00_fixups[rt2x00_num_fixups].slot = slot; |
+ rt2x00_fixups[rt2x00_num_fixups].pdata.eeprom_file_name = kstrdup(eeprom, GFP_KERNEL); |
+ |
+ if (bcm63xx_nvram_get_mac_address(rt2x00_fixups[rt2x00_num_fixups].mac)) |
+ return; |
+ |
+ rt2x00_fixups[rt2x00_num_fixups].pdata.mac_address = rt2x00_fixups[rt2x00_num_fixups].mac; |
+ rt2x00_num_fixups++; |
+} |
+ |
--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
@@ -9,6 +9,7 @@ |
#include <bcm63xx_dev_usb_usbd.h> |
#include <bcm63xx_fallback_sprom.h> |
#include <pci_ath9k_fixup.h> |
+#include <pci_rt2x00_fixup.h> |
|
/* |
* flash mapping |
@@ -16,12 +17,16 @@ |
#define BCM963XX_CFE_VERSION_OFFSET 0x570 |
#define BCM963XX_NVRAM_OFFSET 0x580 |
|
-struct ath9k_caldata { |
+struct bcm63xx_caldata { |
+ unsigned int vendor; |
unsigned int slot; |
u32 caldata_offset; |
+ /* Atheros */ |
unsigned int endian_check:1; |
int led_pin; |
bool led_active_high; |
+ /* Ralink */ |
+ char* eeprom; |
}; |
|
/* |
@@ -44,7 +49,7 @@ struct board_info { |
unsigned int has_caldata:2; |
|
/* wifi calibration data config */ |
- struct ath9k_caldata caldata[2]; |
+ struct bcm63xx_caldata caldata[2]; |
|
/* ethernet config */ |
struct bcm63xx_enet_platform_data enet0; |
--- /dev/null |
+++ b/arch/mips/include/asm/mach-bcm63xx/pci_rt2x00_fixup.h |
@@ -0,0 +1,9 @@ |
+#ifndef _PCI_RT2X00_FIXUP |
+#define _PCI_RT2X00_FIXUP |
+ |
+#define PCI_VENDOR_ID_RALINK 0x1814 |
+ |
+void pci_enable_rt2x00_fixup(unsigned slot, char* eeprom) __init; |
+ |
+#endif /* _PCI_RT2X00_FIXUP */ |
+ |