static void check_hw_pbc(struct _adapter *padapter)
{
	u8	tmp1byte;

	r8712_write8(padapter, MAC_PINMUX_CTRL, (GPIOMUX_EN | GPIOSEL_GPIO));
	tmp1byte = r8712_read8(padapter, GPIO_IO_SEL);
	tmp1byte &= ~(HAL_8192S_HW_GPIO_WPS_BIT);
	r8712_write8(padapter, GPIO_IO_SEL, tmp1byte);
	tmp1byte = r8712_read8(padapter, GPIO_CTRL);
	if (tmp1byte == 0xff)
		return;
	if (tmp1byte&HAL_8192S_HW_GPIO_WPS_BIT) {
		/* Here we only set bPbcPressed to true
		 * After trigger PBC, the variable will be set to false */
		DBG_8712("CheckPbcGPIO - PBC is pressed !!!!\n");
		/* 0 is the default value and it means the application monitors
		 * the HW PBC doesn't provide its pid to driver. */
		if (padapter->pid == 0)
			return;
		kill_pid(find_vpid(padapter->pid), SIGUSR1, 1);
	}
}
Exemple #2
0
u8 do_join(_adapter *padapter)
{
	_list *plist, *phead;
	u8* pibss = NULL;
	struct	mlme_priv	*pmlmepriv = &(padapter->mlmepriv);
	_queue	*queue	= &(pmlmepriv->scanned_queue);
	u8 ret = _TRUE;

_func_enter_;

	phead = get_list_head(queue);
	plist = get_next(phead);

	RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_, ("+do_join: phead=%p; plist=%p\n", phead, plist));

	pmlmepriv->cur_network.join_res = -2;
	pmlmepriv->fw_state |= _FW_UNDER_LINKING;

	pmlmepriv->pscanned = plist;
	pmlmepriv->to_join = _TRUE;

	if (_queue_empty(queue) == _TRUE)
	{
		if(pmlmepriv->fw_state & _FW_UNDER_LINKING)
	               pmlmepriv->fw_state ^= _FW_UNDER_LINKING;
            		
		//when set_ssid/set_bssid for do_join(), but scanning queue is empty
		//we try to issue sitesurvey firstly

		if (pmlmepriv->sitesurveyctrl.traffic_busy == _FALSE)
		{
			// submit site_survey_cmd
			sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid);

			RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("do_join(): site survey if scanned_queue is empty\n."));
		}
		
		//ret=_FALSE;

		goto exit;
	}
	else 	
	{	
             int ret;

	     if((ret=select_and_join_from_scanned_queue(pmlmepriv))==_SUCCESS)
	     {
		_set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
	}
#if 0
	     else if(ret == 2)
	{
			DBG_8712("*****UNDER_LINKED WITH SAME NETWORK, RETURN*****\n");

			if(pmlmepriv->fw_state & _FW_UNDER_LINKING)
	               	pmlmepriv->fw_state ^= _FW_UNDER_LINKING;

	}
#endif
	else
	{
		if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
		{
			// submit createbss_cmd to change to a ADHOC_MASTER

			//pmlmepriv->lock has been acquired by caller...
			WLAN_BSSID_EX *pdev_network = &(padapter->registrypriv.dev_network);

			pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;

			pibss = padapter->registrypriv.dev_network.MacAddress;

			_memset(&pdev_network->Ssid, 0, sizeof(NDIS_802_11_SSID));
			_memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(NDIS_802_11_SSID));
	
			update_registrypriv_dev_network(padapter);

			generate_random_ibss(pibss);
					
				if(createbss_cmd(padapter)!=_SUCCESS)
				{
					RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_err_,("***Error=>do_goin: createbss_cmd status FAIL*** \n "));						
					return _FALSE;
			}

			        pmlmepriv->to_join = _FALSE;

				RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("***Error=> select_and_join_from_scanned_queue FAIL under STA_Mode*** \n "));						

		}
		else
		{
			// can't associate ; reset under-linking			
			if(pmlmepriv->fw_state & _FW_UNDER_LINKING)
			    pmlmepriv->fw_state ^= _FW_UNDER_LINKING;

#if 0
			if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
			{
				if(_memcmp(pmlmepriv->cur_network.network.Ssid.Ssid, pmlmepriv->assoc_ssid.Ssid, pmlmepriv->assoc_ssid.SsidLength))
				{
					// for funk to do roaming
					// funk will reconnect, but funk will not sitesurvey before reconnect
					RT_TRACE(_module_rtl871x_ioctl_set_c_,_drv_info_,("for funk to do roaming"));
					if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE)
						sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid);
				}

			}
#endif

			//when set_ssid/set_bssid for do_join(), but there are no desired bss in scanning queue
			//we try to issue sitesurvey firstly
				if(pmlmepriv->sitesurveyctrl.traffic_busy==_FALSE)
				{
				//printk("do_join() when no desired bss in scanning queue\n");
				sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid);
		}


			}

		}

	}

exit:

_func_exit_;

	return ret;
}