Commit 65a43784 authored by david woo's avatar david woo Committed by Greg Kroah-Hartman
Browse files

Staging: rtl9192e: fix power usage issues



This patch should allow the driver to consume a lot less power.

Signed-off-by: default avatardavid woo <xinhua_wu@realsil.com.cn>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>

parent 789d9dbd
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
NIC_SELECT = RTL8192E


EXTRA_CFLAGS += -DRTL8192E
EXTRA_CFLAGS += -std=gnu89
EXTRA_CFLAGS += -O2
EXTRA_CFLAGS += -DTHOMAS_TURBO
EXTRA_CFLAGS += -DENABLE_DOT11D

r8192_pci-objs :=		\
EXTRA_CFLAGS += -DENABLE_IPS
EXTRA_CFLAGS += -DENABLE_LPS

r8192e_pci-objs :=		\
	r8192E_core.o		\
	r8180_93cx6.o		\
	r8192E_wx.o		\
@@ -31,4 +33,5 @@ r8192_pci-objs := \
	ieee80211/ieee80211_crypt_ccmp.o	\
	ieee80211/ieee80211_crypt_wep.o

obj-$(CONFIG_RTL8192E) += r8192_pci.o
obj-$(CONFIG_RTL8192E) += r8192e_pci.o
+152 −4
Original line number Diff line number Diff line
@@ -180,6 +180,8 @@ typedef struct cb_desc {
        u8 DrvAggrNum;
	u16 pkt_size;
        u8 reserved12;

	u8 bdhcp;
}cb_desc, *pcb_desc;

/*--------------------------Define -------------------------------------------*/
@@ -740,6 +742,8 @@ struct ieee80211_snap_hdr {
#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
#define WLAN_FC_MORE_DATA(fc) ((fc) & IEEE80211_FCTL_MOREDATA)


#define WLAN_FC_GET_FRAMETYPE(fc) ((fc) & IEEE80211_FCTL_FRAMETYPE)
#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
@@ -1052,7 +1056,7 @@ struct ieee80211_device;
#define SEC_ALG_NONE            0
#define SEC_ALG_WEP             1
#define SEC_ALG_TKIP            2
#define SEC_ALG_CCMP            3
#define SEC_ALG_CCMP            4

#define WEP_KEYS 		4
#define WEP_KEY_LEN		13
@@ -1121,6 +1125,14 @@ enum ieee80211_mfie {
/* Minimal header; can be used for passing 802.11 frames with sufficient
 * information to determine what type of underlying data type is actually
 * stored in the data. */
 struct ieee80211_pspoll_hdr {
        __le16 frame_ctl;
        __le16 aid;
	u8 bssid[ETH_ALEN];
        u8 ta[ETH_ALEN];
        //u8 payload[0];
} __attribute__ ((packed));

struct ieee80211_hdr {
        __le16 frame_ctl;
        __le16 duration_id;
@@ -1657,6 +1669,7 @@ struct ieee80211_network {
	bool ralink_cap_exist;
	bool atheros_cap_exist;
	bool cisco_cap_exist;
	bool marvell_cap_exist;
	bool unknown_cap_exist;
//	u8	berp_info;
	bool	berp_info_valid;
@@ -1862,6 +1875,19 @@ typedef struct _RT_POWER_SAVE_CONTROL
	// Leisre Poswer Save : Disable RF if connected but traffic is not busy
	//
	bool				bLeisurePs;
	u32				PowerProfile;
	u8				LpsIdleCount;
	u8				RegMaxLPSAwakeIntvl;
	u8				LPSAwakeIntvl;

	u32				CurPsLevel;
	u32				RegRfPsLevel;

	bool				bFwCtrlLPS;
	u8				FWCtrlPSMode;

	bool				LinkReqInIPSRFOffPgs;
	bool				BufConnectinfoBefore;

}RT_POWER_SAVE_CONTROL,*PRT_POWER_SAVE_CONTROL;

@@ -1902,14 +1928,121 @@ typedef struct _RT_LINK_DETECT_T{

	u32				NumTxOkInPeriod;
	u32				NumRxOkInPeriod;
	u32				NumRxUnicastOkInPeriod;
	bool				bBusyTraffic;
}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;

//added by amy 090330
typedef enum _HW_VARIABLES{
	HW_VAR_ETHER_ADDR,
	HW_VAR_MULTICAST_REG,
	HW_VAR_BASIC_RATE,
	HW_VAR_BSSID,
	HW_VAR_MEDIA_STATUS,
	HW_VAR_SECURITY_CONF,
	HW_VAR_BEACON_INTERVAL,
	HW_VAR_ATIM_WINDOW,
	HW_VAR_LISTEN_INTERVAL,
	HW_VAR_CS_COUNTER,
	HW_VAR_DEFAULTKEY0,
	HW_VAR_DEFAULTKEY1,
	HW_VAR_DEFAULTKEY2,
	HW_VAR_DEFAULTKEY3,
	HW_VAR_SIFS,
	HW_VAR_DIFS,
	HW_VAR_EIFS,
	HW_VAR_SLOT_TIME,
	HW_VAR_ACK_PREAMBLE,
	HW_VAR_CW_CONFIG,
	HW_VAR_CW_VALUES,
	HW_VAR_RATE_FALLBACK_CONTROL,
	HW_VAR_CONTENTION_WINDOW,
	HW_VAR_RETRY_COUNT,
	HW_VAR_TR_SWITCH,
	HW_VAR_COMMAND,			// For Command Register, Annie, 2006-04-07.
	HW_VAR_WPA_CONFIG,		//2004/08/23, kcwu, for 8187 Security config
	HW_VAR_AMPDU_MIN_SPACE,	// The spacing between sub-frame. Roger, 2008.07.04.
	HW_VAR_SHORTGI_DENSITY,	// The density for shortGI. Roger, 2008.07.04.
	HW_VAR_AMPDU_FACTOR,
	HW_VAR_MCS_RATE_AVAILABLE,
	HW_VAR_AC_PARAM,			// For AC Parameters, 2005.12.01, by rcnjko.
	HW_VAR_ACM_CTRL,			// For ACM Control, Annie, 2005-12-13.
	HW_VAR_DIS_Req_Qsize,		// For DIS_Reg_Qsize, Joseph
	HW_VAR_CCX_CHNL_LOAD,		// For CCX 2 channel load request, 2006.05.04.
	HW_VAR_CCX_NOISE_HISTOGRAM,	// For CCX 2 noise histogram request, 2006.05.04.
	HW_VAR_CCX_CLM_NHM,			// For CCX 2 parallel channel load request and noise histogram request, 2006.05.12.
	HW_VAR_TxOPLimit,				// For turbo mode related settings, added by Roger, 2006.12.07
	HW_VAR_TURBO_MODE,			// For turbo mode related settings, added by Roger, 2006.12.15.
	HW_VAR_RF_STATE, 			// For change or query RF power state, 061214, rcnjko.
	HW_VAR_RF_OFF_BY_HW,		// For UI to query if external HW signal disable RF, 061229, rcnjko.
	HW_VAR_BUS_SPEED, 		// In unit of bps. 2006.07.03, by rcnjko.
        HW_VAR_SET_DEV_POWER,	// Set to low power, added by LanHsin, 2007.

	//1!!!!!!!!!!!!!!!!!!!!!!!!!!!
	//1Attention Please!!!<11n or 8190 specific code should be put below this line>
	//1!!!!!!!!!!!!!!!!!!!!!!!!!!!
	HW_VAR_RCR,				//for RCR, David 2006,05,11
	HW_VAR_RATR_0,
	HW_VAR_RRSR,
	HW_VAR_CPU_RST,
	HW_VAR_CECHK_BSSID,
        HW_VAR_LBK_MODE,			// Set lookback mode, 2008.06.11. added by Roger.
	// Set HW related setting for 11N AES bug.
	HW_VAR_AES_11N_FIX,
	// Set Usb Rx Aggregation
	HW_VAR_USB_RX_AGGR,
	HW_VAR_USER_CONTROL_TURBO_MODE,
	HW_VAR_RETRY_LIMIT,
#ifndef _RTL8192_EXT_PATCH_
	HW_VAR_INIT_TX_RATE,  //Get Current Tx rate register. 2008.12.10. Added by tynli
#endif
	HW_VAR_TX_RATE_REG,  //Get Current Tx rate register. 2008.12.10. Added by tynli
	HW_VAR_EFUSE_USAGE, //Get current EFUSE utilization. 2008.12.19. Added by Roger.
	HW_VAR_EFUSE_BYTES,
	HW_VAR_AUTOLOAD_STATUS, //Get current autoload status, 0: autoload success, 1: autoload fail. 2008.12.19. Added by Roger.
	HW_VAR_RF_2R_DISABLE, // 2R disable
	HW_VAR_SET_RPWM,
	HW_VAR_H2C_FW_PWRMODE, // For setting FW related H2C cmd structure. by tynli. 2009.2.18
	HW_VAR_H2C_FW_JOINBSSRPT, // For setting FW related H2C cmd structure. by tynli. 2009.2.18
	HW_VAR_1X1_RECV_COMBINE,	// For 1T2R but only 1SS, Add by hpfan 2009.04.16 hpfan
	HW_VAR_STOP_SEND_BEACON,
	HW_VAR_TSF_TIMER,			// Read from TSF register to get the current TSF timer, by Bruce, 2009-07-22.
	HW_VAR_IO_CMD,
	HW_VAR_HANDLE_FW_C2H,		//Added by tynli. For handling FW C2H command. 2009.10.07.
	HW_VAR_DL_FW_RSVD_PAGE, 		//Added by tynli. Download the packets that FW will use to RSVD page. 2009.10.14.
	HW_VAR_AID,				//Added by tynli.
	HW_VAR_HW_SEQ_ENABLE,		//Added by tynli. 2009.10.20.
	HW_VAR_UPDATE_TSF,			//Added by tynli. 2009.10.22. For Hw count TBTT time.
	HW_VAR_BCN_VALID,				//Added by tynli.
	HW_VAR_FWLPS_RF_ON			//Added by tynli. 2009.11.09. For checking if Fw finishs RF on sequence.
}HW_VARIABLES;

#define RT_CHECK_FOR_HANG_PERIOD 2

struct ieee80211_device {
	struct net_device *dev;
        struct ieee80211_security sec;

	bool	need_sw_enc;
#ifdef ENABLE_LPS
	bool bAwakePktSent;
	u8  LPSDelayCnt;
	bool bIsAggregateFrame;
	bool polling;
	void (*LeisurePSLeave)(struct net_device *dev);
#endif

#ifdef ENABLE_IPS
	bool proto_stoppping;
	bool wx_set_enc;
	struct semaphore ips_sem;
	struct work_struct ips_leave_wq;
        void (*ieee80211_ips_leave_wq) (struct net_device *dev);
        void (*ieee80211_ips_leave)(struct net_device *dev);
#endif
	void (*SetHwRegHandler)(struct net_device *dev,u8 variable,u8* val);
	u8   (*rtllib_ap_sec_type)(struct ieee80211_device *ieee);

	//hw security related
//	u8 hwsec_support; //support?
	u8 hwsec_active;  //hw security active.
@@ -2316,7 +2449,7 @@ struct ieee80211_device {
	 * stop_send_bacons is NOT guaranteed to be called only
	 * after start_send_beacons.
	 */
	void (*start_send_beacons) (struct net_device *dev,u16 tx_rate);
	void (*start_send_beacons) (struct net_device *dev);
	void (*stop_send_beacons) (struct net_device *dev);

	/* power save mode related */
@@ -2370,6 +2503,19 @@ struct ieee80211_device {
	u8 priv[0];
};

#define	RT_RF_OFF_LEVL_ASPM			BIT0	// PCI ASPM
#define	RT_RF_OFF_LEVL_CLK_REQ		BIT1	// PCI clock request
#define	RT_RF_OFF_LEVL_PCI_D3			BIT2	// PCI D3 mode
#define	RT_RF_OFF_LEVL_HALT_NIC		BIT3	// NIC halt, re-initialize hw parameters
#define	RT_RF_OFF_LEVL_FREE_FW		BIT4	// FW free, re-download the FW
#define	RT_RF_OFF_LEVL_FW_32K		BIT5	// FW in 32k
#define	RT_RF_PS_LEVEL_ALWAYS_ASPM	BIT6	// Always enable ASPM and Clock Req in initialization.
#define	RT_RF_LPS_DISALBE_2R			BIT30	// When LPS is on, disable 2R if no packet is received or transmittd.
#define	RT_RF_LPS_LEVEL_ASPM			BIT31	// LPS with ASPM
#define	RT_IN_PS_LEVEL(pPSC, _PS_FLAG)	((pPSC->CurPsLevel & _PS_FLAG) ? true : false)
#define	RT_CLEAR_PS_LEVEL(pPSC, _PS_FLAG)	(pPSC->CurPsLevel &= (~(_PS_FLAG)))
#define	RT_SET_PS_LEVEL(pPSC, _PS_FLAG)	(pPSC->CurPsLevel |= _PS_FLAG)

#define IEEE_A            (1<<0)
#define IEEE_B            (1<<1)
#define IEEE_G            (1<<2)
@@ -2606,9 +2752,9 @@ extern void ieee80211_stop_scan(struct ieee80211_device *ieee);
extern void ieee80211_start_scan_syncro(struct ieee80211_device *ieee);
extern void ieee80211_check_all_nets(struct ieee80211_device *ieee);
extern void ieee80211_start_protocol(struct ieee80211_device *ieee);
extern void ieee80211_stop_protocol(struct ieee80211_device *ieee);
extern void ieee80211_stop_protocol(struct ieee80211_device *ieee,u8 shutdown);
extern void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee);
extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee);
extern void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee,u8 shutdown);
extern void ieee80211_reset_queue(struct ieee80211_device *ieee);
extern void ieee80211_rtl_wake_queue(struct ieee80211_device *ieee);
extern void ieee80211_rtl_stop_queue(struct ieee80211_device *ieee);
@@ -2795,5 +2941,7 @@ extern int ieee80211_parse_info_param(struct ieee80211_device *ieee,
		struct ieee80211_rx_stats *stats);

void ieee80211_indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb** prxbIndicateArray,u8  index);
void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr);
void ieee80211_sta_ps_send_pspoll_frame(struct ieee80211_device *ieee);
#define RT_ASOC_RETRY_LIMIT	5
#endif /* IEEE80211_H */
+3 −3
Original line number Diff line number Diff line
@@ -361,9 +361,9 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)

	if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) {
		if (net_ratelimit()) {
			printk(KERN_DEBUG "CCMP: replay detected: STA=%pM"
			       " previous PN %pm received PN %pm\n",
			       hdr->addr2, key->rx_pn, pn);
			//printk(KERN_DEBUG "CCMP: replay detected: STA=%pM"
			//       " previous PN %pm received PN %pm\n",
			//       hdr->addr2, key->rx_pn, pn);
		}
		key->dot11RSNAStatsCCMPReplays++;
		return -4;
+92 −4
Original line number Diff line number Diff line
@@ -312,6 +312,17 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
	if (skb->len < 24)
		return 0;

#if 1
        if (ieee->hwsec_active)
        {
                cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
                tcb_desc->bHwSec = 1;

                if(ieee->need_sw_enc)
                        tcb_desc->bHwSec = 0;
        }
#endif

	hdr = (struct ieee80211_hdr_4addr *) skb->data;
	fc = le16_to_cpu(hdr->frame_ctl);

@@ -406,6 +417,10 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s
	{
		cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
		tcb_desc->bHwSec = 1;

                if(ieee->need_sw_enc)
                        tcb_desc->bHwSec = 0;

	}

	hdr = (struct ieee80211_hdr_4addr *) skb->data;
@@ -799,7 +814,7 @@ void RxReorderIndicatePacket( struct ieee80211_device *ieee,
#endif
}

u8 parse_subframe(struct sk_buff *skb,
u8 parse_subframe(struct ieee80211_device* ieee,struct sk_buff *skb,
                  struct ieee80211_rx_stats *rx_stats,
		  struct ieee80211_rxb *rxb,u8* src,u8* dst)
{
@@ -839,6 +854,7 @@ u8 parse_subframe(struct sk_buff *skb,
	}

	skb_pull(skb, LLCOffset);
	ieee->bIsAggregateFrame = bIsAggregateFrame;//added by amy for Leisure PS

	if(!bIsAggregateFrame) {
		rxb->nr_subframes = 1;
@@ -940,6 +956,7 @@ int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
	u8	TID = 0;
	u16	SeqNum = 0;
	PRX_TS_RECORD pTS = NULL;
	bool unicast_packet = false;
	//bool bIsAggregateFrame = false;
	//added by amy for reorder
#ifdef NOT_YET
@@ -1215,6 +1232,24 @@ int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
        if (memcmp(bssid, ieee->current_network.bssid, ETH_ALEN))
                goto rx_dropped;

#ifdef ENABLE_LPS
	if ((ieee->iw_mode == IW_MODE_INFRA)  && (ieee->sta_sleep == 1)
		&& (ieee->polling)) {
		if (WLAN_FC_MORE_DATA(fc)) {
			/* more data bit is set, let's request a new frame from the AP */
			ieee80211_sta_ps_send_pspoll_frame(ieee);
		} else {
			ieee->polling =  false;
		}
	}
#endif

	ieee->need_sw_enc = 0;

        if((!rx_stats->Decrypted)){
                ieee->need_sw_enc = 1;
        }

	/* skb: hdr + (possibly fragmented, possibly encrypted) payload */

	if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
@@ -1296,6 +1331,9 @@ int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
	ieee->LinkDetectInfo.NumRxOkInPeriod++;

	hdr = (struct ieee80211_hdr_4addr *) skb->data;
	if((!is_multicast_ether_addr(hdr->addr1)) && (!is_broadcast_ether_addr(hdr->addr1)))
		unicast_packet = true;

	if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) {
		if (/*ieee->ieee802_1x &&*/
		    ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
@@ -1367,7 +1405,7 @@ int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
	}
	/* to parse amsdu packets */
	/* qos data packets & reserved bit is 1 */
	if(parse_subframe(skb,rx_stats,rxb,src,dst) == 0) {
	if(parse_subframe(ieee, skb,rx_stats,rxb,src,dst) == 0) {
		/* only to free rxb, and not submit the packets to upper layer */
		for(i =0; i < rxb->nr_subframes; i++) {
			dev_kfree_skb(rxb->subframes[i]);
@@ -1377,6 +1415,32 @@ int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
		goto rx_dropped;
	}

#ifdef ENABLE_LPS
		if(unicast_packet)
		{
			if (type == IEEE80211_FTYPE_DATA)
			{

				if(ieee->bIsAggregateFrame)
					ieee->LinkDetectInfo.NumRxUnicastOkInPeriod+=rxb->nr_subframes;
				else
					ieee->LinkDetectInfo.NumRxUnicastOkInPeriod++;

				// 2009.03.03 Leave DC mode immediately when detect high traffic
				// DbgPrint("ending Seq %d\n", Frame_SeqNum(pduOS));
				if((ieee->state == IEEE80211_LINKED) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
				{
					if(	((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod +ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
						(ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
					{
						if(ieee->LeisurePSLeave)
							ieee->LeisurePSLeave(dev);
					}
				}
			}
		}
#endif

	ieee->last_rx_ps_time = jiffies;
//added by amy for reorder
	if(ieee->pHTInfo->bCurRxReorderEnable == false ||pTS == NULL){
@@ -2013,12 +2077,22 @@ int ieee80211_parse_info_param(struct ieee80211_device *ieee,
				info_element->data[1] == 0x13 &&
				info_element->data[2] == 0x74))
			{
				printk("========>%s(): athros AP is exist\n",__FUNCTION__);
				//printk("========>%s(): athros AP is exist\n",__FUNCTION__);
				network->atheros_cap_exist = true;
			}
			else
				network->atheros_cap_exist = false;

			if ((info_element->len >= 3 &&
						info_element->data[0] == 0x00 &&
						info_element->data[1] == 0x50 &&
						info_element->data[2] == 0x43) )
			{
				network->marvell_cap_exist = true;
				//printk("========>%s(): marvel AP is exist\n",__FUNCTION__);
			}


			if(info_element->len >= 3 &&
				info_element->data[0] == 0x00 &&
				info_element->data[1] == 0x40 &&
@@ -2219,7 +2293,8 @@ int ieee80211_parse_info_param(struct ieee80211_device *ieee,
	}

	if(!network->atheros_cap_exist && !network->broadcom_cap_exist &&
		!network->cisco_cap_exist && !network->ralink_cap_exist && !network->bssht.bdRT2RTAggregation)
		!network->cisco_cap_exist && !network->ralink_cap_exist && !network->bssht.bdRT2RTAggregation &&
		!network->marvell_cap_exist)
	{
		network->unknown_cap_exist = true;
	}
@@ -2333,6 +2408,7 @@ static inline int ieee80211_network_init(
        network->broadcom_cap_exist = false;
	network->ralink_cap_exist = false;
	network->atheros_cap_exist = false;
	network->marvell_cap_exist = false;
	network->cisco_cap_exist = false;
	network->unknown_cap_exist = false;
#ifdef THOMAS_TURBO
@@ -2463,6 +2539,7 @@ static inline void update_network(struct ieee80211_network *dst,
	dst->broadcom_cap_exist = src->broadcom_cap_exist;
	dst->ralink_cap_exist = src->ralink_cap_exist;
	dst->atheros_cap_exist = src->atheros_cap_exist;
	dst->marvell_cap_exist = src->marvell_cap_exist;
	dst->cisco_cap_exist = src->cisco_cap_exist;
	dst->unknown_cap_exist = src->unknown_cap_exist;
	memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len);
@@ -2761,12 +2838,14 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
		      struct ieee80211_hdr_4addr *header,
		      struct ieee80211_rx_stats *stats)
{
#if 0
	if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED &&
				ieee->iw_mode == IW_MODE_INFRA &&
				ieee->state == IEEE80211_LINKED))
	{
		tasklet_schedule(&ieee->ps_task);
	}
#endif

	if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP &&
		WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON)
@@ -2780,6 +2859,15 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
		IEEE80211_DEBUG_SCAN("Beacon\n");
		ieee80211_process_probe_response(
			ieee, (struct ieee80211_probe_response *)header, stats);

		//printk("----------->%s()\n", __func__);
		if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED &&
					ieee->iw_mode == IW_MODE_INFRA &&
					ieee->state == IEEE80211_LINKED))
		{
			tasklet_schedule(&ieee->ps_task);
		}

		break;

	case IEEE80211_STYPE_PROBE_RESP:
+199 −45

File changed.

Preview size limit exceeded, changes collapsed.

Loading