source: trunk/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch @ 27958

Last change on this file since 27958 was 27958, checked in by nbd, 5 years ago

mac80211: update to 2011-08-10

File size: 7.7 KB
  • new file drivers/net/wireless/rt2x00/rt2x00eeprom.c

    - +  
     1/* 
     2        Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com> 
     3        Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com> 
     4        <http://rt2x00.serialmonkey.com> 
     5 
     6        This program is free software; you can redistribute it and/or modify 
     7        it under the terms of the GNU General Public License as published by 
     8        the Free Software Foundation; either version 2 of the License, or 
     9        (at your option) any later version. 
     10 
     11        This program is distributed in the hope that it will be useful, 
     12        but WITHOUT ANY WARRANTY; without even the implied warranty of 
     13        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     14        GNU General Public License for more details. 
     15 
     16        You should have received a copy of the GNU General Public License 
     17        along with this program; if not, write to the 
     18        Free Software Foundation, Inc., 
     19        59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
     20 */ 
     21 
     22/* 
     23        Module: rt2x00lib 
     24        Abstract: rt2x00 eeprom file loading routines. 
     25 */ 
     26 
     27#include <linux/kernel.h> 
     28#include <linux/module.h> 
     29 
     30#include "rt2x00.h" 
     31#include "rt2x00lib.h" 
     32 
     33static int rt2x00lib_request_eeprom_file(struct rt2x00_dev *rt2x00dev) 
     34{ 
     35        const struct firmware *ee; 
     36        char *ee_name; 
     37        int retval; 
     38 
     39        ee_name = rt2x00dev->ops->lib->get_eeprom_file_name(rt2x00dev); 
     40        if (!ee_name) { 
     41                ERROR(rt2x00dev, 
     42                      "Invalid EEPROM filename.\n" 
     43                      "Please file bug report to %s.\n", DRV_PROJECT); 
     44                return -EINVAL; 
     45        } 
     46 
     47        INFO(rt2x00dev, "Loading EEPROM data from '%s'.\n", ee_name); 
     48 
     49        retval = request_firmware(&ee, ee_name, rt2x00dev->dev); 
     50        if (retval) { 
     51                ERROR(rt2x00dev, "Failed to request EEPROM.\n"); 
     52                return retval; 
     53        } 
     54 
     55        if (!ee || !ee->size || !ee->data) { 
     56                ERROR(rt2x00dev, "Failed to read EEPROM file.\n"); 
     57                retval = -ENOENT; 
     58                goto err_exit; 
     59        } 
     60 
     61        if (ee->size != rt2x00dev->ops->eeprom_size) { 
     62                ERROR(rt2x00dev, 
     63                      "EEPROM file size is invalid, it should be %d bytes\n", 
     64                      rt2x00dev->ops->eeprom_size); 
     65                retval = -EINVAL; 
     66                goto err_release_ee; 
     67        } 
     68 
     69        rt2x00dev->eeprom_file = ee; 
     70        return 0; 
     71 
     72err_release_ee: 
     73        release_firmware(ee); 
     74err_exit: 
     75        return retval; 
     76} 
     77 
     78int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev) 
     79{ 
     80        int retval; 
     81 
     82        if (!test_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags)) 
     83                return 0; 
     84 
     85        if (!rt2x00dev->eeprom_file) { 
     86                retval = rt2x00lib_request_eeprom_file(rt2x00dev); 
     87                if (retval) 
     88                        return retval; 
     89        } 
     90 
     91        return 0; 
     92} 
     93 
     94void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev) 
     95{ 
     96        release_firmware(rt2x00dev->eeprom_file); 
     97        rt2x00dev->eeprom_file = NULL; 
     98} 
  • drivers/net/wireless/rt2x00/rt2x00.h

    a b struct rt2x00lib_ops { 
    539539                               const u8 *data, const size_t len); 
    540540        int (*load_firmware) (struct rt2x00_dev *rt2x00dev, 
    541541                              const u8 *data, const size_t len); 
     542        char *(*get_eeprom_file_name) (struct rt2x00_dev *rt2x00dev); 
    542543 
    543544        /* 
    544545         * Device initialization/deinitialization handlers. 
    enum rt2x00_capability_flags { 
    685686        REQUIRE_SW_SEQNO, 
    686687        REQUIRE_HT_TX_DESC, 
    687688        REQUIRE_PS_AUTOWAKE, 
     689        REQUIRE_EEPROM_FILE, 
    688690 
    689691        /* 
    690692         * Capabilities 
    struct rt2x00_dev { 
    940942        const struct firmware *fw; 
    941943 
    942944        /* 
     945         * EEPROM image. 
     946         */ 
     947        const struct firmware *eeprom_file; 
     948 
     949        /* 
    943950         * FIFO for storing tx status reports between isr and tasklet. 
    944951         */ 
    945952        DECLARE_KFIFO_PTR(txstatus_fifo, u32); 
  • drivers/net/wireless/rt2x00/rt2x00lib.h

    a b static inline void rt2x00lib_free_firmwa 
    309309#endif /* CONFIG_RT2X00_LIB_FIRMWARE */ 
    310310 
    311311/* 
     312 * EEPROM file handlers. 
     313 */ 
     314#ifdef CONFIG_RT2X00_LIB_EEPROM 
     315int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev); 
     316void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev); 
     317#else 
     318static inline int rt2x00lib_load_eeprom_file(struct rt2x00_dev *rt2x00dev) 
     319{ 
     320        return 0; 
     321} 
     322static inline void rt2x00lib_free_eeprom_file(struct rt2x00_dev *rt2x00dev) 
     323{ 
     324} 
     325#endif /* CONFIG_RT2X00_LIB_EEPROM_FILE */ 
     326 
     327/* 
    312328 * Debugfs handlers. 
    313329 */ 
    314330#ifdef CONFIG_RT2X00_LIB_DEBUGFS 
  • drivers/net/wireless/rt2x00/Kconfig

    a b config RT2800PCI 
    6060        select RT2X00_LIB_PCI if PCI 
    6161        select RT2X00_LIB_SOC if RALINK_RT288X || RALINK_RT305X 
    6262        select RT2X00_LIB_FIRMWARE 
     63        select RT2X00_LIB_EEPROM 
    6364        select RT2X00_LIB_CRYPTO 
    6465        select CRC_CCITT 
    6566        select EEPROM_93CX6 
    config RT2X00_LIB_FIRMWARE 
    204205config RT2X00_LIB_CRYPTO 
    205206        boolean 
    206207 
     208config RT2X00_LIB_EEPROM 
     209        boolean 
     210 
    207211config RT2X00_LIB_LEDS 
    208212        boolean 
    209213        default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n) 
  • drivers/net/wireless/rt2x00/Makefile

    a b rt2x00lib-$(CONFIG_RT2X00_LIB_DEBUGFS) + 
    77rt2x00lib-$(CONFIG_RT2X00_LIB_CRYPTO)   += rt2x00crypto.o 
    88rt2x00lib-$(CONFIG_RT2X00_LIB_FIRMWARE) += rt2x00firmware.o 
    99rt2x00lib-$(CONFIG_RT2X00_LIB_LEDS)     += rt2x00leds.o 
     10rt2x00lib-$(CONFIG_RT2X00_LIB_EEPROM)   += rt2x00eeprom.o 
    1011 
    1112obj-$(CONFIG_RT2X00_LIB)                += rt2x00lib.o 
    1213obj-$(CONFIG_RT2X00_LIB_PCI)            += rt2x00pci.o 
  • drivers/net/wireless/rt2x00/rt2800pci.c

    a b static void rt2800pci_mcu_status(struct  
    8484        rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0); 
    8585} 
    8686 
    87 #if defined(CONFIG_RALINK_RT288X) || defined(CONFIG_RALINK_RT305X) 
    8887static void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev) 
    8988{ 
    90         void __iomem *base_addr = ioremap(0x1F040000, EEPROM_SIZE); 
    91  
    92         memcpy_fromio(rt2x00dev->eeprom, base_addr, EEPROM_SIZE); 
    93  
    94         iounmap(base_addr); 
     89        memcpy(rt2x00dev->eeprom, rt2x00dev->eeprom_file->data, EEPROM_SIZE); 
    9590} 
    96 #else 
    97 static inline void rt2800pci_read_eeprom_soc(struct rt2x00_dev *rt2x00dev) 
    98 { 
    99 } 
    100 #endif /* CONFIG_RALINK_RT288X || CONFIG_RALINK_RT305X */ 
    10191 
    10292#ifdef CONFIG_PCI 
    10393static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom) 
    static int rt2800pci_write_firmware(stru 
    311301} 
    312302 
    313303/* 
     304 * EEPROM file functions. 
     305 */ 
     306static char *rt2800pci_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev) 
     307{ 
     308        struct rt2x00_platform_data *pdata; 
     309 
     310        pdata = rt2x00dev->dev->platform_data; 
     311        if (pdata) 
     312                return pdata->eeprom_file_name; 
     313 
     314        return NULL; 
     315} 
     316 
     317/* 
    314318 * Initialization functions. 
    315319 */ 
    316320static bool rt2800pci_get_entry_state(struct queue_entry *entry) 
    static const struct rt2x00lib_ops rt2800 
    10501054        .get_firmware_name      = rt2800pci_get_firmware_name, 
    10511055        .check_firmware         = rt2800_check_firmware, 
    10521056        .load_firmware          = rt2800_load_firmware, 
     1057        .get_eeprom_file_name   = rt2800pci_get_eeprom_file_name, 
    10531058        .initialize             = rt2x00pci_initialize, 
    10541059        .uninitialize           = rt2x00pci_uninitialize, 
    10551060        .get_entry_state        = rt2800pci_get_entry_state, 
  • drivers/net/wireless/rt2x00/rt2x00dev.c

    a b int rt2x00lib_probe_dev(struct rt2x00_de 
    11211121        INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled); 
    11221122        INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); 
    11231123 
     1124        retval = rt2x00lib_load_eeprom_file(rt2x00dev); 
     1125        if (retval) 
     1126                goto exit; 
     1127 
    11241128        /* 
    11251129         * Let the driver probe the device to detect the capabilities. 
    11261130         */ 
    void rt2x00lib_remove_dev(struct rt2x00_ 
    12221226         * Free queue structures. 
    12231227         */ 
    12241228        rt2x00queue_free(rt2x00dev); 
     1229 
     1230        /* 
     1231         * Free EEPROM image. 
     1232         */ 
     1233        rt2x00lib_free_eeprom_file(rt2x00dev); 
    12251234} 
    12261235EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev); 
    12271236 
  • drivers/net/wireless/rt2x00/rt2x00soc.c

    a b int rt2x00soc_probe(struct platform_devi 
    9494        rt2x00dev->hw = hw; 
    9595        rt2x00dev->irq = platform_get_irq(pdev, 0); 
    9696        rt2x00dev->name = pdev->dev.driver->name; 
     97        set_bit(REQUIRE_EEPROM_FILE, &rt2x00dev->cap_flags); 
    9798 
    9899        rt2x00_set_chip_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC); 
    99100 
Note: See TracBrowser for help on using the repository browser.