blob: d0f89288c2005db7e3f739fa674cdbe96ea35bbc [file] [log] [blame]
/****************************************************************************
**+-----------------------------------------------------------------------+**
**| |**
**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
**| All rights reserved. |**
**| |**
**| Redistribution and use in source and binary forms, with or without |**
**| modification, are permitted provided that the following conditions |**
**| are met: |**
**| |**
**| * Redistributions of source code must retain the above copyright |**
**| notice, this list of conditions and the following disclaimer. |**
**| * Redistributions in binary form must reproduce the above copyright |**
**| notice, this list of conditions and the following disclaimer in |**
**| the documentation and/or other materials provided with the |**
**| distribution. |**
**| * Neither the name Texas Instruments nor the names of its |**
**| contributors may be used to endorse or promote products derived |**
**| from this software without specific prior written permission. |**
**| |**
**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
**| |**
**+-----------------------------------------------------------------------+**
****************************************************************************/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include "mmc_tnetw1150_api.h"
#include "esta_drv.h"
#include "srcApi.h"
#include "osApi.h"
#include "whalHwRegs.h"
#include "tiwlnif.h"
#include "osUtil.h"
#ifdef TIWLAN_MSM7000
struct sdio_func *SDIO_GetFunc( void );
#endif
/* Module parameters */
static char tiwlan_chip_id[10] = "na";
module_param_string(chip_id, tiwlan_chip_id, sizeof(tiwlan_chip_id), S_IWUSR | S_IRUGO);
MODULE_PARM_DESC(tiwlan_chip_id, "WiFi chip id");
static char fw_version[10] = "na";
module_param_string(fw_version, fw_version, sizeof(fw_version), S_IWUSR | S_IRUGO);
MODULE_PARM_DESC(fw_version, "WiFi firmware version");
/* export_wifi_fw_version
Exports WiFi firmware version to /sys/module/wlan/parameters/fw_version
Returns 0 if OK
*/
int export_wifi_fw_version( tiwlan_net_dev_t *drv )
{
TIWLN_VERSION swVer;
unsigned long swLen;
int ret;
if (!drv)
return -EINVAL;
swLen = sizeof(swVer);
memset(&swVer, 0, swLen);
ret = UtilGetSwVersion(&drv->adapter, (unsigned char *)&swVer, &swLen);
if (ret != 0)
return -EINVAL;
fw_version[0] = swVer.FWVersion.major + 48;
fw_version[1] = '.';
fw_version[2] = swVer.FWVersion.minor + 48;
fw_version[3] = '.';
fw_version[4] = swVer.FWVersion.bugfix + 48;
fw_version[5] = '.';
fw_version[6] = swVer.FWVersion.subld + 48;
fw_version[7] = '.';
fw_version[8] = swVer.FWVersion.build + 48;
fw_version[9] = '\0';
return ret;
}
/* export_wifi_chip_id
Reads WiFi chip id (0x07030101) and prints it
Returns 0 if OK
*/
int export_wifi_chip_id( void )
{
unsigned char chip_id[4];
unsigned long amap;
#ifdef TIWLAN_MSM7000
SDIO_Request_t req;
struct sdio_func *func;
func = SDIO_GetFunc();
if (!func)
return -EINVAL;
/* configure partition */
amap = SDIO_DOWNLOAD_PARTITION_START;
req.buffer = (unsigned char *)&amap;
req.buffer_len = 4;
req.peripheral_addr = 0x1ffc4;
SDIO_SyncWrite(func, &req);
amap = SDIO_DOWNLOAD_PARTITION_SIZE;
req.buffer = (unsigned char *)&amap;
req.buffer_len = 4;
req.peripheral_addr = 0x1ffc0;
SDIO_SyncWrite(func, &req);
amap = SDIO_REG_PARTITION_START;
req.buffer = (unsigned char *)&amap;
req.buffer_len = 4;
req.peripheral_addr = 0x1ffcc;
SDIO_SyncWrite(func, &req);
amap = SDIO_REG_PARTITION_SIZE;
req.buffer = (unsigned char *)&amap;
req.buffer_len = 4;
req.peripheral_addr = 0x1ffc8;
SDIO_SyncWrite(func, &req);
/* get TIWLAN1251 ID */
memset(chip_id, 0, 4);
req.buffer = chip_id;
req.buffer_len = 4;
req.peripheral_addr = SDIO_DOWNLOAD_PARTITION_SIZE + CHIP_ID; /* 0x1BE74 */
SDIO_SyncRead(func, &req);
#endif
#ifdef TIWLAN_OMAP1610
/* Can not be read on this stage - SDIO stack is not initialized yet */
amap = TNETW1251_CHIP_ID_PG1_2;
memcpy(chip_id, &amap, 4);
#endif
if ((chip_id[2] >= 1) && (chip_id[2] <= 3)){
tiwlan_chip_id[0] = '1';
tiwlan_chip_id[1] = '2';
tiwlan_chip_id[2] = '5';
tiwlan_chip_id[3] = '1';
tiwlan_chip_id[4] = 'P';
tiwlan_chip_id[5] = 'G';
tiwlan_chip_id[6] = '1';
tiwlan_chip_id[7] = '.';
}
switch(chip_id[2]){
case 1:
tiwlan_chip_id[8] = '0';
printk("TIWLAN: 1251 PG 1.0\n");
break;
case 2:
tiwlan_chip_id[8] = '1';
printk("TIWLAN: 1251 PG 1.1\n");
break;
case 3:
tiwlan_chip_id[8] = '2';
printk("TIWLAN: 1251 PG 1.2\n");
break;
default:
printk("TIWLAN: invalid chip id = 0x%2x%2x%2x%2x!\n",
chip_id[3], chip_id[2], chip_id[1], chip_id[0]);
return -EINVAL;
};
return 0;
}