14adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <stdbool.h> 24adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <errno.h> 34adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <time.h> 44adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <net/if.h> 54adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <unistd.h> 64adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <sys/types.h> 74adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <sys/stat.h> 84adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <fcntl.h> 94adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include <sys/mman.h> 104adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 114adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include "calibrator.h" 124adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include "plt.h" 134adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include "ini.h" 144adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#include "nvs.h" 154adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 164adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerSECTION(get); 174adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerSECTION(set); 184adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 194adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int handle_push_nvs(struct nl80211_state *state, 204adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_cb *cb, 214adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, 224adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int argc, char **argv) 234adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 244adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer void *map = MAP_FAILED; 254adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int fd, retval = 0; 264adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nlattr *key; 274adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct stat filestat; 284adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 294adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc != 1) { 304adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 314adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 324adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 334adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fd = open(argv[0], O_RDONLY); 344adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (fd < 0) { 354adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer perror("Error opening file for reading"); 364adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 374adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 384adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 394adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (fstat(fd, &filestat) < 0) { 404adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer perror("Error stating file"); 414adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 424adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 434adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 444adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer map = mmap(0, filestat.st_size, PROT_READ, MAP_SHARED, fd, 0); 454adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (map == MAP_FAILED) { 464adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer perror("Error mmapping the file"); 474adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer goto nla_put_failure; 484adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 494adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 504adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer key = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 514adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (!key) { 524adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer goto nla_put_failure; 534adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 544adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 554adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NLA_PUT_U32(msg, WL1271_TM_ATTR_CMD_ID, WL1271_TM_CMD_NVS_PUSH); 564adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NLA_PUT(msg, WL1271_TM_ATTR_DATA, filestat.st_size, map); 574adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 584adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer nla_nest_end(msg, key); 594adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 604adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer goto cleanup; 614adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 624adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveernla_put_failure: 634adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer retval = -ENOBUFS; 644adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 654adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveercleanup: 664adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (map != MAP_FAILED) { 674adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer munmap(map, filestat.st_size); 684adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 694adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 704adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer close(fd); 714adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 724adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return retval; 734adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 744adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 754adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, push_nvs, "<nvs filename>", 764adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NL80211_CMD_TESTMODE, 0, CIB_PHY, handle_push_nvs, 774adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Push NVS file into the system"); 784adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 794adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#if 0 804adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int handle_fetch_nvs(struct nl80211_state *state, 814adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_cb *cb, 824adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, 834adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int argc, char **argv) 844adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 854adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer char *end; 864adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer void *map = MAP_FAILED; 874adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int fd, retval = 0; 884adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nlattr *key; 894adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct stat filestat; 904adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 914adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc != 0) 924adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 934adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 944adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer key = nla_nest_start(msg, NL80211_ATTR_TESTDATA); 954adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (!key) 964adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer goto nla_put_failure; 974adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 984adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NLA_PUT_U32(msg, WL1271_TM_ATTR_CMD_ID, WL1271_TM_CMD_NVS_PUSH); 994adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NLA_PUT_U32(msg, WL1271_TM_ATTR_IE_ID, WL1271_TM_CMD_NVS_PUSH); 1004adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1014adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer nla_nest_end(msg, key); 1024adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1034adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer goto cleanup; 1044adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1054adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveernla_put_failure: 1064adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer retval = -ENOBUFS; 1074adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1084adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveercleanup: 1094adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (map != MAP_FAILED) 1104adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer munmap(map, filestat.st_size); 1114adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1124adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer close(fd); 1134adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1144adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return retval; 1154adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 1164adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1174adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, fetch_nvs, NULL, 1184adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_fetch_nvs, 1194adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Send command to fetch NVS file"); 1204adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#endif 1214adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int get_nvs_mac(struct nl80211_state *state, struct nl_cb *cb, 1224adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 1234adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 1244adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer unsigned char mac_buff[12]; 1254adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int fd; 1264adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1274adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 1284adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 1294adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1304adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc != 1) { 1314adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 2; 1324adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 1334adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1344adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fd = open(argv[0], O_RDONLY); 1354adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (fd < 0) { 1364adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer perror("Error opening file for reading"); 1374adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 1384adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 1394adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1404adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer read(fd, mac_buff, 12); 1414adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1424adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("MAC addr from NVS: %02x:%02x:%02x:%02x:%02x:%02x\n", 1434adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[11], mac_buff[10], mac_buff[6], 1444adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[5], mac_buff[4], mac_buff[3]); 1454adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1464adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer close(fd); 1474adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1484adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 1494adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 1504adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1514adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(get, nvs_mac, "<nvs filename>", 0, 0, CIB_NONE, get_nvs_mac, 1524adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Get MAC addr from NVS file (offline)"); 1534adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1544adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer/* 1554adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer * Sets MAC address in NVS. 1564adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer * The default value for MAC is random where 1 byte zero. 1574adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer */ 1584adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_nvs_mac(struct nl80211_state *state, struct nl_cb *cb, 1594adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 1604adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 1614adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer unsigned char mac_buff[12]; 1624adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer unsigned char in_mac[6]; 1634adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer int fd; 1644adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1654adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 1664adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 1674adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1684adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc < 1 || (argc == 2 && (strlen(argv[1]) != 17))) { 1694adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 2; 1704adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 1714adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1724adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc == 2) { 1734adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer sscanf(argv[1], "%2x:%2x:%2x:%2x:%2x:%2x", 1744adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer (unsigned int *)&in_mac[0], (unsigned int *)&in_mac[1], 1754adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer (unsigned int *)&in_mac[2], (unsigned int *)&in_mac[3], 1764adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer (unsigned int *)&in_mac[4], (unsigned int *)&in_mac[5]); 1774adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } else { 1784adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer srand((unsigned)time(NULL)); 1794adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1804adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[0] = 0x0; 1814adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[1] = rand()%256; 1824adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[2] = rand()%256; 1834adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[3] = rand()%256; 1844adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[4] = rand()%256; 1854adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[5] = rand()%256; 1864adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 1874adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1884adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fd = open(argv[0], O_RDWR); 1894adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (fd < 0) { 1904adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer perror("Error opening file for reading"); 1914adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 1924adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 1934adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 1944adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer read(fd, mac_buff, 12); 1954adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#if 0 1964adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("Got MAC addr for NVS: %02x:%02x:%02x:%02x:%02x:%02x\n", 1974adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[0], in_mac[1], in_mac[2], 1984adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer in_mac[3], in_mac[4], in_mac[5]); 1994adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2004adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("Got MAC addr from NVS: %02x:%02x:%02x:%02x:%02x:%02x\n", 2014adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[11], mac_buff[10], mac_buff[6], 2024adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[5], mac_buff[4], mac_buff[3]); 2034adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#endif 2044adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[11] = in_mac[0]; 2054adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[10] = in_mac[1]; 2064adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[6] = in_mac[2]; 2074adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[5] = in_mac[3]; 2084adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[4] = in_mac[4]; 2094adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer mac_buff[3] = in_mac[5]; 2104adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2114adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer lseek(fd, 0L, 0); 2124adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2134adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer write(fd, mac_buff, 12); 2144adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2154adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer close(fd); 2164adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2174adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 2184adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 2194adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2204adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, nvs_mac, "<nvs file> [<mac addr>]", 0, 0, CIB_NONE, set_nvs_mac, 2214adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Set MAC addr in NVS file (offline), like XX:XX:XX:XX:XX:XX"); 2224adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2234adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_ref_nvs(struct nl80211_state *state, struct nl_cb *cb, 2244adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 2254adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 2264adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 2274adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 2284adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL, 2294adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .dual_mode = DUAL_MODE_UNSET, 2304adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .done_fem = NO_FEM_PARSED 2314adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 2324adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2334adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 2344adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 2354adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2364adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc != 1) { 2374adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2384adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2394adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2404adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (read_ini(*argv, &cmn)) { 2414adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to read ini file\n"); 2424adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2434adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2444adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2454adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer cfg_nvs_ops(&cmn); 2464adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2474adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (create_nvs_file(&cmn)) { 2484adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to create reference NVS file\n"); 2494adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2504adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2514adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#if 0 2524adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("\n\tThe NVS file (%s) is ready\n\tCopy it to %s and " 2534adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "reboot the system\n\n", 2544adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NEW_NVS_NAME, CURRENT_NVS_NAME); 2554adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#endif 2564adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 2574adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 2584adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2594adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, ref_nvs, "<ini file>", 0, 0, CIB_NONE, set_ref_nvs, 2604adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Create reference NVS file"); 2614adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2624adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_ref_nvs2(struct nl80211_state *state, struct nl_cb *cb, 2634adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 2644adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 2654adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 2664adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 2674adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL, 2684adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .dual_mode = DUAL_MODE_UNSET, 2694adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .done_fem = NO_FEM_PARSED 2704adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 2714adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2724adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 2734adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 2744adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2754adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc != 2) { 2764adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2774adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2784adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2794adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (read_ini(*argv, &cmn)) { 2804adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2814adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2824adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2834adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv++; 2844adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (read_ini(*argv, &cmn)) { 2854adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2864adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2874adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2884adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer cfg_nvs_ops(&cmn); 2894adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 2904adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (create_nvs_file(&cmn)) { 2914adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to create reference NVS file\n"); 2924adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 2934adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 2944adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#if 0 2954adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("\n\tThe NVS file (%s) is ready\n\tCopy it to %s and " 2964adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "reboot the system\n\n", 2974adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer NEW_NVS_NAME, CURRENT_NVS_NAME); 2984adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#endif 2994adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 3004adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 3014adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3024adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, ref_nvs2, "<ini file> <ini file>", 0, 0, CIB_NONE, set_ref_nvs2, 3034adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Create reference NVS file for 2 FEMs"); 3044adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3054adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_upd_nvs(struct nl80211_state *state, struct nl_cb *cb, 3064adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 3074adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 3084adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer char *fname = NULL; 3094adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 3104adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 3114adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL 3124adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 3134adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3144adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 3154adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 3164adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3174adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc < 1) { 3184adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 3194adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3204adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3214adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (read_ini(*argv, &cmn)) { 3224adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to read ini file\n"); 3234adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 3244adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3254adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3264adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer cfg_nvs_ops(&cmn); 3274adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3284adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc == 2) { 3294adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fname = *++argv; 3304adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3314adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3324adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (update_nvs_file(fname, &cmn)) { 3334adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to update NVS file\n"); 3344adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 3354adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3364adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#if 0 3374adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer printf("\n\tThe updated NVS file (%s) is ready\n\tCopy it to %s and " 3384adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "reboot the system\n\n", NEW_NVS_NAME, CURRENT_NVS_NAME); 3394adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer#endif 3404adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 3414adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 3424adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3434adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, upd_nvs, "<ini file> [<nvs file>]", 0, 0, CIB_NONE, set_upd_nvs, 3444adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Update values of a NVS from INI file"); 3454adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3464adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int get_dump_nvs(struct nl80211_state *state, struct nl_cb *cb, 3474adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 3484adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 3494adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer char *fname = NULL; 3504adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 3514adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 3524adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL 3534adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 3544adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3554adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 3564adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 3574adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3584adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc > 0) { 3594adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fname = *argv; 3604adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3614adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3624adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (dump_nvs_file(fname, &cmn)) { 3634adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to dump NVS file\n"); 3644adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 3654adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3664adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3674adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 3684adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 3694adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3704adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(get, dump_nvs, "[<nvs file>]", 0, 0, CIB_NONE, get_dump_nvs, 3714adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Dump NVS file, specified by option or current"); 3724adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3734adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_autofem(struct nl80211_state *state, struct nl_cb *cb, 3744adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 3754adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 3764adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer char *fname = NULL; 3774adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer unsigned char val; 3784adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 3794adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 3804adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL 3814adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 3824adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3834adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 3844adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 3854adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3864adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc < 1) { 3874adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Missing argument\n"); 3884adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 2; 3894adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3904adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3914adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer sscanf(argv[0], "%2x", (unsigned int *)&val); 3924adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3934adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc == 2) { 3944adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fname = argv[1]; 3954adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 3964adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 3974adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (set_nvs_file_autofem(fname, val, &cmn)) { 3984adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to set AutoFEM\n"); 3994adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 4004adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 4014adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4024adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 4034adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 4044adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4054adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, autofem, "<0-manual|1-auto> [<nvs file>]", 0, 0, CIB_NONE, set_autofem, 4064adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Set Auto FEM detection, where 0 - manual, 1 - auto detection"); 4074adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4084adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveerstatic int set_fem_manuf(struct nl80211_state *state, struct nl_cb *cb, 4094adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct nl_msg *msg, int argc, char **argv) 4104adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer{ 4114adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer char *fname = NULL; 4124adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer unsigned char val; 4134adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer struct wl12xx_common cmn = { 4144adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .arch = UNKNOWN_ARCH, 4154adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer .parse_ops = NULL 4164adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer }; 4174adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4184adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argc -= 2; 4194adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer argv += 2; 4204adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4214adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc < 1) { 4224adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Missing argument\n"); 4234adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 2; 4244adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 4254adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4264adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer sscanf(argv[0], "%2x", (unsigned int *)&val); 4274adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4284adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (argc == 2) { 4294adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fname = argv[1]; 4304adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 4314adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4324adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer if (set_nvs_file_fem_manuf(fname, val, &cmn)) { 4334adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer fprintf(stderr, "Fail to set AutoFEM\n"); 4344adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 1; 4354adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer } 4364adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4374adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer return 0; 4384adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer} 4394adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 4404adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal MahaveerCOMMAND(set, fem_manuf, "<0|1> [<nvs file>]", 0, 0, CIB_NONE, set_fem_manuf, 4414adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer "Set FEM manufacturer"); 4424adf0a82f66de9379c5e37d5dd0831a70cb6f236Vishal Mahaveer 443