1 #include "ecrnx_debugfs_func.h"
2 #include "ecrnx_debugfs_custom.h"
4 #ifdef CONFIG_ECRNX_DEBUGFS
6 debugfs_info_t debugfs_info;
7 debugfs_resp_t debugfs_resp;
11 REG_MAP_ST mac_reg_table[]={
12 {"INTC_IRQ_STATUS_ADDR", 0x00510000},
13 {"INTC_IRQ_UNMASK_SET_ADDR", 0x00510010},
14 {"INTC_IRQ_INDEX_ADDR", 0x00510040},
15 {"NXMAC_MAC_ADDR_LOW_ADDR", 0x00610010},
16 {"NXMAC_MAC_ADDR_HI_ADDR", 0x00610014},
17 {"NXMAC_STATE_CNTRL_ADDR", 0x00610038},
18 {"NXMAC_MAC_CNTRL_1_ADDR", 0x0061004c},
19 {"NXMAC_RX_CNTRL_ADDR", 0x00610060},
20 {"NXMAC_MAX_POWER_LEVEL_ADDR", 0x006100a0},
21 {"NXMAC_TIMINGS_1_ADDR", 0x006100e4},
22 {"NXMAC_RX_CNTRL_2_ADDR", 0x0061010c},
23 {"NXMAC_MONOTONIC_COUNTER_2_LO_ADDR", 0x00610120},
24 {"NXMAC_MONOTONIC_COUNTER_2_HI_ADDR", 0x00610124},
25 {"NXMAC_MAX_RX_LENGTH_ADDR", 0x00610150},
26 {"NXMAC_GEN_INT_STATUS_ADDR", 0x0061806c},
27 {"NXMAC_GEN_INT_ENABLE_ADDR", 0x00618074},
28 {"NXMAC_TX_RX_INT_STATUS_ADDR", 0x00618078},
29 {"NXMAC_TX_RX_INT_ENABLE_ADDR", 0x00618080},
30 {"NXMAC_DMA_CNTRL_SET_ADDR", 0x00618180},
31 {"NXMAC_DMA_STATUS_1_ADDR", 0x00618188},
32 {"NXMAC_DMA_STATUS_2_ADDR", 0x0061818c},
33 {"NXMAC_DMA_STATUS_3_ADDR", 0x00618190},
34 {"NXMAC_DMA_STATUS_4_ADDR", 0x00618194},
35 {"NXMAC_TX_BCN_HEAD_PTR_ADDR", 0x00618198},
36 {"NXMAC_TX_AC_0_HEAD_PTR_ADDR", 0x0061819c},
37 {"NXMAC_TX_AC_1_HEAD_PTR_ADDR", 0x006181a0},
38 {"NXMAC_TX_AC_2_HEAD_PTR_ADDR", 0x006181a4},
39 {"NXMAC_TX_AC_3_HEAD_PTR_ADDR", 0x006181a8},
40 {"NXMAC_RX_BUF_1_START_PTR_ADDR", 0x006181c8},
41 {"NXMAC_RX_BUF_1_END_PTR_ADDR", 0x006181cc},
42 {"NXMAC_RX_BUF_1_RD_PTR_ADDR", 0x006181d0},
43 {"NXMAC_RX_BUF_1_WR_PTR_ADDR", 0x006181d4},
44 {"NXMAC_RX_BUF_CONFIG_ADDR", 0x006181e8},
45 {"MDM_HDMCONFIG_ADDR", 0x00700000},
48 REG_MAP_ST rf_reg_table[]={
49 {"RF_REG_EXAMPLE", 0x00510000},
52 REG_MAP_ST bb_reg_table[]={
53 {"BB_REG_EXAMPLE", 0x00510000},
56 REG_MAP_ST efuse_map_table[]={
57 {"EFUSE_REG_EXAMPLE", 0x00510000},
62 char slave_cli_cmd[50];
63 int arg_val[MAX_ARGV];
66 ECRNX_CLI_TABLE_ST ecrnx_cli_tab[]={
67 {"macbyp start ", "macbyp_tx_start", 6, {{0,32},{0,32},{0,32},{0,32},{0,32},{0,32}}, cli_macbyp_start},
68 {"macbyp stop", "macbyp_tx_stop", 0, {}, cli_macbyp_stop},
69 {"rf txgain ", "rf_set_txgain", 1, {{0,32}}, cli_rf_txgain},
70 {"rf rxgain ", "rf_set_rxgain", 4, {{0,32},{0,32},{0,32},{0,32}}, cli_rf_rxgain},
71 {"rf chan ", "rf_set_chan", 2, {{0,32},{0,32}}, cli_rf_chan},
75 void ecrnx_debugfs_param_send(debugfs_info_t *req)
77 if(debugfs_info.debugfs_type == SLAVE_LOG_LEVEL){
78 if (req->u.slave_log_level_t.debug_level < DBG_TYPE_D || req->u.slave_log_level_t.debug_level > DBG_TYPE_O) {
79 ECRNX_ERR("ecrnx debug param error!!!\n");
83 ECRNX_DBG("%s: fstype:%d, level:%d, dir:%d \n", __func__, req->debugfs_type, req->u.slave_log_level_t.debug_level, req->u.slave_log_level_t.debug_dir);
84 //print_hex_dump(KERN_INFO, "ecrnx_debugfs_send ", DUMP_PREFIX_ADDRESS, 32, 1,
85 // (u8*)req, sizeof(debugfs_info_t), false);
86 host_send(req, sizeof(debugfs_info_t), TX_FLAG_MSG_DEBUGFS_IE);
89 int ecrnx_log_level_get(LOG_CTL_ST *log)
99 int ecrnx_fw_log_level_set(u32 level, u32 dir)
101 log_ctl.level = level;
104 debugfs_info.debugfs_type = SLAVE_LOG_LEVEL;
105 debugfs_info.u.slave_log_level_t.debug_level = level;
106 debugfs_info.u.slave_log_level_t.debug_dir = dir;
108 ecrnx_debugfs_param_send(&debugfs_info);
113 bool ecrnx_log_host_enable(void)
121 int ecrnx_host_ver_get(u8 *ver)
126 sprintf(ver, "v%s", HOST_DRIVER_VERSION);
131 int ecrnx_fw_ver_get(u8 *ver)
136 debugfs_info.debugfs_type = SLAVE_FW_INFO;
137 ecrnx_debugfs_param_send(&debugfs_info);
140 debugfs_resp.rxdatas = 0;
141 wait_event_interruptible_timeout(debugfs_resp.rxdataq, debugfs_resp.rxdatas, 1*HZ);
143 if (debugfs_resp.rxdatas)
144 memcpy(ver, debugfs_resp.rxdata, debugfs_resp.rxlen);
151 int ecrnx_build_time_get(u8 *build_time)
153 if (build_time == NULL)
156 sprintf(build_time, "%s %s", __DATE__, __TIME__);
161 static int ecrnx_wdevs_get(struct seq_file *seq, struct wireless_dev **wdev)
163 struct ecrnx_hw *ecrnx_hw;
166 if (seq->private == NULL)
169 ecrnx_hw = seq->private;
171 for (i=0; i<NX_VIRT_STA_MAX; i++)
173 if (ecrnx_hw->vif_table[i] != NULL)
174 wdev[i] = &ecrnx_hw->vif_table[i]->wdev;
182 static int ecrnx_wdev_match(struct wireless_dev **wdev, IF_TYPE_EN iftype, u32 *index)
184 struct ecrnx_vif *ecrnx_vif;
187 for (i=0; i<NX_VIRT_STA_MAX; i++)
194 ecrnx_vif = netdev_priv(wdev[i]->netdev);
195 if (ecrnx_vif->up == false)
199 switch(wdev[i]->iftype)
201 case NL80211_IFTYPE_STATION:
203 if (iftype == IF_STA)
211 case NL80211_IFTYPE_AP:
212 case NL80211_IFTYPE_AP_VLAN:
222 case NL80211_IFTYPE_P2P_CLIENT:
223 case NL80211_IFTYPE_P2P_GO:
224 case NL80211_IFTYPE_P2P_DEVICE:
226 if (iftype == IF_P2P)
242 int ecrnx_rf_info_get(struct seq_file *seq, IF_TYPE_EN iftype,RF_INFO_ST *cur, RF_INFO_ST *oper)
244 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
245 struct cfg80211_chan_def chandef;
248 if (0 != ecrnx_wdevs_get(seq, wdev))
251 if ((cur == NULL) || (oper == NULL))
254 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
257 if (0 != ecrnx_cfg80211_get_channel(wdev[index]->wiphy, wdev[index], &chandef))
260 cur->ch = (chandef.center_freq1 - 2412)/5 + 1;
261 cur->bw = chandef.width;
264 oper->ch = (chandef.center_freq1 - 2412)/5 + 1;
265 oper->bw = chandef.width;
271 int ecrnx_country_code_get(struct seq_file *seq, char *alpha2)
273 struct ecrnx_hw *ecrnx_hw;
275 if (seq->private != NULL)
276 ecrnx_hw = seq->private;
283 if (ecrnx_hw->wiphy == NULL)
286 if (ecrnx_hw->wiphy->regd == NULL)
289 memcpy(alpha2, ecrnx_hw->wiphy->regd->alpha2, sizeof(ecrnx_hw->wiphy->regd->alpha2));
295 int ecrnx_mac_addr_get(struct seq_file *seq, IF_TYPE_EN iftype, u8 *mac_addr)
297 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
300 if (0 != ecrnx_wdevs_get(seq, wdev))
303 if (mac_addr == NULL)
306 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
309 memcpy(mac_addr, wdev[index]->netdev->perm_addr, ETH_ALEN);
314 int ecrnx_mac_addr_get_ex(struct seq_file *seq, u8 *mac_addr_info)
316 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
319 if (0 != ecrnx_wdevs_get(seq, wdev))
322 if (mac_addr_info == NULL)
325 mac_addr_info[0] = '\0';
326 for (i=0; i<NX_VIRT_STA_MAX; i++)
330 sprintf(mac_addr_info+strlen(mac_addr_info), "%s hw_port(%d) mac_addr=%02X:%02X:%02X:%02X:%02X:%02X\n", wdev[i]->netdev->name, wdev[i]->netdev->ifindex,
331 wdev[i]->netdev->perm_addr[0], wdev[i]->netdev->perm_addr[1], wdev[i]->netdev->perm_addr[2],
332 wdev[i]->netdev->perm_addr[3], wdev[i]->netdev->perm_addr[4], wdev[i]->netdev->perm_addr[5]);
339 int ecrnx_channel_get(struct seq_file *seq, IF_TYPE_EN iftype, struct cfg80211_chan_def *chandef)
341 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
344 if (0 != ecrnx_wdevs_get(seq, wdev))
350 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
353 return ecrnx_cfg80211_get_channel(wdev[index]->wiphy, wdev[index], chandef);
356 int ecrnx_p2p_role_get(struct seq_file *seq, IF_TYPE_EN iftype)
358 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
361 if (0 != ecrnx_wdevs_get(seq, wdev))
364 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
367 return wdev[index]->iftype;
370 int ecrnx_bssid_get(struct seq_file *seq, IF_TYPE_EN iftype, u8 *bssid)
372 struct station_info sinfo;
373 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
376 if (0 != ecrnx_wdevs_get(seq, wdev))
382 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
385 return ecrnx_cfg80211_dump_station(wdev[index]->wiphy, wdev[index]->netdev, 0, bssid, &sinfo);
388 int ecrnx_signal_level_get(struct seq_file *seq, IF_TYPE_EN iftype, s8 *noise_dbm)
390 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
391 struct ecrnx_hw *ecrnx_hw;
394 if (0 != ecrnx_wdevs_get(seq, wdev))
397 if (noise_dbm == NULL)
400 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
403 ecrnx_hw = wdev_priv(wdev[index]);
404 *noise_dbm = ecrnx_hw->survey[0].noise_dbm;
409 int ecrnx_flags_get(struct seq_file *seq, IF_TYPE_EN iftype, u32 *flags)
411 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
414 if (0 != ecrnx_wdevs_get(seq, wdev))
420 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
423 *flags = wdev[index]->wiphy->flags;
428 int ecrnx_ssid_get(struct seq_file *seq, IF_TYPE_EN iftype, char *ssid)
430 struct wireless_dev *wdev[NX_VIRT_STA_MAX];
433 if (0 != ecrnx_wdevs_get(seq, wdev))
439 if (0 != ecrnx_wdev_match(wdev, iftype, &index))
442 memcpy(ssid, wdev[index]->ssid, IEEE80211_MAX_SSID_LEN);
447 int ecrnx_sta_mac_get(struct seq_file *seq, IF_TYPE_EN iftype, u8 sta_mac[][ETH_ALEN+1])
449 struct ecrnx_hw *ecrnx_hw;
451 u8 mac[ETH_ALEN] = {0};
453 if (seq->private != NULL)
454 ecrnx_hw = seq->private;
459 for (i=0; i<NX_REMOTE_STA_MAX; i++)
461 if (ecrnx_hw->sta_table[i].valid == true)
463 if (0 == memcmp(mac, ecrnx_hw->sta_table[i].mac_addr, ETH_ALEN))
465 sta_mac[i][0] = 0xFF;
469 sta_mac[i][0] = 0xFF;
470 memcpy(&sta_mac[i][1], ecrnx_hw->sta_table[i].mac_addr, ETH_ALEN);
479 int ecrnx_mac_reg_dump(struct seq_file *seq)
483 seq_printf(seq, "%-34s %-11s %-10s\n", "name", "addr", "value");
485 for (i=0; i<(sizeof(mac_reg_table)/sizeof(mac_reg_table[0])); i++)
487 ecrnx_slave_reg_read(mac_reg_table[i].addr, &data, 1);
488 seq_printf(seq, "%-34s 0x%08X: 0x%08X\n", mac_reg_table[i].name, mac_reg_table[i].addr, data);
494 int ecrnx_rf_reg_dump(struct seq_file *seq)
498 seq_printf(seq, "%-34s %-11s %-10s\n", "name", "addr", "value");
500 for (i=0; i<(sizeof(rf_reg_table)/sizeof(rf_reg_table[0])); i++)
502 ecrnx_slave_reg_read(rf_reg_table[i].addr, &data, 1);
503 seq_printf(seq, "%-34s 0x%08X: 0x%08X\n", rf_reg_table[i].name, rf_reg_table[i].addr, data);
509 int ecrnx_bb_reg_dump(struct seq_file *seq)
513 seq_printf(seq, "%-34s %-11s %-10s\n", "name", "addr", "value");
515 for (i=0; i<(sizeof(bb_reg_table)/sizeof(bb_reg_table[0])); i++)
517 ecrnx_slave_reg_read(bb_reg_table[i].addr, &data, 1);
518 seq_printf(seq, "%-34s 0x%08X: 0x%08X\n", bb_reg_table[i].name, bb_reg_table[i].addr, data);
524 int ecrnx_efuse_map_dump(struct seq_file *seq)
528 seq_printf(seq, "%-34s %-11s %-10s\n", "name", "addr", "value");
530 for (i=0; i<(sizeof(efuse_map_table)/sizeof(efuse_map_table[0])); i++)
532 ecrnx_slave_reg_read(efuse_map_table[i].addr, &data, 1);
533 seq_printf(seq, "%-34s 0x%08X: 0x%08X\n", efuse_map_table[i].name, efuse_map_table[i].addr, data);
539 int ecrnx_slave_reg_read(u32 addr, u32 *data, u32 len)
544 debugfs_info.debugfs_type = SLAVE_READ_REG;
545 debugfs_info.u.slave_read_reg_t.reg = addr;
546 debugfs_info.u.slave_read_reg_t.len = len;
547 ecrnx_debugfs_param_send(&debugfs_info);
550 debugfs_resp.rxdatas = 0;
551 wait_event_interruptible_timeout(debugfs_resp.rxdataq, debugfs_resp.rxdatas, 1*HZ);
553 if (debugfs_resp.rxdatas)
554 memcpy((u8 *)data, (u8 *)debugfs_resp.rxdata, debugfs_resp.rxlen);
559 int ecrnx_slave_reg_write(u32 addr, u32 data, u32 len)
561 debugfs_info.debugfs_type = SLAVE_WRITE_REG;
562 debugfs_info.u.slave_write_reg_t.reg = addr;
563 debugfs_info.u.slave_write_reg_t.value = data;
564 ecrnx_debugfs_param_send(&debugfs_info);
567 debugfs_resp.rxdatas = 0;
568 wait_event_interruptible_timeout(debugfs_resp.rxdataq, debugfs_resp.rxdatas, 1*HZ);
573 int ecrnx_slave_cli_send(u8 *cli, u8 *resp)
578 debugfs_info.debugfs_type = SLAVE_FUNC_INFO;
579 strcpy(debugfs_info.u.slave_cli_func_info_t.func_and_param, cli);
580 ecrnx_debugfs_param_send(&debugfs_info);
583 debugfs_resp.rxdatas = 0;
584 wait_event_interruptible_timeout(debugfs_resp.rxdataq, debugfs_resp.rxdatas, 1*HZ);
586 if ((debugfs_resp.rxdatas) && (debugfs_resp.rxlen))
588 ECRNX_PRINT("%s\n", debugfs_resp.rxdata);
594 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0))
596 * ether_addr_copy - Copy an Ethernet address
597 * @dst: Pointer to a six-byte array Ethernet address destination
598 * @src: Pointer to a six-byte array Ethernet address source
600 * Please note: dst & src must both be aligned to u16.
602 static inline void ether_addr_copy(u8 *dst, const u8 *src)
604 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
605 *(u32 *)dst = *(const u32 *)src;
606 *(u16 *)(dst + 4) = *(const u16 *)(src + 4);
609 const u16 *b = (const u16 *)src;
618 void ecrnx_debugfs_survey_info_update(struct ecrnx_hw *ecrnx_hw, struct cfg80211_bss *bss)
622 const u8 *ie_wpa = NULL, *ie_wpa2 = NULL, *ie_wps = NULL;
623 const u8 *ie_p2p = NULL;
625 struct ecrnx_debugfs_survey_info_tbl *new_node, *entry, *tmp;
626 new_node = kzalloc(sizeof(struct ecrnx_debugfs_survey_info_tbl),
630 const struct cfg80211_bss_ies *ies;
632 new_node->ch = ieee80211_frequency_to_channel(bss->channel->center_freq);
633 ether_addr_copy(new_node->bssid, bss->bssid);
634 new_node->rssi = bss->signal/100;
638 ie_wpa2 = ieee80211_bss_get_ie(bss, WLAN_EID_RSN);
640 ies = rcu_dereference(bss->ies);
642 ie_wpa = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
643 WLAN_OUI_TYPE_MICROSOFT_WPA,
647 ie_wps = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
648 WLAN_OUI_TYPE_MICROSOFT_WPS,
652 ie_p2p = cfg80211_find_vendor_ie(WLAN_OUI_WFA,
653 WLAN_OUI_TYPE_WFA_P2P,
657 ie_cap = cpu_to_le16(bss->capability);
659 ssid_elm = cfg80211_find_ie(WLAN_EID_SSID, ies->data, ies->len);
661 if (ssid_elm[1] <= IEEE80211_MAX_SSID_LEN)
662 memcpy(new_node->ssid, ssid_elm + 2, ssid_elm[1]);
668 sprintf(new_node->flag, "%s%s%s%s%s%s",
669 (ie_wpa) ? "[WPA]" : "",
670 (ie_wpa2) ? "[WPA2]" : "",
671 (!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? "[WEP]" : "",
672 (ie_wps) ? "[WPS]" : "",
673 (ie_cap & BIT(0)) ? "[ESS]" : "",
674 (ie_p2p) ? "[P2P]" : "");
676 INIT_LIST_HEAD(&new_node->list);
678 //if (!list_empty(&ecrnx_hw->debugfs_survey_info_tbl_ptr)) {
679 list_for_each_entry_safe(entry, tmp, &ecrnx_hw->debugfs_survey_info_tbl_ptr, list) {
680 if(memcmp(entry->bssid, new_node->bssid, ETH_ALEN) == 0) {
681 list_del(&entry->list);
686 list_add_tail(&new_node->list, &ecrnx_hw->debugfs_survey_info_tbl_ptr);
689 void ecrnx_debugfs_noise_of_survey_info_update(struct ecrnx_hw *ecrnx_hw, struct ecrnx_survey_info *ecrnx_survey, int chan_no)
691 struct ecrnx_debugfs_survey_info_tbl *entry;
693 list_for_each_entry(entry, &ecrnx_hw->debugfs_survey_info_tbl_ptr, list) {
694 if(entry->ch == chan_no) {
695 entry->noise = ecrnx_survey->noise_dbm;
700 void ecrnx_debugfs_add_station_in_ap_mode(struct ecrnx_hw *ecrnx_hw,
701 struct ecrnx_sta *sta, struct station_parameters *params)
703 struct ecrnx_debugfs_sta *debugfs_sta;
704 //char file_name[18];
708 ECRNX_ERR("%s-%d:sta(%p) or params(%p) is null, return!\n", __func__, __LINE__, sta, params);
712 debugfs_sta = kzalloc(sizeof(struct ecrnx_debugfs_sta), GFP_KERNEL);
715 ECRNX_ERR("error debugfs_sta kzalloc!\n");
718 debugfs_sta->sta_idx = sta->sta_idx;
719 debugfs_sta->aid = sta->aid;
720 debugfs_sta->ch_idx = sta->ch_idx;
721 debugfs_sta->ht = sta->ht;
722 ether_addr_copy(debugfs_sta->mac_addr, sta->mac_addr);
723 debugfs_sta->qos = sta->qos;
724 debugfs_sta->vht = sta->vht;
725 debugfs_sta->width = sta->width;
729 if (params->ht_capa->cap_info & IEEE80211_HT_CAP_TX_STBC)
730 debugfs_sta->stbc_cap = 1;
731 if (params->ht_capa->cap_info & IEEE80211_HT_CAP_LDPC_CODING)
732 debugfs_sta->ldpc_cap = 1;
733 if (params->ht_capa->cap_info & IEEE80211_HT_CAP_SGI_20)
734 debugfs_sta->sgi_20m = 1;
735 if (params->ht_capa->cap_info & IEEE80211_HT_CAP_SGI_40)
736 debugfs_sta->sgi_40m = 1;
739 ecrnx_debugfs_sta_in_ap_init(debugfs_sta);
742 int cli_parse_args(uint8_t* str, char* argv[])
745 char* ch = (char *)str;
747 while(*ch == ' ') ch++;
777 void argv_display(uint32_t argc, char* argv[])
781 ECRNX_PRINT("argc is %d\n", argc);
782 for (i=0; i<argc; i++)
784 ECRNX_PRINT("param %d is %s\n", i, argv[i]);
788 int _atoi(char *pstr)
791 int integer_sign = 1;
795 //printk("Pointer is NULL\n");
808 if (*pstr == '-' || *pstr == '+')
813 while (*pstr >= '0' && *pstr <= '9')
815 ret_integer = ret_integer * 10 + *pstr - '0';
818 ret_integer = integer_sign * ret_integer;
823 int cli_check_parm_num(uint32_t index, uint8_t *param)
825 argc = cli_parse_args(param, argv);
826 //argv_display(argc, argv);
828 if (argc != ecrnx_cli_tab[index].param_num)
834 int cli_check_parm_range(uint32_t start_index, uint32_t index, uint32_t argc, char* argv[])
838 for (i=start_index; i<argc; i++)
840 arg_val[i] = _atoi(argv[i]);
841 if ((arg_val[i] < ecrnx_cli_tab[index].param_range[i].range_min)
842 || (arg_val[i] > ecrnx_cli_tab[index].param_range[i].range_max))
844 ECRNX_PRINT("param %d is out of range! current %d, min %d, max %d\n",
845 i, arg_val[i], ecrnx_cli_tab[index].param_range[i].range_min, ecrnx_cli_tab[index].param_range[i].range_max);
853 int cli_macbyp_start(uint32_t index, uint8_t *param)
858 if (0 != cli_check_parm_num(index, param))
862 if (0 != strcmp(argv[0], "11a")
863 && 0 != strcmp(argv[0], "11b")
864 && 0 != strcmp(argv[0], "11g")
865 && 0 != strcmp(argv[0], "11n")
866 && 0 != strcmp(argv[0], "11ac")
867 && 0 != strcmp(argv[0], "11ax"))
870 if (0 != cli_check_parm_range(1, index, argc, argv))
874 sprintf(slave_cli_cmd, "%s %s", ecrnx_cli_tab[index].map_cmd, argv[0]);
875 for (i=1; i<argc; i++)
876 sprintf(slave_cli_cmd+strlen(slave_cli_cmd), " %d", arg_val[i]);
878 //printk("--->The final command is: %s<-\n", slave_cli_cmd);
879 ecrnx_slave_cli_send(slave_cli_cmd, NULL);
884 int cli_macbyp_stop(uint32_t index, uint8_t *param)
887 if (0 != cli_check_parm_num(index, param))
891 sprintf(slave_cli_cmd, "%s", ecrnx_cli_tab[index].map_cmd);
893 //printk("---> The final command is: %s<-\n", slave_cli_cmd);
894 ecrnx_slave_cli_send(slave_cli_cmd, NULL);
899 int cli_rf_txgain(uint32_t index, uint8_t *param)
904 if (0 != cli_check_parm_num(index, param))
908 if (0 != cli_check_parm_range(0, index, argc, argv))
912 sprintf(slave_cli_cmd, "%s", ecrnx_cli_tab[index].map_cmd);
913 for (i=0; i<argc; i++)
914 sprintf(slave_cli_cmd+strlen(slave_cli_cmd), " %d", arg_val[i]);
916 //printk("---> The final command is: %s<-\n", slave_cli_cmd);
917 ecrnx_slave_cli_send(slave_cli_cmd, NULL);
922 int cli_rf_rxgain(uint32_t index, uint8_t *param)
927 if (0 != cli_check_parm_num(index, param))
931 if (0 != cli_check_parm_range(0, index, argc, argv))
935 sprintf(slave_cli_cmd, "%s", ecrnx_cli_tab[index].map_cmd);
936 for (i=0; i<argc; i++)
937 sprintf(slave_cli_cmd+strlen(slave_cli_cmd), " %d", arg_val[i]);
939 //printk("---> The final command is: %s<-\n", slave_cli_cmd);
940 ecrnx_slave_cli_send(slave_cli_cmd, NULL);
945 int cli_rf_chan(uint32_t index, uint8_t *param)
950 if (0 != cli_check_parm_num(index, param))
954 if (0 != cli_check_parm_range(0, index, argc, argv))
958 sprintf(slave_cli_cmd, "%s", ecrnx_cli_tab[index].map_cmd);
959 for (i=0; i<argc; i++)
960 sprintf(slave_cli_cmd+strlen(slave_cli_cmd), " %d", arg_val[i]);
962 //printk("---> The final command is: %s<-\n", slave_cli_cmd);
963 ecrnx_slave_cli_send(slave_cli_cmd, NULL);
968 int cli_cmd_parse(uint8_t *cmd)
976 //printk("cmd is :%s<-\n", cmd);
977 for (i=0; i<sizeof(ecrnx_cli_tab)/sizeof(ecrnx_cli_tab[0]); i++)
979 if (0 == memcmp(cmd, ecrnx_cli_tab[i].cmd, strlen(ecrnx_cli_tab[i].cmd)))
981 //printk("index %d, cmd %s\n", i, ecrnx_cli_tab[i].cmd);
982 ret = ecrnx_cli_tab[i].cmd_func(i, cmd + strlen(ecrnx_cli_tab[i].cmd));
987 ECRNX_ERR("No matching commands!\n");