void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta) { u8 i, rf_type, limit; u32 tx_ra_bitmap; if (!psta) return; tx_ra_bitmap = 0; /* b/g mode ra_bitmap */ for (i = 0; i < sizeof(psta->bssrateset); i++) { if (psta->bssrateset[i]) tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f); } /* n mode ra_bitmap */ if (psta->htpriv.ht_option) { rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); if (rf_type == RF_2T2R) limit = 16; /* 2R */ else limit = 8; /* 1R */ for (i = 0; i < limit; i++) { if (psta->htpriv.ht_cap.supp_mcs_set[i/8] & BIT(i%8)) tx_ra_bitmap |= BIT(i+12); } } psta->ra_mask = tx_ra_bitmap; psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f; }
//bitmap[0:27] = tx_rate_bitmap //bitmap[28:31]= Rate Adaptive id //arg[0:4] = macid //arg[5] = Short GI void rtl8192d_Add_RateATid(PADAPTER pAdapter, u32 bitmap, u8 arg) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); if(pHalData->fw_ractrl == _TRUE) { rtl8192d_set_raid_cmd(pAdapter, bitmap, arg); } else { u8 macid, init_rate, shortGIrate=_FALSE; init_rate = get_highest_rate_idx(bitmap&0x0fffffff)&0x3f; macid = arg&0x1f; shortGIrate = (arg&BIT(5)) ? _TRUE:_FALSE; if (shortGIrate==_TRUE) init_rate |= BIT(6); rtw_write8(pAdapter, (REG_INIDATA_RATE_SEL+macid), (u8)init_rate); } }
static void update_bmc_sta(struct adapter *padapter) { u32 init_rate = 0; unsigned char network_type, raid; int i, supportRateNum = 0; unsigned int tx_ra_bitmap = 0; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_bssid_ex *pcur_network = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; struct sta_info *psta = rtw_get_bcmc_stainfo(padapter); if (psta) { psta->aid = 0;/* default set to 0 */ psta->mac_id = psta->aid + 1; psta->qos_option = 0; psta->htpriv.ht_option = false; psta->ieee8021x_blocked = 0; memset(&psta->sta_stats, 0, sizeof(struct stainfo_stats)); /* prepare for add_RATid */ supportRateNum = rtw_get_rateset_len((u8 *)&pcur_network->SupportedRates); network_type = rtw_check_network_type((u8 *)&pcur_network->SupportedRates, supportRateNum, 1); memcpy(psta->bssrateset, &pcur_network->SupportedRates, supportRateNum); psta->bssratelen = supportRateNum; /* b/g mode ra_bitmap */ for (i = 0; i < supportRateNum; i++) { if (psta->bssrateset[i]) tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i] & 0x7f); } if (pcur_network->Configuration.DSConfig > 14) { /* force to A mode. 5G doesn't support CCK rates */ network_type = WIRELESS_11A; tx_ra_bitmap = 0x150; /* 6, 12, 24 Mbps */ } else { /* force to b mode */ network_type = WIRELESS_11B; tx_ra_bitmap = 0xf; } raid = networktype_to_raid(network_type); init_rate = get_highest_rate_idx(tx_ra_bitmap & 0x0fffffff) & 0x3f; /* ap mode */ rtw_hal_set_odm_var(padapter, HAL_ODM_STA_INFO, psta, true); { u8 arg = 0; arg = psta->mac_id & 0x1f; arg |= BIT(7); tx_ra_bitmap |= ((raid << 28) & 0xf0000000); DBG_88E("%s, mask = 0x%x, arg = 0x%x\n", __func__, tx_ra_bitmap, arg); /* bitmap[0:27] = tx_rate_bitmap */ /* bitmap[28:31]= Rate Adaptive id */ /* arg[0:4] = macid */ /* arg[5] = Short GI */ rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, 0); } /* set ra_id, init_rate */ psta->raid = raid; psta->init_rate = init_rate; rtw_stassoc_hw_rpt(padapter, psta); spin_lock_bh(&psta->lock); psta->state = _FW_LINKED; spin_unlock_bh(&psta->lock); } else { DBG_88E("add_RATid_bmc_sta error!\n"); } }
void add_RATid(struct adapter *padapter, struct sta_info *psta, u8 rssi_level) { int i; u32 init_rate = 0; unsigned char sta_band = 0, raid, shortGIrate = false; unsigned int tx_ra_bitmap = 0; struct ht_priv *psta_ht = NULL; if (psta) psta_ht = &psta->htpriv; else return; if (!(psta->state & _FW_LINKED)) return; /* b/g mode ra_bitmap */ for (i = 0; i < sizeof(psta->bssrateset); i++) { if (psta->bssrateset[i]) tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i] & 0x7f); } /* n mode ra_bitmap */ if (psta_ht->ht_option) { for (i = 0; i < 8; i++) if (psta_ht->ht_cap.mcs.rx_mask[0] & BIT(i)) tx_ra_bitmap |= BIT(i + 12); /* max short GI rate */ shortGIrate = psta_ht->sgi; } if (tx_ra_bitmap & 0xffff000) sta_band |= WIRELESS_11_24N | WIRELESS_11G | WIRELESS_11B; else if (tx_ra_bitmap & 0xff0) sta_band |= WIRELESS_11G | WIRELESS_11B; else sta_band |= WIRELESS_11B; psta->wireless_mode = sta_band; raid = networktype_to_raid(sta_band); init_rate = get_highest_rate_idx(tx_ra_bitmap & 0x0fffffff) & 0x3f; if (psta->aid < NUM_STA) { u8 arg = 0; arg = psta->mac_id & 0x1f; arg |= BIT(7);/* support entry 2~31 */ if (shortGIrate) arg |= BIT(5); tx_ra_bitmap |= ((raid << 28) & 0xf0000000); DBG_88E("%s => mac_id:%d , raid:%d , bitmap = 0x%x, arg = 0x%x\n", __func__, psta->mac_id, raid, tx_ra_bitmap, arg); /* bitmap[0:27] = tx_rate_bitmap */ /* bitmap[28:31]= Rate Adaptive id */ /* arg[0:4] = macid */ /* arg[5] = Short GI */ rtw_hal_add_ra_tid(padapter, tx_ra_bitmap, arg, rssi_level); if (shortGIrate) init_rate |= BIT(6); /* set ra_id, init_rate */ psta->raid = raid; psta->init_rate = init_rate; } else { DBG_88E("station aid %d exceed the max number\n", psta->aid); } }