1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <drv_types.h>
25 Caller and the rtw_cmd_thread can protect cmd_q by spin_lock.
26 No irqsave is necessary.
29 sint _rtw_init_cmd_priv (struct cmd_priv *pcmdpriv)
35 _rtw_init_sema(&(pcmdpriv->cmd_queue_sema), 0);
36 //_rtw_init_sema(&(pcmdpriv->cmd_done_sema), 0);
37 _rtw_init_sema(&(pcmdpriv->terminate_cmdthread_sema), 0);
40 _rtw_init_queue(&(pcmdpriv->cmd_queue));
42 //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf
44 pcmdpriv->cmd_seq = 1;
46 pcmdpriv->cmd_allocated_buf = rtw_zmalloc(MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
48 if (pcmdpriv->cmd_allocated_buf == NULL){
53 pcmdpriv->cmd_buf = pcmdpriv->cmd_allocated_buf + CMDBUFF_ALIGN_SZ - ( (SIZE_PTR)(pcmdpriv->cmd_allocated_buf) & (CMDBUFF_ALIGN_SZ-1));
55 pcmdpriv->rsp_allocated_buf = rtw_zmalloc(MAX_RSPSZ + 4);
57 if (pcmdpriv->rsp_allocated_buf == NULL){
62 pcmdpriv->rsp_buf = pcmdpriv->rsp_allocated_buf + 4 - ( (SIZE_PTR)(pcmdpriv->rsp_allocated_buf) & 3);
64 pcmdpriv->cmd_issued_cnt = pcmdpriv->cmd_done_cnt = pcmdpriv->rsp_cnt = 0;
66 _rtw_mutex_init(&pcmdpriv->sctx_mutex);
76 static void c2h_wk_callback(_workitem *work);
78 sint _rtw_init_evt_priv(struct evt_priv *pevtpriv)
85 _rtw_init_sema(&(pevtpriv->lbkevt_done), 0);
86 pevtpriv->lbkevt_limit = 0;
87 pevtpriv->lbkevt_num = 0;
88 pevtpriv->cmdevt_parm = NULL;
91 //allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf
92 ATOMIC_SET(&pevtpriv->event_seq, 0);
93 pevtpriv->evt_done_cnt = 0;
95 #ifdef CONFIG_EVENT_THREAD_MODE
97 _rtw_init_sema(&(pevtpriv->evt_notify), 0);
98 _rtw_init_sema(&(pevtpriv->terminate_evtthread_sema), 0);
100 pevtpriv->evt_allocated_buf = rtw_zmalloc(MAX_EVTSZ + 4);
101 if (pevtpriv->evt_allocated_buf == NULL){
105 pevtpriv->evt_buf = pevtpriv->evt_allocated_buf + 4 - ((unsigned int)(pevtpriv->evt_allocated_buf) & 3);
108 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
109 pevtpriv->allocated_c2h_mem = rtw_zmalloc(C2H_MEM_SZ +4);
111 if (pevtpriv->allocated_c2h_mem == NULL){
116 pevtpriv->c2h_mem = pevtpriv->allocated_c2h_mem + 4\
117 - ( (u32)(pevtpriv->allocated_c2h_mem) & 3);
118 #ifdef PLATFORM_OS_XP
119 pevtpriv->pc2h_mdl= IoAllocateMdl((u8 *)pevtpriv->c2h_mem, C2H_MEM_SZ , FALSE, FALSE, NULL);
121 if(pevtpriv->pc2h_mdl == NULL){
125 MmBuildMdlForNonPagedPool(pevtpriv->pc2h_mdl);
127 #endif //end of CONFIG_SDIO_HCI
129 _rtw_init_queue(&(pevtpriv->evt_queue));
133 #endif //end of CONFIG_EVENT_THREAD_MODE
136 _init_workitem(&pevtpriv->c2h_wk, c2h_wk_callback, NULL);
137 pevtpriv->c2h_wk_alive = _FALSE;
138 pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN+1);
146 void _rtw_free_evt_priv (struct evt_priv *pevtpriv)
150 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("+_rtw_free_evt_priv \n"));
152 #ifdef CONFIG_EVENT_THREAD_MODE
153 _rtw_free_sema(&(pevtpriv->evt_notify));
154 _rtw_free_sema(&(pevtpriv->terminate_evtthread_sema));
157 if (pevtpriv->evt_allocated_buf)
158 rtw_mfree(pevtpriv->evt_allocated_buf, MAX_EVTSZ + 4);
162 _cancel_workitem_sync(&pevtpriv->c2h_wk);
163 while(pevtpriv->c2h_wk_alive)
166 while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) {
168 if ((c2h = rtw_cbuf_pop(pevtpriv->c2h_queue)) != NULL
169 && c2h != (void *)pevtpriv) {
173 rtw_cbuf_free(pevtpriv->c2h_queue);
176 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("-_rtw_free_evt_priv \n"));
182 void _rtw_free_cmd_priv (struct cmd_priv *pcmdpriv)
187 _rtw_spinlock_free(&(pcmdpriv->cmd_queue.lock));
188 _rtw_free_sema(&(pcmdpriv->cmd_queue_sema));
189 //_rtw_free_sema(&(pcmdpriv->cmd_done_sema));
190 _rtw_free_sema(&(pcmdpriv->terminate_cmdthread_sema));
192 if (pcmdpriv->cmd_allocated_buf)
193 rtw_mfree(pcmdpriv->cmd_allocated_buf, MAX_CMDSZ + CMDBUFF_ALIGN_SZ);
195 if (pcmdpriv->rsp_allocated_buf)
196 rtw_mfree(pcmdpriv->rsp_allocated_buf, MAX_RSPSZ + 4);
198 _rtw_mutex_free(&pcmdpriv->sctx_mutex);
206 rtw_enqueue_cmd can only be called between kernel thread,
207 since only spin_lock is used.
209 ISR/Call-Back functions can't call this sub-function.
213 sint _rtw_enqueue_cmd(_queue *queue, struct cmd_obj *obj)
222 //_enter_critical_bh(&queue->lock, &irqL);
223 _enter_critical(&queue->lock, &irqL);
225 rtw_list_insert_tail(&obj->list, &queue->queue);
227 //_exit_critical_bh(&queue->lock, &irqL);
228 _exit_critical(&queue->lock, &irqL);
237 struct cmd_obj *_rtw_dequeue_cmd(_queue *queue)
244 //_enter_critical_bh(&(queue->lock), &irqL);
245 _enter_critical(&queue->lock, &irqL);
246 if (rtw_is_list_empty(&(queue->queue)))
250 obj = LIST_CONTAINOR(get_next(&(queue->queue)), struct cmd_obj, list);
251 rtw_list_delete(&obj->list);
254 //_exit_critical_bh(&(queue->lock), &irqL);
255 _exit_critical(&queue->lock, &irqL);
262 u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
266 res = _rtw_init_cmd_priv (pcmdpriv);
271 u32 rtw_init_evt_priv (struct evt_priv *pevtpriv)
275 res = _rtw_init_evt_priv(pevtpriv);
280 void rtw_free_evt_priv (struct evt_priv *pevtpriv)
283 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_evt_priv\n"));
284 _rtw_free_evt_priv(pevtpriv);
288 void rtw_free_cmd_priv (struct cmd_priv *pcmdpriv)
291 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("rtw_free_cmd_priv\n"));
292 _rtw_free_cmd_priv(pcmdpriv);
296 int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj);
297 int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
299 u8 bAllow = _FALSE; //set to _TRUE to allow enqueuing cmd when hw_init_completed is _FALSE
301 #ifdef SUPPORT_HW_RFOFF_DETECTED
302 //To decide allow or not
303 if( (adapter_to_pwrctl(pcmdpriv->padapter)->bHWPwrPindetect)
304 &&(!pcmdpriv->padapter->registrypriv.usbss_enable)
307 if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra) )
309 struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf;
310 if(pdrvextra_cmd_parm->ec_id == POWER_SAVING_CTRL_WK_CID)
312 //DBG_871X("==>enqueue POWER_SAVING_CTRL_WK_CID\n");
319 #ifndef CONFIG_C2H_PACKET_EN
320 /* C2H should be always allowed */
321 if(cmd_obj->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
322 struct drvextra_cmd_parm *pdrvextra_cmd_parm = (struct drvextra_cmd_parm *)cmd_obj->parmbuf;
323 if(pdrvextra_cmd_parm->ec_id == C2H_WK_CID) {
329 if(cmd_obj->cmdcode == GEN_CMD_CODE(_SetChannelPlan))
333 if( (pcmdpriv->padapter->hw_init_completed ==_FALSE && bAllow == _FALSE)
334 || ATOMIC_READ(&(pcmdpriv->cmdthd_running)) == _FALSE //com_thread not running
337 //DBG_871X("%s:%s: drop cmdcode:%u, hw_init_completed:%u, cmdthd_running:%u\n", caller_func, __FUNCTION__,
339 // pcmdpriv->padapter->hw_init_completed,
340 // pcmdpriv->cmdthd_running
350 u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj)
353 PADAPTER padapter = pcmdpriv->padapter;
357 if (cmd_obj == NULL) {
361 cmd_obj->padapter = padapter;
363 #ifdef CONFIG_CONCURRENT_MODE
364 //change pcmdpriv to primary's pcmdpriv
365 if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)
366 pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);
369 if( _FAIL == (res=rtw_cmd_filter(pcmdpriv, cmd_obj)) ) {
370 rtw_free_cmd_obj(cmd_obj);
374 res = _rtw_enqueue_cmd(&pcmdpriv->cmd_queue, cmd_obj);
378 _rtw_up_sema(&pcmdpriv->cmd_queue_sema);
387 struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv)
389 struct cmd_obj *cmd_obj;
392 cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue);
398 void rtw_cmd_clr_isr(struct cmd_priv *pcmdpriv)
401 pcmdpriv->cmd_done_cnt++;
402 //_rtw_up_sema(&(pcmdpriv->cmd_done_sema));
406 void rtw_free_cmd_obj(struct cmd_obj *pcmd)
410 if((pcmd->cmdcode!=_JoinBss_CMD_) &&(pcmd->cmdcode!= _CreateBss_CMD_))
412 //free parmbuf in cmd_obj
413 rtw_mfree((unsigned char*)pcmd->parmbuf, pcmd->cmdsz);
420 //free rsp in cmd_obj
421 rtw_mfree((unsigned char*)pcmd->rsp, pcmd->rspsz);
426 rtw_mfree((unsigned char*)pcmd, sizeof(struct cmd_obj));
432 void rtw_stop_cmd_thread(_adapter *adapter)
434 struct cmd_priv *pcmdpriv = &(adapter->cmdpriv);
437 if(adapter->cmdThread &&
438 ATOMIC_READ(&(adapter->cmdpriv.cmdthd_running)) == _TRUE &&
439 adapter->cmdpriv.stop_req == 0)
441 DBG_871X("%s: up sema\n", __func__);
442 adapter->cmdpriv.stop_req = 1;
443 _rtw_up_sema(&adapter->cmdpriv.cmd_queue_sema);
444 DBG_871X("%s: terminate_cmdthread_sema: %d\n",
446 adapter->cmdpriv.terminate_cmdthread_sema.count);
447 _rtw_down_sema(&adapter->cmdpriv.terminate_cmdthread_sema);
451 thread_return rtw_cmd_thread(thread_context context)
454 struct cmd_obj *pcmd;
455 u8 *pcmdbuf, *prspbuf;
457 u32 cmd_process_time;
458 u8 (*cmd_hdl)(_adapter *padapter, u8* pbuf);
459 void (*pcmd_callback)(_adapter *dev, struct cmd_obj *pcmd);
460 PADAPTER padapter = (PADAPTER)context;
461 struct cmd_priv *pcmdpriv = &(padapter->cmdpriv);
462 struct drvextra_cmd_parm *extra_parm = NULL;
466 thread_enter("RTW_CMD_THREAD");
468 pcmdbuf = pcmdpriv->cmd_buf;
469 prspbuf = pcmdpriv->rsp_buf;
471 pcmdpriv->stop_req = 0;
472 ATOMIC_SET(&(pcmdpriv->cmdthd_running), _TRUE);
473 _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
475 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("start r871x rtw_cmd_thread !!!!\n"));
479 if (_rtw_down_sema(&pcmdpriv->cmd_queue_sema) == _FAIL) {
480 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" _rtw_down_sema(&pcmdpriv->cmd_queue_sema) return _FAIL, break\n", FUNC_ADPT_ARG(padapter));
484 if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved == _TRUE))
486 DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n",
487 __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__);
488 DBG_871X("%s: terminate_cmdthread_sema: %d\n", __func__,
489 padapter->cmdpriv.terminate_cmdthread_sema.count);
493 if (pcmdpriv->stop_req) {
494 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" stop_req:%u, break\n", FUNC_ADPT_ARG(padapter), pcmdpriv->stop_req);
498 if(rtw_is_list_empty(&(pcmdpriv->cmd_queue.queue)))
500 //DBG_871X("%s: cmd queue is empty!\n", __func__);
504 #ifdef CONFIG_LPS_LCLK
505 if (rtw_register_cmd_alive(padapter) != _SUCCESS)
507 RT_TRACE(_module_hal_xmit_c_, _drv_notice_,
508 ("%s: wait to leave LPS_LCLK\n", __FUNCTION__));
514 if ((padapter->bDriverStopped == _TRUE)||(padapter->bSurpriseRemoved== _TRUE))
516 DBG_871X_LEVEL(_drv_always_, "%s: DriverStopped(%d) SurpriseRemoved(%d) break at line %d\n",
517 __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved, __LINE__);
521 if(!(pcmd = rtw_dequeue_cmd(pcmdpriv))) {
522 #ifdef CONFIG_LPS_LCLK
523 rtw_unregister_cmd_alive(padapter);
528 cmd_start_time = rtw_get_current_time();
530 if( _FAIL == rtw_cmd_filter(pcmdpriv, pcmd) )
532 pcmd->res = H2C_DROPPED;
536 pcmdpriv->cmd_issued_cnt++;
538 pcmd->cmdsz = _RND4((pcmd->cmdsz));//_RND4
540 _rtw_memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz);
542 if(pcmd->cmdcode < (sizeof(wlancmds) /sizeof(struct cmd_hdl)))
544 cmd_hdl = wlancmds[pcmd->cmdcode].h2cfuns;
548 ret = cmd_hdl(pcmd->padapter, pcmdbuf);
556 pcmd->res = H2C_PARAMETERS_ERROR;
563 _enter_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);
566 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" pcmd->sctx\n",
567 FUNC_ADPT_ARG(pcmd->padapter));
568 if (pcmd->res == H2C_SUCCESS)
569 rtw_sctx_done(&pcmd->sctx);
571 rtw_sctx_done_err(&pcmd->sctx, RTW_SCTX_DONE_CMD_ERROR);
573 _exit_critical_mutex(&(pcmd->padapter->cmdpriv.sctx_mutex), NULL);
576 if((cmd_process_time = rtw_get_passing_time_ms(cmd_start_time)) > 1000)
578 if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
579 struct drvextra_cmd_parm *drvextra_parm = (struct drvextra_cmd_parm *)pcmdbuf;
580 DBG_871X(ADPT_FMT" cmd=%d,%d,%d process_time=%d > 1 sec\n",
581 ADPT_ARG(pcmd->padapter), pcmd->cmdcode, drvextra_parm->ec_id, drvextra_parm->type, cmd_process_time);
583 } else if(pcmd->cmdcode == GEN_CMD_CODE(_Set_MLME_EVT)){
584 struct C2HEvent_Header *pc2h_evt_hdr = (struct C2HEvent_Header *)pcmdbuf;
585 DBG_871X(ADPT_FMT" cmd=%d,%d, process_time=%d > 1 sec\n",
586 ADPT_ARG(pcmd->padapter), pcmd->cmdcode, pc2h_evt_hdr->ID, cmd_process_time);
589 DBG_871X(ADPT_FMT" cmd=%d, process_time=%d > 1 sec\n",
590 ADPT_ARG(pcmd->padapter), pcmd->cmdcode, cmd_process_time);
595 //call callback function for post-processed
596 if(pcmd->cmdcode < (sizeof(rtw_cmd_callback) /sizeof(struct _cmd_callback)))
598 pcmd_callback = rtw_cmd_callback[pcmd->cmdcode].callback;
599 if(pcmd_callback == NULL)
601 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("mlme_cmd_hdl(): pcmd_callback=0x%p, cmdcode=0x%x\n", pcmd_callback, pcmd->cmdcode));
602 rtw_free_cmd_obj(pcmd);
606 //todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!=NULL)
607 pcmd_callback(pcmd->padapter, pcmd);//need conider that free cmd_obj in rtw_cmd_callback
612 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("%s: cmdcode=0x%x callback not defined!\n", __FUNCTION__, pcmd->cmdcode));
613 rtw_free_cmd_obj(pcmd);
616 flush_signals_thread();
622 // free all cmd_obj resources
624 pcmd = rtw_dequeue_cmd(pcmdpriv);
626 #ifdef CONFIG_LPS_LCLK
627 rtw_unregister_cmd_alive(padapter);
629 DBG_871X("%s: pcmd==NULL\n", __FUNCTION__);
633 DBG_871X("%s: leaving... drop cmdcode:%u size:%d\n", __FUNCTION__, pcmd->cmdcode, pcmd->cmdsz);
635 if (pcmd->cmdcode == GEN_CMD_CODE(_Set_Drv_Extra)) {
636 extra_parm = (struct drvextra_cmd_parm *)pcmd->parmbuf;
637 if(extra_parm->pbuf && extra_parm->size > 0) {
638 rtw_mfree(extra_parm->pbuf, extra_parm->size);
642 rtw_free_cmd_obj(pcmd);
645 _rtw_up_sema(&pcmdpriv->terminate_cmdthread_sema);
652 #ifdef CONFIG_EVENT_THREAD_MODE
653 u32 rtw_enqueue_evt(struct evt_priv *pevtpriv, struct evt_obj *obj)
657 _queue *queue = &pevtpriv->evt_queue;
668 _enter_critical_bh(&queue->lock, &irqL);
670 rtw_list_insert_tail(&obj->list, &queue->queue);
672 _exit_critical_bh(&queue->lock, &irqL);
674 //rtw_evt_notify_isr(pevtpriv);
683 struct evt_obj *rtw_dequeue_evt(_queue *queue)
686 struct evt_obj *pevtobj;
690 _enter_critical_bh(&queue->lock, &irqL);
692 if (rtw_is_list_empty(&(queue->queue)))
696 pevtobj = LIST_CONTAINOR(get_next(&(queue->queue)), struct evt_obj, list);
697 rtw_list_delete(&pevtobj->list);
700 _exit_critical_bh(&queue->lock, &irqL);
707 void rtw_free_evt_obj(struct evt_obj *pevtobj)
712 rtw_mfree((unsigned char*)pevtobj->parmbuf, pevtobj->evtsz);
714 rtw_mfree((unsigned char*)pevtobj, sizeof(struct evt_obj));
719 void rtw_evt_notify_isr(struct evt_priv *pevtpriv)
722 pevtpriv->evt_done_cnt++;
723 _rtw_up_sema(&(pevtpriv->evt_notify));
730 u8 rtw_setstandby_cmd(unsigned char *adapter)
732 u8 rtw_setstandby_cmd(_adapter *padapter, uint action)
734 struct cmd_obj* ph2c;
735 struct usb_suspend_parm* psetusbsuspend;
736 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
742 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
748 psetusbsuspend = (struct usb_suspend_parm*)rtw_zmalloc(sizeof(struct usb_suspend_parm));
749 if (psetusbsuspend == NULL) {
750 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
755 psetusbsuspend->action = action;
757 init_h2fwcmd_w_parm_no_rsp(ph2c, psetusbsuspend, GEN_CMD_CODE(_SetUsbSuspend));
759 ret = rtw_enqueue_cmd(pcmdpriv, ph2c);
769 rtw_sitesurvey_cmd(~)
771 MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock
773 u8 rtw_sitesurvey_cmd(_adapter *padapter, NDIS_802_11_SSID *ssid, int ssid_num,
774 struct rtw_ieee80211_channel *ch, int ch_num)
777 struct cmd_obj *ph2c;
778 struct sitesurvey_parm *psurveyPara;
779 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
780 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
782 struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
788 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE){
789 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1);
794 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
795 p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1);
797 #endif //CONFIG_P2P_PS
799 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
803 psurveyPara = (struct sitesurvey_parm*)rtw_zmalloc(sizeof(struct sitesurvey_parm));
804 if (psurveyPara == NULL) {
805 rtw_mfree((unsigned char*) ph2c, sizeof(struct cmd_obj));
809 rtw_free_network_queue(padapter, _FALSE);
811 RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("%s: flush network queue\n", __FUNCTION__));
813 init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey));
815 /* psurveyPara->bsslimit = 48; */
816 psurveyPara->scan_mode = pmlmepriv->scan_mode;
818 /* prepare ssid list */
821 for (i=0; i<ssid_num && i< RTW_SSID_SCAN_AMOUNT; i++) {
822 if (ssid[i].SsidLength) {
823 _rtw_memcpy(&psurveyPara->ssid[i], &ssid[i], sizeof(NDIS_802_11_SSID));
824 psurveyPara->ssid_num++;
826 DBG_871X(FUNC_ADPT_FMT" ssid:(%s, %d)\n", FUNC_ADPT_ARG(padapter),
827 psurveyPara->ssid[i].Ssid, psurveyPara->ssid[i].SsidLength);
832 /* prepare channel list */
835 for (i=0; i<ch_num && i< RTW_CHANNEL_SCAN_AMOUNT; i++) {
836 if (ch[i].hw_value && !(ch[i].flags & RTW_IEEE80211_CHAN_DISABLED)) {
837 _rtw_memcpy(&psurveyPara->ch[i], &ch[i], sizeof(struct rtw_ieee80211_channel));
838 psurveyPara->ch_num++;
840 DBG_871X(FUNC_ADPT_FMT" ch:%u\n", FUNC_ADPT_ARG(padapter),
841 psurveyPara->ch[i].hw_value);
846 set_fwstate(pmlmepriv, _FW_UNDER_SURVEY);
848 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
850 if(res == _SUCCESS) {
852 pmlmepriv->scan_start_time = rtw_get_current_time();
854 #ifdef CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
855 if((padapter->pbuddy_adapter->mlmeextpriv.mlmext_info.state&0x03) == WIFI_FW_AP_STATE)
856 _set_timer(&pmlmepriv->scan_to_timer, SURVEY_TO *
857 ( padapter->mlmeextpriv.max_chan_nums + ( padapter->mlmeextpriv.max_chan_nums / RTW_SCAN_NUM_OF_CH ) * RTW_STAY_AP_CH_MILLISECOND ) + 1000 );
859 #endif //CONFIG_STA_MODE_SCAN_UNDER_AP_MODE
860 _set_timer(&pmlmepriv->scan_to_timer, SCANNING_TIMEOUT);
862 rtw_led_control(padapter, LED_CTL_SITE_SURVEY);
864 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY);
872 u8 rtw_setdatarate_cmd(_adapter *padapter, u8 *rateset)
874 struct cmd_obj* ph2c;
875 struct setdatarate_parm* pbsetdataratepara;
876 struct cmd_priv* pcmdpriv = &padapter->cmdpriv;
881 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
887 pbsetdataratepara = (struct setdatarate_parm*)rtw_zmalloc(sizeof(struct setdatarate_parm));
888 if (pbsetdataratepara == NULL) {
889 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
894 init_h2fwcmd_w_parm_no_rsp(ph2c, pbsetdataratepara, GEN_CMD_CODE(_SetDataRate));
895 #ifdef MP_FIRMWARE_OFFLOAD
896 pbsetdataratepara->curr_rateidx = *(u32*)rateset;
897 // _rtw_memcpy(pbsetdataratepara, rateset, sizeof(u32));
899 pbsetdataratepara->mac_id = 5;
900 _rtw_memcpy(pbsetdataratepara->datarates, rateset, NumRates);
902 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
910 u8 rtw_setbasicrate_cmd(_adapter *padapter, u8 *rateset)
912 struct cmd_obj* ph2c;
913 struct setbasicrate_parm* pssetbasicratepara;
914 struct cmd_priv* pcmdpriv=&padapter->cmdpriv;
919 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
924 pssetbasicratepara = (struct setbasicrate_parm*)rtw_zmalloc(sizeof(struct setbasicrate_parm));
926 if (pssetbasicratepara == NULL) {
927 rtw_mfree((u8*) ph2c, sizeof(struct cmd_obj));
932 init_h2fwcmd_w_parm_no_rsp(ph2c, pssetbasicratepara, _SetBasicRate_CMD_);
934 _rtw_memcpy(pssetbasicratepara->basicrates, rateset, NumRates);
936 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
946 unsigned char rtw_setphy_cmd(unsigned char *adapter)
948 1. be called only after rtw_update_registrypriv_dev_network( ~) or mp testing program
949 2. for AdHoc/Ap mode or mp mode?
952 u8 rtw_setphy_cmd(_adapter *padapter, u8 modem, u8 ch)
954 struct cmd_obj* ph2c;
955 struct setphy_parm* psetphypara;
956 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
957 // struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
958 // struct registry_priv* pregistry_priv = &padapter->registrypriv;
963 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
968 psetphypara = (struct setphy_parm*)rtw_zmalloc(sizeof(struct setphy_parm));
970 if(psetphypara==NULL){
971 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
976 init_h2fwcmd_w_parm_no_rsp(ph2c, psetphypara, _SetPhy_CMD_);
978 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("CH=%d, modem=%d", ch, modem));
980 psetphypara->modem = modem;
981 psetphypara->rfchannel = ch;
983 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
989 u8 rtw_setbbreg_cmd(_adapter*padapter, u8 offset, u8 val)
991 struct cmd_obj* ph2c;
992 struct writeBB_parm* pwritebbparm;
993 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
996 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1001 pwritebbparm = (struct writeBB_parm*)rtw_zmalloc(sizeof(struct writeBB_parm));
1003 if(pwritebbparm==NULL){
1004 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1009 init_h2fwcmd_w_parm_no_rsp(ph2c, pwritebbparm, GEN_CMD_CODE(_SetBBReg));
1011 pwritebbparm->offset = offset;
1012 pwritebbparm->value = val;
1014 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1020 u8 rtw_getbbreg_cmd(_adapter *padapter, u8 offset, u8 *pval)
1022 struct cmd_obj* ph2c;
1023 struct readBB_parm* prdbbparm;
1024 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1028 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1033 prdbbparm = (struct readBB_parm*)rtw_zmalloc(sizeof(struct readBB_parm));
1035 if(prdbbparm ==NULL){
1036 rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
1040 _rtw_init_listhead(&ph2c->list);
1041 ph2c->cmdcode =GEN_CMD_CODE(_GetBBReg);
1042 ph2c->parmbuf = (unsigned char *)prdbbparm;
1043 ph2c->cmdsz = sizeof(struct readBB_parm);
1045 ph2c->rspsz = sizeof(struct readBB_rsp);
1047 prdbbparm ->offset = offset;
1049 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1055 u8 rtw_setrfreg_cmd(_adapter *padapter, u8 offset, u32 val)
1057 struct cmd_obj* ph2c;
1058 struct writeRF_parm* pwriterfparm;
1059 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1062 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1067 pwriterfparm = (struct writeRF_parm*)rtw_zmalloc(sizeof(struct writeRF_parm));
1069 if(pwriterfparm==NULL){
1070 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1075 init_h2fwcmd_w_parm_no_rsp(ph2c, pwriterfparm, GEN_CMD_CODE(_SetRFReg));
1077 pwriterfparm->offset = offset;
1078 pwriterfparm->value = val;
1080 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1086 u8 rtw_getrfreg_cmd(_adapter *padapter, u8 offset, u8 *pval)
1088 struct cmd_obj* ph2c;
1089 struct readRF_parm* prdrfparm;
1090 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1095 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1101 prdrfparm = (struct readRF_parm*)rtw_zmalloc(sizeof(struct readRF_parm));
1102 if(prdrfparm ==NULL){
1103 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1108 _rtw_init_listhead(&ph2c->list);
1109 ph2c->cmdcode =GEN_CMD_CODE(_GetRFReg);
1110 ph2c->parmbuf = (unsigned char *)prdrfparm;
1111 ph2c->cmdsz = sizeof(struct readRF_parm);
1113 ph2c->rspsz = sizeof(struct readRF_rsp);
1115 prdrfparm ->offset = offset;
1117 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1126 void rtw_getbbrfreg_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
1130 //rtw_free_cmd_obj(pcmd);
1131 rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);
1132 rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));
1134 #ifdef CONFIG_MP_INCLUDED
1135 if (padapter->registrypriv.mp_mode == 1)
1136 padapter->mppriv.workparam.bcompleted= _TRUE;
1141 void rtw_readtssi_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
1145 rtw_mfree((unsigned char*) pcmd->parmbuf, pcmd->cmdsz);
1146 rtw_mfree((unsigned char*) pcmd, sizeof(struct cmd_obj));
1148 #ifdef CONFIG_MP_INCLUDED
1149 if (padapter->registrypriv.mp_mode == 1)
1150 padapter->mppriv.workparam.bcompleted= _TRUE;
1156 u8 rtw_createbss_cmd(_adapter *padapter)
1158 struct cmd_obj* pcmd;
1159 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1160 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1161 WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network;
1166 rtw_led_control(padapter, LED_CTL_START_TO_LINK);
1168 if (pmlmepriv->assoc_ssid.SsidLength == 0){
1169 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid));
1171 RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid));
1174 pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1180 _rtw_init_listhead(&pcmd->list);
1181 pcmd->cmdcode = _CreateBss_CMD_;
1182 pcmd->parmbuf = (unsigned char *)pdev_network;
1183 pcmd->cmdsz = get_WLAN_BSSID_EX_sz((WLAN_BSSID_EX*)pdev_network);
1187 pdev_network->Length = pcmd->cmdsz;
1189 #ifdef CONFIG_RTL8712
1190 //notes: translate IELength & Length after assign the Length to cmdsz;
1191 pdev_network->Length = cpu_to_le32(pcmd->cmdsz);
1192 pdev_network->IELength = cpu_to_le32(pdev_network->IELength);
1193 pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength);
1196 res = rtw_enqueue_cmd(pcmdpriv, pcmd);
1205 u8 rtw_createbss_cmd_ex(_adapter *padapter, unsigned char *pbss, unsigned int sz)
1207 struct cmd_obj* pcmd;
1208 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1213 pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1219 _rtw_init_listhead(&pcmd->list);
1220 pcmd->cmdcode = GEN_CMD_CODE(_CreateBss);
1221 pcmd->parmbuf = pbss;
1226 res = rtw_enqueue_cmd(pcmdpriv, pcmd);
1235 u8 rtw_startbss_cmd(_adapter *padapter, int flags)
1237 struct cmd_obj* pcmd;
1238 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1239 struct submit_ctx sctx;
1244 if (flags & RTW_CMDF_DIRECTLY) {
1245 /* no need to enqueue, do the cmd hdl directly and free cmd parameter */
1246 start_bss_network(padapter, (u8*)&(padapter->mlmepriv.cur_network.network));
1248 /* need enqueue, prepare cmd_obj and enqueue */
1249 pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1255 _rtw_init_listhead(&pcmd->list);
1256 pcmd->cmdcode = GEN_CMD_CODE(_CreateBss);
1257 pcmd->parmbuf = NULL;
1262 if (flags & RTW_CMDF_WAIT_ACK) {
1264 rtw_sctx_init(&sctx, 2000);
1267 res = rtw_enqueue_cmd(pcmdpriv, pcmd);
1269 if (res == _SUCCESS && (flags & RTW_CMDF_WAIT_ACK)) {
1270 rtw_sctx_wait(&sctx, __func__);
1271 _enter_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
1272 if (sctx.status == RTW_SCTX_SUBMITTED)
1274 _exit_critical_mutex(&pcmdpriv->sctx_mutex, NULL);
1285 u8 rtw_joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork)
1287 u8 *auth, res = _SUCCESS;
1289 WLAN_BSSID_EX *psecnetwork;
1290 struct cmd_obj *pcmd;
1291 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1292 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1293 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
1294 struct security_priv *psecuritypriv=&padapter->securitypriv;
1295 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1296 #ifdef CONFIG_80211N_HT
1297 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1298 #endif //CONFIG_80211N_HT
1299 #ifdef CONFIG_80211AC_VHT
1300 struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
1301 #endif //CONFIG_80211AC_VHT
1302 NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode;
1303 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1304 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1309 rtw_led_control(padapter, LED_CTL_START_TO_LINK);
1311 if (pmlmepriv->assoc_ssid.SsidLength == 0){
1312 RT_TRACE(_module_rtl871x_cmd_c_, _drv_info_, ("+Join cmd: Any SSid\n"));
1314 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+Join cmd: SSid=[%s]\n", pmlmepriv->assoc_ssid.Ssid));
1317 pcmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1320 RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd: memory allocate for cmd_obj fail!!!\n"));
1323 /* // for IEs is pointer
1324 t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 +
1325 sizeof (NDIS_802_11_SSID) + sizeof (ULONG) +
1326 sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) +
1327 sizeof (NDIS_802_11_CONFIGURATION) +
1328 sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) +
1329 sizeof (NDIS_802_11_RATES_EX)+ sizeof(WLAN_PHY_INFO)+ sizeof (ULONG) + MAX_IE_SZ;
1331 //for IEs is fix buf size
1332 t_len = sizeof(WLAN_BSSID_EX);
1335 //for hidden ap to set fw_state here
1336 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) != _TRUE)
1338 switch(ndis_network_mode)
1340 case Ndis802_11IBSS:
1341 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
1344 case Ndis802_11Infrastructure:
1345 set_fwstate(pmlmepriv, WIFI_STATION_STATE);
1348 case Ndis802_11APMode:
1349 case Ndis802_11AutoUnknown:
1350 case Ndis802_11InfrastructureMax:
1356 psecnetwork=(WLAN_BSSID_EX *)&psecuritypriv->sec_bss;
1357 if(psecnetwork==NULL)
1360 rtw_mfree((unsigned char *)pcmd, sizeof(struct cmd_obj));
1364 RT_TRACE(_module_rtl871x_cmd_c_, _drv_err_, ("rtw_joinbss_cmd :psecnetwork==NULL!!!\n"));
1369 _rtw_memset(psecnetwork, 0, t_len);
1371 _rtw_memcpy(psecnetwork, &pnetwork->network, get_WLAN_BSSID_EX_sz(&pnetwork->network));
1373 auth=&psecuritypriv->authenticator_ie[0];
1374 psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength;
1376 if((psecnetwork->IELength-12) < (256-1)) {
1377 _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12);
1379 _rtw_memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1));
1382 psecnetwork->IELength = 0;
1383 // Added by Albert 2009/02/18
1384 // If the the driver wants to use the bssid to create the connection.
1385 // If not, we have to copy the connecting AP's MAC address to it so that
1386 // the driver just has the bssid information for PMKIDList searching.
1388 if ( pmlmepriv->assoc_by_bssid == _FALSE )
1390 _rtw_memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN );
1393 psecnetwork->IELength = rtw_restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength);
1396 pqospriv->qos_option = 0;
1398 if(pregistrypriv->wmm_enable)
1400 tmp_len = rtw_restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength);
1402 if (psecnetwork->IELength != tmp_len)
1404 psecnetwork->IELength = tmp_len;
1405 pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon
1409 pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon
1413 #ifdef CONFIG_80211N_HT
1414 phtpriv->ht_option = _FALSE;
1415 ptmp = rtw_get_ie(&pnetwork->network.IEs[12], _HT_CAPABILITY_IE_, &tmp_len, pnetwork->network.IELength-12);
1416 if(pregistrypriv->ht_enable && ptmp && tmp_len>0)
1418 // Added by Albert 2010/06/23
1419 // For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue.
1420 // Especially for Realtek 8192u SoftAP.
1421 if ( ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_ ) &&
1422 ( padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_ ) &&
1423 ( padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_ ))
1425 rtw_ht_use_default_setting(padapter);
1427 rtw_build_wmm_ie_ht(padapter, &psecnetwork->IEs[12], &psecnetwork->IELength);
1429 //rtw_restructure_ht_ie
1430 rtw_restructure_ht_ie(padapter, &pnetwork->network.IEs[12], &psecnetwork->IEs[0],
1431 pnetwork->network.IELength-12, &psecnetwork->IELength,
1432 pnetwork->network.Configuration.DSConfig);
1436 #ifdef CONFIG_80211AC_VHT
1437 pvhtpriv->vht_option = _FALSE;
1438 if (phtpriv->ht_option && pregistrypriv->vht_enable) {
1439 rtw_restructure_vht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0],
1440 pnetwork->network.IELength, &psecnetwork->IELength);
1444 rtw_append_exented_cap(padapter, &psecnetwork->IEs[0], &psecnetwork->IELength);
1446 #endif //CONFIG_80211N_HT
1448 pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pnetwork->network.IEs, pnetwork->network.IELength);
1451 psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength;
1453 if(psecnetwork->IELength < (256-1))
1455 _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength);
1459 _rtw_memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1));
1463 pcmd->cmdsz = get_WLAN_BSSID_EX_sz(psecnetwork);//get cmdsz before endian conversion
1465 #ifdef CONFIG_RTL8712
1466 //wlan_network endian conversion
1467 psecnetwork->Length = cpu_to_le32(psecnetwork->Length);
1468 psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength);
1469 psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy);
1470 psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi);
1471 psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse);
1472 psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow);
1473 psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod);
1474 psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig);
1475 psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime);
1476 psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern);
1477 psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet);
1478 psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length);
1479 psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length);
1480 psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode);
1481 psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength);
1484 _rtw_init_listhead(&pcmd->list);
1485 pcmd->cmdcode = _JoinBss_CMD_;//GEN_CMD_CODE(_JoinBss)
1486 pcmd->parmbuf = (unsigned char *)psecnetwork;
1490 res = rtw_enqueue_cmd(pcmdpriv, pcmd);
1499 u8 rtw_disassoc_cmd(_adapter*padapter, u32 deauth_timeout_ms, bool enqueue) /* for sta_mode */
1501 struct cmd_obj *cmdobj = NULL;
1502 struct disconnect_parm *param = NULL;
1503 struct cmd_priv *cmdpriv = &padapter->cmdpriv;
1508 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_disassoc_cmd\n"));
1510 /* prepare cmd parameter */
1511 param = (struct disconnect_parm *)rtw_zmalloc(sizeof(*param));
1512 if (param == NULL) {
1516 param->deauth_timeout_ms = deauth_timeout_ms;
1519 /* need enqueue, prepare cmd_obj and enqueue */
1520 cmdobj = (struct cmd_obj *)rtw_zmalloc(sizeof(*cmdobj));
1521 if (cmdobj == NULL) {
1523 rtw_mfree((u8 *)param, sizeof(*param));
1526 init_h2fwcmd_w_parm_no_rsp(cmdobj, param, _DisConnect_CMD_);
1527 res = rtw_enqueue_cmd(cmdpriv, cmdobj);
1529 /* no need to enqueue, do the cmd hdl directly and free cmd parameter */
1530 if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param))
1532 rtw_mfree((u8 *)param, sizeof(*param));
1542 u8 rtw_setopmode_cmd(_adapter *padapter, NDIS_802_11_NETWORK_INFRASTRUCTURE networktype, bool enqueue)
1544 struct cmd_obj* ph2c;
1545 struct setopmode_parm* psetop;
1547 struct cmd_priv *pcmdpriv= &padapter->cmdpriv;
1551 psetop = (struct setopmode_parm*)rtw_zmalloc(sizeof(struct setopmode_parm));
1557 psetop->mode = (u8)networktype;
1560 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1562 rtw_mfree((u8 *)psetop, sizeof(*psetop));
1567 init_h2fwcmd_w_parm_no_rsp(ph2c, psetop, _SetOpMode_CMD_);
1568 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1571 setopmode_hdl(padapter, (u8 *)psetop);
1572 rtw_mfree((u8 *)psetop, sizeof(*psetop));
1581 u8 rtw_setstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 unicast_key, bool enqueue)
1583 struct cmd_obj* ph2c;
1584 struct set_stakey_parm *psetstakey_para;
1585 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1586 struct set_stakey_rsp *psetstakey_rsp = NULL;
1588 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1589 struct security_priv *psecuritypriv = &padapter->securitypriv;
1594 psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
1595 if(psetstakey_para==NULL){
1600 _rtw_memcpy(psetstakey_para->addr, sta->hwaddr,ETH_ALEN);
1602 if(check_fwstate(pmlmepriv, WIFI_STATION_STATE)){
1604 if(sta->tdls_sta_state&TDLS_LINKED_STATE)
1605 psetstakey_para->algorithm=(u8)sta->dot118021XPrivacy;
1607 #endif //CONFIG_TDLS
1608 psetstakey_para->algorithm =(unsigned char) psecuritypriv->dot11PrivacyAlgrthm;
1610 GET_ENCRY_ALGO(psecuritypriv, sta, psetstakey_para->algorithm, _FALSE);
1613 if (unicast_key == _TRUE) {
1615 if((sta->tdls_sta_state&TDLS_LINKED_STATE)==TDLS_LINKED_STATE)
1616 _rtw_memcpy(&psetstakey_para->key, sta->tpk.tk, 16);
1618 #endif //CONFIG_TDLS
1619 _rtw_memcpy(&psetstakey_para->key, &sta->dot118021x_UncstKey, 16);
1622 _rtw_memcpy(&psetstakey_para->key, &psecuritypriv->dot118021XGrpKey[psecuritypriv->dot118021XGrpKeyid].skey, 16);
1625 //jeff: set this becasue at least sw key is ready
1626 padapter->securitypriv.busetkipkey=_TRUE;
1630 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1632 rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
1637 psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp));
1638 if(psetstakey_rsp == NULL){
1639 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1640 rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
1645 init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
1646 ph2c->rsp = (u8 *) psetstakey_rsp;
1647 ph2c->rspsz = sizeof(struct set_stakey_rsp);
1648 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1651 set_stakey_hdl(padapter, (u8 *)psetstakey_para);
1652 rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
1661 u8 rtw_clearstakey_cmd(_adapter *padapter, struct sta_info *sta, u8 enqueue)
1664 struct cmd_obj* ph2c;
1665 struct set_stakey_parm *psetstakey_para;
1666 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1667 struct set_stakey_rsp *psetstakey_rsp = NULL;
1668 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1669 struct security_priv *psecuritypriv = &padapter->securitypriv;
1677 while((cam_id = rtw_camid_search(padapter, sta->hwaddr, -1)) >= 0) {
1678 DBG_871X_LEVEL(_drv_always_, "clear key for addr:"MAC_FMT", camid:%d\n", MAC_ARG(sta->hwaddr), cam_id);
1679 clear_cam_entry(padapter, cam_id);
1680 rtw_camid_free(padapter, cam_id);
1686 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1692 psetstakey_para = (struct set_stakey_parm*)rtw_zmalloc(sizeof(struct set_stakey_parm));
1693 if(psetstakey_para==NULL){
1694 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1699 psetstakey_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_stakey_rsp));
1700 if(psetstakey_rsp == NULL){
1701 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1702 rtw_mfree((u8 *) psetstakey_para, sizeof(struct set_stakey_parm));
1707 init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
1708 ph2c->rsp = (u8 *) psetstakey_rsp;
1709 ph2c->rspsz = sizeof(struct set_stakey_rsp);
1711 _rtw_memcpy(psetstakey_para->addr, sta->hwaddr, ETH_ALEN);
1713 psetstakey_para->algorithm = _NO_PRIVACY_;
1715 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1726 u8 rtw_setrttbl_cmd(_adapter *padapter, struct setratable_parm *prate_table)
1728 struct cmd_obj* ph2c;
1729 struct setratable_parm * psetrttblparm;
1730 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1734 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1739 psetrttblparm = (struct setratable_parm*)rtw_zmalloc(sizeof(struct setratable_parm));
1741 if(psetrttblparm==NULL){
1742 rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
1747 init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));
1749 _rtw_memcpy(psetrttblparm,prate_table,sizeof(struct setratable_parm));
1751 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1758 u8 rtw_getrttbl_cmd(_adapter *padapter, struct getratable_rsp *pval)
1760 struct cmd_obj* ph2c;
1761 struct getratable_parm * pgetrttblparm;
1762 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1766 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1771 pgetrttblparm = (struct getratable_parm*)rtw_zmalloc(sizeof(struct getratable_parm));
1773 if(pgetrttblparm==NULL){
1774 rtw_mfree((unsigned char *) ph2c, sizeof(struct cmd_obj));
1779 // init_h2fwcmd_w_parm_no_rsp(ph2c, psetrttblparm, GEN_CMD_CODE(_SetRaTable));
1781 _rtw_init_listhead(&ph2c->list);
1782 ph2c->cmdcode =GEN_CMD_CODE(_GetRaTable);
1783 ph2c->parmbuf = (unsigned char *)pgetrttblparm;
1784 ph2c->cmdsz = sizeof(struct getratable_parm);
1785 ph2c->rsp = (u8*)pval;
1786 ph2c->rspsz = sizeof(struct getratable_rsp);
1788 pgetrttblparm ->rsvd = 0x0;
1790 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1797 u8 rtw_setassocsta_cmd(_adapter *padapter, u8 *mac_addr)
1799 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
1800 struct cmd_obj* ph2c;
1801 struct set_assocsta_parm *psetassocsta_para;
1802 struct set_stakey_rsp *psetassocsta_rsp = NULL;
1808 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1814 psetassocsta_para = (struct set_assocsta_parm*)rtw_zmalloc(sizeof(struct set_assocsta_parm));
1815 if(psetassocsta_para==NULL){
1816 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1821 psetassocsta_rsp = (struct set_stakey_rsp*)rtw_zmalloc(sizeof(struct set_assocsta_rsp));
1822 if(psetassocsta_rsp==NULL){
1823 rtw_mfree((u8 *) ph2c, sizeof(struct cmd_obj));
1824 rtw_mfree((u8 *) psetassocsta_para, sizeof(struct set_assocsta_parm));
1828 init_h2fwcmd_w_parm_no_rsp(ph2c, psetassocsta_para, _SetAssocSta_CMD_);
1829 ph2c->rsp = (u8 *) psetassocsta_rsp;
1830 ph2c->rspsz = sizeof(struct set_assocsta_rsp);
1832 _rtw_memcpy(psetassocsta_para->addr, mac_addr,ETH_ALEN);
1834 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1843 u8 rtw_addbareq_cmd(_adapter*padapter, u8 tid, u8 *addr)
1845 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
1846 struct cmd_obj* ph2c;
1847 struct addBaReq_parm *paddbareq_parm;
1853 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1859 paddbareq_parm = (struct addBaReq_parm*)rtw_zmalloc(sizeof(struct addBaReq_parm));
1860 if(paddbareq_parm==NULL){
1861 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
1866 paddbareq_parm->tid = tid;
1867 _rtw_memcpy(paddbareq_parm->addr, addr, ETH_ALEN);
1869 init_h2fwcmd_w_parm_no_rsp(ph2c, paddbareq_parm, GEN_CMD_CODE(_AddBAReq));
1871 //DBG_871X("rtw_addbareq_cmd, tid=%d\n", tid);
1873 //rtw_enqueue_cmd(pcmdpriv, ph2c);
1874 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1882 //add for CONFIG_IEEE80211W, none 11w can use it
1883 u8 rtw_reset_securitypriv_cmd(_adapter*padapter)
1885 struct cmd_obj* ph2c;
1886 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
1887 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1892 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1898 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
1899 if(pdrvextra_cmd_parm==NULL){
1900 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
1905 pdrvextra_cmd_parm->ec_id = RESET_SECURITYPRIV;
1906 pdrvextra_cmd_parm->type = 0;
1907 pdrvextra_cmd_parm->size = 0;
1908 pdrvextra_cmd_parm->pbuf = NULL;
1910 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
1913 //rtw_enqueue_cmd(pcmdpriv, ph2c);
1914 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1924 u8 rtw_free_assoc_resources_cmd(_adapter*padapter)
1926 struct cmd_obj* ph2c;
1927 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
1928 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1933 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1939 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
1940 if(pdrvextra_cmd_parm==NULL){
1941 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
1946 pdrvextra_cmd_parm->ec_id = FREE_ASSOC_RESOURCES;
1947 pdrvextra_cmd_parm->type = 0;
1948 pdrvextra_cmd_parm->size = 0;
1949 pdrvextra_cmd_parm->pbuf = NULL;
1951 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
1954 //rtw_enqueue_cmd(pcmdpriv, ph2c);
1955 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
1965 u8 rtw_dynamic_chk_wk_cmd(_adapter*padapter)
1967 struct cmd_obj* ph2c;
1968 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
1969 struct cmd_priv *pcmdpriv=&padapter->cmdpriv;
1974 //only primary padapter does this cmd
1976 #ifdef CONFIG_CONCURRENT_MODE
1977 if (padapter->adapter_type != PRIMARY_ADAPTER && padapter->pbuddy_adapter)
1978 pcmdpriv = &(padapter->pbuddy_adapter->cmdpriv);
1982 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
1988 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
1989 if(pdrvextra_cmd_parm==NULL){
1990 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
1995 pdrvextra_cmd_parm->ec_id = DYNAMIC_CHK_WK_CID;
1996 pdrvextra_cmd_parm->type = 0;
1997 pdrvextra_cmd_parm->size = 0;
1998 pdrvextra_cmd_parm->pbuf = NULL;
1999 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2002 //rtw_enqueue_cmd(pcmdpriv, ph2c);
2003 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2013 u8 rtw_set_ch_cmd(_adapter*padapter, u8 ch, u8 bw, u8 ch_offset, u8 enqueue)
2015 struct cmd_obj *pcmdobj;
2016 struct set_ch_parm *set_ch_parm;
2017 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2023 DBG_871X(FUNC_NDEV_FMT" ch:%u, bw:%u, ch_offset:%u\n",
2024 FUNC_NDEV_ARG(padapter->pnetdev), ch, bw, ch_offset);
2026 /* check input parameter */
2028 /* prepare cmd parameter */
2029 set_ch_parm = (struct set_ch_parm *)rtw_zmalloc(sizeof(*set_ch_parm));
2030 if (set_ch_parm == NULL) {
2034 set_ch_parm->ch = ch;
2035 set_ch_parm->bw = bw;
2036 set_ch_parm->ch_offset = ch_offset;
2039 /* need enqueue, prepare cmd_obj and enqueue */
2040 pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2041 if(pcmdobj == NULL){
2042 rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
2047 init_h2fwcmd_w_parm_no_rsp(pcmdobj, set_ch_parm, GEN_CMD_CODE(_SetChannel));
2048 res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
2050 /* no need to enqueue, do the cmd hdl directly and free cmd parameter */
2051 if( H2C_SUCCESS !=set_ch_hdl(padapter, (u8 *)set_ch_parm) )
2054 rtw_mfree((u8 *)set_ch_parm, sizeof(*set_ch_parm));
2057 /* do something based on res... */
2061 DBG_871X(FUNC_NDEV_FMT" res:%u\n", FUNC_NDEV_ARG(padapter->pnetdev), res);
2068 u8 rtw_set_chplan_cmd(_adapter*padapter, u8 chplan, u8 enqueue, u8 swconfig)
2070 struct cmd_obj* pcmdobj;
2071 struct SetChannelPlan_param *setChannelPlan_param;
2072 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2078 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_chplan_cmd\n"));
2080 // check if allow software config
2081 if (swconfig && rtw_hal_is_disable_sw_channel_plan(padapter) == _TRUE)
2087 //check input parameter
2088 if(!rtw_is_channel_plan_valid(chplan)) {
2093 //prepare cmd parameter
2094 setChannelPlan_param = (struct SetChannelPlan_param *)rtw_zmalloc(sizeof(struct SetChannelPlan_param));
2095 if(setChannelPlan_param == NULL) {
2099 setChannelPlan_param->channel_plan=chplan;
2103 //need enqueue, prepare cmd_obj and enqueue
2104 pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2105 if(pcmdobj == NULL){
2106 rtw_mfree((u8 *)setChannelPlan_param, sizeof(struct SetChannelPlan_param));
2111 init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelPlan_param, GEN_CMD_CODE(_SetChannelPlan));
2112 res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
2116 //no need to enqueue, do the cmd hdl directly and free cmd parameter
2117 if( H2C_SUCCESS !=set_chplan_hdl(padapter, (unsigned char *)setChannelPlan_param) )
2120 rtw_mfree((u8 *)setChannelPlan_param, sizeof(struct SetChannelPlan_param));
2123 //do something based on res...
2125 padapter->mlmepriv.ChannelPlan = chplan;
2134 u8 rtw_led_blink_cmd(_adapter*padapter, PVOID pLed)
2136 struct cmd_obj* pcmdobj;
2137 struct LedBlink_param *ledBlink_param;
2138 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2144 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_led_blink_cmd\n"));
2146 pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2147 if(pcmdobj == NULL){
2152 ledBlink_param = (struct LedBlink_param *)rtw_zmalloc(sizeof(struct LedBlink_param));
2153 if(ledBlink_param == NULL) {
2154 rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
2159 ledBlink_param->pLed=pLed;
2161 init_h2fwcmd_w_parm_no_rsp(pcmdobj, ledBlink_param, GEN_CMD_CODE(_LedBlink));
2162 res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
2171 u8 rtw_set_csa_cmd(_adapter*padapter, u8 new_ch_no)
2173 struct cmd_obj* pcmdobj;
2174 struct SetChannelSwitch_param*setChannelSwitch_param;
2175 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2176 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2182 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_csa_cmd\n"));
2184 pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2185 if(pcmdobj == NULL){
2190 setChannelSwitch_param = (struct SetChannelSwitch_param *)rtw_zmalloc(sizeof(struct SetChannelSwitch_param));
2191 if(setChannelSwitch_param == NULL) {
2192 rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
2197 setChannelSwitch_param->new_ch_no=new_ch_no;
2199 init_h2fwcmd_w_parm_no_rsp(pcmdobj, setChannelSwitch_param, GEN_CMD_CODE(_SetChannelSwitch));
2200 res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
2209 u8 rtw_tdls_cmd(_adapter *padapter, u8 *addr, u8 option)
2211 struct cmd_obj* pcmdobj;
2212 struct TDLSoption_param *TDLSoption;
2213 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2214 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2222 RT_TRACE(_module_rtl871x_cmd_c_, _drv_notice_, ("+rtw_set_tdls_cmd\n"));
2224 pcmdobj = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2225 if(pcmdobj == NULL){
2230 TDLSoption= (struct TDLSoption_param *)rtw_zmalloc(sizeof(struct TDLSoption_param));
2231 if(TDLSoption == NULL) {
2232 rtw_mfree((u8 *)pcmdobj, sizeof(struct cmd_obj));
2237 _rtw_spinlock(&(padapter->tdlsinfo.cmd_lock));
2238 _rtw_memcpy(TDLSoption->addr, addr, 6);
2239 TDLSoption->option = option;
2240 _rtw_spinunlock(&(padapter->tdlsinfo.cmd_lock));
2241 init_h2fwcmd_w_parm_no_rsp(pcmdobj, TDLSoption, GEN_CMD_CODE(_TDLS));
2242 res = rtw_enqueue_cmd(pcmdpriv, pcmdobj);
2244 #endif //CONFIG_TDLS
2254 static void collect_traffic_statistics(_adapter *padapter)
2256 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
2258 #ifdef CONFIG_CONCURRENT_MODE
2259 if (padapter->adapter_type != PRIMARY_ADAPTER)
2264 pdvobjpriv->traffic_stat.tx_bytes = padapter->xmitpriv.tx_bytes;
2265 pdvobjpriv->traffic_stat.tx_pkts = padapter->xmitpriv.tx_pkts;
2266 pdvobjpriv->traffic_stat.tx_drop = padapter->xmitpriv.tx_drop;
2269 pdvobjpriv->traffic_stat.rx_bytes = padapter->recvpriv.rx_bytes;
2270 pdvobjpriv->traffic_stat.rx_pkts = padapter->recvpriv.rx_pkts;
2271 pdvobjpriv->traffic_stat.rx_drop = padapter->recvpriv.rx_drop;
2273 #ifdef CONFIG_CONCURRENT_MODE
2274 // Add secondary adapter statistics
2275 if(rtw_buddy_adapter_up(padapter))
2278 pdvobjpriv->traffic_stat.tx_bytes += padapter->pbuddy_adapter->xmitpriv.tx_bytes;
2279 pdvobjpriv->traffic_stat.tx_pkts += padapter->pbuddy_adapter->xmitpriv.tx_pkts;
2280 pdvobjpriv->traffic_stat.tx_drop += padapter->pbuddy_adapter->xmitpriv.tx_drop;
2283 pdvobjpriv->traffic_stat.rx_bytes += padapter->pbuddy_adapter->recvpriv.rx_bytes;
2284 pdvobjpriv->traffic_stat.rx_pkts += padapter->pbuddy_adapter->recvpriv.rx_pkts;
2285 pdvobjpriv->traffic_stat.rx_drop += padapter->pbuddy_adapter->recvpriv.rx_drop;
2289 // Calculate throughput in last interval
2290 pdvobjpriv->traffic_stat.cur_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes - pdvobjpriv->traffic_stat.last_tx_bytes;
2291 pdvobjpriv->traffic_stat.cur_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes - pdvobjpriv->traffic_stat.last_rx_bytes;
2292 pdvobjpriv->traffic_stat.last_tx_bytes = pdvobjpriv->traffic_stat.tx_bytes;
2293 pdvobjpriv->traffic_stat.last_rx_bytes = pdvobjpriv->traffic_stat.rx_bytes;
2295 pdvobjpriv->traffic_stat.cur_tx_tp = (u32)(pdvobjpriv->traffic_stat.cur_tx_bytes *8/2/1024/1024);
2296 pdvobjpriv->traffic_stat.cur_rx_tp = (u32)(pdvobjpriv->traffic_stat.cur_rx_bytes *8/2/1024/1024);
2299 u8 traffic_status_watchdog(_adapter *padapter, u8 from_timer)
2301 u8 bEnterPS = _FALSE;
2302 u16 BusyThreshold = 100;
2303 u8 bBusyTraffic = _FALSE, bTxBusyTraffic = _FALSE, bRxBusyTraffic = _FALSE;
2304 u8 bHigherBusyTraffic = _FALSE, bHigherBusyRxTraffic = _FALSE, bHigherBusyTxTraffic = _FALSE;
2306 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
2308 struct tdls_info *ptdlsinfo = &(padapter->tdlsinfo);
2309 struct tdls_txmgmt txmgmt;
2310 u8 baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2311 #endif //CONFIG_TDLS
2313 RT_LINK_DETECT_T * link_detect = &pmlmepriv->LinkDetectInfo;
2315 collect_traffic_statistics(padapter);
2318 // Determine if our traffic is busy now
2320 if((check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE)
2321 /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
2323 #ifdef CONFIG_BT_COEXIST
2324 if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 25 ||
2325 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 25 )
2326 #else // !CONFIG_BT_COEXIST
2327 // if we raise bBusyTraffic in last watchdog, using lower threshold.
2328 if (pmlmepriv->LinkDetectInfo.bBusyTraffic)
2330 if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold ||
2331 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold )
2332 #endif // !CONFIG_BT_COEXIST
2334 bBusyTraffic = _TRUE;
2336 if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod)
2337 bRxBusyTraffic = _TRUE;
2339 bTxBusyTraffic = _TRUE;
2342 // Higher Tx/Rx data.
2343 if( pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > 4000 ||
2344 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > 4000 )
2346 bHigherBusyTraffic = _TRUE;
2348 if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > pmlmepriv->LinkDetectInfo.NumTxOkInPeriod)
2349 bHigherBusyRxTraffic = _TRUE;
2351 bHigherBusyTxTraffic = _TRUE;
2354 #ifdef CONFIG_TRAFFIC_PROTECT
2355 #define TX_ACTIVE_TH 10
2356 #define RX_ACTIVE_TH 20
2357 #define TRAFFIC_PROTECT_PERIOD_MS 4500
2359 if (link_detect->NumTxOkInPeriod > TX_ACTIVE_TH
2360 || link_detect->NumRxUnicastOkInPeriod > RX_ACTIVE_TH) {
2362 DBG_871X_LEVEL(_drv_info_, FUNC_ADPT_FMT" acqiure wake_lock for %u ms(tx:%d,rx_unicast:%d)\n",
2363 FUNC_ADPT_ARG(padapter),
2364 TRAFFIC_PROTECT_PERIOD_MS,
2365 link_detect->NumTxOkInPeriod,
2366 link_detect->NumRxUnicastOkInPeriod);
2368 rtw_lock_traffic_suspend_timeout(TRAFFIC_PROTECT_PERIOD_MS);
2373 #ifdef CONFIG_TDLS_AUTOSETUP
2374 if( ( ptdlsinfo->watchdog_count % TDLS_WATCHDOG_PERIOD ) == 0 ) //10 * 2sec, periodically sending
2376 _rtw_memcpy(txmgmt.peer, baddr, ETH_ALEN);
2377 issue_tdls_dis_req( padapter, &txmgmt );
2379 ptdlsinfo->watchdog_count++;
2380 #endif //CONFIG_TDLS_AUTOSETUP
2381 #endif //CONFIG_TDLS
2384 // check traffic for powersaving.
2385 if( ((pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod + pmlmepriv->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
2386 (pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
2388 //DBG_871X("(-)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);
2391 if(bBusyTraffic == _TRUE)
2393 if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount <= 4)
2394 pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 4;
2396 pmlmepriv->LinkDetectInfo.TrafficTransitionCount++;
2398 //DBG_871X("Set TrafficTransitionCount to %d\n", pmlmepriv->LinkDetectInfo.TrafficTransitionCount);
2400 if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount > 30/*TrafficTransitionLevel*/)
2402 pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 30;
2408 //DBG_871X("(+)Tx = %d, Rx = %d \n",pmlmepriv->LinkDetectInfo.NumTxOkInPeriod,pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod);
2410 if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount>=2)
2411 pmlmepriv->LinkDetectInfo.TrafficTransitionCount -=2;
2413 pmlmepriv->LinkDetectInfo.TrafficTransitionCount = 0;
2415 if(pmlmepriv->LinkDetectInfo.TrafficTransitionCount == 0)
2419 #ifdef CONFIG_DYNAMIC_DTIM
2420 if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount == 8)
2423 DBG_871X("LowPowerTransitionCount=%d\n", pmlmepriv->LinkDetectInfo.LowPowerTransitionCount);
2424 #endif //CONFIG_DYNAMIC_DTIM
2426 // LeisurePS only work in infra mode.
2431 #ifdef CONFIG_DYNAMIC_DTIM
2432 if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount < 8)
2434 adapter_to_pwrctl(padapter)->dtim = 1;
2438 adapter_to_pwrctl(padapter)->dtim = 3;
2440 #endif //CONFIG_DYNAMIC_DTIM
2441 LPS_Enter(padapter, "TRAFFIC_IDLE");
2446 //rtw_lps_ctrl_wk_cmd(adapter, LPS_CTRL_ENTER, 1);
2447 //rtw_hal_dm_watchdog_in_lps(padapter);
2449 #ifdef CONFIG_DYNAMIC_DTIM
2450 if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE )
2451 pmlmepriv->LinkDetectInfo.LowPowerTransitionCount++;
2452 #endif //CONFIG_DYNAMIC_DTIM
2456 #ifdef CONFIG_DYNAMIC_DTIM
2457 if(pmlmepriv->LinkDetectInfo.LowPowerTransitionCount != 8)
2458 pmlmepriv->LinkDetectInfo.LowPowerTransitionCount = 0;
2460 pmlmepriv->LinkDetectInfo.LowPowerTransitionCount++;
2461 #endif //CONFIG_DYNAMIC_DTIM
2464 LPS_Leave(padapter, "TRAFFIC_BUSY");
2468 #ifdef CONFIG_CONCURRENT_MODE
2469 if(padapter->iface_type == IFACE_PORT0)
2471 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_TRAFFIC_BUSY, 1);
2475 #endif // CONFIG_LPS
2480 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
2481 int n_assoc_iface = 0;
2484 for (i = 0; i < dvobj->iface_nums; i++) {
2485 if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
2489 if(!from_timer && n_assoc_iface == 0)
2490 LPS_Leave(padapter, "NON_LINKED");
2494 pmlmepriv->LinkDetectInfo.NumRxOkInPeriod = 0;
2495 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod = 0;
2496 pmlmepriv->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
2497 pmlmepriv->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
2498 pmlmepriv->LinkDetectInfo.bTxBusyTraffic = bTxBusyTraffic;
2499 pmlmepriv->LinkDetectInfo.bRxBusyTraffic = bRxBusyTraffic;
2500 pmlmepriv->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic;
2501 pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
2502 pmlmepriv->LinkDetectInfo.bHigherBusyTxTraffic = bHigherBusyTxTraffic;
2508 void dynamic_chk_wk_hdl(_adapter *padapter)
2510 struct mlme_priv *pmlmepriv;
2511 pmlmepriv = &(padapter->mlmepriv);
2513 #ifdef CONFIG_ACTIVE_KEEP_ALIVE_CHECK
2514 #ifdef CONFIG_AP_MODE
2515 if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
2517 expire_timeout_chk(padapter);
2520 #endif //CONFIG_ACTIVE_KEEP_ALIVE_CHECK
2522 #ifdef DBG_CONFIG_ERROR_DETECT
2523 rtw_hal_sreset_xmit_status_check(padapter);
2524 rtw_hal_sreset_linked_status_check(padapter);
2528 _linked_info_dump(padapter);
2531 //if(check_fwstate(pmlmepriv, _FW_UNDER_LINKING|_FW_UNDER_SURVEY)==_FALSE)
2533 linked_status_chk(padapter);
2534 traffic_status_watchdog(padapter, 0);
2537 #ifdef CONFIG_BEAMFORMING
2538 beamforming_watchdog(padapter);
2541 rtw_hal_dm_watchdog(padapter);
2543 //check_hw_pbc(padapter, pdrvextra_cmd->pbuf, pdrvextra_cmd->type);
2545 #ifdef CONFIG_BT_COEXIST
2549 rtw_btcoex_Handler(padapter);
2553 #ifdef CONFIG_IPS_CHECK_IN_WD
2554 //always call rtw_ps_processor() at last one.
2555 if(is_primary_adapter(padapter))
2556 rtw_ps_processor(padapter);
2562 void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type);
2563 void lps_ctrl_wk_hdl(_adapter *padapter, u8 lps_ctrl_type)
2565 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
2566 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
2571 if((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)
2572 || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
2577 switch(lps_ctrl_type)
2580 //DBG_871X("LPS_CTRL_SCAN \n");
2581 #ifdef CONFIG_BT_COEXIST
2582 rtw_btcoex_ScanNotify(padapter, _TRUE);
2583 #endif // CONFIG_BT_COEXIST
2584 if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
2587 LPS_Leave(padapter, "LPS_CTRL_SCAN");
2590 case LPS_CTRL_JOINBSS:
2591 //DBG_871X("LPS_CTRL_JOINBSS \n");
2592 LPS_Leave(padapter, "LPS_CTRL_JOINBSS");
2594 case LPS_CTRL_CONNECT:
2595 //DBG_871X("LPS_CTRL_CONNECT \n");
2596 mstatus = 1;//connect
2597 // Reset LPS Setting
2598 pwrpriv->LpsIdleCount = 0;
2599 rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
2600 #ifdef CONFIG_BT_COEXIST
2601 rtw_btcoex_MediaStatusNotify(padapter, mstatus);
2602 #endif // CONFIG_BT_COEXIST
2604 case LPS_CTRL_DISCONNECT:
2605 //DBG_871X("LPS_CTRL_DISCONNECT \n");
2606 mstatus = 0;//disconnect
2607 #ifdef CONFIG_BT_COEXIST
2608 rtw_btcoex_MediaStatusNotify(padapter, mstatus);
2609 #endif // CONFIG_BT_COEXIST
2610 LPS_Leave(padapter, "LPS_CTRL_DISCONNECT");
2611 rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus));
2613 case LPS_CTRL_SPECIAL_PACKET:
2614 //DBG_871X("LPS_CTRL_SPECIAL_PACKET \n");
2615 pwrpriv->DelayLPSLastTimeStamp = rtw_get_current_time();
2616 #ifdef CONFIG_BT_COEXIST
2617 rtw_btcoex_SpecialPacketNotify(padapter, PACKET_DHCP);
2618 #endif // CONFIG_BT_COEXIST
2619 LPS_Leave(padapter, "LPS_CTRL_SPECIAL_PACKET");
2621 case LPS_CTRL_LEAVE:
2622 //DBG_871X("LPS_CTRL_LEAVE \n");
2623 LPS_Leave(padapter, "LPS_CTRL_LEAVE");
2625 case LPS_CTRL_TRAFFIC_BUSY:
2626 LPS_Leave(padapter, "LPS_CTRL_TRAFFIC_BUSY");
2634 u8 rtw_lps_ctrl_wk_cmd(_adapter*padapter, u8 lps_ctrl_type, u8 enqueue)
2636 struct cmd_obj *ph2c;
2637 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2638 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2639 //struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
2644 //if(!pwrctrlpriv->bLeisurePs)
2649 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2655 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2656 if(pdrvextra_cmd_parm==NULL){
2657 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2662 pdrvextra_cmd_parm->ec_id = LPS_CTRL_WK_CID;
2663 pdrvextra_cmd_parm->type = lps_ctrl_type;
2664 pdrvextra_cmd_parm->size = 0;
2665 pdrvextra_cmd_parm->pbuf = NULL;
2667 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2669 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2673 lps_ctrl_wk_hdl(padapter, lps_ctrl_type);
2684 void rtw_dm_in_lps_hdl(_adapter*padapter)
2686 rtw_hal_set_hwreg(padapter, HW_VAR_DM_IN_LPS, NULL);
2689 u8 rtw_dm_in_lps_wk_cmd(_adapter*padapter)
2691 struct cmd_obj *ph2c;
2692 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2693 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2697 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2703 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2704 if(pdrvextra_cmd_parm==NULL){
2705 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2710 pdrvextra_cmd_parm->ec_id = DM_IN_LPS_WK_CID;
2711 pdrvextra_cmd_parm->type = 0;
2712 pdrvextra_cmd_parm->size = 0;
2713 pdrvextra_cmd_parm->pbuf = NULL;
2715 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2717 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2725 void rtw_lps_change_dtim_hdl(_adapter *padapter, u8 dtim)
2727 struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
2729 if(dtim <=0 || dtim > 16)
2732 #ifdef CONFIG_BT_COEXIST
2733 if (rtw_btcoex_IsBtControlLps(padapter) == _TRUE)
2737 #ifdef CONFIG_LPS_LCLK
2738 _enter_pwrlock(&pwrpriv->lock);
2741 if(pwrpriv->dtim!=dtim)
2743 DBG_871X("change DTIM from %d to %d, bFwCurrentInPSMode=%d, ps_mode=%d\n", pwrpriv->dtim, dtim,
2744 pwrpriv->bFwCurrentInPSMode, pwrpriv->pwr_mode);
2746 pwrpriv->dtim = dtim;
2749 if((pwrpriv->bFwCurrentInPSMode ==_TRUE) && (pwrpriv->pwr_mode > PS_MODE_ACTIVE))
2751 u8 ps_mode = pwrpriv->pwr_mode;
2753 //DBG_871X("change DTIM from %d to %d, ps_mode=%d\n", pwrpriv->dtim, dtim, ps_mode);
2755 rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode));
2758 #ifdef CONFIG_LPS_LCLK
2759 _exit_pwrlock(&pwrpriv->lock);
2766 u8 rtw_lps_change_dtim_cmd(_adapter*padapter, u8 dtim)
2768 struct cmd_obj *ph2c;
2769 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2770 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2773 #ifdef CONFIG_CONCURRENT_MODE
2774 if (padapter->iface_type != IFACE_PORT0)
2779 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2785 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2786 if(pdrvextra_cmd_parm==NULL){
2787 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2792 pdrvextra_cmd_parm->ec_id = LPS_CHANGE_DTIM_CID;
2793 pdrvextra_cmd_parm->type = dtim;
2794 pdrvextra_cmd_parm->size = 0;
2795 pdrvextra_cmd_parm->pbuf = NULL;
2797 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2799 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2808 #if (RATE_ADAPTIVE_SUPPORT==1)
2809 void rpt_timer_setting_wk_hdl(_adapter *padapter, u16 minRptTime)
2811 rtw_hal_set_hwreg(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&minRptTime));
2814 u8 rtw_rpt_timer_cfg_cmd(_adapter*padapter, u16 minRptTime)
2816 struct cmd_obj *ph2c;
2817 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2818 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2823 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2829 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2830 if(pdrvextra_cmd_parm==NULL){
2831 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2836 pdrvextra_cmd_parm->ec_id = RTP_TIMER_CFG_WK_CID;
2837 pdrvextra_cmd_parm->type = minRptTime;
2838 pdrvextra_cmd_parm->size = 0;
2839 pdrvextra_cmd_parm->pbuf = NULL;
2840 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2841 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2852 #ifdef CONFIG_ANTENNA_DIVERSITY
2853 void antenna_select_wk_hdl(_adapter *padapter, u8 antenna)
2855 rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna));
2858 u8 rtw_antenna_select_cmd(_adapter*padapter, u8 antenna,u8 enqueue)
2860 struct cmd_obj *ph2c;
2861 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2862 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2863 u8 bSupportAntDiv = _FALSE;
2867 rtw_hal_get_def_var(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &(bSupportAntDiv));
2868 if(_FALSE == bSupportAntDiv ) return res;
2870 if(_TRUE == enqueue)
2872 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2878 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2879 if(pdrvextra_cmd_parm==NULL){
2880 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2885 pdrvextra_cmd_parm->ec_id = ANT_SELECT_WK_CID;
2886 pdrvextra_cmd_parm->type = antenna;
2887 pdrvextra_cmd_parm->size = 0;
2888 pdrvextra_cmd_parm->pbuf = NULL;
2889 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2891 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2894 antenna_select_wk_hdl(padapter,antenna );
2905 void rtw_dm_ra_mask_hdl(_adapter *padapter, struct sta_info *psta)
2908 set_sta_rate(padapter, psta);
2912 u8 rtw_dm_ra_mask_wk_cmd(_adapter*padapter, u8 *psta)
2914 struct cmd_obj *ph2c;
2915 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2916 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2920 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2926 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2927 if(pdrvextra_cmd_parm==NULL){
2928 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2933 pdrvextra_cmd_parm->ec_id = DM_RA_MSK_WK_CID;
2934 pdrvextra_cmd_parm->type = 0;
2935 pdrvextra_cmd_parm->size = 0;
2936 pdrvextra_cmd_parm->pbuf = psta;
2938 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
2940 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
2948 void power_saving_wk_hdl(_adapter *padapter)
2950 rtw_ps_processor(padapter);
2953 //add for CONFIG_IEEE80211W, none 11w can use it
2954 void reset_securitypriv_hdl(_adapter *padapter)
2956 rtw_reset_securitypriv(padapter);
2959 void free_assoc_resources_hdl(_adapter *padapter)
2961 rtw_free_assoc_resources(padapter, 1);
2965 u8 p2p_protocol_wk_cmd(_adapter*padapter, int intCmdType )
2967 struct cmd_obj *ph2c;
2968 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
2969 struct wifidirect_info *pwdinfo= &(padapter->wdinfo);
2970 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
2975 if(rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE))
2980 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
2986 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
2987 if(pdrvextra_cmd_parm==NULL){
2988 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
2993 pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID;
2994 pdrvextra_cmd_parm->type = intCmdType; // As the command tppe.
2995 pdrvextra_cmd_parm->size = 0;
2996 pdrvextra_cmd_parm->pbuf = NULL; // Must be NULL here
2998 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
3000 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
3011 u8 rtw_ps_cmd(_adapter*padapter)
3013 struct cmd_obj *ppscmd;
3014 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
3015 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
3020 #ifdef CONFIG_CONCURRENT_MODE
3021 if (padapter->adapter_type != PRIMARY_ADAPTER)
3025 ppscmd = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
3031 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
3032 if(pdrvextra_cmd_parm==NULL){
3033 rtw_mfree((unsigned char *)ppscmd, sizeof(struct cmd_obj));
3038 pdrvextra_cmd_parm->ec_id = POWER_SAVING_CTRL_WK_CID;
3039 pdrvextra_cmd_parm->type = 0;
3040 pdrvextra_cmd_parm->size = 0;
3041 pdrvextra_cmd_parm->pbuf = NULL;
3042 init_h2fwcmd_w_parm_no_rsp(ppscmd, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
3044 res = rtw_enqueue_cmd(pcmdpriv, ppscmd);
3054 #ifdef CONFIG_AP_MODE
3056 extern u32 g_wait_hiq_empty;
3058 static void rtw_chk_hi_queue_hdl(_adapter *padapter)
3060 struct sta_info *psta_bmc;
3061 struct sta_priv *pstapriv = &padapter->stapriv;
3062 u32 start = rtw_get_current_time();
3065 psta_bmc = rtw_get_bcmc_stainfo(padapter);
3069 rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
3071 while(_FALSE == empty && rtw_get_passing_time_ms(start) < g_wait_hiq_empty)
3074 rtw_hal_get_hwreg(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &empty);
3077 if(psta_bmc->sleepq_len==0)
3079 if(empty == _SUCCESS)
3081 bool update_tim = _FALSE;
3083 if (pstapriv->tim_bitmap & BIT(0))
3086 pstapriv->tim_bitmap &= ~BIT(0);
3087 pstapriv->sta_dz_bitmap &= ~BIT(0);
3089 if (update_tim == _TRUE)
3090 update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
3092 else //re check again
3094 rtw_chk_hi_queue_cmd(padapter);
3101 u8 rtw_chk_hi_queue_cmd(_adapter*padapter)
3103 struct cmd_obj *ph2c;
3104 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
3105 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
3108 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
3114 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
3115 if(pdrvextra_cmd_parm==NULL){
3116 rtw_mfree((unsigned char *)ph2c, sizeof(struct cmd_obj));
3121 pdrvextra_cmd_parm->ec_id = CHECK_HIQ_WK_CID;
3122 pdrvextra_cmd_parm->type = 0;
3123 pdrvextra_cmd_parm->size = 0;
3124 pdrvextra_cmd_parm->pbuf = NULL;
3126 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
3128 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
3137 //#ifdef CONFIG_C2H_PACKET_EN
3138 u8 rtw_c2h_packet_wk_cmd(PADAPTER padapter, u8 *pbuf, u16 length)
3140 struct cmd_obj *ph2c;
3141 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
3142 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
3145 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
3151 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
3152 if (pdrvextra_cmd_parm == NULL) {
3153 rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
3158 pdrvextra_cmd_parm->ec_id = C2H_WK_CID;
3159 pdrvextra_cmd_parm->type = 0;
3160 pdrvextra_cmd_parm->size = length;
3161 pdrvextra_cmd_parm->pbuf = pbuf;
3163 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
3165 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
3171 //#else //CONFIG_C2H_PACKET_EN
3172 /* dont call R/W in this function, beucase SDIO interrupt have claim host */
3173 /* or deadlock will happen and cause special-systemserver-died in android */
3175 u8 rtw_c2h_wk_cmd(PADAPTER padapter, u8 *c2h_evt)
3177 struct cmd_obj *ph2c;
3178 struct drvextra_cmd_parm *pdrvextra_cmd_parm;
3179 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
3182 ph2c = (struct cmd_obj*)rtw_zmalloc(sizeof(struct cmd_obj));
3188 pdrvextra_cmd_parm = (struct drvextra_cmd_parm*)rtw_zmalloc(sizeof(struct drvextra_cmd_parm));
3189 if (pdrvextra_cmd_parm == NULL) {
3190 rtw_mfree((u8*)ph2c, sizeof(struct cmd_obj));
3195 pdrvextra_cmd_parm->ec_id = C2H_WK_CID;
3196 pdrvextra_cmd_parm->type = 0;
3197 pdrvextra_cmd_parm->size = c2h_evt?16:0;
3198 pdrvextra_cmd_parm->pbuf = c2h_evt;
3200 init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra));
3202 res = rtw_enqueue_cmd(pcmdpriv, ph2c);
3208 //#endif //CONFIG_C2H_PACKET_EN
3210 s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter)
3216 /* No c2h event in cmd_obj, read c2h event before handling*/
3217 if (rtw_hal_c2h_evt_read(adapter, buf) == _SUCCESS) {
3220 if (filter && filter(c2h_evt) == _FALSE)
3223 ret = rtw_hal_c2h_handler(adapter, c2h_evt);
3227 if (filter && filter(c2h_evt) == _FALSE)
3230 ret = rtw_hal_c2h_handler(adapter, c2h_evt);
3236 #ifdef CONFIG_C2H_WK
3237 static void c2h_wk_callback(_workitem *work)
3239 struct evt_priv *evtpriv = container_of(work, struct evt_priv, c2h_wk);
3240 _adapter *adapter = container_of(evtpriv, _adapter, evtpriv);
3242 c2h_id_filter ccx_id_filter = rtw_hal_c2h_id_filter_ccx(adapter);
3244 evtpriv->c2h_wk_alive = _TRUE;
3246 while (!rtw_cbuf_empty(evtpriv->c2h_queue)) {
3247 if ((c2h_evt = (u8 *)rtw_cbuf_pop(evtpriv->c2h_queue)) != NULL) {
3248 /* This C2H event is read, clear it */
3249 c2h_evt_clear(adapter);
3250 } else if ((c2h_evt = (u8 *)rtw_malloc(16)) != NULL) {
3251 /* This C2H event is not read, read & clear now */
3252 if (rtw_hal_c2h_evt_read(adapter, c2h_evt) != _SUCCESS) {
3253 rtw_mfree(c2h_evt, 16);
3258 /* Special pointer to trigger c2h_evt_clear only */
3259 if ((void *)c2h_evt == (void *)evtpriv)
3262 if (!rtw_hal_c2h_valid(adapter, c2h_evt)) {
3263 rtw_mfree(c2h_evt, 16);
3267 if (ccx_id_filter(c2h_evt) == _TRUE) {
3268 /* Handle CCX report here */
3269 rtw_hal_c2h_handler(adapter, c2h_evt);
3270 rtw_mfree(c2h_evt, 16);
3272 /* Enqueue into cmd_thread for others */
3273 rtw_c2h_wk_cmd(adapter, c2h_evt);
3277 evtpriv->c2h_wk_alive = _FALSE;
3281 u8 rtw_drvextra_cmd_hdl(_adapter *padapter, unsigned char *pbuf)
3283 struct drvextra_cmd_parm *pdrvextra_cmd;
3286 return H2C_PARAMETERS_ERROR;
3288 pdrvextra_cmd = (struct drvextra_cmd_parm*)pbuf;
3290 switch(pdrvextra_cmd->ec_id)
3292 case DYNAMIC_CHK_WK_CID://only primary padapter go to this cmd, but execute dynamic_chk_wk_hdl() for two interfaces
3293 #ifdef CONFIG_CONCURRENT_MODE
3294 if(padapter->pbuddy_adapter)
3296 dynamic_chk_wk_hdl(padapter->pbuddy_adapter);
3298 #endif //CONFIG_CONCURRENT_MODE
3299 dynamic_chk_wk_hdl(padapter);
3301 case POWER_SAVING_CTRL_WK_CID:
3302 power_saving_wk_hdl(padapter);
3305 case LPS_CTRL_WK_CID:
3306 lps_ctrl_wk_hdl(padapter, (u8)pdrvextra_cmd->type);
3308 case DM_IN_LPS_WK_CID:
3309 rtw_dm_in_lps_hdl(padapter);
3311 case LPS_CHANGE_DTIM_CID:
3312 rtw_lps_change_dtim_hdl(padapter, (u8)pdrvextra_cmd->type);
3315 #if (RATE_ADAPTIVE_SUPPORT==1)
3316 case RTP_TIMER_CFG_WK_CID:
3317 rpt_timer_setting_wk_hdl(padapter, pdrvextra_cmd->type);
3320 #ifdef CONFIG_ANTENNA_DIVERSITY
3321 case ANT_SELECT_WK_CID:
3322 antenna_select_wk_hdl(padapter, pdrvextra_cmd->type);
3325 #ifdef CONFIG_P2P_PS
3327 p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type);
3329 #endif //CONFIG_P2P_PS
3331 case P2P_PROTO_WK_CID:
3332 // Commented by Albert 2011/07/01
3333 // I used the type_size as the type command
3334 p2p_protocol_wk_hdl( padapter, pdrvextra_cmd->type );
3337 #ifdef CONFIG_AP_MODE
3338 case CHECK_HIQ_WK_CID:
3339 rtw_chk_hi_queue_hdl(padapter);
3341 #endif //CONFIG_AP_MODE
3342 #ifdef CONFIG_INTEL_WIDI
3343 case INTEl_WIDI_WK_CID:
3344 intel_widi_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf);
3346 #endif //CONFIG_INTEL_WIDI
3347 //add for CONFIG_IEEE80211W, none 11w can use it
3348 case RESET_SECURITYPRIV:
3349 reset_securitypriv_hdl(padapter);
3351 case FREE_ASSOC_RESOURCES:
3352 free_assoc_resources_hdl(padapter);
3355 #ifdef CONFIG_C2H_PACKET_EN
3356 rtw_hal_set_hwreg_with_buf(padapter, HW_VAR_C2H_HANDLE, pdrvextra_cmd->pbuf, pdrvextra_cmd->size);
3358 c2h_evt_hdl(padapter, pdrvextra_cmd->pbuf, NULL);
3361 #ifdef CONFIG_BEAMFORMING
3362 case BEAMFORMING_WK_CID:
3363 beamforming_wk_hdl(padapter, pdrvextra_cmd->type, pdrvextra_cmd->pbuf);
3365 #endif //CONFIG_BEAMFORMING
3366 case DM_RA_MSK_WK_CID:
3367 rtw_dm_ra_mask_hdl(padapter, (struct sta_info *)pdrvextra_cmd->pbuf);
3374 if (pdrvextra_cmd->pbuf && pdrvextra_cmd->size>0)
3376 rtw_mfree(pdrvextra_cmd->pbuf, pdrvextra_cmd->size);
3382 void rtw_survey_cmd_callback(_adapter* padapter , struct cmd_obj *pcmd)
3384 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3388 if(pcmd->res == H2C_DROPPED)
3390 //TODO: cancel timer and do timeout handler directly...
3391 //need to make timeout handlerOS independent
3392 _set_timer(&pmlmepriv->scan_to_timer, 1);
3394 else if (pcmd->res != H2C_SUCCESS) {
3395 _set_timer(&pmlmepriv->scan_to_timer, 1);
3396 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: MgntActrtw_set_802_11_bssid_LIST_SCAN Fail ************\n\n."));
3400 rtw_free_cmd_obj(pcmd);
3404 void rtw_disassoc_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd)
3407 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3411 if (pcmd->res != H2C_SUCCESS)
3413 _enter_critical_bh(&pmlmepriv->lock, &irqL);
3414 set_fwstate(pmlmepriv, _FW_LINKED);
3415 _exit_critical_bh(&pmlmepriv->lock, &irqL);
3417 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ***Error: disconnect_cmd_callback Fail ***\n."));
3421 #ifdef CONFIG_BR_EXT
3422 else //clear bridge database
3423 nat25_db_cleanup(padapter);
3424 #endif //CONFIG_BR_EXT
3427 rtw_free_cmd_obj(pcmd);
3435 void rtw_joinbss_cmd_callback(_adapter* padapter, struct cmd_obj *pcmd)
3437 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3438 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
3439 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
3444 if(pcmd->res == H2C_DROPPED)
3446 //TODO: cancel timer and do timeout handler directly...
3447 //need to make timeout handlerOS independent
3448 _set_timer(&pmlmepriv->assoc_timer, 1);
3450 else if(pcmd->res != H2C_SUCCESS)
3452 _set_timer(&pmlmepriv->assoc_timer, 1);
3454 else if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_TPLINK_745N)
3457 rtw_hal_set_hwreg(padapter, HW_VAR_MAX_AGGR_NUM, (u8 *)&val);
3460 rtw_free_cmd_obj(pcmd);
3465 void rtw_createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd)
3469 struct sta_info *psta = NULL;
3470 struct wlan_network *pwlan = NULL;
3471 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3472 WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)pcmd->parmbuf;
3473 struct wlan_network *tgt_network = &(pmlmepriv->cur_network);
3477 if (pcmd->parmbuf == NULL)
3480 if((pcmd->res != H2C_SUCCESS))
3482 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: rtw_createbss_cmd_callback Fail ************\n\n."));
3483 _set_timer(&pmlmepriv->assoc_timer, 1 );
3486 _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled);
3488 #ifdef CONFIG_FW_MLMLE
3490 pnetwork->Length = le32_to_cpu(pnetwork->Length);
3491 pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength);
3492 pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy);
3493 pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi);
3494 pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse);
3495 pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow);
3496 //pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod);
3497 pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig);
3498 pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime);
3499 pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern);
3500 pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet);
3501 pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length);
3502 pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length);
3503 pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode);
3504 pnetwork->IELength = le32_to_cpu(pnetwork->IELength);
3507 _enter_critical_bh(&pmlmepriv->lock, &irqL);
3510 if(check_fwstate(pmlmepriv, WIFI_AP_STATE) )
3512 psta = rtw_get_stainfo(&padapter->stapriv, pnetwork->MacAddress);
3515 psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress);
3518 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n"));
3519 goto createbss_cmd_fail ;
3523 rtw_indicate_connect( padapter);
3529 pwlan = _rtw_alloc_network(pmlmepriv);
3530 _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
3533 pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue);
3536 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in rtw_joinbss_event_callback \n"));
3537 _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
3538 goto createbss_cmd_fail;
3540 pwlan->last_scanned = rtw_get_current_time();
3544 rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);
3547 pnetwork->Length = get_WLAN_BSSID_EX_sz(pnetwork);
3548 _rtw_memcpy(&(pwlan->network), pnetwork, pnetwork->Length);
3549 //pwlan->fixed = _TRUE;
3551 //rtw_list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue);
3553 // copy pdev_network information to pmlmepriv->cur_network
3554 _rtw_memcpy(&tgt_network->network, pnetwork, (get_WLAN_BSSID_EX_sz(pnetwork)));
3557 //tgt_network->network.Configuration.DSConfig = (u32)rtw_ch2freq(pnetwork->Configuration.DSConfig);
3559 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
3562 if((pmlmepriv->fw_state) & WIFI_AP_STATE)
3564 psta = rtw_alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress);
3566 if (psta == NULL) { // for AP Mode & Adhoc Master Mode
3567 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n"));
3568 goto createbss_cmd_fail ;
3571 rtw_indicate_connect( padapter);
3575 //rtw_indicate_disconnect(dev);
3578 _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
3579 // we will set _FW_LINKED when there is one more sat to join us (rtw_stassoc_event_callback)
3585 _exit_critical_bh(&pmlmepriv->lock, &irqL);
3587 rtw_free_cmd_obj(pcmd);
3595 void rtw_setstaKey_cmdrsp_callback(_adapter* padapter , struct cmd_obj *pcmd)
3598 struct sta_priv * pstapriv = &padapter->stapriv;
3599 struct set_stakey_rsp* psetstakey_rsp = (struct set_stakey_rsp*) (pcmd->rsp);
3600 struct sta_info* psta = rtw_get_stainfo(pstapriv, psetstakey_rsp->addr);
3606 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: rtw_setstaKey_cmdrsp_callback => can't get sta_info \n\n"));
3610 //psta->aid = psta->mac_id = psetstakey_rsp->keyid; //CAM_ID(CAM_ENTRY)
3614 rtw_free_cmd_obj(pcmd);
3619 void rtw_setassocsta_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
3622 struct sta_priv * pstapriv = &padapter->stapriv;
3623 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3624 struct set_assocsta_parm* passocsta_parm = (struct set_assocsta_parm*)(pcmd->parmbuf);
3625 struct set_assocsta_rsp* passocsta_rsp = (struct set_assocsta_rsp*) (pcmd->rsp);
3626 struct sta_info* psta = rtw_get_stainfo(pstapriv, passocsta_parm->addr);
3632 RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nERROR: setassocsta_cmdrsp_callbac => can't get sta_info \n\n"));
3636 psta->aid = psta->mac_id = passocsta_rsp->cam_id;
3638 _enter_critical_bh(&pmlmepriv->lock, &irqL);
3640 if ((check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE) && (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE))
3641 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
3643 set_fwstate(pmlmepriv, _FW_LINKED);
3644 _exit_critical_bh(&pmlmepriv->lock, &irqL);
3647 rtw_free_cmd_obj(pcmd);
3652 void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd);
3653 void rtw_getrttbl_cmd_cmdrsp_callback(_adapter* padapter, struct cmd_obj *pcmd)
3657 rtw_free_cmd_obj(pcmd);
3658 #ifdef CONFIG_MP_INCLUDED
3659 if (padapter->registrypriv.mp_mode == 1)
3660 padapter->mppriv.workparam.bcompleted=_TRUE;