/* ========================================================================== Description: Update the station current power save mode. Calling this routine also prove the specified client is still alive. Otherwise AP will age-out this client once IdleCount exceeds a threshold. ========================================================================== */ BOOLEAN RtmpPsIndicate( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN ULONG Wcid, IN UCHAR Psm) { MAC_TABLE_ENTRY *pEntry; UCHAR old_psmode; if (Wcid >= MAX_LEN_OF_MAC_TABLE) { return PWR_ACTIVE; } pEntry = &pAd->MacTab.Content[Wcid]; old_psmode = pEntry->PsMode; /* if (pEntry) */ { /* Change power save mode first because we will call RTMPDeQueuePacket() in RtmpHandleRxPsPoll(). Or when Psm = PWR_ACTIVE, we will not do Aggregation in RTMPDeQueuePacket(). */ pEntry->NoDataIdleCount = 0; pEntry->PsMode = Psm; if ((old_psmode == PWR_ACTIVE) && (Psm == PWR_SAVE)) { DBGPRINT(RT_DEBUG_TRACE, ("RtmpPsIndicate - %02x:%02x:%02x:%02x:%02x:%02x sleep!\n", pAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5])); } if ((old_psmode == PWR_SAVE) && (Psm == PWR_ACTIVE)) { /* TODO: For RT2870, how to handle about the BA when STA in PS mode???? */ DBGPRINT(RT_DEBUG_TRACE, ("RtmpPsIndicate - %02x:%02x:%02x:%02x:%02x:%02x wakes up, " "act like rx PS-POLL\n", pAddr[0],pAddr[1],pAddr[2],pAddr[3],pAddr[4],pAddr[5])); /* sleep station awakes, move all pending frames from PSQ to TXQ if any */ RtmpHandleRxPsPoll(pAd, pAddr, pEntry->Aid, TRUE); } /* move to above section */ /* pEntry->NoDataIdleCount = 0; */ /* pEntry->PsMode = Psm; */ } /* else */ /* { */ /* not in table, try to learn it ???? why bother? */ /* } */ return old_psmode; }
/* ========================================================================== Description: Update the station current power save mode. Calling this routine also prove the specified client is still alive. Otherwise AP will age-out this client once IdleCount exceeds a threshold. ========================================================================== */ BOOLEAN RtmpPsIndicate(RTMP_ADAPTER *pAd, UCHAR *pAddr, UCHAR wcid, UCHAR Psm) { MAC_TABLE_ENTRY *pEntry; UCHAR old_psmode; if (wcid >= MAX_LEN_OF_MAC_TABLE) return PWR_ACTIVE; pEntry = &pAd->MacTab.Content[wcid]; old_psmode = pEntry->PsMode; /* Change power save mode first because we will call RTMPDeQueuePacket() in RtmpHandleRxPsPoll(). Or when Psm = PWR_ACTIVE, we will not do Aggregation in RTMPDeQueuePacket(). */ pEntry->NoDataIdleCount = 0; pEntry->PsMode = Psm; if (old_psmode != Psm) { DBGPRINT(RT_DEBUG_INFO, ("%s():%02x:%02x:%02x:%02x:%02x:%02x %s!\n", __FUNCTION__, PRINT_MAC(pAddr), (Psm == PWR_SAVE ? "Sleep" : "wakes up, act like rx PS-POLL"))); } if ((old_psmode == PWR_SAVE) && (Psm == PWR_ACTIVE)) { #ifdef DROP_MASK_SUPPORT /* Disable Drop Mask */ set_drop_mask_per_client(pAd, pEntry, 2, 0); #endif /* DROP_MASK_SUPPORT */ #ifdef PS_ENTRY_MAITENANCE pEntry->continuous_ps_count = 0; #endif /* PS_ENTRY_MAITENANCE */ #ifdef RTMP_MAC_PCI #ifdef DOT11_N_SUPPORT /* When sta wake up, we send BAR to refresh the BA sequence. TODO: For RT2870, how to handle BA when STA in PS mode? */ SendRefreshBAR(pAd, pEntry); #endif /* DOT11_N_SUPPORT */ #endif /* RTMP_MAC_PCI */ /* sleep station awakes, move all pending frames from PSQ to TXQ if any */ RtmpHandleRxPsPoll(pAd, pAddr, pEntry->wcid, TRUE); } #ifdef DROP_MASK_SUPPORT else if ((old_psmode == PWR_ACTIVE) && (Psm == PWR_SAVE)) { /* Enable Drop Mask */ set_drop_mask_per_client(pAd, pEntry, 2, 1); } #endif /* DROP_MASK_SUPPORT */ return old_psmode; }