Example #1
0
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;
}
Example #4
0
/*****************************************************************************
 函 数 名  : 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;
}
Example #5
0
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;
}