diff --git a/changelog.txt b/changelog.txt index d74a2cb..8db8acb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +2023/11/17 + 1. 支持设置国家码 + 2. SCAN AP列表信息修改,支持输出国家码和BSS BW。 + 3. SCAN功能修改,通过参数控制是否清空BSS List。 + 2023/08/04 1. 支持接口聚合收发功能,此功能默认关闭,1.x版本固件不支持聚合功能。 2. sleep流程调整:sleep命令发送完成后立即设置sleep标识,拦截后续所有的数据;sleep命令的resp失败时再清除sleep标识。 diff --git a/doc/泰芯Linux_WiFi_FMAC驱动开发指南.pdf b/doc/泰芯Linux_WiFi_FMAC驱动开发指南.pdf index 0ceccd3..c884ae0 100644 Binary files a/doc/泰芯Linux_WiFi_FMAC驱动开发指南.pdf and b/doc/泰芯Linux_WiFi_FMAC驱动开发指南.pdf differ diff --git a/hgic.h b/hgic.h index 212aad2..45a1e77 100644 --- a/hgic.h +++ b/hgic.h @@ -25,6 +25,16 @@ struct hgic_bss_info { unsigned short freq; }; +struct hgic_bss_info1 { + unsigned char bssid[6]; + unsigned char ssid[32]; + unsigned char encrypt: 6, ver: 2; + signed char signal; + unsigned short freq; + unsigned char country_region[4]; + unsigned char bss_bw; +}; + struct hgic_fw_info { unsigned int version; unsigned int svn_version; @@ -94,9 +104,11 @@ struct hgic_tx_info { unsigned char band; unsigned char tx_bw; unsigned char tx_mcs; - unsigned char antenna; - unsigned int tx_flags; - unsigned int tx_flags2; + unsigned char freq_idx: 5, antenna: 3; + unsigned int tx_flags; + unsigned short tx_flags2; + unsigned char priority; + unsigned char tx_power; }; struct bt_rx_info { @@ -239,7 +251,7 @@ enum hgic_cmd { HGIC_CMD_SET_MAC = 3, /* fmac/smac */ HGIC_CMD_SET_SSID = 4, /* fmac */ HGIC_CMD_SET_BSSID = 5, /* fmac */ - HGIC_CMD_SET_COUNTERY = 6, /* fmac */ + HGIC_CMD_SET_COUNTRY = 6, /* fmac */ HGIC_CMD_SET_CHANNEL = 7, /* fmac */ HGIC_CMD_SET_CENTER_FREQ = 8, /* smac */ HGIC_CMD_SET_RTS_THRESHOLD = 9, /* smac */ diff --git a/hgic_def.h b/hgic_def.h index fb688cf..3687120 100644 --- a/hgic_def.h +++ b/hgic_def.h @@ -69,9 +69,10 @@ enum hgic_bus_flag { #define hgic_pick_values(pick_type, str, array, size) do{\ char *__ptr = NULL;\ + char *__str = str; \ memset(array, 0, size*sizeof(pick_type));\ if((str) && strlen((str)) > 0){\ - while ((__ptr = strsep((char **)&(str), ",")) != NULL) {\ + while ((__ptr = strsep((char **)&(__str), ",")) != NULL) {\ if (argcnt >= size) break;\ array[argcnt++] = (pick_type)simple_strtol(__ptr, 0, 0);\ }\ diff --git a/hgic_fmac/core.c b/hgic_fmac/core.c index 41c0b3c..2179bc5 100644 --- a/hgic_fmac/core.c +++ b/hgic_fmac/core.c @@ -758,9 +758,7 @@ static int hgicf_download_fw(struct hgicf_wdev *hg) } } - if (!no_bootdl && hg->bus->reinit && test_bit(HGIC_BUS_FLAGS_NOPOLL, &hg->bus->flags)) { - mod_timer(&hg->detect_tmr, jiffies + msecs_to_jiffies(HGIC_DETECT_TIMER * 4)); - } + mod_timer(&hg->detect_tmr, jiffies + msecs_to_jiffies(HGIC_DETECT_TIMER)); hg->fw_state = status; return (status == STATE_FW); } @@ -886,9 +884,12 @@ static void hgicf_probe_post(void *priv) static int hgicf_core_suspend(void *hgobj) { int err = 0; + u32 vals[2] = {1, 0xffffffff}; struct hgicf_wdev *hg = (struct hgicf_wdev *)hgobj; if (!test_bit(HGIC_BUS_FLAGS_SLEEP, &hg->bus->flags)) { - err = hgic_fwctrl_enter_sleep(&hg->ctrl, HGIC_WDEV_ID_STA, 1, 0xffffffff); + if(hg->fwinfo.version < 0x02000000) vals[0] = 0xffff; + hgic_dbg("enter sleep : type:%d, sleep_ms:%d ...\r\n", vals[0], vals[1]); + err = hgic_fwctrl_enter_sleep(&hg->ctrl, HGIC_WDEV_ID_STA, vals[0], vals[1]); } return err; } diff --git a/hgic_fmac/ctrl.c b/hgic_fmac/ctrl.c index 6ba0897..d0e80b1 100644 --- a/hgic_fmac/ctrl.c +++ b/hgic_fmac/ctrl.c @@ -58,7 +58,7 @@ int hgicf_ioctl_savecfg(struct net_device *dev, struct iwreq *wrqin) int hgicf_ioctl_scan(struct net_device *dev, struct iwreq *wrqin) { struct hgicf_vif *vif = (struct hgicf_vif *)netdev_priv(dev); - return hgic_fwctrl_scan(&(vif->hg->ctrl), vif->fwifidx); + return hgic_fwctrl_scan(&(vif->hg->ctrl), vif->fwifidx, 1); } int hgicf_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) diff --git a/hgic_fmac/procfs.c b/hgic_fmac/procfs.c index b777ceb..d6e6728 100644 --- a/hgic_fmac/procfs.c +++ b/hgic_fmac/procfs.c @@ -183,8 +183,9 @@ static ssize_t hgicf_iwpriv_write(struct file *file, const char __user *buffer, return -EINVAL; } } - } else if (strcasecmp(cmd, "scan") == 0) { - ret = hgic_fwctrl_scan(&hg->ctrl, vif->fwifidx); + } else if (strncasecmp(cmd, "scan", 4) == 0) { + char *ptr = strchr(cmd, '='); + ret = hgic_fwctrl_scan(&hg->ctrl, vif->fwifidx, (ptr ? (u8)simple_strtol(ptr+1, 0, 10) : 1)); } else if (strcasecmp(cmd, "save") == 0) { ret = hgic_fwctrl_save_cfg(&hg->ctrl, vif->fwifidx); #if 0 diff --git a/tools/test_app/hgic.h b/tools/test_app/hgic.h index 212aad2..45a1e77 100644 --- a/tools/test_app/hgic.h +++ b/tools/test_app/hgic.h @@ -25,6 +25,16 @@ struct hgic_bss_info { unsigned short freq; }; +struct hgic_bss_info1 { + unsigned char bssid[6]; + unsigned char ssid[32]; + unsigned char encrypt: 6, ver: 2; + signed char signal; + unsigned short freq; + unsigned char country_region[4]; + unsigned char bss_bw; +}; + struct hgic_fw_info { unsigned int version; unsigned int svn_version; @@ -94,9 +104,11 @@ struct hgic_tx_info { unsigned char band; unsigned char tx_bw; unsigned char tx_mcs; - unsigned char antenna; - unsigned int tx_flags; - unsigned int tx_flags2; + unsigned char freq_idx: 5, antenna: 3; + unsigned int tx_flags; + unsigned short tx_flags2; + unsigned char priority; + unsigned char tx_power; }; struct bt_rx_info { @@ -239,7 +251,7 @@ enum hgic_cmd { HGIC_CMD_SET_MAC = 3, /* fmac/smac */ HGIC_CMD_SET_SSID = 4, /* fmac */ HGIC_CMD_SET_BSSID = 5, /* fmac */ - HGIC_CMD_SET_COUNTERY = 6, /* fmac */ + HGIC_CMD_SET_COUNTRY = 6, /* fmac */ HGIC_CMD_SET_CHANNEL = 7, /* fmac */ HGIC_CMD_SET_CENTER_FREQ = 8, /* smac */ HGIC_CMD_SET_RTS_THRESHOLD = 9, /* smac */ diff --git a/tools/test_app/iwpriv.c b/tools/test_app/iwpriv.c index af9203f..13d00a7 100644 --- a/tools/test_app/iwpriv.c +++ b/tools/test_app/iwpriv.c @@ -581,11 +581,11 @@ int hgic_iwpriv_unpair(char *ifname, char *mac) { return hgic_iwpriv_set_mac(ifname, "unpair", mac); } -int hgic_iwpriv_scan(char *ifname) +int hgic_iwpriv_scan(char *ifname, int scan_cmd) { char cmd[32]; memset(cmd, 0, sizeof(cmd)); - sprintf(cmd, "%s scan", ifname); + sprintf(cmd, "%s scan=%d", ifname, scan_cmd); return hgic_iwpriv_do(cmd, 0, 0, 0, 0); } int hgic_iwpriv_save(char *ifname) @@ -1396,3 +1396,7 @@ int hgic_iwpriv_get_signal(char *ifname) return hgic_iwpriv_get_int(ifname, "signal"); } +int hgic_iwpriv_set_countryregion(char *ifname, char country[2]) +{ + return hgic_iwpriv_set_bytes(ifname, "country_region", country, 2); +} diff --git a/utils/ah_freqinfo.c b/utils/ah_freqinfo.c index 01f3433..f5246f1 100644 --- a/utils/ah_freqinfo.c +++ b/utils/ah_freqinfo.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file ah_freqinfo.c * @author HUGE-IC Application Team - * @version V1.0.0 - * @date 2021-06-23 + * @version V1.0.1 + * @date 2023-11-7 * @brief IEEE802.11 AH Frequency defines ****************************************************************************** * @attention @@ -13,68 +13,79 @@ ****************************************************************************** */ -typedef unsigned char uint8; -typedef unsigned short uint16; #define ARRAYSIZE(arr) (sizeof(arr) / sizeof((arr)[0])) struct ieee80211_ah_freqinfo { - uint8 s1g_opclass, type, max_txpower, rev; - uint16 freqlist[16]; + unsigned char s1g_opclass, type, max_txpower, freq_count; + int freqlist[16]; }; -const struct ieee80211_ah_freqinfo ah_freqs[] = { - {1, 1, 30, 0, { 9020+5*1, 9020+5*3, 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43, - 9020+5*45, 9020+5*47, 9020+5*49, 9020+5*51}}, /*U.S., 1M, type1*/ - {1, 2, 30, 0, { 9020+5*5, 9020+5*7, 9020+5*9, 9020+5*11, 9020+5*13, 9020+5*15, - 9020+5*17, 9020+5*19, 9020+5*21, 9020+5*23, 9020+5*25, 9020+5*27, - 9020+5*29, 9020+5*31, 9020+5*33, 9020+5*35}}, /*U.S., 1M, type2*/ - {2, 1, 30, 0, { 9020+5*2, 9020+5*38, 9020+5*42, 9020+5*46, 9020+5*50}}, /*U.S., 2M, type1*/ - {2, 2, 30, 0, { 9020+5*6, 9020+5*10, 9020+5*14, 9020+5*18, 9020+5*22, 9020+5*26, 9020+5*30, 9020+5*34}}, /*U.S., 2M, type2*/ - {3, 1, 30, 0, { 9020+5*40, 9020+5*48}}, /*U.S., 4M, type1*/ - {3, 2, 30, 0, { 9020+5*8, 9020+5*16, 9020+5*24, 9020+5*32}}, /*U.S., 4M, type2*/ - {4, 1, 30, 0, { 9020+5*44}}, /*U.S., 8M, type1*/ - {4, 2, 30, 0, { 9020+5*12, 9020+5*28}}, /*U.S., 8M, type2*/ - {5, 2, 30, 0, { 9020+5*20}}, /*U.S., 16M, type2*/ +const struct ieee80211_ah_freqinfo ah_freqs[] = {//fixed type to 1 + {1, 1, 22, 6, { 9055, 9095, 9135, 9175, 9215, 9255}}, /*U.S., 1M, type1*/ + //{1, 2, 22, 16, { 9020+5*5, 9020+5*7, 9020+5*9, 9020+5*11, 9020+5*13, 9020+5*15, + // 9020+5*17, 9020+5*19, 9020+5*21, 9020+5*23, 9020+5*25, 9020+5*27, + // 9020+5*29, 9020+5*31, 9020+5*33, 9020+5*35}}, /*U.S., 1M, type2*/ + {2, 1, 22, 6, { 9050, 9090, 9130, 9170, 9210, 9250}}, /*U.S., 2M, type1*/ + //{2, 2, 22, 8, { 9020+5*6, 9020+5*10, 9020+5*14, 9020+5*18, 9020+5*22, 9020+5*26, 9020+5*30, 9020+5*34}}, /*U.S., 2M, type2*/ + {3, 1, 22, 5, { 9060, 9100, 9140, 9180, 9220}}, /*U.S., 4M, type1, 926M deleted*/ + //{3, 2, 22, 4, { 9020+5*8, 9020+5*16, 9020+5*24, 9020+5*32}}, /*U.S., 4M, type2*/ + {4, 1, 22, 3, { 9080, 9160, 9240}}, /*U.S., 8M, type1*/ + //{4, 2, 22, 2, { 9020+5*12, 9020+5*28}}, /*U.S., 8M, type2*/ + //{5, 2, 22, 1, { 9020+5*20}}, /*U.S., 16M, type2*/ - {6, 1, 14, 0, { 8630+5*1, 8630+5*3, 8630+5*5, 8630+5*7, 8630+5*9}}, /*Europe, 1M, type1*/ - {7, 1, 14, 0, { 8630+5*2, 8630+5*6}}, /*Europe, 2M, type1*/ + {6, 1, 6, 5, { 8635, 8645, 8655, 8665, 8675}}, /*Europe, 1M, type1*/ + //{7, 2, 6, 2, { 8630+5*2, 8630+5*6}}, /*Europe, 2M, type1*/ + {8, 1, 6, 1, { 8660}}, /*Europe, 2M, for audio&video*/ - {8, 1, 23, 0, { 9165+5*1, 9165+5*3, 9165+5*5, 9165+5*7, 9165+5*9, 9165+5*11, - 9165+5*13, 9165+5*15, 9165+5*17, 9165+5*19, 9165+5*21}}, /*Japan, 1M, type1*/ - - {9, 1, 10, 0, { 7550+5*1, 7550+5*3, 7550+5*5, 7550+5*7, 7550+5*9, + //invalid in China + /*{9, 1, 10, 16, { 7550+5*1, 7550+5*3, 7550+5*5, 7550+5*7, 7550+5*9, 7550+5*11, 7550+5*13, 7550+5*15, 7550+5*17, 7550+5*19, 7550+5*21, 7550+5*23, 7550+5*25, 7550+5*27, - 7550+5*29, 7550+5*31}}, /*China, 1M, type1*/ - /*{10, 1, 10, 0, { 7790+5*1, 7790+5*3, 7790+5*5, 7790+5*7, 7790+5*9, + 7550+5*29, 7550+5*31}},*/ /*China, 1M, type1*/ + /*{10, 1, 10, 8, { 7790+5*1, 7790+5*3, 7790+5*5, 7790+5*7, 7790+5*9, 7790+5*11, 7790+5*13, 7790+5*15}},*/ /*China, 1M, type1*/ - {11, 2, 10, 0, { 7790+5*2, 7790+5*6, 7790+5*10, 7790+5*14}}, /*China, 2M, type2*/ - {12, 2, 10, 0, { 7790+5*4, 7790+5*12}}, /*China, 4M, type2*/ - {13, 2, 10, 0, { 7790+5*8}}, /*China, 8M, type2*/ + //{11, 2, 10, 4, { 7790+5*2, 7790+5*6, 7790+5*10, 7790+5*14}}, /*China, 2M, type2*/ + //{12, 2, 10, 2, { 7790+5*4, 7790+5*12}}, /*China, 4M, type2*/ + //{13, 2, 10, 1, { 7790+5*8}}, /*China, 8M, type2*/ - {14, 1, 10, 0, { 9175+5*1, 9175+5*3, 9175+5*5, 9175+5*7, 9175+5*9, 9175+5*11}}, /*Korea, 1M, type1*/ - {15, 1, 10, 0, { 9175+5*2, 9175+5*6, 9175+5*10}}, /*Korea, 2M, type1*/ - {16, 1, 10, 0, { 9175+5*8}}, /*Korea, 4M, type1*/ + {14, 1, 10, 6, { 9180, 9190, 9200, 9210, 9220, 9230}}, /*Korea, 1M, type1*/ + {15, 1, 10, 3, { 9185, 9205, 9225}}, /*Korea, 2M, type1*/ + {16, 1, 10, 1, { 9215}}, /*Korea, 4M, type1*/ - {17, 1, 26, 0, { 8630+5*7, 8630+5*9, 8630+5*11, 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43, 9020+5*45}}, /*Singapore, 1M, type1*/ - {19, 1, 26, 0, { 8630+5*10, 9020+5*38, 9020+5*42}}, /*Singapore, 2M, type1*/ - {21, 1, 26, 0, { 9020+5*40}}, /*Singapore, 4M, type1*/ + {17, 1, 20, 5, { 9205, 9215, 9225, 9235, 9245}}, /*Singapore, 1M, type1*/ + {19, 1, 20, 2, { 9215, 9235}}, /*Singapore, 2M, type1*/ + {21, 1, 20, 1, { 9225}}, /*Singapore, 4M, type1*/ - {22, 1, 30, 0, { 9020+5*27, 9020+5*29, 9020+5*31, 9020+5*33, 9020+5*35}}, /*Australia, 1M, type1*/ - {22, 2, 30, 0, { 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43, 9020+5*45, 9020+5*47, 9020+5*49, 9020+5*51}}, /*Australia, 1M, type2*/ - {23, 1, 30, 0, { 9020+5*28, 9020+5*32}}, /*Australia, 2M, type1*/ - {23, 2, 30, 0, { 9020+5*38, 9020+5*42, 9020+5*46, 9020+5*50}}, /*Australia, 2M, type2*/ - {24, 1, 30, 0, { 9020+5*30}}, /*Australia, 4M, type1*/ - {24, 2, 30, 0, { 9020+5*40, 9020+5*48}}, /*Australia, 4M, type2*/ - {25, 2, 30, 0, { 9020+5*44}}, /*Australia, 8M, type2*/ + {22, 1, 22, 6, { 9165, 9185, 9205, 9225, 9245, 9265}}, /*Australia, 1M, type1*/ + //{22, 2, 30, 8, { 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43, 9020+5*45, 9020+5*47, 9020+5*49, 9020+5*51}}, /*Australia, 1M, type2*/ + {23, 1, 22, 6, { 9160, 9180, 9210, 9230, 9250, 9270}}, /*Australia, 2M, type1*/ + //{23, 2, 30, 4, { 9020+5*38, 9020+5*42, 9020+5*46, 9020+5*50}}, /*Australia, 2M, type2*/ + {24, 1, 22, 3, { 9170, 9220, 9260}}, /*Australia, 4M, type1*/ + //{24, 2, 30, 2, { 9020+5*40, 9020+5*48}}, /*Australia, 4M, type2*/ + {25, 1, 22, 1, { 9240}}, /*Australia, 8M, type2*/ - {26, 1, 36, 0, { 9020+5*27, 9020+5*29, 9020+5*31, 9020+5*33, 9020+5*35, 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43}}, /*New Zealand, 1M, type1*/ - {26, 2, 36, 0, { 9020+5*45, 9020+5*47, 9020+5*49, 9020+5*51}}, /*New Zealand, 1M, type2*/ - {27, 1, 36, 0, { 9020+5*28, 9020+5*32, 9020+5*36, 9020+5*40}}, /*New Zealand, 2M, type1*/ - {27, 2, 36, 0, { 9020+5*46, 9020+5*50}}, /*New Zealand, 2M, type2*/ - {28, 1, 36, 0, { 9020+5*30, 9020+5*38}}, /*New Zealand, 4M, type1*/ - {28, 2, 36, 0, { 9020+5*48}}, /*New Zealand, 4M, type2*/ - {29, 1, 36, 0, { 9020+5*34}}, /*New Zealand, 8M, type1*/ + //{26, 1, 36, 9, { 9020+5*27, 9020+5*29, 9020+5*31, 9020+5*33, 9020+5*35, 9020+5*37, 9020+5*39, 9020+5*41, 9020+5*43}}, /*New Zealand, 1M, type1*/ + {26, 1, 28, 4, { 9245, 9255, 9265, 9275}}, /*New Zealand, 1M, type2*/ + //{27, 1, 36, 4, { 9020+5*28, 9020+5*32, 9020+5*36, 9020+5*40}}, /*New Zealand, 2M, type1*/ + {27, 1, 28, 2, { 9250, 9270}}, /*New Zealand, 2M, type2*/ + //{28, 1, 36, 2, { 9020+5*30, 9020+5*38}}, /*New Zealand, 4M, type1*/ + {28, 1, 28, 1, { 9260}}, /*New Zealand, 4M, type2*/ + {29, 1, 5, 1, { 9190}}, /*New Zealand, 8M, type1*/ + + {30, 1, 20, 2, { 9210, 9220}}, /*Indonesia, 1M, type1*/ + {31, 1, 20, 1, { 9215}}, /*Indonesia, 2M, type1*/ + + {32, 1, 8, 5, { 9180, 9200, 9220, 9240, 9260}}, /*Japan, 1M, type1*/ + {33, 1, 8, 3, { 9220, 9240, 9260}}, /*Japan, 2M, type1*/ + {34, 1, 8, 1, { 9240}}, /*Japan, 4M, type1*/ + + {35, 1, 20, 5, { 9195, 9205, 9215, 9225, 9235}}, /*Malaysia, 1M, type1*/ + {36, 1, 20, 2, { 9205, 9225}}, /*Malaysia, 2M, type1*/ + {37, 1, 20, 1, { 9215}}, /*Malaysia, 4M, type1*/ + + {38, 1, 10, 5, { 9205, 9215, 9225, 9235, 9245}}, /*Thailand, 1M, type1*/ + {39, 1, 10, 2, { 9215, 9235}}, /*Thailand, 2M, type1*/ + {40, 1, 10, 1, { 9225}}, /*Thailand, 4M, type1*/ }; struct ieee80211_ah_freqinfo *hgic_get_ah_freqinfo(char *country_code, char bw, char type) @@ -96,22 +107,17 @@ struct ieee80211_ah_freqinfo *hgic_get_ah_freqinfo(char *country_code, char bw, } else if (strcmp(country_code, "EU") == 0) { switch (bw) { case 1: s1g_opclass = 6; break; - case 2: s1g_opclass = 7; break; + case 2: s1g_opclass = 8; break; default: break; }; - } else if (strcmp(country_code, "JP") == 0) { - switch (bw) { - case 1: s1g_opclass = 8; break; - default: break; - }; - } else if (strcmp(country_code, "CN") == 0) { +/* } else if (strcmp(country_code, "CN") == 0) { switch (bw) { case 1: s1g_opclass = 9; break; case 2: s1g_opclass = 11; break; case 4: s1g_opclass = 12; break; case 8: s1g_opclass = 13; break; default: break; - }; + };*/ } else if (strcmp(country_code, "KR") == 0) { switch (bw) { case 1: s1g_opclass = 14; break; @@ -126,7 +132,7 @@ struct ieee80211_ah_freqinfo *hgic_get_ah_freqinfo(char *country_code, char bw, case 4: s1g_opclass = 21; break; default: break; }; - } else if (strcmp(country_code, "AZ") == 0) { + } else if (strcmp(country_code, "AU") == 0) { switch (bw) { case 1: s1g_opclass = 22; break; case 2: s1g_opclass = 23; break; @@ -142,6 +148,33 @@ struct ieee80211_ah_freqinfo *hgic_get_ah_freqinfo(char *country_code, char bw, case 8: s1g_opclass = 29; break; default: break; }; + } else if (strcmp(country_code, "ID") == 0) { + switch (bw) { + case 1: s1g_opclass = 30; break; + case 2: s1g_opclass = 31; break; + default: break; + }; + } else if (strcmp(country_code, "JP") == 0) { + switch (bw) { + case 1: s1g_opclass = 32; break; + case 2: s1g_opclass = 33; break; + case 4: s1g_opclass = 34; break; + default: break; + }; + } else if (strcmp(country_code, "MY") == 0) { + switch (bw) { + case 1: s1g_opclass = 35; break; + case 2: s1g_opclass = 36; break; + case 4: s1g_opclass = 37; break; + default: break; + }; + } else if (strcmp(country_code, "TH") == 0) { + switch (bw) { + case 1: s1g_opclass = 38; break; + case 2: s1g_opclass = 39; break; + case 4: s1g_opclass = 40; break; + default: break; + }; } for (i = 0; s1g_opclass && i < ARRAYSIZE(ah_freqs); i++) { @@ -152,67 +185,21 @@ struct ieee80211_ah_freqinfo *hgic_get_ah_freqinfo(char *country_code, char bw, return NULL; } -#ifdef __linux__ /*for linux*/ -void hgic_ah_set_country_region(char *country_code, char bw, char type) +int hgic_ah_set_country_region(char *country_code, char bw, char type) // type fixed to 1 { - int i = 0; - char *ptr = NULL; - char cmd[128]; - struct ieee80211_ah_freqinfo *freqinfo = NULL; + int ret = 0; + struct ieee80211_ah_freqinfo *freqinfo = hgic_get_ah_freqinfo(country_code, bw, type); - freqinfo = hgic_get_ah_freqinfo(country_code, bw, type); if (freqinfo == NULL) { printf("invalid country region: %s, bw:%d, type:%d", country_code, bw, type); - return; + return -1; } - /*set freq list*/ - ptr = cmd; - memset(cmd, 0, sizeof(cmd)); - strcpy(ptr, "iwpriv hg0 set chan_list="); - ptr += strlen(ptr); - for (i = 0; i < 16 && freqinfo->freqlist[i]; i++) { - sprintf(ptr, "%d,", freqinfo->freqlist[i]); - ptr += strlen(ptr); - } - if (i > 0) { - *(ptr--) = 0; - system(cmd); - } - + ret |= hgic_iwpriv_set_chan_list("hg0", freqinfo->freqlist, freqinfo->freq_count); /*set bw*/ - memset(cmd, 0, sizeof(cmd)); - sprintf(cmd, "iwpriv hg0 set bss_bw=%d", bw); - system(cmd); - + ret |= hgic_iwpriv_set_bss_bw("hg0", bw); /*set tx power*/ - memset(cmd, 0, sizeof(cmd)); - sprintf(cmd, "iwpriv hg0 set txpower=%d", freqinfo->max_txpower); - system(cmd); + ret |= hgic_iwpriv_set_txpower("hg0", freqinfo->max_txpower); + return ret; } -#else /*for rtos*/ -void hgic_ah_set_country_region(char *country_code, char bw, char type) -{ - int i = 0; - struct ieee80211_ah_freqinfo *freqinfo = NULL; - - freqinfo = hgic_get_ah_freqinfo(country_code, bw, type); - if (freqinfo == NULL) { - printf("invalid country region: %s, bw:%d, type:%d", country_code, bw, type); - return; - } - - /*set freq list*/ - while (i < 16 && freqinfo->freqlist[i]) i++; - if (i > 0) { - hgicf_cmd("w0", HGIC_CMD_SET_CHAN_LIST, (unsigned int)&freqinfo->freqlist, i); - } - - /*set bw*/ - hgicf_cmd("w0", HGIC_CMD_SET_BSS_BW, bw, 0); - - /*set max power*/ - hgicf_cmd("w0", HGIC_CMD_SET_TX_POWER, freqinfo->max_txpower, 0); -} -#endif diff --git a/utils/fwctrl.c b/utils/fwctrl.c index 1fceb7b..88f1f5a 100644 --- a/utils/fwctrl.c +++ b/utils/fwctrl.c @@ -320,7 +320,7 @@ int hgic_fwctrl_get_fwinfo(struct hgic_fwctrl *ctrl, u8 ifidx, struct hgic_fw_in int hgic_fwctrl_set_countryregion(struct hgic_fwctrl *ctrl, u8 ifidx, u8 *country_code) { - return hgic_fwctrl_set_bytes(ctrl, ifidx, HGIC_CMD_SET_COUNTERY, country_code, STR_LEN(country_code)); + return hgic_fwctrl_set_bytes(ctrl, ifidx, HGIC_CMD_SET_COUNTRY, country_code, STR_LEN(country_code)); } int hgic_fwctrl_set_ssid(struct hgic_fwctrl *ctrl, u8 ifidx, u8 *ssid) @@ -523,9 +523,9 @@ int hgic_fwctrl_get_scan_list(struct hgic_fwctrl *ctrl, u8 ifidx, u8 *buff, u32 return hgic_fwctrl_get_bytes(ctrl, ifidx, HGIC_CMD_GET_SCAN_LIST, buff, size); } -int hgic_fwctrl_scan(struct hgic_fwctrl *ctrl, u8 ifidx) +int hgic_fwctrl_scan(struct hgic_fwctrl *ctrl, u8 ifidx, u8 scan_cmd) { - return hgic_fwctrl_set_byte(ctrl, ifidx, HGIC_CMD_SCAN, 1); + return hgic_fwctrl_set_byte(ctrl, ifidx, HGIC_CMD_SCAN, scan_cmd); } int hgic_fwctrl_set_txq_param(struct hgic_fwctrl *ctrl, u8 ifidx, u8 ac, struct hgic_txq_param *param) @@ -977,7 +977,7 @@ int hgic_fwctrl_set_psconnect_dis(struct hgic_fwctrl *ctrl, u8 ifidx, u8 dis) return hgic_fwctrl_set_byte(ctrl, ifidx, HGIC_CMD_SET_DIS_PSCONNECT, dis); } -int hgic_fwctrl_set_blenc_en(struct hgic_fwctrl *ctrl, u8 ifidx, u8 data[3]) +int hgic_fwctrl_set_blenc_en(struct hgic_fwctrl *ctrl, u8 ifidx, u8 data[2]) { return hgic_fwctrl_set_bytes(ctrl, ifidx, HGIC_CMD_SET_BLENC_EN, data, 2); } diff --git a/utils/fwctrl.h b/utils/fwctrl.h index cccb2fd..4569acd 100644 --- a/utils/fwctrl.h +++ b/utils/fwctrl.h @@ -95,7 +95,7 @@ int hgic_fwctrl_set_primary_chan(struct hgic_fwctrl *ctrl, u8 ifidx, u8 primary_ int hgic_fwctrl_set_aid(struct hgic_fwctrl *ctrl, u8 ifidx, u32 aid); int hgic_fwctrl_set_mac(struct hgic_fwctrl *ctrl, u8 ifidx, u8 *mac_addr); int hgic_fwctrl_get_scan_list(struct hgic_fwctrl *ctrl, u8 ifidx, u8 *buff, u32 size); -int hgic_fwctrl_scan(struct hgic_fwctrl *ctrl, u8 ifidx); +int hgic_fwctrl_scan(struct hgic_fwctrl *ctrl, u8 ifidx, u8 scan_cmd); int hgic_fwctrl_set_txq_param(struct hgic_fwctrl *ctrl, u8 ifidx, u8 ac, struct hgic_txq_param *param); int hgic_fwctrl_set_user_edca(struct hgic_fwctrl *ctrl, u8 ifidx, u8 ac, struct hgic_txq_param *param); int hgic_fwctrl_get_temperature(struct hgic_fwctrl *ctrl); diff --git a/utils/iwpriv.c b/utils/iwpriv.c index 6db0962..0c990e5 100644 --- a/utils/iwpriv.c +++ b/utils/iwpriv.c @@ -55,7 +55,7 @@ static void hgic_copyto_iwreq(struct iwreq *wrqin, char *buf, int len) static int hgic_iwpriv_set_countryregion(struct hgic_fwctrl *ctrl, u8 ifidx, char *data, u32 count) { - if (data == NULL) { + if (data == NULL || strlen(data) != 2) { return -EINVAL; } return hgic_fwctrl_set_countryregion(ctrl, ifidx, data); @@ -1126,6 +1126,7 @@ static int hgic_iwpriv_get_scan_list(struct hgic_fwctrl *ctrl, u8 ifidx, struct int count = 0; int len = 0; struct hgic_bss_info *bss = NULL; + struct hgic_bss_info1 *bss1 = NULL; char *buf = kzalloc(1024, GFP_ATOMIC); char *print_buf = kzalloc(4096, GFP_ATOMIC); @@ -1138,13 +1139,26 @@ static int hgic_iwpriv_get_scan_list(struct hgic_fwctrl *ctrl, u8 ifidx, struct ret = hgic_fwctrl_get_scan_list(ctrl, ifidx, buf, 1024); if (ret > 0) { bss = (struct hgic_bss_info *)buf; - count = ret / sizeof(struct hgic_bss_info); - len += sprintf(print_buf + len, "\r\nBSSID \tSSID \tEncryption\tFrequence\tSignal\n"); - for (i = 0; i < count; i++) { - len += sprintf(print_buf + len, "%pM\t%s\t%10s\t%10d\t%d\n", - bss[i].bssid, bss[i].ssid, - bss[i].encrypt ? (bss[i].encrypt == 1 ? "WPA" : "WPA2") : "NONE", - bss[i].freq, bss[i].signal); + bss1 = (struct hgic_bss_info1 *)buf; + if (bss1[0].ver != 1) { + count = ret / sizeof(struct hgic_bss_info); + len += sprintf(print_buf + len, "\r\nBSSID \tSSID \tEncryption\tFrequence\tSignal\n"); + for (i = 0; i < count; i++) { + len += sprintf(print_buf + len, "%pM\t%s\t %10s\t %10d\t%d\n", + bss[i].bssid, bss[i].ssid, + bss[i].encrypt ? (bss[i].encrypt == 1 ? "WPA" : "WPA2") : "NONE", + bss[i].freq, bss[i].signal); + } + } else { + count = ret / sizeof(struct hgic_bss_info1); + len += sprintf(print_buf + len, "\r\nBSSID \tSSID \tEncryption\tFrequence\tSignal\tCountry_region\n"); + for (i = 0; i < count; i++) { + len += sprintf(print_buf + len, "%pM\t%s\t %10s\t %10d\t%10d\t%10s\t%d\n", + bss1[i].bssid, bss1[i].ssid, + bss1[i].encrypt ? (bss1[i].encrypt == 1 ? "WPA" : "WPA2") : "NONE", + bss1[i].freq, bss1[i].signal, + bss1[i].country_region, bss1[i].bss_bw); + } } wrqin->u.data.length = (u16)len; } else { diff --git a/version.h b/version.h index 8a00d1a..f09b323 100644 --- a/version.h +++ b/version.h @@ -1 +1 @@ -#define SVN_VERSION "25328" +#define SVN_VERSION "26364"