OAL_STATIC oal_uint32 device_test_create_cfg_vap(oal_void) { oal_uint32 ul_return; frw_event_mem_stru *pst_event_mem; frw_event_stru *pst_event; pst_event_mem = FRW_EVENT_ALLOC(0); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_event_mem)) { OAL_IO_PRINT("device_test_create_cfg_vap: hmac_init_event_process FRW_EVENT_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } ul_return = dmac_init_event_process(pst_event_mem); if (OAL_SUCC != ul_return) { OAL_IO_PRINT("device_test_create_cfg_vap: dmac_init_event_process result = fale.\n"); FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } pst_event = (frw_event_stru *)pst_event_mem->puc_data; pst_event->st_event_hdr.uc_device_id = 0; ul_return = dmac_cfg_vap_init_event(pst_event_mem); if (OAL_SUCC != ul_return) { FRW_EVENT_FREE(pst_event_mem); return ul_return; } FRW_EVENT_FREE(pst_event_mem); return OAL_SUCC; }
oal_int32 hi1102_device_main_init(oal_void) { oal_int32 l_return = OAL_FAIL; oal_uint16 us_bitmap; //frw_event_mem_stru *pst_event_mem; //WLAN_EDA_TRACE_TAG(0x4100UL); l_return = platform_module_init(); if (OAL_SUCC != l_return) { OAL_IO_PRINT("host_bottom_main_init: platform_module_init return error code: %d\r\n", l_return); return l_return; } //WLAN_EDA_TRACE_TAG(0x4200UL); l_return = device_module_init(); if (OAL_SUCC != l_return) { OAL_IO_PRINT("host_bottom_main_init: device_module_init return error code: %d\r\n", l_return); us_bitmap = BIT0 | BIT1 | BIT2 | BIT3; builder_module_exit(us_bitmap); return l_return; } #if 0 /* 1102 需要在device初始化成功后同步速率级 */ pst_event_mem = FRW_EVENT_ALLOC(0); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_event_mem)) { OAL_IO_PRINT("hi1102_device_main_init: dmac_init_event_process FRW_EVENT_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } l_return = dmac_init_event_process(pst_event_mem); if (OAL_SUCC != l_return) { OAL_IO_PRINT("hi1102_device_main_init: dmac_init_event_process result = fale.\n"); FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } FRW_EVENT_FREE(pst_event_mem); #endif #if (!defined(HI1102_EDA)) /*device_ready:调用HCC接口通知Hmac,Dmac已经完成初始化 TBD*/ //hcc_send_msg2host(D2H_MSG_WLAN_READY); SDIO_SendMsgSync(D2H_MSG_WLAN_READY); #endif /*启动完成后,输出打印*/ OAL_IO_PRINT("Hi1102_device_main_init:: Hi1102_device_main_init finish!\r\n"); return OAL_SUCC; }
/***************************************************************************** 函 数 名 : dmac_psm_clean_state 功能描述 : this func must be called before any save ps state operate,because save ps state will use netbuf mem clean state including: 1. stop sys timer 2. free alloced netbuf 输入参数 : 输出参数 : 无 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2014年1月14日 作 者 : l00280485 修改内容 : 新生成函数 *****************************************************************************/ oal_uint8 dmac_psm_clean_state (oal_void) { hal_to_dmac_device_stru *pst_hal_device; mac_device_stru *pst_device; oal_uint32 ul_is_netbuf_empty; extern frw_event_mem_stru *g_pst_first_rx_event; /*低功耗前面的流程已检查过合法性,不需要重复检查*/ pst_device = mac_res_get_dev(0); pst_hal_device = pst_device->pst_device_stru; if(g_pst_first_rx_event) { FRW_EVENT_FREE(g_pst_first_rx_event); g_pst_first_rx_event = OAL_PTR_NULL; } hcc_slave_clean(); hal_rx_destroy_dscr_queue(pst_hal_device,OAL_TRUE); /* 检查除oam子池外的三个netbuf子池,深睡前应该这三个子池的netbuf内存都已经释放 */ ul_is_netbuf_empty = oal_mem_is_netbuf_empty(); if (ul_is_netbuf_empty != OAL_TRUE) { OAM_ERROR_LOG0(0,OAM_SF_PWR,"{dmac_psm_clean_state::before deep sleep netbuf is not empty.}"); OAL_MEM_INFO_PRINT(OAL_MEM_POOL_ID_NETBUF); } return OAL_SUCC; }
OAL_STATIC oal_uint32 host_test_get_chip_msg(oal_void) { oal_uint32 ul_return; mac_chip_stru *pst_chip; frw_event_mem_stru *pst_event_mem; frw_event_stru *pst_event; /* 事件结构体 */ oal_uint32 ul_dev_id; oal_netbuf_stru *pst_netbuf; dmac_tx_event_stru *pst_ctx_event; oal_uint8 *pst_mac_rates_11g; /** 待补充 ***/ pst_event_mem = FRW_EVENT_ALLOC(OAL_SIZEOF(dmac_tx_event_stru)); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_event_mem)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process FRW_EVENT_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } /* 申请netbuf内存 */ pst_netbuf = OAL_MEM_NETBUF_ALLOC(OAL_NORMAL_NETBUF, WLAN_MEM_NETBUF_SIZE2, OAL_NETBUF_PRIORITY_MID); if (OAL_UNLIKELY(OAL_PTR_NULL == pst_netbuf)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process OAL_MEM_NETBUF_ALLOC result = OAL_PTR_NULL.\n"); return OAL_FAIL; } pst_event = (frw_event_stru *)pst_event_mem->puc_data; pst_ctx_event = (dmac_tx_event_stru *)pst_event->auc_event_data; pst_ctx_event->pst_netbuf = pst_netbuf; pst_mac_rates_11g = (oal_uint8*)oal_netbuf_data(pst_ctx_event->pst_netbuf); pst_chip = (mac_chip_stru *)(pst_mac_rates_11g + sizeof(mac_data_rate_stru) * MAC_DATARATES_PHY_80211G_NUM); ul_dev_id = (oal_uint32) oal_queue_dequeue(&(g_st_mac_res.st_dev_res.st_queue)); /* 0为无效值 */ if (0 == ul_dev_id) { OAL_IO_PRINT("host_test_get_chip_msg:oal_queue_dequeue return 0!"); FRW_EVENT_FREE(pst_event_mem); return OAL_FAIL; } pst_chip->auc_device_id[0] = (oal_uint8)(ul_dev_id - 1); /* 根据ul_chip_ver,通过hal_chip_init_by_version函数获得 */ pst_chip->uc_device_nums = 1; pst_chip->uc_chip_id = 0; pst_chip->en_chip_state = OAL_TRUE; /* 由hal_chip_get_version函数得到,1102 02需要SOC提供寄存器后实现 */ pst_chip->ul_chip_ver = WLAN_CHIP_VERSION_HI1151V100H; pst_chip->pst_chip_stru = OAL_PTR_NULL; ul_return = hmac_init_event_process(pst_event_mem); if(OAL_UNLIKELY(ul_return != OAL_SUCC)) { OAL_IO_PRINT("host_test_get_chip_msg: hmac_init_event_process ul_return != OAL_SUCC\n"); FRW_EVENT_FREE(pst_event_mem); oal_netbuf_free(pst_netbuf); return OAL_FAIL; } return OAL_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; }