1 /**************************************************************************** 2 **+-----------------------------------------------------------------------+** 3 **| |** 4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 5 **| All rights reserved. |** 6 **| |** 7 **| Redistribution and use in source and binary forms, with or without |** 8 **| modification, are permitted provided that the following conditions |** 9 **| are met: |** 10 **| |** 11 **| * Redistributions of source code must retain the above copyright |** 12 **| notice, this list of conditions and the following disclaimer. |** 13 **| * Redistributions in binary form must reproduce the above copyright |** 14 **| notice, this list of conditions and the following disclaimer in |** 15 **| the documentation and/or other materials provided with the |** 16 **| distribution. |** 17 **| * Neither the name Texas Instruments nor the names of its |** 18 **| contributors may be used to endorse or promote products derived |** 19 **| from this software without specific prior written permission. |** 20 **| |** 21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 32 **| |** 33 **+-----------------------------------------------------------------------+** 34 ****************************************************************************/ 35 36 #include <linux/module.h> 37 #include <linux/kernel.h> 38 #include <linux/version.h> 39 40 #include "mmc_tnetw1150_api.h" 41 #include "esta_drv.h" 42 #include "srcApi.h" 43 #include "osApi.h" 44 #include "whalHwRegs.h" 45 46 #include "tiwlnif.h" 47 #include "osUtil.h" 48 49 #ifdef TIWLAN_MSM7000 50 struct sdio_func *SDIO_GetFunc( void ); 51 #endif 52 53 /* Module parameters */ 54 static char tiwlan_chip_id[10] = "na"; 55 module_param_string(chip_id, tiwlan_chip_id, sizeof(tiwlan_chip_id), S_IWUSR | S_IRUGO); 56 MODULE_PARM_DESC(tiwlan_chip_id, "WiFi chip id"); 57 static char fw_version[10] = "na"; 58 module_param_string(fw_version, fw_version, sizeof(fw_version), S_IWUSR | S_IRUGO); 59 MODULE_PARM_DESC(fw_version, "WiFi firmware version"); 60 61 /* export_wifi_fw_version 62 Exports WiFi firmware version to /sys/module/wlan/parameters/fw_version 63 Returns 0 if OK 64 */ 65 int export_wifi_fw_version( tiwlan_net_dev_t *drv ) 66 { 67 TIWLN_VERSION swVer; 68 unsigned long swLen; 69 int ret; 70 71 if (!drv) 72 return -EINVAL; 73 74 swLen = sizeof(swVer); 75 memset(&swVer, 0, swLen); 76 ret = UtilGetSwVersion(&drv->adapter, (unsigned char *)&swVer, &swLen); 77 if (ret != 0) 78 return -EINVAL; 79 80 fw_version[0] = swVer.FWVersion.major + 48; 81 fw_version[1] = '.'; 82 fw_version[2] = swVer.FWVersion.minor + 48; 83 fw_version[3] = '.'; 84 fw_version[4] = swVer.FWVersion.bugfix + 48; 85 fw_version[5] = '.'; 86 fw_version[6] = swVer.FWVersion.subld + 48; 87 fw_version[7] = '.'; 88 fw_version[8] = swVer.FWVersion.build + 48; 89 fw_version[9] = '\0'; 90 return ret; 91 } 92 93 /* export_wifi_chip_id 94 Reads WiFi chip id (0x07030101) and prints it 95 Returns 0 if OK 96 */ 97 int export_wifi_chip_id( void ) 98 { 99 unsigned char chip_id[4]; 100 unsigned long amap; 101 #ifdef TIWLAN_MSM7000 102 SDIO_Request_t req; 103 struct sdio_func *func; 104 105 func = SDIO_GetFunc(); 106 if (!func) 107 return -EINVAL; 108 109 /* configure partition */ 110 amap = SDIO_DOWNLOAD_PARTITION_START; 111 req.buffer = (unsigned char *)&amap; 112 req.buffer_len = 4; 113 req.peripheral_addr = 0x1ffc4; 114 SDIO_SyncWrite(func, &req); 115 116 amap = SDIO_DOWNLOAD_PARTITION_SIZE; 117 req.buffer = (unsigned char *)&amap; 118 req.buffer_len = 4; 119 req.peripheral_addr = 0x1ffc0; 120 SDIO_SyncWrite(func, &req); 121 122 amap = SDIO_REG_PARTITION_START; 123 req.buffer = (unsigned char *)&amap; 124 req.buffer_len = 4; 125 req.peripheral_addr = 0x1ffcc; 126 SDIO_SyncWrite(func, &req); 127 128 amap = SDIO_REG_PARTITION_SIZE; 129 req.buffer = (unsigned char *)&amap; 130 req.buffer_len = 4; 131 req.peripheral_addr = 0x1ffc8; 132 SDIO_SyncWrite(func, &req); 133 134 /* get TIWLAN1251 ID */ 135 memset(chip_id, 0, 4); 136 req.buffer = chip_id; 137 req.buffer_len = 4; 138 req.peripheral_addr = SDIO_DOWNLOAD_PARTITION_SIZE + CHIP_ID; /* 0x1BE74 */ 139 SDIO_SyncRead(func, &req); 140 #endif 141 #ifdef TIWLAN_OMAP1610 142 /* Can not be read on this stage - SDIO stack is not initialized yet */ 143 amap = TNETW1251_CHIP_ID_PG1_2; 144 memcpy(chip_id, &amap, 4); 145 #endif 146 147 if ((chip_id[2] >= 1) && (chip_id[2] <= 3)){ 148 tiwlan_chip_id[0] = '1'; 149 tiwlan_chip_id[1] = '2'; 150 tiwlan_chip_id[2] = '5'; 151 tiwlan_chip_id[3] = '1'; 152 tiwlan_chip_id[4] = 'P'; 153 tiwlan_chip_id[5] = 'G'; 154 tiwlan_chip_id[6] = '1'; 155 tiwlan_chip_id[7] = '.'; 156 } 157 switch(chip_id[2]){ 158 case 1: 159 tiwlan_chip_id[8] = '0'; 160 printk("TIWLAN: 1251 PG 1.0\n"); 161 break; 162 case 2: 163 tiwlan_chip_id[8] = '1'; 164 printk("TIWLAN: 1251 PG 1.1\n"); 165 break; 166 case 3: 167 tiwlan_chip_id[8] = '2'; 168 printk("TIWLAN: 1251 PG 1.2\n"); 169 break; 170 default: 171 printk("TIWLAN: invalid chip id = 0x%2x%2x%2x%2x!\n", 172 chip_id[3], chip_id[2], chip_id[1], chip_id[0]); 173 return -EINVAL; 174 }; 175 return 0; 176 } 177