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