int wlan_set_device_param(wlan_dev_t ic, ieee80211_device_param param, u_int32_t val) { int retval=EOK; switch(param) { case IEEE80211_DEVICE_TX_CHAIN_MASK: case IEEE80211_DEVICE_TX_CHAIN_MASK_LEGACY: if(ic->ic_set_chain_mask(ic,param,val) == 0) { ic->ic_tx_chainmask = val; } else { retval=EINVAL; } break; case IEEE80211_DEVICE_RX_CHAIN_MASK: case IEEE80211_DEVICE_RX_CHAIN_MASK_LEGACY: if(ic->ic_set_chain_mask(ic,param,val) == 0) { ic->ic_rx_chainmask = val; } else { retval=EINVAL; } break; case IEEE80211_DEVICE_PROTECTION_MODE: if (val > IEEE80211_PROT_RTSCTS) { retval=EINVAL; } else { ic->ic_protmode = val; } break; case IEEE80211_DEVICE_NUM_TX_CHAIN: case IEEE80211_DEVICE_NUM_RX_CHAIN: case IEEE80211_DEVICE_COUNTRYCODE: /* read only */ retval=EINVAL; break; case IEEE80211_DEVICE_BMISS_LIMIT: ic->ic_bmisstimeout = val * ic->ic_intval; break; case IEEE80211_DEVICE_BLKDFSCHAN: if (val == 0) { ieee80211_ic_block_dfschan_clear(ic); } else { ieee80211_ic_block_dfschan_set(ic); } break; case IEEE80211_DEVICE_GREEN_AP_PS_ENABLE: ic->ic_green_ap_set_enable(ic, val); break; case IEEE80211_DEVICE_GREEN_AP_PS_TIMEOUT: ic->ic_green_ap_set_transition_time(ic, val); break; case IEEE80211_DEVICE_GREEN_AP_PS_ON_TIME: ic->ic_green_ap_set_on_time(ic, val); break; case IEEE80211_DEVICE_GREEN_AP_ENABLE_PRINT: ic->ic_green_ap_set_print_level(ic, val); break; case IEEE80211_DEVICE_CWM_EXTPROTMODE: if (val < IEEE80211_CWM_EXTPROTMAX) { ic->ic_cwm_set_extprotmode(ic, val); } else { retval = EINVAL; } break; case IEEE80211_DEVICE_CWM_EXTPROTSPACING: if (val < IEEE80211_CWM_EXTPROTSPACINGMAX) { ic->ic_cwm_set_extprotspacing(ic, val); } else { retval = EINVAL; } break; case IEEE80211_DEVICE_CWM_ENABLE: ic->ic_cwm_set_enable(ic, val); break; case IEEE80211_DEVICE_CWM_EXTBUSYTHRESHOLD: ic->ic_cwm_set_extbusythreshold(ic, val); break; case IEEE80211_DEVICE_DOTH: if (val == 0) { ieee80211_ic_doth_clear(ic); } else { ieee80211_ic_doth_set(ic); } break; #if UMAC_SUPPORT_TDLS_CHAN_SWITCH case IEEE80211_DEVICE_OFF_CHANNEL_SUPPORT: if (val == 0) { ieee80211_ic_off_channel_support_clear(ic); } else { if (ic->ic_tsf_timer) { ieee80211_ic_off_channel_support_set(ic); } else { printk("%s: Cannot enable off-channel support ic_tsf_timer=%p", __func__, ic->ic_tsf_timer); } } break; #endif case IEEE80211_DEVICE_ADDBA_MODE: ic->ic_addba_mode = val; /* * Clear any user defined ADDBA response codes before switching modes. */ ieee80211_iterate_node(ic, ieee80211_addba_clearresponse, ic); break; case IEEE80211_DEVICE_MULTI_CHANNEL: if (!val) { /* Disable Multi-Channel */ retval = ieee80211_resmgr_setmode(ic->ic_resmgr, IEEE80211_RESMGR_MODE_SINGLE_CHANNEL); } else if (ic->ic_caps_ext & IEEE80211_CEXT_MULTICHAN) { retval = ieee80211_resmgr_setmode(ic->ic_resmgr, IEEE80211_RESMGR_MODE_MULTI_CHANNEL); } else { printk("%s: Unable to enable Multi-Channel Scheduling since device/driver don't support it.\n", __func__); retval = EINVAL; } break; case IEEE80211_DEVICE_MAX_AMSDU_SIZE: ic->ic_amsdu_max_size = val; break; #if ATH_SUPPORT_IBSS_HT case IEEE80211_DEVICE_HT20ADHOC: if (val == 0) { ieee80211_ic_ht20Adhoc_clear(ic); } else { ieee80211_ic_ht20Adhoc_set(ic); } break; case IEEE80211_DEVICE_HT40ADHOC: if (val == 0) { ieee80211_ic_ht40Adhoc_clear(ic); } else { ieee80211_ic_ht40Adhoc_set(ic); } break; case IEEE80211_DEVICE_HTADHOCAGGR: if (val == 0) { ieee80211_ic_htAdhocAggr_clear(ic); } else { ieee80211_ic_htAdhocAggr_set(ic); } break; #endif /* end of #if ATH_SUPPORT_IBSS_HT */ case IEEE80211_DEVICE_PWRTARGET: ieee80211com_set_curchanmaxpwr(ic, val); break; case IEEE80211_DEVICE_P2P: if (val == 0) { ieee80211_ic_p2pDevEnable_clear(ic); } else if (ic->ic_caps_ext & IEEE80211_CEXT_P2P) { ieee80211_ic_p2pDevEnable_set(ic); } else { printk("%s: Unable to enable P2P since device/driver don't support it.\n", __func__); retval = EINVAL; } break; case IEEE80211_DEVICE_OVERRIDE_SCAN_PROBERESPONSE_IE: if (val) { ieee80211_ic_override_proberesp_ie_set(ic); } else { ieee80211_ic_override_proberesp_ie_clear(ic); } break; case IEEE80211_DEVICE_2G_CSA: if (val == 0) { ieee80211_ic_2g_csa_clear(ic); } else { ieee80211_ic_2g_csa_set(ic); } break; default: printk("%s: Error: invalid param=%d.\n", __func__, param); } return retval; }
void ieee80211_update_spectrumrequirement(struct ieee80211vap *vap) { /* * 1. If not multiple-domain capable, check to update the country IE. * 2. If multiple-domain capable, * a. If the country has been set by using desired country, * then it is done, the ie has been updated. * For IBSS or AP mode, if we are DFS owner, then need to enable Radar detect. * b. If the country is not set, if no AP or peer country info, * just assuming legancy mode. * If we have AP or peer country info, using default to see if AP accept for now. */ struct ieee80211com *ic = vap->iv_ic; struct ieee80211_node *ni = vap->iv_bss; IEEE80211_COUNTRY_ENTRY curCountry; ieee80211_ic_doth_clear(ic); if (ic->ic_country.isMultidomain == 0) { if (!IEEE80211_IS_COUNTRYIE_ENABLED(ic)) { ic->ic_country_iso[0] = ic->ic_country.iso[0]; ic->ic_country_iso[1] = ic->ic_country.iso[1]; ic->ic_country_iso[2] = ic->ic_country.iso[2]; ieee80211_build_countryie_all(ic); } if (ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) ieee80211_ic_doth_set(ic); return; } if (IEEE80211_HAS_DESIRED_COUNTRY(ic)) { /* If the country has been set, enabled the flag */ if( (ic->ic_country_iso[0] == ni->ni_cc[0]) && (ic->ic_country_iso[1] == ni->ni_cc[1])) { if (ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) { ieee80211_ic_doth_set(ic); } IEEE80211_ENABLE_11D(ic); return; } } if ((ni->ni_cc[0] == 0) || (ni->ni_cc[1] == 0) || (ni->ni_cc[0] == ' ') || (ni->ni_cc[1] == ' ')) { if (ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) { ieee80211_ic_doth_set(ic); } return; } // Update the cc only for platforms that request this : Currently, only Windows. if (ieee80211_ic_disallowAutoCCchange_is_set(ic)) { ic->ic_get_currentCountry(ic, &curCountry); if ((ni->ni_cc[0] == curCountry.iso[0] && ni->ni_cc[1] == curCountry.iso[1] && ni->ni_cc[2] == curCountry.iso[2])) { ieee80211_build_countryie_all(ic); if (ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) { ieee80211_ic_doth_set(ic); } } } else { // If ignore11dBeacon, using the original reg. domain setting. if (!IEEE80211_IS_11D_BEACON_IGNORED(ic)) { if (ieee80211_set_country_code(ic, (char*)ni->ni_cc, 0, CLIST_UPDATE) == 0) { if (ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) ieee80211_ic_doth_set(ic); } } } }