static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
			     union iwreq_data *wrqu, char *b)
{
	struct r8180_priv *priv = ieee80211_priv(dev);
	int ret;
	struct ieee80211_device* ieee = priv->ieee80211;


	if (priv->ieee80211->bHwRadioOff)
		return 0;

	if (wrqu->data.flags & IW_SCAN_THIS_ESSID)	{
		struct iw_scan_req* req = (struct iw_scan_req*)b;
		if (req->essid_len)		{
			ieee->current_network.ssid_len = req->essid_len;
			memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
		}
	}

	down(&priv->wx_sem);
	if (priv->up)	{
		priv->ieee80211->actscanning = true;
		if (priv->bInactivePs && (priv->ieee80211->state != IEEE80211_LINKED))	{
			IPSLeave(dev);
		ieee80211_softmac_ips_scan_syncro(priv->ieee80211);
			ret = 0;
		}	else	{
			/* prevent scan in BusyTraffic */
			/* FIXME: Need to consider last scan time */
			if ((priv->link_detect.bBusyTraffic) && (true))	{
				ret = 0;
				printk("Now traffic is busy, please try later!\n");
			}	else
				/* prevent scan in BusyTraffic,end */
				ret = ieee80211_wx_set_scan(priv->ieee80211, a, wrqu, b);
		}
	}	else
			ret = -1;

	up(&priv->wx_sem);

	return ret;
}
Exemple #2
0
static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
                             union iwreq_data *wrqu, char *b)
{
    struct r8180_priv *priv = ieee80211_priv(dev);
    int ret;
    struct ieee80211_device* ieee = priv->ieee80211;


    if (priv->ieee80211->bHwRadioOff)
        return 0;

    /*YJ,add,080819, for hidden ap	*/
    /*printk("==*&*&*&==>%s in\n", __func__);	*/
    /*printk("=*&*&*&*===>flag:%x, %x\n", wrqu->data.flags, IW_SCAN_THIS_ESSID);	*/
    if (wrqu->data.flags & IW_SCAN_THIS_ESSID)	{
        struct iw_scan_req* req = (struct iw_scan_req*)b;
        if (req->essid_len)		{
            /*printk("==**&*&*&**===>scan set ssid:%s\n", req->essid); */
            ieee->current_network.ssid_len = req->essid_len;
            memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
            /*printk("=====>network ssid:%s\n", ieee->current_network.ssid); */
        }
    }
    /*YJ,add,080819, for hidden ap, end */

    down(&priv->wx_sem);
    if (priv->up)	{
        /*		printk("set scan ENABLE_IPS\n");	*/
        priv->ieee80211->actscanning = true;
        if (priv->bInactivePs && (priv->ieee80211->state != IEEE80211_LINKED))	{
            IPSLeave(dev);
            /*down(&priv->ieee80211->wx_sem);	*/
            /*
            			if (priv->ieee80211->iw_mode == IW_MODE_MONITOR || !(priv->ieee80211->proto_started)){
            				ret = -1;
            				up(&priv->ieee80211->wx_sem);
            				up(&priv->wx_sem);
            				return ret;
            			}
            */
            /*	queue_work(priv->ieee80211->wq, &priv->ieee80211->wx_sync_scan_wq); */
            /* printk("start scan============================>\n"); */
            ieee80211_softmac_ips_scan_syncro(priv->ieee80211);
            /* ieee80211_rtl_start_scan(priv->ieee80211); */
            /* intentionally forget to up sem */
            /*			up(&priv->ieee80211->wx_sem); */
            ret = 0;
        }	else	{
            /* YJ,add,080828, prevent scan in BusyTraffic */
            /* FIXME: Need to consider last scan time */
            if ((priv->link_detect.bBusyTraffic) && (true))	{
                ret = 0;
                printk("Now traffic is busy, please try later!\n");
            }	else
                /* YJ,add,080828, prevent scan in BusyTraffic,end */
                ret = ieee80211_wx_set_scan(priv->ieee80211, a, wrqu, b);
        }
    }	else
        ret = -1;

    up(&priv->wx_sem);

    return ret;
}