// ================================================== // Below Functions are called by BT-Coex // ================================================== void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable) { struct mlme_ext_info *pmlmeinfo; pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; if (_TRUE == enable) { struct sta_info *psta = NULL; pmlmeinfo->bAcceptAddbaReq = _FALSE; if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); if (psta) send_delba(padapter, 0, psta->hwaddr); } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { _irqL irqL; _list *phead, *plist; u8 peer_num = 0; char peers[NUM_STA]; struct sta_priv *pstapriv = &padapter->stapriv; int i; _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); phead = &pstapriv->asoc_list; plist = get_next(phead); while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { int stainfo_offset; psta = LIST_CONTAINOR(plist, struct sta_info, asoc_list); plist = get_next(plist); stainfo_offset = rtw_stainfo_offset(pstapriv, psta); if (stainfo_offset_valid(stainfo_offset)) peers[peer_num++] = stainfo_offset; } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); if (peer_num) { for (i = 0; i < peer_num; i++) { psta = rtw_get_stainfo_by_offset(pstapriv, peers[i]); if (psta) send_delba(padapter, 0, psta->hwaddr); } } } }
ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data) { struct net_device *dev = data; _adapter *padapter = (_adapter *)rtw_netdev_priv(dev); struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); char tmp[32]; u32 mode; if (count < 1) return -EFAULT; if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) { int num = sscanf(tmp, "%d ", &mode); if( pregpriv && mode >= 0 && mode < 2 ) { pmlmeinfo->bAcceptAddbaReq = mode; DBG_871X("pmlmeinfo->bAcceptAddbaReq=%d \n",pmlmeinfo->bAcceptAddbaReq); if(mode == 0) { //tear down Rx AMPDU send_delba(padapter, 0, get_my_bssid(&(pmlmeinfo->network)));// recipient } } } return count; }
u8 ap_free_sta(struct adapter *padapter, struct sta_info *psta, bool active, u16 reason) { u8 beacon_updated = false; struct sta_priv *pstapriv = &padapter->stapriv; if (!psta) return beacon_updated; /* tear down Rx AMPDU */ send_delba(padapter, 0, psta->hwaddr);/* recipient */ /* tear down TX AMPDU */ send_delba(padapter, 1, psta->hwaddr);/* originator */ psta->htpriv.agg_enable_bitmap = 0x0;/* reset */ psta->htpriv.candidate_tid_bitmap = 0x0;/* reset */ if (active) issue_deauth(padapter, psta->hwaddr, reason); /* clear cam entry / key */ rtw_clearstakey_cmd(padapter, (u8 *)psta, (u8)(psta->mac_id + 3), true); spin_lock_bh(&psta->lock); psta->state &= ~_FW_LINKED; spin_unlock_bh(&psta->lock); rtw_indicate_sta_disassoc_event(padapter, psta); report_del_sta_event(padapter, psta->hwaddr, reason); beacon_updated = bss_cap_update_on_sta_leave(padapter, psta); spin_lock_bh(&pstapriv->sta_hash_lock); rtw_free_stainfo(padapter, psta); spin_unlock_bh(&pstapriv->sta_hash_lock); return beacon_updated; }
/* ================================================== */ void rtw_btcoex_RejectApAggregatedPacket(struct adapter *padapter, u8 enable) { struct mlme_ext_info *pmlmeinfo; struct sta_info *psta; pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); if (true == enable) { pmlmeinfo->bAcceptAddbaReq = false; if (psta) send_delba(padapter, 0, psta->hwaddr); } else{ pmlmeinfo->bAcceptAddbaReq = true; } }
// ================================================== // Below Functions are called by BT-Coex // ================================================== void rtw_btcoex_RejectApAggregatedPacket(PADAPTER padapter, u8 enable) { struct mlme_ext_info *pmlmeinfo; struct sta_info *psta; pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv)); if (_TRUE == enable) { pmlmeinfo->bAcceptAddbaReq = _FALSE; send_delba(padapter, 0, psta->hwaddr); } else { pmlmeinfo->bAcceptAddbaReq = _TRUE; } }
void update_sta_info_apmode(struct adapter *padapter, struct sta_info *psta) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct ht_priv *phtpriv_ap = &pmlmepriv->htpriv; struct ht_priv *phtpriv_sta = &psta->htpriv; psta->mac_id = psta->aid + 1; DBG_88E("%s\n", __func__); /* ap mode */ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) psta->ieee8021x_blocked = true; else psta->ieee8021x_blocked = false; /* update sta's cap */ /* ERP */ VCS_update(padapter, psta); /* HT related cap */ if (phtpriv_sta->ht_option) { /* check if sta supports rx ampdu */ phtpriv_sta->ampdu_enable = phtpriv_ap->ampdu_enable; /* check if sta support s Short GI */ if (le16_to_cpu(phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & (IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40)) phtpriv_sta->sgi = true; /* bwmode */ if (le16_to_cpu(phtpriv_sta->ht_cap.cap_info & phtpriv_ap->ht_cap.cap_info) & IEEE80211_HT_CAP_SUP_WIDTH) { phtpriv_sta->bwmode = pmlmeext->cur_bwmode; phtpriv_sta->ch_offset = pmlmeext->cur_ch_offset; } psta->qos_option = true; } else { phtpriv_sta->ampdu_enable = false; phtpriv_sta->sgi = false; phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_20; phtpriv_sta->ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; } /* Rx AMPDU */ send_delba(padapter, 0, psta->hwaddr);/* recipient */ /* TX AMPDU */ send_delba(padapter, 1, psta->hwaddr);/* originator */ phtpriv_sta->agg_enable_bitmap = 0x0;/* reset */ phtpriv_sta->candidate_tid_bitmap = 0x0;/* reset */ /* todo: init other variables */ memset(&psta->sta_stats, 0, sizeof(struct stainfo_stats)); spin_lock_bh(&psta->lock); psta->state |= _FW_LINKED; spin_unlock_bh(&psta->lock); }