void dmac_scan_verify_cb(wlan_scan_event_enum_uint8 en_event, void *pst_scan_event_data) { mac_scan_event_stru *pst_scan_event; oal_uint ul_idx; if (OAL_PTR_NULL == pst_scan_event_data) { return; } OAM_INFO_LOG0(0, OAM_SF_ANY,"SCAN comp!\n"); pst_scan_event = (mac_scan_event_stru *)pst_scan_event_data; g_st_scanner_record.uc_scan_cb_cnt += 1; g_st_scanner_record.uc_nchans = pst_scan_event->uc_nchans; for (ul_idx = 0; ul_idx < g_st_scanner_record.uc_nchans; ul_idx++) { g_st_scanner_record.ast_channel_results[ul_idx] = pst_scan_event->past_channel_results[ul_idx]; } g_st_scanner_record.us_nbss = pst_scan_event->us_nbss; for (ul_idx = 0; ul_idx < g_st_scanner_record.us_nbss; ul_idx++) { g_st_scanner_record.ast_bss_results[ul_idx] = pst_scan_event->past_bss_results[ul_idx]; } g_st_scanner_record.st_time_cost = pst_scan_event->st_time_cost; g_st_scanner_record.ul_request_id = pst_scan_event->ul_request_id; g_st_scanner_record.ul_scan_id = pst_scan_event->ul_scan_id; g_st_scanner_record.uc_scan_func = pst_scan_event->uc_scan_func; }
OAL_STATIC int32 hwifi_config_init_nvram(void) { int32 l_ret = INI_FAILED; int32 l_cfg_id; int32 aul_nvram_params[NVRAM_PARAMS_INDEX_BUTT]={0}; oal_memset(g_auc_nv_params, 0x00, sizeof(g_auc_nv_params)); l_ret = get_cust_conf_string(CUST_MODU_NVRAM, OAL_PTR_NULL, g_auc_nv_params, sizeof(g_auc_nv_params)); /* nv读取失败或者返回的参数值为零,尝试读取ini */ if(INI_FAILED == l_ret || !g_auc_nv_params[0]) { OAM_WARNING_LOG3(0, OAM_SF_ANY, "hwifi_config_init_nvram read nvram failed[ret:%d] or wrong values[first eight values:0x%x %x], read dts instead!", l_ret, *((oal_uint32*)g_auc_nv_params),*((oal_uint32*)(g_auc_nv_params+4))); /* 先尝试从ini文件中读取,读不到的话再从dts中读取 */ for (l_cfg_id = NVRAM_PARAMS_INDEX_0; l_cfg_id < NVRAM_PARAMS_INDEX_BUTT; l_cfg_id++) { l_ret = get_cust_conf_int32(INI_MODU_WIFI, g_ast_nvram_config_ini[l_cfg_id].name, &aul_nvram_params[l_cfg_id]); if(INI_FAILED == l_ret) { OAM_ERROR_LOG1(0, OAM_SF_ANY, "hwifi_config_init_nvram read %d from ini failed!", l_cfg_id); break; } } if (NVRAM_PARAMS_INDEX_BUTT == l_cfg_id) { OAM_INFO_LOG0(0, OAM_SF_ANY, "hwifi_config_init_nvram read from ini success!"); oal_memcopy(g_auc_nv_params, aul_nvram_params, sizeof(g_auc_nv_params)); return INI_SUCC; } l_ret = get_cust_conf_string(CUST_MODU_DTS, NVRAM_PARAMS_ARRAY, g_auc_nv_params, sizeof(g_auc_nv_params)); if(INI_FAILED == l_ret) { OAM_WARNING_LOG0(0, OAM_SF_ANY, "hwifi_config_init_nvram read dts failed!"); /* 读取dts也失败时将数组置零,防止下发至device */ oal_memset(g_auc_nv_params, 0x00, sizeof(g_auc_nv_params)); return INI_FAILED; } } return INI_SUCC; }
int32 hwifi_fetch_ori_caldata(uint8* auc_caldata, int32 l_nvm_len) { int32 l_ret = INI_FAILED; int32 l_cfg_id; int32 aul_nvram_params[NVRAM_PARAMS_INDEX_BUTT]={0}; if (l_nvm_len != HISI_CUST_NVRAM_LEN) { OAM_ERROR_LOG2(0, OAM_SF_ANY, "hwifi_fetch_ori_caldata atcmd[nv_len:%d] and plat_ini[nv_len:%d] model have different nvm lenth!!", l_nvm_len, HISI_CUST_NVRAM_LEN); return INI_FAILED; } oal_memset(auc_caldata, 0x00, HISI_CUST_NVRAM_LEN); for (l_cfg_id = NVRAM_PARAMS_INDEX_0; l_cfg_id < NVRAM_PARAMS_INDEX_BUTT; l_cfg_id++) { l_ret = get_cust_conf_int32(INI_MODU_WIFI, g_ast_nvram_config_ini[l_cfg_id].name, &aul_nvram_params[l_cfg_id]); if(INI_FAILED == l_ret) { OAM_ERROR_LOG1(0, OAM_SF_ANY, "hwifi_fetch_ori_caldata read ori caldata %d from ini failed!", l_cfg_id); break; } } if (NVRAM_PARAMS_INDEX_BUTT == l_cfg_id) { OAM_INFO_LOG0(0, OAM_SF_ANY, "hwifi_fetch_ori_caldata read ori caldata from ini success!"); oal_memcopy(auc_caldata, aul_nvram_params, HISI_CUST_NVRAM_LEN); return INI_SUCC; } l_ret = get_cust_conf_string(CUST_MODU_DTS, NVRAM_PARAMS_ARRAY, auc_caldata, HISI_CUST_NVRAM_LEN); if(INI_FAILED == l_ret) { OAM_ERROR_LOG0(0, OAM_SF_ANY, "hwifi_fetch_ori_caldata read ori caldata from dts failed!"); return INI_FAILED; } return INI_SUCC; }
/***************************************************************************** 函 数 名 : hmac_smps_update_status 功能描述 : AP侧接收到对应STA的关联请求消息 输入参数 : 无 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2014年4月16日 作 者 : zhangyu 修改内容 : 新生成函数 *****************************************************************************/ oal_uint32 hmac_smps_update_status(mac_vap_stru *pst_mac_vap, mac_user_stru *pst_mac_user, oal_bool_enum_uint8 en_plus_user) { mac_device_stru *pst_mac_device; wlan_mib_mimo_power_save_enum_uint8 en_user_smps_mode; frw_event_mem_stru *pst_event_mem; frw_event_stru *pst_event; oal_uint32 ul_ret; oal_bool_enum_uint8 en_ht_cap; mac_cfg_smps_mode_stru st_smps_mode = {0}; if ((OAL_PTR_NULL == pst_mac_vap) || (OAL_PTR_NULL == pst_mac_user)) { OAM_ERROR_LOG2(0, OAM_SF_SMPS, "{hmac_smps_update_status: NULL PTR pst_mac_vap is [%d] and pst_mac_user is [%d].}", pst_mac_vap, pst_mac_user); return OAL_ERR_CODE_PTR_NULL; } if (OAL_FALSE == mac_mib_get_HighThroughputOptionImplemented(pst_mac_vap)) { OAM_INFO_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: pst_mac_vap is mimo.}"); return OAL_SUCC; } pst_mac_device = mac_res_get_dev(pst_mac_vap->uc_device_id); if (OAL_PTR_NULL == pst_mac_device) { OAM_ERROR_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: pst_mac_device is null.}"); return OAL_ERR_CODE_PTR_NULL; } st_smps_mode.uc_smps_mode = WLAN_MIB_MIMO_POWER_SAVE_BUTT; st_smps_mode.us_user_idx = 0; en_user_smps_mode = (wlan_mib_mimo_power_save_enum_uint8)pst_mac_user->st_ht_hdl.bit_sm_power_save; en_ht_cap = (oal_bool_enum_uint8)pst_mac_user->st_ht_hdl.en_ht_capable; if (OAL_TRUE == en_plus_user) { if ((OAL_TRUE == en_ht_cap) && (WLAN_MIB_MIMO_POWER_SAVE_MIMO != en_user_smps_mode)) { /* 如果不是第一个用户,则直接返回 */ if (1 < pst_mac_device->uc_asoc_user_cnt) { return OAL_SUCC; } /* 如果是第一个用户,则进入SMPS模式 */ /* 设置SMPS模式信息 mib值 */ st_smps_mode.uc_smps_mode = (oal_uint8)pst_mac_vap->st_cap_flag.bit_smps; } else { pst_mac_device->uc_no_smps_user_cnt++; if (OAL_FALSE == pst_mac_device->en_smps) { return OAL_SUCC; } /* 设置SMPS模式disable */ st_smps_mode.uc_smps_mode = WLAN_MIB_MIMO_POWER_SAVE_MIMO; hmac_smps_all_vap_update(pst_mac_device, WLAN_MIB_MIMO_POWER_SAVE_MIMO); } } else { if ((OAL_TRUE == en_ht_cap) && (WLAN_MIB_MIMO_POWER_SAVE_MIMO != en_user_smps_mode)) { return OAL_SUCC; } if (0 < pst_mac_device->uc_no_smps_user_cnt) { pst_mac_device->uc_no_smps_user_cnt--; } if ((0 == pst_mac_device->uc_no_smps_user_cnt) && (OAL_FALSE == pst_mac_device->en_smps)) { /* 设置SMPS模式信息 mib值 */ st_smps_mode.uc_smps_mode = mac_mib_get_smps(pst_mac_vap); hmac_smps_all_vap_update(pst_mac_device, mac_mib_get_smps(pst_mac_vap)); } else { return OAL_SUCC; } } /* 抛事件到DMAC, 申请事件内存 */ pst_event_mem = FRW_EVENT_ALLOC(OAL_SIZEOF(st_smps_mode)); if (OAL_PTR_NULL == pst_event_mem) { OAM_ERROR_LOG0(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status: FRW_EVENT_ALLOC fail.}"); return OAL_ERR_CODE_PTR_NULL; } ul_ret = mac_vap_find_user_by_macaddr(pst_mac_vap, pst_mac_user->auc_user_mac_addr, &(st_smps_mode.us_user_idx)); /* 查找用户失败或没有找到对应的用户 */ if (OAL_SUCC != ul_ret) { OAM_WARNING_LOG1(pst_mac_vap->uc_vap_id, OAM_SF_SMPS, "{hmac_smps_update_status::mac_vap_find_user_by_macaddr failed[%d].}", ul_ret); return ul_ret; } /* 填写事件 */ pst_event = (frw_event_stru *)pst_event_mem->puc_data; FRW_EVENT_HDR_INIT(&(pst_event->st_event_hdr), FRW_EVENT_TYPE_WLAN_CTX, DMAC_WLAN_CTX_EVENT_SUB_TYPE_SET_SMPS, OAL_SIZEOF(st_smps_mode), FRW_EVENT_PIPELINE_STAGE_1, pst_mac_vap->uc_chip_id, pst_mac_vap->uc_device_id, pst_mac_vap->uc_vap_id); /* 拷贝参数 */ oal_memcopy(pst_event->auc_event_data, (oal_void *)&st_smps_mode, OAL_SIZEOF(st_smps_mode)); /* 分发事件 */ ul_ret = frw_event_dispatch_event(pst_event_mem); if (OAL_SUCC != ul_ret) { FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } FRW_EVENT_FREE(pst_event_mem); return OAL_SUCC; }
OAL_STATIC ssize_t dmac_scan_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { oal_uint8 auc_buffer[64]; oal_int8 ac_cmd[128], c_size; oal_uint8 uc_bidx = 0; oal_uint8 uc_state, uc_tmp, uc_device_id; oal_uint32 ul_cnt; oal_uint8 uc_band, uc_num, uc_chan_cnt = 0; mac_scan_req_stru st_scan_req; mac_device_stru *pst_mac_device; c_size = count; if (count > 127) { c_size = 127; } if (copy_from_user(ac_cmd, buffer, c_size) != 0) { return -EFAULT; } ac_cmd[c_size] = '\0'; uc_state = 0; uc_tmp = 0; OAL_MEMZERO(&st_scan_req, OAL_SIZEOF(st_scan_req)); g_st_scanner_record.uc_write_cnt += 1; for (ul_cnt = 0; ul_cnt < count; ul_cnt++) { if (0 == uc_state) { if (' ' == ac_cmd[ul_cnt]) { continue; } else if ((ac_cmd[ul_cnt] >= '0') && (ac_cmd[ul_cnt] <= '9')) { uc_state = 1; ul_cnt -= 1; } else if (('\0' == ac_cmd[ul_cnt]) || ('\n' == ac_cmd[ul_cnt])) { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_ALL_OK; break; } else { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INVALID_CHAR; break; } } else if (1 == uc_state) { if (' ' == ac_cmd[ul_cnt]) { uc_state = 0; auc_buffer[uc_bidx++] = uc_tmp; uc_tmp = 0; } else { if ((ac_cmd[ul_cnt] >= '0') && (ac_cmd[ul_cnt] <= '9')) { uc_tmp = uc_tmp * 10 + ac_cmd[ul_cnt] - '0'; } else if (('\0' == ac_cmd[ul_cnt]) || ('\n' == ac_cmd[ul_cnt])) { auc_buffer[uc_bidx++] = uc_tmp; uc_state = 0; g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_ALL_OK; break; } else { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INVALID_CHAR; uc_state = 0; break; } } } } if (uc_state) { auc_buffer[uc_bidx++] = uc_tmp; } #if 1 OAM_INFO_LOG0(0, OAM_SF_ANY,"%d numbers.\n", uc_bidx); for (ul_cnt = 0; ul_cnt < uc_bidx; ul_cnt++) { OAL_IO_PRINT("..[%d].\n", auc_buffer[ul_cnt]); } #endif /* 解析命令 */ /* 命令格式(以字节为单位) */ /* scan_mode(1 byte) + scan_type(1 byte) + func_mode(1 byte) + band(1 byte) + channel_num(1byte) + 具体的信道列表(variable) */ st_scan_req.en_scan_mode = auc_buffer[1]; st_scan_req.en_scan_type = auc_buffer[2]; if (auc_buffer[3] & 0xf0) { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INVALID_MODE; OAM_INFO_LOG1(0, OAM_SF_ANY,"abnormal, auc_buffer[3] is %d\n", auc_buffer[3]); goto out; } st_scan_req.uc_scan_func = auc_buffer[3]; ul_cnt = 4; uc_bidx -= 4; while(1) { if (uc_bidx && (uc_bidx < 2)) { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INCOMP_CMD; OAM_INFO_LOG1(0, OAM_SF_ANY,"abnormal, uc_bidx is %d\n", uc_bidx); goto out; } uc_band = auc_buffer[ul_cnt++]; uc_num = auc_buffer[ul_cnt++]; OAM_INFO_LOG2(0, OAM_SF_ANY,"Add %d channels for band %d.\n", uc_num, uc_band); if ((PROC_SCANNER_BAND_2G != uc_band) && (PROC_SCANNER_BAND_5G != uc_band)) { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INVALID_BAND; OAM_INFO_LOG1(0, OAM_SF_ANY,"abnormal, uc_band is %d\n", uc_band); goto out; } if (PROC_SCANNER_BAND_2G == uc_band) { uc_band = WLAN_BAND_2G; } else { uc_band = WLAN_BAND_5G; } uc_bidx -= 2; if (uc_bidx < uc_num) { g_st_scanner_record.uc_curr_status = PROC_ERROR_TYPE_INCOMP_CMD; break; } /* 提取信道列表 */ if (uc_num) { st_scan_req.uc_channel_nums += uc_num; uc_tmp = 0; while(uc_tmp < uc_num) { st_scan_req.ast_channel_list[uc_chan_cnt].en_band = uc_band; st_scan_req.ast_channel_list[uc_chan_cnt].en_bandwidth = WLAN_BAND_WIDTH_20M; st_scan_req.ast_channel_list[uc_chan_cnt].uc_chan_number = auc_buffer[ul_cnt + uc_tmp]; mac_get_channel_idx_from_num(uc_band, auc_buffer[ul_cnt + uc_tmp], &st_scan_req.ast_channel_list[uc_chan_cnt].uc_idx); uc_tmp++; uc_chan_cnt++; } ul_cnt += uc_num; } uc_bidx -= uc_num; /* 提交扫描请求 */ if (!uc_bidx) { oal_uint8 uc_tmp_i; for (uc_tmp_i = 0; uc_tmp_i < st_scan_req.uc_channel_nums; uc_tmp_i++) { OAM_INFO_LOG4(0, OAM_SF_ANY,"[%-6s:%4d]\n", st_scan_req.ast_channel_list[uc_tmp_i].en_band == WLAN_BAND_2G?"2.4G":"5G", st_scan_req.ast_channel_list[uc_tmp_i].uc_chan_number); } break; } } st_scan_req.p_fn_cb = dmac_scan_verify_cb; uc_device_id = auc_buffer[0]; pst_mac_device = mac_res_get_dev(uc_device_id); dmac_scan_add_req(pst_mac_device, &st_scan_req); out: return count; }