diff options
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/rt3090/oid.h | 117 | ||||
-rw-r--r-- | drivers/staging/rt3090/sta_ioctl.c | 2285 |
2 files changed, 2 insertions, 2400 deletions
diff --git a/drivers/staging/rt3090/oid.h b/drivers/staging/rt3090/oid.h index a375da89a3a..25927c1322e 100644 --- a/drivers/staging/rt3090/oid.h +++ b/drivers/staging/rt3090/oid.h | |||
@@ -98,143 +98,26 @@ | |||
98 | #define OID_GET_SET_TOGGLE 0x8000 | 98 | #define OID_GET_SET_TOGGLE 0x8000 |
99 | #define OID_GET_SET_FROM_UI 0x4000 | 99 | #define OID_GET_SET_FROM_UI 0x4000 |
100 | 100 | ||
101 | #define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0103 | ||
102 | #define OID_802_11_NETWORK_TYPE_IN_USE 0x0104 | ||
103 | #define OID_802_11_RSSI_TRIGGER 0x0107 | ||
104 | #define RT_OID_802_11_RSSI 0x0108 //rt2860 only , kathy | ||
105 | #define RT_OID_802_11_RSSI_1 0x0109 //rt2860 only , kathy | ||
106 | #define RT_OID_802_11_RSSI_2 0x010A //rt2860 only , kathy | ||
107 | #define OID_802_11_NUMBER_OF_ANTENNAS 0x010B | ||
108 | #define OID_802_11_RX_ANTENNA_SELECTED 0x010C | ||
109 | #define OID_802_11_TX_ANTENNA_SELECTED 0x010D | ||
110 | #define OID_802_11_SUPPORTED_RATES 0x010E | ||
111 | #define OID_802_11_ADD_WEP 0x0112 | 101 | #define OID_802_11_ADD_WEP 0x0112 |
112 | #define OID_802_11_REMOVE_WEP 0x0113 | ||
113 | #define OID_802_11_DISASSOCIATE 0x0114 | 102 | #define OID_802_11_DISASSOCIATE 0x0114 |
114 | #define OID_802_11_PRIVACY_FILTER 0x0118 | ||
115 | #define OID_802_11_ASSOCIATION_INFORMATION 0x011E | ||
116 | #define OID_802_11_TEST 0x011F | ||
117 | |||
118 | |||
119 | #define RT_OID_802_11_COUNTRY_REGION 0x0507 | ||
120 | #define OID_802_11_BSSID_LIST_SCAN 0x0508 | 103 | #define OID_802_11_BSSID_LIST_SCAN 0x0508 |
121 | #define OID_802_11_SSID 0x0509 | 104 | #define OID_802_11_SSID 0x0509 |
122 | #define OID_802_11_BSSID 0x050A | 105 | #define OID_802_11_BSSID 0x050A |
123 | #define RT_OID_802_11_RADIO 0x050B | ||
124 | #define RT_OID_802_11_PHY_MODE 0x050C | ||
125 | #define RT_OID_802_11_STA_CONFIG 0x050D | ||
126 | #define OID_802_11_DESIRED_RATES 0x050E | ||
127 | #define RT_OID_802_11_PREAMBLE 0x050F | ||
128 | #define OID_802_11_WEP_STATUS 0x0510 | ||
129 | #define OID_802_11_AUTHENTICATION_MODE 0x0511 | ||
130 | #define OID_802_11_INFRASTRUCTURE_MODE 0x0512 | ||
131 | #define RT_OID_802_11_RESET_COUNTERS 0x0513 | ||
132 | #define OID_802_11_RTS_THRESHOLD 0x0514 | ||
133 | #define OID_802_11_FRAGMENTATION_THRESHOLD 0x0515 | ||
134 | #define OID_802_11_POWER_MODE 0x0516 | ||
135 | #define OID_802_11_TX_POWER_LEVEL 0x0517 | ||
136 | #define RT_OID_802_11_ADD_WPA 0x0518 | ||
137 | #define OID_802_11_REMOVE_KEY 0x0519 | ||
138 | #define OID_802_11_ADD_KEY 0x0520 | ||
139 | #define OID_802_11_CONFIGURATION 0x0521 | ||
140 | #define OID_802_11_TX_PACKET_BURST 0x0522 | ||
141 | #define RT_OID_802_11_QUERY_NOISE_LEVEL 0x0523 | ||
142 | #define RT_OID_802_11_EXTRA_INFO 0x0524 | ||
143 | #ifdef DBG | ||
144 | #define RT_OID_802_11_HARDWARE_REGISTER 0x0525 | ||
145 | #endif | ||
146 | #define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS | ||
147 | #define OID_802_11_DEAUTHENTICATION 0x0526 | ||
148 | #define OID_802_11_DROP_UNENCRYPTED 0x0527 | ||
149 | #define OID_802_11_MIC_FAILURE_REPORT_FRAME 0x0528 | 106 | #define OID_802_11_MIC_FAILURE_REPORT_FRAME 0x0528 |
150 | #define OID_802_11_EAP_METHOD 0x0529 | ||
151 | |||
152 | // For 802.1x daemin using to require current driver configuration | ||
153 | #define OID_802_11_RADIUS_QUERY_SETTING 0x0540 | ||
154 | 107 | ||
155 | #define RT_OID_DEVICE_NAME 0x0607 | 108 | #define RT_OID_DEVICE_NAME 0x0607 |
156 | #define RT_OID_VERSION_INFO 0x0608 | 109 | #define RT_OID_VERSION_INFO 0x0608 |
157 | #define OID_802_11_BSSID_LIST 0x0609 | ||
158 | #define OID_802_3_CURRENT_ADDRESS 0x060A | ||
159 | #define OID_GEN_MEDIA_CONNECT_STATUS 0x060B | 110 | #define OID_GEN_MEDIA_CONNECT_STATUS 0x060B |
160 | #define RT_OID_802_11_QUERY_LINK_STATUS 0x060C | ||
161 | #define OID_802_11_RSSI 0x060D | ||
162 | #define OID_802_11_STATISTICS 0x060E | ||
163 | #define OID_GEN_RCV_OK 0x060F | 111 | #define OID_GEN_RCV_OK 0x060F |
164 | #define OID_GEN_RCV_NO_BUFFER 0x0610 | 112 | #define OID_GEN_RCV_NO_BUFFER 0x0610 |
165 | #define RT_OID_802_11_QUERY_EEPROM_VERSION 0x0611 | ||
166 | #define RT_OID_802_11_QUERY_FIRMWARE_VERSION 0x0612 | ||
167 | #define RT_OID_802_11_QUERY_LAST_RX_RATE 0x0613 | ||
168 | #define RT_OID_802_11_TX_POWER_LEVEL_1 0x0614 | ||
169 | #define RT_OID_802_11_QUERY_PIDVID 0x0615 | ||
170 | //for WPA_SUPPLICANT_SUPPORT | 113 | //for WPA_SUPPLICANT_SUPPORT |
171 | #define OID_SET_COUNTERMEASURES 0x0616 | 114 | #define OID_SET_COUNTERMEASURES 0x0616 |
172 | #define OID_802_11_SET_IEEE8021X 0x0617 | ||
173 | #define OID_802_11_SET_IEEE8021X_REQUIRE_KEY 0x0618 | ||
174 | #define OID_802_11_PMKID 0x0620 | ||
175 | #define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621 | 115 | #define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621 |
176 | #define RT_OID_WE_VERSION_COMPILED 0x0622 | 116 | #define RT_OID_WE_VERSION_COMPILED 0x0622 |
177 | #define RT_OID_NEW_DRIVER 0x0623 | 117 | #define RT_OID_NEW_DRIVER 0x0623 |
178 | 118 | ||
179 | #define RT_OID_802_11_SNR_0 0x0630 | ||
180 | #define RT_OID_802_11_SNR_1 0x0631 | ||
181 | #define RT_OID_802_11_QUERY_LAST_TX_RATE 0x0632 | ||
182 | #define RT_OID_802_11_QUERY_HT_PHYMODE 0x0633 | ||
183 | #define RT_OID_802_11_SET_HT_PHYMODE 0x0634 | ||
184 | #define OID_802_11_RELOAD_DEFAULTS 0x0635 | ||
185 | #define RT_OID_802_11_QUERY_APSD_SETTING 0x0636 | ||
186 | #define RT_OID_802_11_SET_APSD_SETTING 0x0637 | ||
187 | #define RT_OID_802_11_QUERY_APSD_PSM 0x0638 | ||
188 | #define RT_OID_802_11_SET_APSD_PSM 0x0639 | ||
189 | #define RT_OID_802_11_QUERY_DLS 0x063A | ||
190 | #define RT_OID_802_11_SET_DLS 0x063B | ||
191 | #define RT_OID_802_11_QUERY_DLS_PARAM 0x063C | ||
192 | #define RT_OID_802_11_SET_DLS_PARAM 0x063D | ||
193 | #define RT_OID_802_11_QUERY_WMM 0x063E | ||
194 | #define RT_OID_802_11_SET_WMM 0x063F | ||
195 | #define RT_OID_802_11_QUERY_IMME_BA_CAP 0x0640 | ||
196 | #define RT_OID_802_11_SET_IMME_BA_CAP 0x0641 | ||
197 | #define RT_OID_802_11_QUERY_BATABLE 0x0642 | ||
198 | #define RT_OID_802_11_ADD_IMME_BA 0x0643 | ||
199 | #define RT_OID_802_11_TEAR_IMME_BA 0x0644 | ||
200 | #define RT_OID_DRIVER_DEVICE_NAME 0x0645 | 119 | #define RT_OID_DRIVER_DEVICE_NAME 0x0645 |
201 | #define RT_OID_802_11_QUERY_DAT_HT_PHYMODE 0x0646 | ||
202 | #define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT 0x0647 | 120 | #define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT 0x0647 |
203 | #define OID_802_11_SET_PSPXLINK_MODE 0x0648 | ||
204 | /*+++ add by woody +++*/ | ||
205 | #define OID_802_11_SET_PASSPHRASE 0x0649 | ||
206 | // Ralink defined OIDs | ||
207 | // Dennis Lee move to platform specific | ||
208 | |||
209 | #define RT_OID_802_11_BSSID (OID_GET_SET_TOGGLE | OID_802_11_BSSID) | ||
210 | #define RT_OID_802_11_SSID (OID_GET_SET_TOGGLE | OID_802_11_SSID) | ||
211 | #define RT_OID_802_11_INFRASTRUCTURE_MODE (OID_GET_SET_TOGGLE | OID_802_11_INFRASTRUCTURE_MODE) | ||
212 | #define RT_OID_802_11_ADD_WEP (OID_GET_SET_TOGGLE | OID_802_11_ADD_WEP) | ||
213 | #define RT_OID_802_11_ADD_KEY (OID_GET_SET_TOGGLE | OID_802_11_ADD_KEY) | ||
214 | #define RT_OID_802_11_REMOVE_WEP (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_WEP) | ||
215 | #define RT_OID_802_11_REMOVE_KEY (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_KEY) | ||
216 | #define RT_OID_802_11_DISASSOCIATE (OID_GET_SET_TOGGLE | OID_802_11_DISASSOCIATE) | ||
217 | #define RT_OID_802_11_AUTHENTICATION_MODE (OID_GET_SET_TOGGLE | OID_802_11_AUTHENTICATION_MODE) | ||
218 | #define RT_OID_802_11_PRIVACY_FILTER (OID_GET_SET_TOGGLE | OID_802_11_PRIVACY_FILTER) | ||
219 | #define RT_OID_802_11_BSSID_LIST_SCAN (OID_GET_SET_TOGGLE | OID_802_11_BSSID_LIST_SCAN) | ||
220 | #define RT_OID_802_11_WEP_STATUS (OID_GET_SET_TOGGLE | OID_802_11_WEP_STATUS) | ||
221 | #define RT_OID_802_11_RELOAD_DEFAULTS (OID_GET_SET_TOGGLE | OID_802_11_RELOAD_DEFAULTS) | ||
222 | #define RT_OID_802_11_NETWORK_TYPE_IN_USE (OID_GET_SET_TOGGLE | OID_802_11_NETWORK_TYPE_IN_USE) | ||
223 | #define RT_OID_802_11_TX_POWER_LEVEL (OID_GET_SET_TOGGLE | OID_802_11_TX_POWER_LEVEL) | ||
224 | #define RT_OID_802_11_RSSI_TRIGGER (OID_GET_SET_TOGGLE | OID_802_11_RSSI_TRIGGER) | ||
225 | #define RT_OID_802_11_FRAGMENTATION_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_FRAGMENTATION_THRESHOLD) | ||
226 | #define RT_OID_802_11_RTS_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_RTS_THRESHOLD) | ||
227 | #define RT_OID_802_11_RX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_RX_ANTENNA_SELECTED) | ||
228 | #define RT_OID_802_11_TX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_TX_ANTENNA_SELECTED) | ||
229 | #define RT_OID_802_11_SUPPORTED_RATES (OID_GET_SET_TOGGLE | OID_802_11_SUPPORTED_RATES) | ||
230 | #define RT_OID_802_11_DESIRED_RATES (OID_GET_SET_TOGGLE | OID_802_11_DESIRED_RATES) | ||
231 | #define RT_OID_802_11_CONFIGURATION (OID_GET_SET_TOGGLE | OID_802_11_CONFIGURATION) | ||
232 | #define RT_OID_802_11_POWER_MODE (OID_GET_SET_TOGGLE | OID_802_11_POWER_MODE) | ||
233 | #define RT_OID_802_11_SET_PSPXLINK_MODE (OID_GET_SET_TOGGLE | OID_802_11_SET_PSPXLINK_MODE) | ||
234 | #define RT_OID_802_11_EAP_METHOD (OID_GET_SET_TOGGLE | OID_802_11_EAP_METHOD) | ||
235 | #define RT_OID_802_11_SET_PASSPHRASE (OID_GET_SET_TOGGLE | OID_802_11_SET_PASSPHRASE) | ||
236 | |||
237 | |||
238 | 121 | ||
239 | typedef enum _NDIS_802_11_STATUS_TYPE | 122 | typedef enum _NDIS_802_11_STATUS_TYPE |
240 | { | 123 | { |
diff --git a/drivers/staging/rt3090/sta_ioctl.c b/drivers/staging/rt3090/sta_ioctl.c index 8f54cca89d1..e419fb1d5ee 100644 --- a/drivers/staging/rt3090/sta_ioctl.c +++ b/drivers/staging/rt3090/sta_ioctl.c | |||
@@ -3119,2279 +3119,6 @@ const struct iw_handler_def rt28xx_iw_handler_def = | |||
3119 | #endif | 3119 | #endif |
3120 | }; | 3120 | }; |
3121 | 3121 | ||
3122 | INT RTMPSetInformation( | ||
3123 | IN PRTMP_ADAPTER pAd, | ||
3124 | IN OUT struct ifreq *rq, | ||
3125 | IN INT cmd) | ||
3126 | { | ||
3127 | struct iwreq *wrq = (struct iwreq *) rq; | ||
3128 | NDIS_802_11_SSID Ssid; | ||
3129 | NDIS_802_11_MAC_ADDRESS Bssid; | ||
3130 | RT_802_11_PHY_MODE PhyMode; | ||
3131 | RT_802_11_STA_CONFIG StaConfig; | ||
3132 | NDIS_802_11_RATES aryRates; | ||
3133 | RT_802_11_PREAMBLE Preamble; | ||
3134 | NDIS_802_11_WEP_STATUS WepStatus; | ||
3135 | NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax; | ||
3136 | NDIS_802_11_NETWORK_INFRASTRUCTURE BssType; | ||
3137 | NDIS_802_11_RTS_THRESHOLD RtsThresh; | ||
3138 | NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; | ||
3139 | NDIS_802_11_POWER_MODE PowerMode; | ||
3140 | PNDIS_802_11_KEY pKey = NULL; | ||
3141 | PNDIS_802_11_WEP pWepKey =NULL; | ||
3142 | PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL; | ||
3143 | NDIS_802_11_CONFIGURATION Config, *pConfig = NULL; | ||
3144 | NDIS_802_11_NETWORK_TYPE NetType; | ||
3145 | ULONG Now; | ||
3146 | UINT KeyIdx = 0; | ||
3147 | INT Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G; | ||
3148 | ULONG PowerTemp; | ||
3149 | BOOLEAN RadioState; | ||
3150 | BOOLEAN StateMachineTouched = FALSE; | ||
3151 | PNDIS_802_11_PASSPHRASE ppassphrase = NULL; | ||
3152 | #ifdef DOT11_N_SUPPORT | ||
3153 | OID_SET_HT_PHYMODE HT_PhyMode; //11n ,kathy | ||
3154 | #endif // DOT11_N_SUPPORT // | ||
3155 | #ifdef WPA_SUPPLICANT_SUPPORT | ||
3156 | PNDIS_802_11_PMKID pPmkId = NULL; | ||
3157 | BOOLEAN IEEE8021xState = FALSE; | ||
3158 | BOOLEAN IEEE8021x_required_keys = FALSE; | ||
3159 | UCHAR wpa_supplicant_enable = 0; | ||
3160 | #endif // WPA_SUPPLICANT_SUPPORT // | ||
3161 | |||
3162 | #ifdef SNMP_SUPPORT | ||
3163 | TX_RTY_CFG_STRUC tx_rty_cfg; | ||
3164 | ULONG ShortRetryLimit, LongRetryLimit; | ||
3165 | UCHAR ctmp; | ||
3166 | #endif // SNMP_SUPPORT // | ||
3167 | |||
3168 | |||
3169 | |||
3170 | |||
3171 | #ifdef DOT11_N_SUPPORT | ||
3172 | MaxPhyMode = PHY_11N_5G; | ||
3173 | #endif // DOT11_N_SUPPORT // | ||
3174 | |||
3175 | DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPSetInformation(), 0x%08x\n", cmd&0x7FFF)); | ||
3176 | switch(cmd & 0x7FFF) { | ||
3177 | case RT_OID_802_11_COUNTRY_REGION: | ||
3178 | if (wrq->u.data.length < sizeof(UCHAR)) | ||
3179 | Status = -EINVAL; | ||
3180 | // Only avaliable when EEPROM not programming | ||
3181 | else if (!(pAd->CommonCfg.CountryRegion & 0x80) && !(pAd->CommonCfg.CountryRegionForABand & 0x80)) | ||
3182 | { | ||
3183 | ULONG Country; | ||
3184 | UCHAR TmpPhy; | ||
3185 | |||
3186 | Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length); | ||
3187 | pAd->CommonCfg.CountryRegion = (UCHAR)(Country & 0x000000FF); | ||
3188 | pAd->CommonCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF); | ||
3189 | TmpPhy = pAd->CommonCfg.PhyMode; | ||
3190 | pAd->CommonCfg.PhyMode = 0xff; | ||
3191 | // Build all corresponding channel information | ||
3192 | RTMPSetPhyMode(pAd, TmpPhy); | ||
3193 | #ifdef DOT11_N_SUPPORT | ||
3194 | SetCommonHT(pAd); | ||
3195 | #endif // DOT11_N_SUPPORT // | ||
3196 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_COUNTRY_REGION (A:%d B/G:%d)\n", pAd->CommonCfg.CountryRegionForABand, | ||
3197 | pAd->CommonCfg.CountryRegion)); | ||
3198 | } | ||
3199 | break; | ||
3200 | case OID_802_11_BSSID_LIST_SCAN: | ||
3201 | Now = jiffies; | ||
3202 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAd->RalinkCounters.LastOneSecTotalTxCount)); | ||
3203 | |||
3204 | if (MONITOR_ON(pAd)) | ||
3205 | { | ||
3206 | DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n")); | ||
3207 | break; | ||
3208 | } | ||
3209 | |||
3210 | //Benson add 20080527, when radio off, sta don't need to scan | ||
3211 | if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) | ||
3212 | break; | ||
3213 | |||
3214 | if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) | ||
3215 | { | ||
3216 | DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is scanning now !!!\n")); | ||
3217 | pAd->StaCfg.bScanReqIsFromWebUI = TRUE; | ||
3218 | Status = NDIS_STATUS_SUCCESS; | ||
3219 | break; | ||
3220 | } | ||
3221 | |||
3222 | if (pAd->RalinkCounters.LastOneSecTotalTxCount > 100) | ||
3223 | { | ||
3224 | DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); | ||
3225 | Status = NDIS_STATUS_SUCCESS; | ||
3226 | pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID | ||
3227 | break; | ||
3228 | } | ||
3229 | |||
3230 | if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) && | ||
3231 | ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || | ||
3232 | (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || | ||
3233 | (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || | ||
3234 | (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) && | ||
3235 | (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) | ||
3236 | { | ||
3237 | DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); | ||
3238 | Status = NDIS_STATUS_SUCCESS; | ||
3239 | pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID | ||
3240 | break; | ||
3241 | } | ||
3242 | |||
3243 | |||
3244 | if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) | ||
3245 | { | ||
3246 | RTMP_MLME_RESET_STATE_MACHINE(pAd); | ||
3247 | DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); | ||
3248 | } | ||
3249 | |||
3250 | // tell CNTL state machine to call NdisMSetInformationComplete() after completing | ||
3251 | // this request, because this request is initiated by NDIS. | ||
3252 | pAd->MlmeAux.CurrReqIsFromNdis = FALSE; | ||
3253 | // Reset allowed scan retries | ||
3254 | pAd->StaCfg.ScanCnt = 0; | ||
3255 | pAd->StaCfg.LastScanTime = Now; | ||
3256 | |||
3257 | pAd->StaCfg.bScanReqIsFromWebUI = TRUE; | ||
3258 | RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); | ||
3259 | MlmeEnqueue(pAd, | ||
3260 | MLME_CNTL_STATE_MACHINE, | ||
3261 | OID_802_11_BSSID_LIST_SCAN, | ||
3262 | 0, | ||
3263 | NULL); | ||
3264 | |||
3265 | Status = NDIS_STATUS_SUCCESS; | ||
3266 | StateMachineTouched = TRUE; | ||
3267 | break; | ||
3268 | case OID_802_11_SSID: | ||
3269 | if (wrq->u.data.length != sizeof(NDIS_802_11_SSID)) | ||
3270 | Status = -EINVAL; | ||
3271 | else | ||
3272 | { | ||
3273 | PSTRING pSsidString = NULL; | ||
3274 | Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length); | ||
3275 | |||
3276 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid)); | ||
3277 | if (Ssid.SsidLength > MAX_LEN_OF_SSID) | ||
3278 | Status = -EINVAL; | ||
3279 | else | ||
3280 | { | ||
3281 | if (Ssid.SsidLength == 0) | ||
3282 | { | ||
3283 | Set_SSID_Proc(pAd, ""); | ||
3284 | } | ||
3285 | else | ||
3286 | { | ||
3287 | pSsidString = (PSTRING)kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); | ||
3288 | if (pSsidString) | ||
3289 | { | ||
3290 | NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1); | ||
3291 | NdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength); | ||
3292 | Set_SSID_Proc(pAd, pSsidString); | ||
3293 | kfree(pSsidString); | ||
3294 | } | ||
3295 | else | ||
3296 | Status = -ENOMEM; | ||
3297 | } | ||
3298 | } | ||
3299 | } | ||
3300 | break; | ||
3301 | case OID_802_11_SET_PASSPHRASE: | ||
3302 | ppassphrase= kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
3303 | |||
3304 | if(ppassphrase== NULL) | ||
3305 | { | ||
3306 | Status = -ENOMEM; | ||
3307 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed!!\n")); | ||
3308 | break; | ||
3309 | } | ||
3310 | else | ||
3311 | { | ||
3312 | Status = copy_from_user(ppassphrase, wrq->u.data.pointer, wrq->u.data.length); | ||
3313 | |||
3314 | if (Status) | ||
3315 | { | ||
3316 | Status = -EINVAL; | ||
3317 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (length mismatch)!!\n")); | ||
3318 | } | ||
3319 | else | ||
3320 | { | ||
3321 | if(ppassphrase->KeyLength < 8 || ppassphrase->KeyLength > 64) | ||
3322 | { | ||
3323 | Status = -EINVAL; | ||
3324 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (len less than 8 or greater than 64)!!\n")); | ||
3325 | } | ||
3326 | else | ||
3327 | { | ||
3328 | // set key passphrase and length | ||
3329 | NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64); | ||
3330 | NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, &ppassphrase->KeyMaterial, ppassphrase->KeyLength); | ||
3331 | pAd->StaCfg.WpaPassPhraseLen = ppassphrase->KeyLength; | ||
3332 | hex_dump("pAd->StaCfg.WpaPassPhrase", pAd->StaCfg.WpaPassPhrase, 64); | ||
3333 | printk("WpaPassPhrase=%s\n",pAd->StaCfg.WpaPassPhrase); | ||
3334 | } | ||
3335 | } | ||
3336 | } | ||
3337 | kfree(ppassphrase); | ||
3338 | break; | ||
3339 | |||
3340 | case OID_802_11_BSSID: | ||
3341 | if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS)) | ||
3342 | Status = -EINVAL; | ||
3343 | else | ||
3344 | { | ||
3345 | Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length); | ||
3346 | |||
3347 | // tell CNTL state machine to call NdisMSetInformationComplete() after completing | ||
3348 | // this request, because this request is initiated by NDIS. | ||
3349 | pAd->MlmeAux.CurrReqIsFromNdis = FALSE; | ||
3350 | |||
3351 | // Prevent to connect AP again in STAMlmePeriodicExec | ||
3352 | pAd->MlmeAux.AutoReconnectSsidLen= 32; | ||
3353 | |||
3354 | // Reset allowed scan retries | ||
3355 | pAd->StaCfg.ScanCnt = 0; | ||
3356 | |||
3357 | if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) | ||
3358 | { | ||
3359 | RTMP_MLME_RESET_STATE_MACHINE(pAd); | ||
3360 | DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); | ||
3361 | } | ||
3362 | MlmeEnqueue(pAd, | ||
3363 | MLME_CNTL_STATE_MACHINE, | ||
3364 | OID_802_11_BSSID, | ||
3365 | sizeof(NDIS_802_11_MAC_ADDRESS), | ||
3366 | (VOID *)&Bssid); | ||
3367 | Status = NDIS_STATUS_SUCCESS; | ||
3368 | StateMachineTouched = TRUE; | ||
3369 | |||
3370 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", | ||
3371 | Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); | ||
3372 | } | ||
3373 | break; | ||
3374 | case RT_OID_802_11_RADIO: | ||
3375 | if (wrq->u.data.length != sizeof(BOOLEAN)) | ||
3376 | Status = -EINVAL; | ||
3377 | else | ||
3378 | { | ||
3379 | Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length); | ||
3380 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RADIO (=%d)\n", RadioState)); | ||
3381 | if (pAd->StaCfg.bSwRadio != RadioState) | ||
3382 | { | ||
3383 | pAd->StaCfg.bSwRadio = RadioState; | ||
3384 | if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) | ||
3385 | { | ||
3386 | pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); | ||
3387 | if (pAd->StaCfg.bRadio == TRUE) | ||
3388 | { | ||
3389 | MlmeRadioOn(pAd); | ||
3390 | // Update extra information | ||
3391 | pAd->ExtraInfo = EXTRA_INFO_CLEAR; | ||
3392 | } | ||
3393 | else | ||
3394 | { | ||
3395 | if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) | ||
3396 | { | ||
3397 | if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) | ||
3398 | { | ||
3399 | RTMP_MLME_RESET_STATE_MACHINE(pAd); | ||
3400 | DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); | ||
3401 | } | ||
3402 | } | ||
3403 | |||
3404 | MlmeRadioOff(pAd); | ||
3405 | // Update extra information | ||
3406 | pAd->ExtraInfo = SW_RADIO_OFF; | ||
3407 | } | ||
3408 | } | ||
3409 | } | ||
3410 | } | ||
3411 | break; | ||
3412 | case RT_OID_802_11_PHY_MODE: | ||
3413 | if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE)) | ||
3414 | Status = -EINVAL; | ||
3415 | else | ||
3416 | { | ||
3417 | Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length); | ||
3418 | if (PhyMode <= MaxPhyMode) | ||
3419 | { | ||
3420 | RTMPSetPhyMode(pAd, PhyMode); | ||
3421 | #ifdef DOT11_N_SUPPORT | ||
3422 | SetCommonHT(pAd); | ||
3423 | #endif // DOT11_N_SUPPORT // | ||
3424 | } | ||
3425 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode)); | ||
3426 | } | ||
3427 | break; | ||
3428 | case RT_OID_802_11_STA_CONFIG: | ||
3429 | if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG)) | ||
3430 | Status = -EINVAL; | ||
3431 | else | ||
3432 | { | ||
3433 | UINT32 Value; | ||
3434 | |||
3435 | Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length); | ||
3436 | pAd->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst; | ||
3437 | pAd->CommonCfg.UseBGProtection = StaConfig.UseBGProtection; | ||
3438 | pAd->CommonCfg.bUseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable | ||
3439 | if ((pAd->CommonCfg.PhyMode != StaConfig.AdhocMode) && | ||
3440 | (StaConfig.AdhocMode <= MaxPhyMode)) | ||
3441 | { | ||
3442 | // allow dynamic change of "USE OFDM rate or not" in ADHOC mode | ||
3443 | // if setting changed, need to reset current TX rate as well as BEACON frame format | ||
3444 | if (pAd->StaCfg.BssType == BSS_ADHOC) | ||
3445 | { | ||
3446 | pAd->CommonCfg.PhyMode = StaConfig.AdhocMode; | ||
3447 | RTMPSetPhyMode(pAd, PhyMode); | ||
3448 | MlmeUpdateTxRates(pAd, FALSE, 0); | ||
3449 | MakeIbssBeacon(pAd); // re-build BEACON frame | ||
3450 | AsicEnableIbssSync(pAd); // copy to on-chip memory | ||
3451 | } | ||
3452 | } | ||
3453 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\n", | ||
3454 | pAd->CommonCfg.bEnableTxBurst, | ||
3455 | pAd->CommonCfg.UseBGProtection, | ||
3456 | pAd->CommonCfg.bUseShortSlotTime)); | ||
3457 | |||
3458 | if (pAd->CommonCfg.PSPXlink) | ||
3459 | Value = PSPXLINK; | ||
3460 | else | ||
3461 | Value = STANORMAL; | ||
3462 | RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value); | ||
3463 | Value = 0; | ||
3464 | RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); | ||
3465 | Value &= (~0x80); | ||
3466 | RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); | ||
3467 | } | ||
3468 | break; | ||
3469 | case OID_802_11_DESIRED_RATES: | ||
3470 | if (wrq->u.data.length != sizeof(NDIS_802_11_RATES)) | ||
3471 | Status = -EINVAL; | ||
3472 | else | ||
3473 | { | ||
3474 | Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length); | ||
3475 | NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES); | ||
3476 | NdisMoveMemory(pAd->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES)); | ||
3477 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n", | ||
3478 | pAd->CommonCfg.DesireRate[0],pAd->CommonCfg.DesireRate[1], | ||
3479 | pAd->CommonCfg.DesireRate[2],pAd->CommonCfg.DesireRate[3], | ||
3480 | pAd->CommonCfg.DesireRate[4],pAd->CommonCfg.DesireRate[5], | ||
3481 | pAd->CommonCfg.DesireRate[6],pAd->CommonCfg.DesireRate[7] )); | ||
3482 | // Changing DesiredRate may affect the MAX TX rate we used to TX frames out | ||
3483 | MlmeUpdateTxRates(pAd, FALSE, 0); | ||
3484 | } | ||
3485 | break; | ||
3486 | case RT_OID_802_11_PREAMBLE: | ||
3487 | if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE)) | ||
3488 | Status = -EINVAL; | ||
3489 | else | ||
3490 | { | ||
3491 | Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length); | ||
3492 | if (Preamble == Rt802_11PreambleShort) | ||
3493 | { | ||
3494 | pAd->CommonCfg.TxPreamble = Preamble; | ||
3495 | MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); | ||
3496 | } | ||
3497 | else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto)) | ||
3498 | { | ||
3499 | // if user wants AUTO, initialize to LONG here, then change according to AP's | ||
3500 | // capability upon association. | ||
3501 | pAd->CommonCfg.TxPreamble = Preamble; | ||
3502 | MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); | ||
3503 | } | ||
3504 | else | ||
3505 | { | ||
3506 | Status = -EINVAL; | ||
3507 | break; | ||
3508 | } | ||
3509 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PREAMBLE (=%d)\n", Preamble)); | ||
3510 | } | ||
3511 | break; | ||
3512 | case OID_802_11_WEP_STATUS: | ||
3513 | if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) | ||
3514 | Status = -EINVAL; | ||
3515 | else | ||
3516 | { | ||
3517 | Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length); | ||
3518 | // Since TKIP, AES, WEP are all supported. It should not have any invalid setting | ||
3519 | if (WepStatus <= Ndis802_11Encryption3KeyAbsent) | ||
3520 | { | ||
3521 | if (pAd->StaCfg.WepStatus != WepStatus) | ||
3522 | { | ||
3523 | // Config has changed | ||
3524 | pAd->bConfigChanged = TRUE; | ||
3525 | } | ||
3526 | pAd->StaCfg.WepStatus = WepStatus; | ||
3527 | pAd->StaCfg.OrigWepStatus = WepStatus; | ||
3528 | pAd->StaCfg.PairCipher = WepStatus; | ||
3529 | pAd->StaCfg.GroupCipher = WepStatus; | ||
3530 | } | ||
3531 | else | ||
3532 | { | ||
3533 | Status = -EINVAL; | ||
3534 | break; | ||
3535 | } | ||
3536 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus)); | ||
3537 | } | ||
3538 | break; | ||
3539 | case OID_802_11_AUTHENTICATION_MODE: | ||
3540 | if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) | ||
3541 | Status = -EINVAL; | ||
3542 | else | ||
3543 | { | ||
3544 | Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length); | ||
3545 | if (AuthMode > Ndis802_11AuthModeMax) | ||
3546 | { | ||
3547 | Status = -EINVAL; | ||
3548 | break; | ||
3549 | } | ||
3550 | else | ||
3551 | { | ||
3552 | if (pAd->StaCfg.AuthMode != AuthMode) | ||
3553 | { | ||
3554 | // Config has changed | ||
3555 | pAd->bConfigChanged = TRUE; | ||
3556 | } | ||
3557 | pAd->StaCfg.AuthMode = AuthMode; | ||
3558 | } | ||
3559 | pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; | ||
3560 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n",pAd->StaCfg.AuthMode)); | ||
3561 | } | ||
3562 | break; | ||
3563 | case OID_802_11_INFRASTRUCTURE_MODE: | ||
3564 | if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE)) | ||
3565 | Status = -EINVAL; | ||
3566 | else | ||
3567 | { | ||
3568 | Status = copy_from_user(&BssType, wrq->u.data.pointer, wrq->u.data.length); | ||
3569 | |||
3570 | if (BssType == Ndis802_11IBSS) | ||
3571 | Set_NetworkType_Proc(pAd, "Adhoc"); | ||
3572 | else if (BssType == Ndis802_11Infrastructure) | ||
3573 | Set_NetworkType_Proc(pAd, "Infra"); | ||
3574 | else if (BssType == Ndis802_11Monitor) | ||
3575 | Set_NetworkType_Proc(pAd, "Monitor"); | ||
3576 | else | ||
3577 | { | ||
3578 | Status = -EINVAL; | ||
3579 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_INFRASTRUCTURE_MODE (unknown)\n")); | ||
3580 | } | ||
3581 | } | ||
3582 | break; | ||
3583 | case OID_802_11_REMOVE_WEP: | ||
3584 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_WEP\n")); | ||
3585 | if (wrq->u.data.length != sizeof(NDIS_802_11_KEY_INDEX)) | ||
3586 | { | ||
3587 | Status = -EINVAL; | ||
3588 | } | ||
3589 | else | ||
3590 | { | ||
3591 | KeyIdx = *(NDIS_802_11_KEY_INDEX *) wrq->u.data.pointer; | ||
3592 | |||
3593 | if (KeyIdx & 0x80000000) | ||
3594 | { | ||
3595 | // Should never set default bit when remove key | ||
3596 | Status = -EINVAL; | ||
3597 | } | ||
3598 | else | ||
3599 | { | ||
3600 | KeyIdx = KeyIdx & 0x0fffffff; | ||
3601 | if (KeyIdx >= 4){ | ||
3602 | Status = -EINVAL; | ||
3603 | } | ||
3604 | else | ||
3605 | { | ||
3606 | pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0; | ||
3607 | pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE; | ||
3608 | AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); | ||
3609 | } | ||
3610 | } | ||
3611 | } | ||
3612 | break; | ||
3613 | case RT_OID_802_11_RESET_COUNTERS: | ||
3614 | NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11)); | ||
3615 | NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3)); | ||
3616 | NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK)); | ||
3617 | pAd->Counters8023.RxNoBuffer = 0; | ||
3618 | pAd->Counters8023.GoodReceives = 0; | ||
3619 | pAd->Counters8023.RxNoBuffer = 0; | ||
3620 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RESET_COUNTERS \n")); | ||
3621 | break; | ||
3622 | case OID_802_11_RTS_THRESHOLD: | ||
3623 | if (wrq->u.data.length != sizeof(NDIS_802_11_RTS_THRESHOLD)) | ||
3624 | Status = -EINVAL; | ||
3625 | else | ||
3626 | { | ||
3627 | Status = copy_from_user(&RtsThresh, wrq->u.data.pointer, wrq->u.data.length); | ||
3628 | if (RtsThresh > MAX_RTS_THRESHOLD) | ||
3629 | Status = -EINVAL; | ||
3630 | else | ||
3631 | pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh; | ||
3632 | } | ||
3633 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_RTS_THRESHOLD (=%ld)\n",RtsThresh)); | ||
3634 | break; | ||
3635 | case OID_802_11_FRAGMENTATION_THRESHOLD: | ||
3636 | if (wrq->u.data.length != sizeof(NDIS_802_11_FRAGMENTATION_THRESHOLD)) | ||
3637 | Status = -EINVAL; | ||
3638 | else | ||
3639 | { | ||
3640 | Status = copy_from_user(&FragThresh, wrq->u.data.pointer, wrq->u.data.length); | ||
3641 | pAd->CommonCfg.bUseZeroToDisableFragment = FALSE; | ||
3642 | if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD) | ||
3643 | { | ||
3644 | if (FragThresh == 0) | ||
3645 | { | ||
3646 | pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD; | ||
3647 | pAd->CommonCfg.bUseZeroToDisableFragment = TRUE; | ||
3648 | } | ||
3649 | else | ||
3650 | Status = -EINVAL; | ||
3651 | } | ||
3652 | else | ||
3653 | pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh; | ||
3654 | } | ||
3655 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_FRAGMENTATION_THRESHOLD (=%ld) \n",FragThresh)); | ||
3656 | break; | ||
3657 | case OID_802_11_POWER_MODE: | ||
3658 | if (wrq->u.data.length != sizeof(NDIS_802_11_POWER_MODE)) | ||
3659 | Status = -EINVAL; | ||
3660 | else | ||
3661 | { | ||
3662 | Status = copy_from_user(&PowerMode, wrq->u.data.pointer, wrq->u.data.length); | ||
3663 | if (PowerMode == Ndis802_11PowerModeCAM) | ||
3664 | Set_PSMode_Proc(pAd, "CAM"); | ||
3665 | else if (PowerMode == Ndis802_11PowerModeMAX_PSP) | ||
3666 | Set_PSMode_Proc(pAd, "Max_PSP"); | ||
3667 | else if (PowerMode == Ndis802_11PowerModeFast_PSP) | ||
3668 | Set_PSMode_Proc(pAd, "Fast_PSP"); | ||
3669 | else if (PowerMode == Ndis802_11PowerModeLegacy_PSP) | ||
3670 | Set_PSMode_Proc(pAd, "Legacy_PSP"); | ||
3671 | else | ||
3672 | Status = -EINVAL; | ||
3673 | } | ||
3674 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_POWER_MODE (=%d)\n",PowerMode)); | ||
3675 | break; | ||
3676 | case RT_OID_802_11_TX_POWER_LEVEL_1: | ||
3677 | if (wrq->u.data.length < sizeof(ULONG)) | ||
3678 | Status = -EINVAL; | ||
3679 | else | ||
3680 | { | ||
3681 | Status = copy_from_user(&PowerTemp, wrq->u.data.pointer, wrq->u.data.length); | ||
3682 | if (PowerTemp > 100) | ||
3683 | PowerTemp = 0xffffffff; // AUTO | ||
3684 | pAd->CommonCfg.TxPowerDefault = PowerTemp; //keep current setting. | ||
3685 | pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; | ||
3686 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage)); | ||
3687 | } | ||
3688 | break; | ||
3689 | case OID_802_11_NETWORK_TYPE_IN_USE: | ||
3690 | if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_TYPE)) | ||
3691 | Status = -EINVAL; | ||
3692 | else | ||
3693 | { | ||
3694 | Status = copy_from_user(&NetType, wrq->u.data.pointer, wrq->u.data.length); | ||
3695 | |||
3696 | if (NetType == Ndis802_11DS) | ||
3697 | RTMPSetPhyMode(pAd, PHY_11B); | ||
3698 | else if (NetType == Ndis802_11OFDM24) | ||
3699 | RTMPSetPhyMode(pAd, PHY_11BG_MIXED); | ||
3700 | else if (NetType == Ndis802_11OFDM5) | ||
3701 | RTMPSetPhyMode(pAd, PHY_11A); | ||
3702 | else | ||
3703 | Status = -EINVAL; | ||
3704 | #ifdef DOT11_N_SUPPORT | ||
3705 | if (Status == NDIS_STATUS_SUCCESS) | ||
3706 | SetCommonHT(pAd); | ||
3707 | #endif // DOT11_N_SUPPORT // | ||
3708 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType)); | ||
3709 | } | ||
3710 | break; | ||
3711 | // For WPA PSK PMK key | ||
3712 | case RT_OID_802_11_ADD_WPA: | ||
3713 | pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
3714 | if(pKey == NULL) | ||
3715 | { | ||
3716 | Status = -ENOMEM; | ||
3717 | break; | ||
3718 | } | ||
3719 | |||
3720 | Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); | ||
3721 | if (pKey->Length != wrq->u.data.length) | ||
3722 | { | ||
3723 | Status = -EINVAL; | ||
3724 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!!\n")); | ||
3725 | } | ||
3726 | else | ||
3727 | { | ||
3728 | if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && | ||
3729 | (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) && | ||
3730 | (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) ) | ||
3731 | { | ||
3732 | Status = -EOPNOTSUPP; | ||
3733 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\n")); | ||
3734 | } | ||
3735 | else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || | ||
3736 | (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || | ||
3737 | (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) ) // Only for WPA PSK mode | ||
3738 | { | ||
3739 | NdisMoveMemory(pAd->StaCfg.PMK, &pKey->KeyMaterial, pKey->KeyLength); | ||
3740 | // Use RaConfig as PSK agent. | ||
3741 | // Start STA supplicant state machine | ||
3742 | if (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) | ||
3743 | pAd->StaCfg.WpaState = SS_START; | ||
3744 | |||
3745 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); | ||
3746 | } | ||
3747 | else | ||
3748 | { | ||
3749 | pAd->StaCfg.WpaState = SS_NOTUSE; | ||
3750 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); | ||
3751 | } | ||
3752 | } | ||
3753 | kfree(pKey); | ||
3754 | break; | ||
3755 | case OID_802_11_REMOVE_KEY: | ||
3756 | pRemoveKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
3757 | if(pRemoveKey == NULL) | ||
3758 | { | ||
3759 | Status = -ENOMEM; | ||
3760 | break; | ||
3761 | } | ||
3762 | |||
3763 | Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length); | ||
3764 | if (pRemoveKey->Length != wrq->u.data.length) | ||
3765 | { | ||
3766 | Status = -EINVAL; | ||
3767 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!\n")); | ||
3768 | } | ||
3769 | else | ||
3770 | { | ||
3771 | if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) | ||
3772 | { | ||
3773 | RTMPWPARemoveKeyProc(pAd, pRemoveKey); | ||
3774 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\n")); | ||
3775 | } | ||
3776 | else | ||
3777 | { | ||
3778 | KeyIdx = pRemoveKey->KeyIndex; | ||
3779 | |||
3780 | if (KeyIdx & 0x80000000) | ||
3781 | { | ||
3782 | // Should never set default bit when remove key | ||
3783 | Status = -EINVAL; | ||
3784 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\n")); | ||
3785 | } | ||
3786 | else | ||
3787 | { | ||
3788 | KeyIdx = KeyIdx & 0x0fffffff; | ||
3789 | if (KeyIdx > 3) | ||
3790 | { | ||
3791 | Status = -EINVAL; | ||
3792 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\n", KeyIdx)); | ||
3793 | } | ||
3794 | else | ||
3795 | { | ||
3796 | pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0; | ||
3797 | pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE; | ||
3798 | AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); | ||
3799 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length)); | ||
3800 | } | ||
3801 | } | ||
3802 | } | ||
3803 | } | ||
3804 | kfree(pRemoveKey); | ||
3805 | break; | ||
3806 | // New for WPA | ||
3807 | case OID_802_11_ADD_KEY: | ||
3808 | pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
3809 | if(pKey == NULL) | ||
3810 | { | ||
3811 | Status = -ENOMEM; | ||
3812 | break; | ||
3813 | } | ||
3814 | Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); | ||
3815 | if (pKey->Length != wrq->u.data.length) | ||
3816 | { | ||
3817 | Status = -EINVAL; | ||
3818 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY, Failed!!\n")); | ||
3819 | } | ||
3820 | else | ||
3821 | { | ||
3822 | RTMPAddKey(pAd, pKey); | ||
3823 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); | ||
3824 | } | ||
3825 | kfree(pKey); | ||
3826 | break; | ||
3827 | case OID_802_11_CONFIGURATION: | ||
3828 | if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION)) | ||
3829 | Status = -EINVAL; | ||
3830 | else | ||
3831 | { | ||
3832 | Status = copy_from_user(&Config, wrq->u.data.pointer, wrq->u.data.length); | ||
3833 | pConfig = &Config; | ||
3834 | |||
3835 | if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400)) | ||
3836 | pAd->CommonCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod; | ||
3837 | |||
3838 | pAd->StaActive.AtimWin = (USHORT) pConfig->ATIMWindow; | ||
3839 | MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAd->CommonCfg.Channel); | ||
3840 | // | ||
3841 | // Save the channel on MlmeAux for CntlOidRTBssidProc used. | ||
3842 | // | ||
3843 | pAd->MlmeAux.Channel = pAd->CommonCfg.Channel; | ||
3844 | |||
3845 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CONFIGURATION (BeacnPeriod=%ld,AtimW=%ld,Ch=%d)\n", | ||
3846 | pConfig->BeaconPeriod, pConfig->ATIMWindow, pAd->CommonCfg.Channel)); | ||
3847 | // Config has changed | ||
3848 | pAd->bConfigChanged = TRUE; | ||
3849 | } | ||
3850 | break; | ||
3851 | #ifdef DOT11_N_SUPPORT | ||
3852 | case RT_OID_802_11_SET_HT_PHYMODE: | ||
3853 | if (wrq->u.data.length != sizeof(OID_SET_HT_PHYMODE)) | ||
3854 | Status = -EINVAL; | ||
3855 | else | ||
3856 | { | ||
3857 | POID_SET_HT_PHYMODE pHTPhyMode = &HT_PhyMode; | ||
3858 | |||
3859 | Status = copy_from_user(&HT_PhyMode, wrq->u.data.pointer, wrq->u.data.length); | ||
3860 | DBGPRINT(RT_DEBUG_TRACE, ("Set::pHTPhyMode (PhyMode = %d,TransmitNo = %d, HtMode = %d, ExtOffset = %d , MCS = %d, BW = %d, STBC = %d, SHORTGI = %d) \n", | ||
3861 | pHTPhyMode->PhyMode, pHTPhyMode->TransmitNo,pHTPhyMode->HtMode,pHTPhyMode->ExtOffset, | ||
3862 | pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI)); | ||
3863 | if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) | ||
3864 | RTMPSetHT(pAd, pHTPhyMode); | ||
3865 | } | ||
3866 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_HT_PHYMODE(MCS=%d,BW=%d,SGI=%d,STBC=%d)\n", | ||
3867 | pAd->StaCfg.HTPhyMode.field.MCS, pAd->StaCfg.HTPhyMode.field.BW, pAd->StaCfg.HTPhyMode.field.ShortGI, | ||
3868 | pAd->StaCfg.HTPhyMode.field.STBC)); | ||
3869 | break; | ||
3870 | #endif // DOT11_N_SUPPORT // | ||
3871 | case RT_OID_802_11_SET_APSD_SETTING: | ||
3872 | if (wrq->u.data.length != sizeof(ULONG)) | ||
3873 | Status = -EINVAL; | ||
3874 | else | ||
3875 | { | ||
3876 | ULONG apsd ; | ||
3877 | Status = copy_from_user(&apsd, wrq->u.data.pointer, wrq->u.data.length); | ||
3878 | |||
3879 | /*------------------------------------------------------------------- | ||
3880 | |B31~B7 | B6~B5 | B4 | B3 | B2 | B1 | B0 | | ||
3881 | --------------------------------------------------------------------- | ||
3882 | | Rsvd | Max SP Len | AC_VO | AC_VI | AC_BK | AC_BE | APSD Capable | | ||
3883 | ---------------------------------------------------------------------*/ | ||
3884 | pAd->CommonCfg.bAPSDCapable = (apsd & 0x00000001) ? TRUE : FALSE; | ||
3885 | pAd->CommonCfg.bAPSDAC_BE = ((apsd & 0x00000002) >> 1) ? TRUE : FALSE; | ||
3886 | pAd->CommonCfg.bAPSDAC_BK = ((apsd & 0x00000004) >> 2) ? TRUE : FALSE; | ||
3887 | pAd->CommonCfg.bAPSDAC_VI = ((apsd & 0x00000008) >> 3) ? TRUE : FALSE; | ||
3888 | pAd->CommonCfg.bAPSDAC_VO = ((apsd & 0x00000010) >> 4) ? TRUE : FALSE; | ||
3889 | pAd->CommonCfg.MaxSPLength = (UCHAR)((apsd & 0x00000060) >> 5); | ||
3890 | |||
3891 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_SETTING (apsd=0x%lx, APSDCap=%d, [BE,BK,VI,VO]=[%d/%d/%d/%d], MaxSPLen=%d)\n", apsd, pAd->CommonCfg.bAPSDCapable, | ||
3892 | pAd->CommonCfg.bAPSDAC_BE, pAd->CommonCfg.bAPSDAC_BK, pAd->CommonCfg.bAPSDAC_VI, pAd->CommonCfg.bAPSDAC_VO, pAd->CommonCfg.MaxSPLength)); | ||
3893 | } | ||
3894 | break; | ||
3895 | |||
3896 | case RT_OID_802_11_SET_APSD_PSM: | ||
3897 | if (wrq->u.data.length != sizeof(ULONG)) | ||
3898 | Status = -EINVAL; | ||
3899 | else | ||
3900 | { | ||
3901 | // Driver needs to notify AP when PSM changes | ||
3902 | Status = copy_from_user(&pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.pointer, wrq->u.data.length); | ||
3903 | if (pAd->CommonCfg.bAPSDForcePowerSave != pAd->StaCfg.Psm) | ||
3904 | { | ||
3905 | RTMP_SET_PSM_BIT(pAd, pAd->CommonCfg.bAPSDForcePowerSave); | ||
3906 | RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); | ||
3907 | } | ||
3908 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_PSM (bAPSDForcePowerSave:%d)\n", pAd->CommonCfg.bAPSDForcePowerSave)); | ||
3909 | } | ||
3910 | break; | ||
3911 | #ifdef QOS_DLS_SUPPORT | ||
3912 | case RT_OID_802_11_SET_DLS: | ||
3913 | if (wrq->u.data.length != sizeof(ULONG)) | ||
3914 | Status = -EINVAL; | ||
3915 | else | ||
3916 | { | ||
3917 | BOOLEAN oldvalue = pAd->CommonCfg.bDLSCapable; | ||
3918 | Status = copy_from_user(&pAd->CommonCfg.bDLSCapable, wrq->u.data.pointer, wrq->u.data.length); | ||
3919 | if (oldvalue && !pAd->CommonCfg.bDLSCapable) | ||
3920 | { | ||
3921 | int i; | ||
3922 | // tear down local dls table entry | ||
3923 | for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) | ||
3924 | { | ||
3925 | if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) | ||
3926 | { | ||
3927 | pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; | ||
3928 | pAd->StaCfg.DLSEntry[i].Valid = FALSE; | ||
3929 | RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); | ||
3930 | } | ||
3931 | } | ||
3932 | |||
3933 | // tear down peer dls table entry | ||
3934 | for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) | ||
3935 | { | ||
3936 | if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) | ||
3937 | { | ||
3938 | pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; | ||
3939 | pAd->StaCfg.DLSEntry[i].Valid = FALSE; | ||
3940 | RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); | ||
3941 | } | ||
3942 | } | ||
3943 | } | ||
3944 | |||
3945 | DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS (=%d)\n", pAd->CommonCfg.bDLSCapable)); | ||
3946 | } | ||
3947 | break; | ||
3948 | |||
3949 | case RT_OID_802_11_SET_DLS_PARAM: | ||
3950 | if (wrq->u.data.length != sizeof(RT_802_11_DLS_UI)) | ||
3951 | Status = -EINVAL; | ||
3952 | else | ||
3953 | { | ||
3954 | RT_802_11_DLS Dls; | ||
3955 | |||
3956 | NdisZeroMemory(&Dls, sizeof(RT_802_11_DLS)); | ||
3957 | RTMPMoveMemory(&Dls, wrq->u.data.pointer, sizeof(RT_802_11_DLS_UI)); | ||
3958 | MlmeEnqueue(pAd, | ||
3959 | MLME_CNTL_STATE_MACHINE, | ||
3960 | RT_OID_802_11_SET_DLS_PARAM, | ||
3961 | sizeof(RT_802_11_DLS), | ||
3962 | &Dls); | ||
3963 | DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS_PARAM \n")); | ||
3964 | } | ||
3965 | break; | ||
3966 | #endif // QOS_DLS_SUPPORT // | ||
3967 | case RT_OID_802_11_SET_WMM: | ||
3968 | if (wrq->u.data.length != sizeof(BOOLEAN)) | ||
3969 | Status = -EINVAL; | ||
3970 | else | ||
3971 | { | ||
3972 | Status = copy_from_user(&pAd->CommonCfg.bWmmCapable, wrq->u.data.pointer, wrq->u.data.length); | ||
3973 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_WMM (=%d) \n", pAd->CommonCfg.bWmmCapable)); | ||
3974 | } | ||
3975 | break; | ||
3976 | |||
3977 | case OID_802_11_DISASSOCIATE: | ||
3978 | // | ||
3979 | // Set NdisRadioStateOff to TRUE, instead of called MlmeRadioOff. | ||
3980 | // Later on, NDIS_802_11_BSSID_LIST_EX->NumberOfItems should be 0 | ||
3981 | // when query OID_802_11_BSSID_LIST. | ||
3982 | // | ||
3983 | // TRUE: NumberOfItems will set to 0. | ||
3984 | // FALSE: NumberOfItems no change. | ||
3985 | // | ||
3986 | pAd->CommonCfg.NdisRadioStateOff = TRUE; | ||
3987 | // Set to immediately send the media disconnect event | ||
3988 | pAd->MlmeAux.CurrReqIsFromNdis = TRUE; | ||
3989 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DISASSOCIATE \n")); | ||
3990 | |||
3991 | |||
3992 | if (INFRA_ON(pAd)) | ||
3993 | { | ||
3994 | if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) | ||
3995 | { | ||
3996 | RTMP_MLME_RESET_STATE_MACHINE(pAd); | ||
3997 | DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); | ||
3998 | } | ||
3999 | |||
4000 | MlmeEnqueue(pAd, | ||
4001 | MLME_CNTL_STATE_MACHINE, | ||
4002 | OID_802_11_DISASSOCIATE, | ||
4003 | 0, | ||
4004 | NULL); | ||
4005 | |||
4006 | StateMachineTouched = TRUE; | ||
4007 | } | ||
4008 | break; | ||
4009 | |||
4010 | #ifdef DOT11_N_SUPPORT | ||
4011 | case RT_OID_802_11_SET_IMME_BA_CAP: | ||
4012 | if (wrq->u.data.length != sizeof(OID_BACAP_STRUC)) | ||
4013 | Status = -EINVAL; | ||
4014 | else | ||
4015 | { | ||
4016 | OID_BACAP_STRUC Orde ; | ||
4017 | Status = copy_from_user(&Orde, wrq->u.data.pointer, wrq->u.data.length); | ||
4018 | if (Orde.Policy > BA_NOTUSE) | ||
4019 | { | ||
4020 | Status = NDIS_STATUS_INVALID_DATA; | ||
4021 | } | ||
4022 | else if (Orde.Policy == BA_NOTUSE) | ||
4023 | { | ||
4024 | pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE; | ||
4025 | pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity; | ||
4026 | pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity; | ||
4027 | pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable; | ||
4028 | pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize; | ||
4029 | pAd->CommonCfg.DesiredHtPhy.MimoPs= Orde.MMPSmode; | ||
4030 | pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode; | ||
4031 | // UPdata to HT IE | ||
4032 | pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode; | ||
4033 | pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize; | ||
4034 | pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity; | ||
4035 | } | ||
4036 | else | ||
4037 | { | ||
4038 | pAd->CommonCfg.BACapability.field.AutoBA = Orde.AutoBA; | ||
4039 | pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; // we only support immediate BA. | ||
4040 | pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity; | ||
4041 | pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity; | ||
4042 | pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable; | ||
4043 | pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize; | ||
4044 | pAd->CommonCfg.DesiredHtPhy.MimoPs = Orde.MMPSmode; | ||
4045 | pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode; | ||
4046 | |||
4047 | // UPdata to HT IE | ||
4048 | pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode; | ||
4049 | pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize; | ||
4050 | pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity; | ||
4051 | |||
4052 | if (pAd->CommonCfg.BACapability.field.RxBAWinLimit > MAX_RX_REORDERBUF) | ||
4053 | pAd->CommonCfg.BACapability.field.RxBAWinLimit = MAX_RX_REORDERBUF; | ||
4054 | |||
4055 | } | ||
4056 | |||
4057 | pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; | ||
4058 | DBGPRINT(RT_DEBUG_TRACE, ("Set::(Orde.AutoBA = %d) (Policy=%d)(ReBAWinLimit=%d)(TxBAWinLimit=%d)(AutoMode=%d)\n",Orde.AutoBA, pAd->CommonCfg.BACapability.field.Policy, | ||
4059 | pAd->CommonCfg.BACapability.field.RxBAWinLimit,pAd->CommonCfg.BACapability.field.TxBAWinLimit, pAd->CommonCfg.BACapability.field.AutoBA)); | ||
4060 | DBGPRINT(RT_DEBUG_TRACE, ("Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\n",pAd->CommonCfg.DesiredHtPhy.MimoPs, pAd->CommonCfg.DesiredHtPhy.AmsduEnable, | ||
4061 | pAd->CommonCfg.DesiredHtPhy.AmsduSize, pAd->CommonCfg.DesiredHtPhy.MpduDensity)); | ||
4062 | } | ||
4063 | |||
4064 | break; | ||
4065 | case RT_OID_802_11_ADD_IMME_BA: | ||
4066 | DBGPRINT(RT_DEBUG_TRACE, (" Set :: RT_OID_802_11_ADD_IMME_BA \n")); | ||
4067 | if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY)) | ||
4068 | Status = -EINVAL; | ||
4069 | else | ||
4070 | { | ||
4071 | UCHAR index; | ||
4072 | OID_ADD_BA_ENTRY BA; | ||
4073 | MAC_TABLE_ENTRY *pEntry; | ||
4074 | |||
4075 | Status = copy_from_user(&BA, wrq->u.data.pointer, wrq->u.data.length); | ||
4076 | if (BA.TID > 15) | ||
4077 | { | ||
4078 | Status = NDIS_STATUS_INVALID_DATA; | ||
4079 | break; | ||
4080 | } | ||
4081 | else | ||
4082 | { | ||
4083 | //BATableInsertEntry | ||
4084 | //As ad-hoc mode, BA pair is not limited to only BSSID. so add via OID. | ||
4085 | index = BA.TID; | ||
4086 | // in ad hoc mode, when adding BA pair, we should insert this entry into MACEntry too | ||
4087 | pEntry = MacTableLookup(pAd, BA.MACAddr); | ||
4088 | if (!pEntry) | ||
4089 | { | ||
4090 | DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_802_11_ADD_IMME_BA. break on no connection.----:%x:%x\n", BA.MACAddr[4], BA.MACAddr[5])); | ||
4091 | break; | ||
4092 | } | ||
4093 | if (BA.IsRecipient == FALSE) | ||
4094 | { | ||
4095 | if (pEntry->bIAmBadAtheros == TRUE) | ||
4096 | pAd->CommonCfg.BACapability.field.RxBAWinLimit = 0x10; | ||
4097 | |||
4098 | BAOriSessionSetUp(pAd, pEntry, index, 0, 100, TRUE); | ||
4099 | } | ||
4100 | else | ||
4101 | { | ||
4102 | //BATableInsertEntry(pAd, pEntry->Aid, BA.MACAddr, 0, 0xffff, BA.TID, BA.nMSDU, BA.IsRecipient); | ||
4103 | } | ||
4104 | |||
4105 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_IMME_BA. Rec = %d. Mac = %x:%x:%x:%x:%x:%x . \n", | ||
4106 | BA.IsRecipient, BA.MACAddr[0], BA.MACAddr[1], BA.MACAddr[2], BA.MACAddr[2] | ||
4107 | , BA.MACAddr[4], BA.MACAddr[5])); | ||
4108 | } | ||
4109 | } | ||
4110 | break; | ||
4111 | |||
4112 | case RT_OID_802_11_TEAR_IMME_BA: | ||
4113 | DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA \n")); | ||
4114 | if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY)) | ||
4115 | Status = -EINVAL; | ||
4116 | else | ||
4117 | { | ||
4118 | POID_ADD_BA_ENTRY pBA; | ||
4119 | MAC_TABLE_ENTRY *pEntry; | ||
4120 | |||
4121 | pBA = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
4122 | |||
4123 | if (pBA == NULL) | ||
4124 | { | ||
4125 | DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA kmalloc() can't allocate enough memory\n")); | ||
4126 | Status = NDIS_STATUS_FAILURE; | ||
4127 | } | ||
4128 | else | ||
4129 | { | ||
4130 | Status = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length); | ||
4131 | DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\n", pBA->TID, pBA->bAllTid)); | ||
4132 | |||
4133 | if (!pBA->bAllTid && (pBA->TID > NUM_OF_TID)) | ||
4134 | { | ||
4135 | Status = NDIS_STATUS_INVALID_DATA; | ||
4136 | break; | ||
4137 | } | ||
4138 | |||
4139 | if (pBA->IsRecipient == FALSE) | ||
4140 | { | ||
4141 | pEntry = MacTableLookup(pAd, pBA->MACAddr); | ||
4142 | DBGPRINT(RT_DEBUG_TRACE, (" pBA->IsRecipient == FALSE\n")); | ||
4143 | if (pEntry) | ||
4144 | { | ||
4145 | DBGPRINT(RT_DEBUG_TRACE, (" pBA->pEntry\n")); | ||
4146 | BAOriSessionTearDown(pAd, pEntry->Aid, pBA->TID, FALSE, TRUE); | ||
4147 | } | ||
4148 | else | ||
4149 | DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n")); | ||
4150 | } | ||
4151 | else | ||
4152 | { | ||
4153 | pEntry = MacTableLookup(pAd, pBA->MACAddr); | ||
4154 | if (pEntry) | ||
4155 | { | ||
4156 | BARecSessionTearDown( pAd, (UCHAR)pEntry->Aid, pBA->TID, TRUE); | ||
4157 | } | ||
4158 | else | ||
4159 | DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n")); | ||
4160 | } | ||
4161 | kfree(pBA); | ||
4162 | } | ||
4163 | } | ||
4164 | break; | ||
4165 | #endif // DOT11_N_SUPPORT // | ||
4166 | |||
4167 | // For WPA_SUPPLICANT to set static wep key | ||
4168 | case OID_802_11_ADD_WEP: | ||
4169 | pWepKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
4170 | |||
4171 | if(pWepKey == NULL) | ||
4172 | { | ||
4173 | Status = -ENOMEM; | ||
4174 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed!!\n")); | ||
4175 | break; | ||
4176 | } | ||
4177 | Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length); | ||
4178 | if (Status) | ||
4179 | { | ||
4180 | Status = -EINVAL; | ||
4181 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\n")); | ||
4182 | } | ||
4183 | else | ||
4184 | { | ||
4185 | KeyIdx = pWepKey->KeyIndex & 0x0fffffff; | ||
4186 | // KeyIdx must be 0 ~ 3 | ||
4187 | if (KeyIdx > 4) | ||
4188 | { | ||
4189 | Status = -EINVAL; | ||
4190 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\n")); | ||
4191 | } | ||
4192 | else | ||
4193 | { | ||
4194 | UCHAR CipherAlg = 0; | ||
4195 | PUCHAR Key; | ||
4196 | |||
4197 | // set key material and key length | ||
4198 | NdisZeroMemory(pAd->SharedKey[BSS0][KeyIdx].Key, 16); | ||
4199 | pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; | ||
4200 | NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength); | ||
4201 | |||
4202 | switch(pWepKey->KeyLength) | ||
4203 | { | ||
4204 | case 5: | ||
4205 | CipherAlg = CIPHER_WEP64; | ||
4206 | break; | ||
4207 | case 13: | ||
4208 | CipherAlg = CIPHER_WEP128; | ||
4209 | break; | ||
4210 | default: | ||
4211 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\n")); | ||
4212 | Status = -EINVAL; | ||
4213 | break; | ||
4214 | } | ||
4215 | pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg; | ||
4216 | |||
4217 | // Default key for tx (shared key) | ||
4218 | if (pWepKey->KeyIndex & 0x80000000) | ||
4219 | { | ||
4220 | #ifdef WPA_SUPPLICANT_SUPPORT | ||
4221 | // set key material and key length | ||
4222 | NdisZeroMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, 16); | ||
4223 | pAd->StaCfg.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; | ||
4224 | NdisMoveMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength); | ||
4225 | pAd->StaCfg.DesireSharedKeyId = KeyIdx; | ||
4226 | pAd->StaCfg.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg; | ||
4227 | #endif // WPA_SUPPLICANT_SUPPORT // | ||
4228 | pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; | ||
4229 | } | ||
4230 | |||
4231 | #ifdef WPA_SUPPLICANT_SUPPORT | ||
4232 | if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && | ||
4233 | (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) | ||
4234 | { | ||
4235 | Key = pWepKey->KeyMaterial; | ||
4236 | |||
4237 | // Set Group key material to Asic | ||
4238 | AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL); | ||
4239 | |||
4240 | // Update WCID attribute table and IVEIV table for this group key table | ||
4241 | RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, NULL); | ||
4242 | |||
4243 | STA_PORT_SECURED(pAd); | ||
4244 | |||
4245 | // Indicate Connected for GUI | ||
4246 | pAd->IndicateMediaState = NdisMediaStateConnected; | ||
4247 | } | ||
4248 | else if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) | ||
4249 | #endif // WPA_SUPPLICANT_SUPPORT | ||
4250 | { | ||
4251 | Key = pAd->SharedKey[BSS0][KeyIdx].Key; | ||
4252 | |||
4253 | // Set key material and cipherAlg to Asic | ||
4254 | AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL); | ||
4255 | |||
4256 | if (pWepKey->KeyIndex & 0x80000000) | ||
4257 | { | ||
4258 | PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[BSSID_WCID]; | ||
4259 | // Assign group key info | ||
4260 | RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, NULL); | ||
4261 | // Assign pairwise key info | ||
4262 | RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, pEntry); | ||
4263 | } | ||
4264 | } | ||
4265 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\n", pWepKey->KeyIndex, pWepKey->KeyLength, (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) ? "Port Secured":"Port NOT Secured")); | ||
4266 | } | ||
4267 | } | ||
4268 | kfree(pWepKey); | ||
4269 | break; | ||
4270 | #ifdef WPA_SUPPLICANT_SUPPORT | ||
4271 | case OID_SET_COUNTERMEASURES: | ||
4272 | if (wrq->u.data.length != sizeof(int)) | ||
4273 | Status = -EINVAL; | ||
4274 | else | ||
4275 | { | ||
4276 | int enabled = 0; | ||
4277 | Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length); | ||
4278 | if (enabled == 1) | ||
4279 | pAd->StaCfg.bBlockAssoc = TRUE; | ||
4280 | else | ||
4281 | // WPA MIC error should block association attempt for 60 seconds | ||
4282 | pAd->StaCfg.bBlockAssoc = FALSE; | ||
4283 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_SET_COUNTERMEASURES bBlockAssoc=%s\n", pAd->StaCfg.bBlockAssoc ? "TRUE":"FALSE")); | ||
4284 | } | ||
4285 | break; | ||
4286 | case RT_OID_WPA_SUPPLICANT_SUPPORT: | ||
4287 | if (wrq->u.data.length != sizeof(UCHAR)) | ||
4288 | Status = -EINVAL; | ||
4289 | else | ||
4290 | { | ||
4291 | Status = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length); | ||
4292 | pAd->StaCfg.WpaSupplicantUP = wpa_supplicant_enable; | ||
4293 | DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAd->StaCfg.WpaSupplicantUP)); | ||
4294 | } | ||
4295 | break; | ||
4296 | case OID_802_11_DEAUTHENTICATION: | ||
4297 | if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT)) | ||
4298 | Status = -EINVAL; | ||
4299 | else | ||
4300 | { | ||
4301 | MLME_DEAUTH_REQ_STRUCT *pInfo; | ||
4302 | MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); | ||
4303 | if (MsgElem == NULL) | ||
4304 | { | ||
4305 | DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __FUNCTION__)); | ||
4306 | return -EINVAL; | ||
4307 | } | ||
4308 | |||
4309 | pInfo = (MLME_DEAUTH_REQ_STRUCT *) MsgElem->Msg; | ||
4310 | Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length); | ||
4311 | MlmeDeauthReqAction(pAd, MsgElem); | ||
4312 | kfree(MsgElem); | ||
4313 | |||
4314 | if (INFRA_ON(pAd)) | ||
4315 | { | ||
4316 | LinkDown(pAd, FALSE); | ||
4317 | pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; | ||
4318 | } | ||
4319 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", pInfo->Reason)); | ||
4320 | } | ||
4321 | break; | ||
4322 | case OID_802_11_DROP_UNENCRYPTED: | ||
4323 | if (wrq->u.data.length != sizeof(int)) | ||
4324 | Status = -EINVAL; | ||
4325 | else | ||
4326 | { | ||
4327 | int enabled = 0; | ||
4328 | Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length); | ||
4329 | if (enabled == 1) | ||
4330 | pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; | ||
4331 | else | ||
4332 | pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; | ||
4333 | NdisAcquireSpinLock(&pAd->MacTabLock); | ||
4334 | pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured; | ||
4335 | NdisReleaseSpinLock(&pAd->MacTabLock); | ||
4336 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DROP_UNENCRYPTED (=%d)\n", enabled)); | ||
4337 | } | ||
4338 | break; | ||
4339 | case OID_802_11_SET_IEEE8021X: | ||
4340 | if (wrq->u.data.length != sizeof(BOOLEAN)) | ||
4341 | Status = -EINVAL; | ||
4342 | else | ||
4343 | { | ||
4344 | Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length); | ||
4345 | pAd->StaCfg.IEEE8021X = IEEE8021xState; | ||
4346 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X (=%d)\n", IEEE8021xState)); | ||
4347 | } | ||
4348 | break; | ||
4349 | case OID_802_11_SET_IEEE8021X_REQUIRE_KEY: | ||
4350 | if (wrq->u.data.length != sizeof(BOOLEAN)) | ||
4351 | Status = -EINVAL; | ||
4352 | else | ||
4353 | { | ||
4354 | Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length); | ||
4355 | pAd->StaCfg.IEEE8021x_required_keys = IEEE8021x_required_keys; | ||
4356 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\n", IEEE8021x_required_keys)); | ||
4357 | } | ||
4358 | break; | ||
4359 | case OID_802_11_PMKID: | ||
4360 | pPmkId = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); | ||
4361 | |||
4362 | if(pPmkId == NULL) { | ||
4363 | Status = -ENOMEM; | ||
4364 | break; | ||
4365 | } | ||
4366 | Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length); | ||
4367 | |||
4368 | // check the PMKID information | ||
4369 | if (pPmkId->BSSIDInfoCount == 0) | ||
4370 | NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO); | ||
4371 | else | ||
4372 | { | ||
4373 | PBSSID_INFO pBssIdInfo; | ||
4374 | UINT BssIdx; | ||
4375 | UINT CachedIdx; | ||
4376 | |||
4377 | for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++) | ||
4378 | { | ||
4379 | // point to the indexed BSSID_INFO structure | ||
4380 | pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO)); | ||
4381 | // Find the entry in the saved data base. | ||
4382 | for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) | ||
4383 | { | ||
4384 | // compare the BSSID | ||
4385 | if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS))) | ||
4386 | break; | ||
4387 | } | ||
4388 | |||
4389 | // Found, replace it | ||
4390 | if (CachedIdx < PMKID_NO) | ||
4391 | { | ||
4392 | DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx)); | ||
4393 | NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO)); | ||
4394 | pAd->StaCfg.SavedPMKNum++; | ||
4395 | } | ||
4396 | // Not found, replace the last one | ||
4397 | else | ||
4398 | { | ||
4399 | // Randomly replace one | ||
4400 | CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO); | ||
4401 | DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx)); | ||
4402 | NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO)); | ||
4403 | } | ||
4404 | } | ||
4405 | } | ||
4406 | if(pPmkId) | ||
4407 | kfree(pPmkId); | ||
4408 | break; | ||
4409 | #endif // WPA_SUPPLICANT_SUPPORT // | ||
4410 | |||
4411 | |||
4412 | |||
4413 | #ifdef SNMP_SUPPORT | ||
4414 | case OID_802_11_SHORTRETRYLIMIT: | ||
4415 | if (wrq->u.data.length != sizeof(ULONG)) | ||
4416 | Status = -EINVAL; | ||
4417 | else | ||
4418 | { | ||
4419 | Status = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length); | ||
4420 | RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); | ||
4421 | tx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit; | ||
4422 | RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word); | ||
4423 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\n", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit)); | ||
4424 | } | ||
4425 | break; | ||
4426 | |||
4427 | case OID_802_11_LONGRETRYLIMIT: | ||
4428 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT \n")); | ||
4429 | if (wrq->u.data.length != sizeof(ULONG)) | ||
4430 | Status = -EINVAL; | ||
4431 | else | ||
4432 | { | ||
4433 | Status = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length); | ||
4434 | RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); | ||
4435 | tx_rty_cfg.field.LongRtyLimit = LongRetryLimit; | ||
4436 | RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word); | ||
4437 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\n", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit)); | ||
4438 | } | ||
4439 | break; | ||
4440 | |||
4441 | case OID_802_11_WEPDEFAULTKEYVALUE: | ||
4442 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE\n")); | ||
4443 | pKey = kmalloc(wrq->u.data.length, GFP_KERNEL); | ||
4444 | Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); | ||
4445 | //pKey = &WepKey; | ||
4446 | |||
4447 | if ( pKey->Length != wrq->u.data.length) | ||
4448 | { | ||
4449 | Status = -EINVAL; | ||
4450 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n")); | ||
4451 | } | ||
4452 | KeyIdx = pKey->KeyIndex & 0x0fffffff; | ||
4453 | DBGPRINT(RT_DEBUG_TRACE,("pKey->KeyIndex =%d, pKey->KeyLength=%d\n", pKey->KeyIndex, pKey->KeyLength)); | ||
4454 | |||
4455 | // it is a shared key | ||
4456 | if (KeyIdx > 4) | ||
4457 | Status = -EINVAL; | ||
4458 | else | ||
4459 | { | ||
4460 | pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength; | ||
4461 | NdisMoveMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength); | ||
4462 | if (pKey->KeyIndex & 0x80000000) | ||
4463 | { | ||
4464 | // Default key for tx (shared key) | ||
4465 | pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; | ||
4466 | } | ||
4467 | //RestartAPIsRequired = TRUE; | ||
4468 | } | ||
4469 | break; | ||
4470 | |||
4471 | |||
4472 | case OID_802_11_WEPDEFAULTKEYID: | ||
4473 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYID \n")); | ||
4474 | |||
4475 | if (wrq->u.data.length != sizeof(UCHAR)) | ||
4476 | Status = -EINVAL; | ||
4477 | else | ||
4478 | Status = copy_from_user(&pAd->StaCfg.DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length); | ||
4479 | |||
4480 | break; | ||
4481 | |||
4482 | |||
4483 | case OID_802_11_CURRENTCHANNEL: | ||
4484 | DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CURRENTCHANNEL \n")); | ||
4485 | if (wrq->u.data.length != sizeof(UCHAR)) | ||
4486 | Status = -EINVAL; | ||
4487 | else | ||
4488 | { | ||
4489 | Status = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length); | ||
4490 | sprintf((PSTRING)&ctmp,"%d", ctmp); | ||
4491 | Set_Channel_Proc(pAd, (PSTRING)&ctmp); | ||
4492 | } | ||
4493 | break; | ||
4494 | #endif | ||
4495 | |||
4496 | |||
4497 | |||
4498 | case RT_OID_802_11_SET_PSPXLINK_MODE: | ||
4499 | if (wrq->u.data.length != sizeof(BOOLEAN)) | ||
4500 | Status = -EINVAL; | ||
4501 | else | ||
4502 | { | ||
4503 | Status = copy_from_user(&pAd->CommonCfg.PSPXlink, wrq->u.data.pointer, wrq->u.data.length); | ||
4504 | /*if (pAd->CommonCfg.PSPXlink) | ||
4505 | RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS)*/ | ||
4506 | DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_PSPXLINK_MODE(=%d) \n", pAd->CommonCfg.PSPXlink)); | ||
4507 | } | ||
4508 | break; | ||
4509 | |||
4510 | |||
4511 | default: | ||
4512 | DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd)); | ||
4513 | Status = -EOPNOTSUPP; | ||
4514 | break; | ||
4515 | } | ||
4516 | |||
4517 | |||
4518 | return Status; | ||
4519 | } | ||
4520 | |||
4521 | INT RTMPQueryInformation( | ||
4522 | IN PRTMP_ADAPTER pAd, | ||
4523 | IN OUT struct ifreq *rq, | ||
4524 | IN INT cmd) | ||
4525 | { | ||
4526 | struct iwreq *wrq = (struct iwreq *) rq; | ||
4527 | NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL; | ||
4528 | PNDIS_WLAN_BSSID_EX pBss; | ||
4529 | NDIS_802_11_SSID Ssid; | ||
4530 | NDIS_802_11_CONFIGURATION *pConfiguration = NULL; | ||
4531 | RT_802_11_LINK_STATUS *pLinkStatus = NULL; | ||
4532 | RT_802_11_STA_CONFIG *pStaConfig = NULL; | ||
4533 | NDIS_802_11_STATISTICS *pStatistics = NULL; | ||
4534 | NDIS_802_11_RTS_THRESHOLD RtsThresh; | ||
4535 | NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; | ||
4536 | NDIS_802_11_POWER_MODE PowerMode; | ||
4537 | NDIS_802_11_NETWORK_INFRASTRUCTURE BssType; | ||
4538 | RT_802_11_PREAMBLE PreamType; | ||
4539 | NDIS_802_11_AUTHENTICATION_MODE AuthMode; | ||
4540 | NDIS_802_11_WEP_STATUS WepStatus; | ||
4541 | NDIS_MEDIA_STATE MediaState; | ||
4542 | ULONG BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0; | ||
4543 | USHORT BssLen = 0; | ||
4544 | PUCHAR pBuf = NULL, pPtr; | ||
4545 | INT Status = NDIS_STATUS_SUCCESS; | ||
4546 | UINT we_version_compiled; | ||
4547 | UCHAR i, Padding = 0; | ||
4548 | BOOLEAN RadioState; | ||
4549 | STRING driverVersion[8]; | ||
4550 | OID_SET_HT_PHYMODE *pHTPhyMode = NULL; | ||
4551 | |||
4552 | |||
4553 | #ifdef SNMP_SUPPORT | ||
4554 | //for snmp, kathy | ||
4555 | DefaultKeyIdxValue *pKeyIdxValue; | ||
4556 | INT valueLen; | ||
4557 | TX_RTY_CFG_STRUC tx_rty_cfg; | ||
4558 | ULONG ShortRetryLimit, LongRetryLimit; | ||
4559 | UCHAR tmp[64]; | ||
4560 | #endif //SNMP | ||
4561 | |||
4562 | switch(cmd) | ||
4563 | { | ||
4564 | case RT_OID_DEVICE_NAME: | ||
4565 | wrq->u.data.length = sizeof(pAd->nickname); | ||
4566 | Status = copy_to_user(wrq->u.data.pointer, pAd->nickname, wrq->u.data.length); | ||
4567 | break; | ||
4568 | case RT_OID_VERSION_INFO: | ||
4569 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n")); | ||
4570 | wrq->u.data.length = 8*sizeof(CHAR); | ||
4571 | sprintf(&driverVersion[0], "%s", STA_DRIVER_VERSION); | ||
4572 | driverVersion[7] = '\0'; | ||
4573 | if (copy_to_user(wrq->u.data.pointer, &driverVersion[0], wrq->u.data.length)) | ||
4574 | { | ||
4575 | Status = -EFAULT; | ||
4576 | } | ||
4577 | break; | ||
4578 | |||
4579 | case OID_802_11_BSSID_LIST: | ||
4580 | if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) | ||
4581 | { | ||
4582 | /* | ||
4583 | * Still scanning, indicate the caller should try again. | ||
4584 | */ | ||
4585 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n")); | ||
4586 | return -EAGAIN; | ||
4587 | } | ||
4588 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAd->ScanTab.BssNr)); | ||
4589 | pAd->StaCfg.bScanReqIsFromWebUI = FALSE; | ||
4590 | // Claculate total buffer size required | ||
4591 | BssBufSize = sizeof(ULONG); | ||
4592 | |||
4593 | for (i = 0; i < pAd->ScanTab.BssNr; i++) | ||
4594 | { | ||
4595 | // Align pointer to 4 bytes boundary. | ||
4596 | //Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003); | ||
4597 | //if (Padding == 4) | ||
4598 | // Padding = 0; | ||
4599 | BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding); | ||
4600 | } | ||
4601 | |||
4602 | // For safety issue, we add 256 bytes just in case | ||
4603 | BssBufSize += 256; | ||
4604 | // Allocate the same size as passed from higher layer | ||
4605 | pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG); | ||
4606 | if(pBuf == NULL) | ||
4607 | { | ||
4608 | Status = -ENOMEM; | ||
4609 | break; | ||
4610 | } | ||
4611 | // Init 802_11_BSSID_LIST_EX structure | ||
4612 | NdisZeroMemory(pBuf, BssBufSize); | ||
4613 | pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf; | ||
4614 | pBssidList->NumberOfItems = pAd->ScanTab.BssNr; | ||
4615 | |||
4616 | // Calculate total buffer length | ||
4617 | BssLen = 4; // Consist of NumberOfItems | ||
4618 | // Point to start of NDIS_WLAN_BSSID_EX | ||
4619 | // pPtr = pBuf + sizeof(ULONG); | ||
4620 | pPtr = (PUCHAR) &pBssidList->Bssid[0]; | ||
4621 | for (i = 0; i < pAd->ScanTab.BssNr; i++) | ||
4622 | { | ||
4623 | pBss = (PNDIS_WLAN_BSSID_EX) pPtr; | ||
4624 | NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN); | ||
4625 | if ((pAd->ScanTab.BssEntry[i].Hidden == 1) && (pAd->StaCfg.bShowHiddenSSID == FALSE)) | ||
4626 | { | ||
4627 | // | ||
4628 | // We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation | ||
4629 | // and then failed to send EAPOl farame. | ||
4630 | // | ||
4631 | if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED)) | ||
4632 | { | ||
4633 | pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen; | ||
4634 | NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen); | ||
4635 | } | ||
4636 | else | ||
4637 | pBss->Ssid.SsidLength = 0; | ||
4638 | } | ||
4639 | else | ||
4640 | { | ||
4641 | pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen; | ||
4642 | NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen); | ||
4643 | } | ||
4644 | pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy; | ||
4645 | pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta; | ||
4646 | pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]); | ||
4647 | pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION); | ||
4648 | pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod; | ||
4649 | pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin; | ||
4650 | |||
4651 | MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig); | ||
4652 | |||
4653 | if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA) | ||
4654 | pBss->InfrastructureMode = Ndis802_11Infrastructure; | ||
4655 | else | ||
4656 | pBss->InfrastructureMode = Ndis802_11IBSS; | ||
4657 | |||
4658 | NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen); | ||
4659 | NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen, | ||
4660 | pAd->ScanTab.BssEntry[i].ExtRate, | ||
4661 | pAd->ScanTab.BssEntry[i].ExtRateLen); | ||
4662 | |||
4663 | if (pAd->ScanTab.BssEntry[i].VarIELen == 0) | ||
4664 | { | ||
4665 | pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs); | ||
4666 | NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); | ||
4667 | pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs); | ||
4668 | } | ||
4669 | else | ||
4670 | { | ||
4671 | pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen); | ||
4672 | pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs); | ||
4673 | NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); | ||
4674 | NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen); | ||
4675 | pPtr += pAd->ScanTab.BssEntry[i].VarIELen; | ||
4676 | } | ||
4677 | pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding); | ||
4678 | |||
4679 | #if WIRELESS_EXT < 17 | ||
4680 | if ((BssLen + pBss->Length) < wrq->u.data.length) | ||
4681 | BssLen += pBss->Length; | ||
4682 | else | ||
4683 | { | ||
4684 | pBssidList->NumberOfItems = i; | ||
4685 | break; | ||
4686 | } | ||
4687 | #else | ||
4688 | BssLen += pBss->Length; | ||
4689 | #endif | ||
4690 | } | ||
4691 | |||
4692 | #if WIRELESS_EXT < 17 | ||
4693 | wrq->u.data.length = BssLen; | ||
4694 | #else | ||
4695 | if (BssLen > wrq->u.data.length) | ||
4696 | { | ||
4697 | kfree(pBssidList); | ||
4698 | return -E2BIG; | ||
4699 | } | ||
4700 | else | ||
4701 | wrq->u.data.length = BssLen; | ||
4702 | #endif | ||
4703 | Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen); | ||
4704 | kfree(pBssidList); | ||
4705 | break; | ||
4706 | case OID_802_3_CURRENT_ADDRESS: | ||
4707 | wrq->u.data.length = MAC_ADDR_LEN; | ||
4708 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); | ||
4709 | break; | ||
4710 | case OID_GEN_MEDIA_CONNECT_STATUS: | ||
4711 | if (pAd->IndicateMediaState == NdisMediaStateConnected) | ||
4712 | MediaState = NdisMediaStateConnected; | ||
4713 | else | ||
4714 | MediaState = NdisMediaStateDisconnected; | ||
4715 | |||
4716 | wrq->u.data.length = sizeof(NDIS_MEDIA_STATE); | ||
4717 | Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length); | ||
4718 | break; | ||
4719 | case OID_802_11_BSSID: | ||
4720 | if (INFRA_ON(pAd) || ADHOC_ON(pAd)) | ||
4721 | { | ||
4722 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS)); | ||
4723 | |||
4724 | } | ||
4725 | else | ||
4726 | { | ||
4727 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n")); | ||
4728 | Status = -ENOTCONN; | ||
4729 | } | ||
4730 | break; | ||
4731 | case OID_802_11_SSID: | ||
4732 | NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); | ||
4733 | NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID); | ||
4734 | Ssid.SsidLength = pAd->CommonCfg.SsidLen; | ||
4735 | memcpy(Ssid.Ssid, pAd->CommonCfg.Ssid, Ssid.SsidLength); | ||
4736 | wrq->u.data.length = sizeof(NDIS_802_11_SSID); | ||
4737 | Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length); | ||
4738 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid)); | ||
4739 | break; | ||
4740 | case RT_OID_802_11_QUERY_LINK_STATUS: | ||
4741 | pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG); | ||
4742 | if (pLinkStatus) | ||
4743 | { | ||
4744 | pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAd->CommonCfg.TxRate]; // unit : 500 kbps | ||
4745 | pLinkStatus->ChannelQuality = pAd->Mlme.ChannelQuality; | ||
4746 | pLinkStatus->RxByteCount = pAd->RalinkCounters.ReceivedByteCount; | ||
4747 | pLinkStatus->TxByteCount = pAd->RalinkCounters.TransmittedByteCount; | ||
4748 | pLinkStatus->CentralChannel = pAd->CommonCfg.CentralChannel; | ||
4749 | wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS); | ||
4750 | Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length); | ||
4751 | kfree(pLinkStatus); | ||
4752 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS\n")); | ||
4753 | } | ||
4754 | else | ||
4755 | { | ||
4756 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\n")); | ||
4757 | Status = -EFAULT; | ||
4758 | } | ||
4759 | break; | ||
4760 | case OID_802_11_CONFIGURATION: | ||
4761 | pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG); | ||
4762 | if (pConfiguration) | ||
4763 | { | ||
4764 | pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION); | ||
4765 | pConfiguration->BeaconPeriod = pAd->CommonCfg.BeaconPeriod; | ||
4766 | pConfiguration->ATIMWindow = pAd->StaActive.AtimWin; | ||
4767 | MAP_CHANNEL_ID_TO_KHZ(pAd->CommonCfg.Channel, pConfiguration->DSConfig); | ||
4768 | wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION); | ||
4769 | Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length); | ||
4770 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n", | ||
4771 | pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAd->CommonCfg.Channel)); | ||
4772 | kfree(pConfiguration); | ||
4773 | } | ||
4774 | else | ||
4775 | { | ||
4776 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(kmalloc failed)\n")); | ||
4777 | Status = -EFAULT; | ||
4778 | } | ||
4779 | break; | ||
4780 | case RT_OID_802_11_SNR_0: | ||
4781 | if ((pAd->StaCfg.LastSNR0 > 0)) | ||
4782 | { | ||
4783 | ulInfo = ((0xeb - pAd->StaCfg.LastSNR0) * 3) / 16 ; | ||
4784 | wrq->u.data.length = sizeof(ulInfo); | ||
4785 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4786 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo)); | ||
4787 | } | ||
4788 | else | ||
4789 | Status = -EFAULT; | ||
4790 | break; | ||
4791 | case RT_OID_802_11_SNR_1: | ||
4792 | if ((pAd->Antenna.field.RxPath > 1) && | ||
4793 | (pAd->StaCfg.LastSNR1 > 0)) | ||
4794 | { | ||
4795 | ulInfo = ((0xeb - pAd->StaCfg.LastSNR1) * 3) / 16 ; | ||
4796 | wrq->u.data.length = sizeof(ulInfo); | ||
4797 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4798 | DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(0x=%lx)\n",ulInfo)); | ||
4799 | } | ||
4800 | else | ||
4801 | Status = -EFAULT; | ||
4802 | DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(pAd->StaCfg.LastSNR1=%d)\n",pAd->StaCfg.LastSNR1)); | ||
4803 | break; | ||
4804 | case OID_802_11_RSSI_TRIGGER: | ||
4805 | ulInfo = pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta; | ||
4806 | wrq->u.data.length = sizeof(ulInfo); | ||
4807 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4808 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RSSI_TRIGGER(=%ld)\n", ulInfo)); | ||
4809 | break; | ||
4810 | case OID_802_11_RSSI: | ||
4811 | case RT_OID_802_11_RSSI: | ||
4812 | ulInfo = pAd->StaCfg.RssiSample.LastRssi0; | ||
4813 | wrq->u.data.length = sizeof(ulInfo); | ||
4814 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4815 | break; | ||
4816 | case RT_OID_802_11_RSSI_1: | ||
4817 | ulInfo = pAd->StaCfg.RssiSample.LastRssi1; | ||
4818 | wrq->u.data.length = sizeof(ulInfo); | ||
4819 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4820 | break; | ||
4821 | case RT_OID_802_11_RSSI_2: | ||
4822 | ulInfo = pAd->StaCfg.RssiSample.LastRssi2; | ||
4823 | wrq->u.data.length = sizeof(ulInfo); | ||
4824 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4825 | break; | ||
4826 | case OID_802_11_STATISTICS: | ||
4827 | pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG); | ||
4828 | if (pStatistics) | ||
4829 | { | ||
4830 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n")); | ||
4831 | // add the most up-to-date h/w raw counters into software counters | ||
4832 | NICUpdateRawCounters(pAd); | ||
4833 | |||
4834 | // Sanity check for calculation of sucessful count | ||
4835 | if (pAd->WlanCounters.TransmittedFragmentCount.QuadPart < pAd->WlanCounters.RetryCount.QuadPart) | ||
4836 | pAd->WlanCounters.TransmittedFragmentCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart; | ||
4837 | |||
4838 | pStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; | ||
4839 | pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart; | ||
4840 | pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart; | ||
4841 | pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart; | ||
4842 | pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart; | ||
4843 | pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart; | ||
4844 | pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart; | ||
4845 | pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart; | ||
4846 | pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart; | ||
4847 | pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; | ||
4848 | pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; | ||
4849 | #ifdef DBG | ||
4850 | pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount; | ||
4851 | #else | ||
4852 | pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart; | ||
4853 | pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100; | ||
4854 | #endif | ||
4855 | wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS); | ||
4856 | Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length); | ||
4857 | kfree(pStatistics); | ||
4858 | } | ||
4859 | else | ||
4860 | { | ||
4861 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(kmalloc failed)\n")); | ||
4862 | Status = -EFAULT; | ||
4863 | } | ||
4864 | break; | ||
4865 | case OID_GEN_RCV_OK: | ||
4866 | ulInfo = pAd->Counters8023.GoodReceives; | ||
4867 | wrq->u.data.length = sizeof(ulInfo); | ||
4868 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4869 | break; | ||
4870 | case OID_GEN_RCV_NO_BUFFER: | ||
4871 | ulInfo = pAd->Counters8023.RxNoBuffer; | ||
4872 | wrq->u.data.length = sizeof(ulInfo); | ||
4873 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4874 | break; | ||
4875 | case RT_OID_802_11_PHY_MODE: | ||
4876 | ulInfo = (ULONG)pAd->CommonCfg.PhyMode; | ||
4877 | wrq->u.data.length = sizeof(ulInfo); | ||
4878 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
4879 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PHY_MODE (=%ld)\n", ulInfo)); | ||
4880 | break; | ||
4881 | case RT_OID_802_11_STA_CONFIG: | ||
4882 | pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG); | ||
4883 | if (pStaConfig) | ||
4884 | { | ||
4885 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG\n")); | ||
4886 | pStaConfig->EnableTxBurst = pAd->CommonCfg.bEnableTxBurst; | ||
4887 | pStaConfig->EnableTurboRate = 0; | ||
4888 | pStaConfig->UseBGProtection = pAd->CommonCfg.UseBGProtection; | ||
4889 | pStaConfig->UseShortSlotTime = pAd->CommonCfg.bUseShortSlotTime; | ||
4890 | //pStaConfig->AdhocMode = pAd->StaCfg.AdhocMode; | ||
4891 | pStaConfig->HwRadioStatus = (pAd->StaCfg.bHwRadio == TRUE) ? 1 : 0; | ||
4892 | pStaConfig->Rsv1 = 0; | ||
4893 | pStaConfig->SystemErrorBitmap = pAd->SystemErrorBitmap; | ||
4894 | wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG); | ||
4895 | Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length); | ||
4896 | kfree(pStaConfig); | ||
4897 | } | ||
4898 | else | ||
4899 | { | ||
4900 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); | ||
4901 | Status = -EFAULT; | ||
4902 | } | ||
4903 | break; | ||
4904 | case OID_802_11_RTS_THRESHOLD: | ||
4905 | RtsThresh = pAd->CommonCfg.RtsThreshold; | ||
4906 | wrq->u.data.length = sizeof(RtsThresh); | ||
4907 | Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length); | ||
4908 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RTS_THRESHOLD(=%ld)\n", RtsThresh)); | ||
4909 | break; | ||
4910 | case OID_802_11_FRAGMENTATION_THRESHOLD: | ||
4911 | FragThresh = pAd->CommonCfg.FragmentThreshold; | ||
4912 | if (pAd->CommonCfg.bUseZeroToDisableFragment == TRUE) | ||
4913 | FragThresh = 0; | ||
4914 | wrq->u.data.length = sizeof(FragThresh); | ||
4915 | Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length); | ||
4916 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\n", FragThresh)); | ||
4917 | break; | ||
4918 | case OID_802_11_POWER_MODE: | ||
4919 | PowerMode = pAd->StaCfg.WindowsPowerMode; | ||
4920 | wrq->u.data.length = sizeof(PowerMode); | ||
4921 | Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length); | ||
4922 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_POWER_MODE(=%d)\n", PowerMode)); | ||
4923 | break; | ||
4924 | case RT_OID_802_11_RADIO: | ||
4925 | RadioState = (BOOLEAN) pAd->StaCfg.bSwRadio; | ||
4926 | wrq->u.data.length = sizeof(RadioState); | ||
4927 | Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length); | ||
4928 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_RADIO (=%d)\n", RadioState)); | ||
4929 | break; | ||
4930 | case OID_802_11_INFRASTRUCTURE_MODE: | ||
4931 | if (pAd->StaCfg.BssType == BSS_ADHOC) | ||
4932 | BssType = Ndis802_11IBSS; | ||
4933 | else if (pAd->StaCfg.BssType == BSS_INFRA) | ||
4934 | BssType = Ndis802_11Infrastructure; | ||
4935 | else if (pAd->StaCfg.BssType == BSS_MONITOR) | ||
4936 | BssType = Ndis802_11Monitor; | ||
4937 | else | ||
4938 | BssType = Ndis802_11AutoUnknown; | ||
4939 | |||
4940 | wrq->u.data.length = sizeof(BssType); | ||
4941 | Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length); | ||
4942 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\n", BssType)); | ||
4943 | break; | ||
4944 | case RT_OID_802_11_PREAMBLE: | ||
4945 | PreamType = pAd->CommonCfg.TxPreamble; | ||
4946 | wrq->u.data.length = sizeof(PreamType); | ||
4947 | Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length); | ||
4948 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PREAMBLE(=%d)\n", PreamType)); | ||
4949 | break; | ||
4950 | case OID_802_11_AUTHENTICATION_MODE: | ||
4951 | AuthMode = pAd->StaCfg.AuthMode; | ||
4952 | wrq->u.data.length = sizeof(AuthMode); | ||
4953 | Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length); | ||
4954 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE(=%d)\n", AuthMode)); | ||
4955 | break; | ||
4956 | case OID_802_11_WEP_STATUS: | ||
4957 | WepStatus = pAd->StaCfg.WepStatus; | ||
4958 | wrq->u.data.length = sizeof(WepStatus); | ||
4959 | Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length); | ||
4960 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEP_STATUS(=%d)\n", WepStatus)); | ||
4961 | break; | ||
4962 | case OID_802_11_TX_POWER_LEVEL: | ||
4963 | wrq->u.data.length = sizeof(ULONG); | ||
4964 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPower, wrq->u.data.length); | ||
4965 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_TX_POWER_LEVEL %x\n",pAd->CommonCfg.TxPower)); | ||
4966 | break; | ||
4967 | case RT_OID_802_11_TX_POWER_LEVEL_1: | ||
4968 | wrq->u.data.length = sizeof(ULONG); | ||
4969 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPowerPercentage, wrq->u.data.length); | ||
4970 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage)); | ||
4971 | break; | ||
4972 | case OID_802_11_NETWORK_TYPES_SUPPORTED: | ||
4973 | if ((pAd->RfIcType == RFIC_2850) || (pAd->RfIcType == RFIC_2750) || (pAd->RfIcType == RFIC_3052)) | ||
4974 | { | ||
4975 | NetworkTypeList[0] = 3; // NumberOfItems = 3 | ||
4976 | NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b | ||
4977 | NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g | ||
4978 | NetworkTypeList[3] = Ndis802_11OFDM5; // NetworkType[3] = 11a | ||
4979 | wrq->u.data.length = 16; | ||
4980 | Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length); | ||
4981 | } | ||
4982 | else | ||
4983 | { | ||
4984 | NetworkTypeList[0] = 2; // NumberOfItems = 2 | ||
4985 | NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b | ||
4986 | NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g | ||
4987 | wrq->u.data.length = 12; | ||
4988 | Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length); | ||
4989 | } | ||
4990 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n")); | ||
4991 | break; | ||
4992 | case OID_802_11_NETWORK_TYPE_IN_USE: | ||
4993 | wrq->u.data.length = sizeof(ULONG); | ||
4994 | if (pAd->CommonCfg.PhyMode == PHY_11A) | ||
4995 | ulInfo = Ndis802_11OFDM5; | ||
4996 | else if ((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11G)) | ||
4997 | ulInfo = Ndis802_11OFDM24; | ||
4998 | else | ||
4999 | ulInfo = Ndis802_11DS; | ||
5000 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
5001 | break; | ||
5002 | case RT_OID_802_11_QUERY_LAST_RX_RATE: | ||
5003 | ulInfo = (ULONG)pAd->LastRxRate; | ||
5004 | wrq->u.data.length = sizeof(ulInfo); | ||
5005 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
5006 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", ulInfo)); | ||
5007 | break; | ||
5008 | case RT_OID_802_11_QUERY_LAST_TX_RATE: | ||
5009 | //ulInfo = (ULONG)pAd->LastTxRate; | ||
5010 | ulInfo = (ULONG)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word; | ||
5011 | wrq->u.data.length = sizeof(ulInfo); | ||
5012 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
5013 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\n", ulInfo)); | ||
5014 | break; | ||
5015 | case RT_OID_802_11_QUERY_EEPROM_VERSION: | ||
5016 | wrq->u.data.length = sizeof(ULONG); | ||
5017 | Status = copy_to_user(wrq->u.data.pointer, &pAd->EepromVersion, wrq->u.data.length); | ||
5018 | break; | ||
5019 | case RT_OID_802_11_QUERY_FIRMWARE_VERSION: | ||
5020 | wrq->u.data.length = sizeof(ULONG); | ||
5021 | Status = copy_to_user(wrq->u.data.pointer, &pAd->FirmwareVersion, wrq->u.data.length); | ||
5022 | break; | ||
5023 | case RT_OID_802_11_QUERY_NOISE_LEVEL: | ||
5024 | wrq->u.data.length = sizeof(UCHAR); | ||
5025 | Status = copy_to_user(wrq->u.data.pointer, &pAd->BbpWriteLatch[66], wrq->u.data.length); | ||
5026 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\n", pAd->BbpWriteLatch[66])); | ||
5027 | break; | ||
5028 | case RT_OID_802_11_EXTRA_INFO: | ||
5029 | wrq->u.data.length = sizeof(ULONG); | ||
5030 | Status = copy_to_user(wrq->u.data.pointer, &pAd->ExtraInfo, wrq->u.data.length); | ||
5031 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_EXTRA_INFO (=%ld)\n", pAd->ExtraInfo)); | ||
5032 | break; | ||
5033 | case RT_OID_WE_VERSION_COMPILED: | ||
5034 | wrq->u.data.length = sizeof(UINT); | ||
5035 | we_version_compiled = WIRELESS_EXT; | ||
5036 | Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length); | ||
5037 | break; | ||
5038 | case RT_OID_802_11_QUERY_APSD_SETTING: | ||
5039 | apsd = (pAd->CommonCfg.bAPSDCapable | (pAd->CommonCfg.bAPSDAC_BE << 1) | (pAd->CommonCfg.bAPSDAC_BK << 2) | ||
5040 | | (pAd->CommonCfg.bAPSDAC_VI << 3) | (pAd->CommonCfg.bAPSDAC_VO << 4) | (pAd->CommonCfg.MaxSPLength << 5)); | ||
5041 | |||
5042 | wrq->u.data.length = sizeof(ULONG); | ||
5043 | Status = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length); | ||
5044 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_SETTING (=0x%lx,APSDCap=%d,AC_BE=%d,AC_BK=%d,AC_VI=%d,AC_VO=%d,MAXSPLen=%d)\n", | ||
5045 | apsd,pAd->CommonCfg.bAPSDCapable,pAd->CommonCfg.bAPSDAC_BE,pAd->CommonCfg.bAPSDAC_BK,pAd->CommonCfg.bAPSDAC_VI,pAd->CommonCfg.bAPSDAC_VO,pAd->CommonCfg.MaxSPLength)); | ||
5046 | break; | ||
5047 | case RT_OID_802_11_QUERY_APSD_PSM: | ||
5048 | wrq->u.data.length = sizeof(ULONG); | ||
5049 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length); | ||
5050 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\n", pAd->CommonCfg.bAPSDForcePowerSave)); | ||
5051 | break; | ||
5052 | case RT_OID_802_11_QUERY_WMM: | ||
5053 | wrq->u.data.length = sizeof(BOOLEAN); | ||
5054 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bWmmCapable, wrq->u.data.length); | ||
5055 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n", pAd->CommonCfg.bWmmCapable)); | ||
5056 | break; | ||
5057 | #ifdef WPA_SUPPLICANT_SUPPORT | ||
5058 | case RT_OID_NEW_DRIVER: | ||
5059 | { | ||
5060 | UCHAR enabled = 1; | ||
5061 | wrq->u.data.length = sizeof(UCHAR); | ||
5062 | Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length); | ||
5063 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NEW_DRIVER (=%d)\n", enabled)); | ||
5064 | } | ||
5065 | break; | ||
5066 | case RT_OID_WPA_SUPPLICANT_SUPPORT: | ||
5067 | wrq->u.data.length = sizeof(UCHAR); | ||
5068 | Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WpaSupplicantUP, wrq->u.data.length); | ||
5069 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAd->StaCfg.WpaSupplicantUP)); | ||
5070 | break; | ||
5071 | #endif // WPA_SUPPLICANT_SUPPORT // | ||
5072 | |||
5073 | case RT_OID_DRIVER_DEVICE_NAME: | ||
5074 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_DRIVER_DEVICE_NAME \n")); | ||
5075 | wrq->u.data.length = 16; | ||
5076 | if (copy_to_user(wrq->u.data.pointer, pAd->StaCfg.dev_name, wrq->u.data.length)) | ||
5077 | { | ||
5078 | Status = -EFAULT; | ||
5079 | } | ||
5080 | break; | ||
5081 | case RT_OID_802_11_QUERY_HT_PHYMODE: | ||
5082 | pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG); | ||
5083 | if (pHTPhyMode) | ||
5084 | { | ||
5085 | pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode; | ||
5086 | pHTPhyMode->HtMode = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE; | ||
5087 | pHTPhyMode->BW = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW; | ||
5088 | pHTPhyMode->MCS= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS; | ||
5089 | pHTPhyMode->SHORTGI= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI; | ||
5090 | pHTPhyMode->STBC= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC; | ||
5091 | |||
5092 | pHTPhyMode->ExtOffset = ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE)); | ||
5093 | wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE); | ||
5094 | if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length)) | ||
5095 | { | ||
5096 | Status = -EFAULT; | ||
5097 | } | ||
5098 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n", | ||
5099 | pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset)); | ||
5100 | DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word)); | ||
5101 | } | ||
5102 | else | ||
5103 | { | ||
5104 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); | ||
5105 | Status = -EFAULT; | ||
5106 | } | ||
5107 | break; | ||
5108 | case RT_OID_802_11_COUNTRY_REGION: | ||
5109 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_COUNTRY_REGION \n")); | ||
5110 | wrq->u.data.length = sizeof(ulInfo); | ||
5111 | ulInfo = pAd->CommonCfg.CountryRegionForABand; | ||
5112 | ulInfo = (ulInfo << 8)|(pAd->CommonCfg.CountryRegion); | ||
5113 | if (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length)) | ||
5114 | { | ||
5115 | Status = -EFAULT; | ||
5116 | } | ||
5117 | break; | ||
5118 | case RT_OID_802_11_QUERY_DAT_HT_PHYMODE: | ||
5119 | pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG); | ||
5120 | if (pHTPhyMode) | ||
5121 | { | ||
5122 | pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode; | ||
5123 | pHTPhyMode->HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE; | ||
5124 | pHTPhyMode->BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW; | ||
5125 | pHTPhyMode->MCS= (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.MCS; | ||
5126 | pHTPhyMode->SHORTGI= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI; | ||
5127 | pHTPhyMode->STBC= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC; | ||
5128 | |||
5129 | wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE); | ||
5130 | if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length)) | ||
5131 | { | ||
5132 | Status = -EFAULT; | ||
5133 | } | ||
5134 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n", | ||
5135 | pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset)); | ||
5136 | DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word)); | ||
5137 | } | ||
5138 | else | ||
5139 | { | ||
5140 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); | ||
5141 | Status = -EFAULT; | ||
5142 | } | ||
5143 | break; | ||
5144 | case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT: | ||
5145 | wrq->u.data.length = sizeof(UCHAR); | ||
5146 | i = 0; | ||
5147 | #ifdef MULTIPLE_CARD_SUPPORT | ||
5148 | i = 1; | ||
5149 | #endif // MULTIPLE_CARD_SUPPORT // | ||
5150 | if (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length)) | ||
5151 | { | ||
5152 | Status = -EFAULT; | ||
5153 | } | ||
5154 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \n", i)); | ||
5155 | break; | ||
5156 | #ifdef SNMP_SUPPORT | ||
5157 | case RT_OID_802_11_MAC_ADDRESS: | ||
5158 | wrq->u.data.length = MAC_ADDR_LEN; | ||
5159 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); | ||
5160 | break; | ||
5161 | |||
5162 | case RT_OID_802_11_MANUFACTUREROUI: | ||
5163 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREROUI \n")); | ||
5164 | wrq->u.data.length = ManufacturerOUI_LEN; | ||
5165 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); | ||
5166 | break; | ||
5167 | |||
5168 | case RT_OID_802_11_MANUFACTURERNAME: | ||
5169 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTURERNAME \n")); | ||
5170 | wrq->u.data.length = strlen(ManufacturerNAME); | ||
5171 | Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length); | ||
5172 | break; | ||
5173 | |||
5174 | case RT_OID_802_11_RESOURCETYPEIDNAME: | ||
5175 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_RESOURCETYPEIDNAME \n")); | ||
5176 | wrq->u.data.length = strlen(ResourceTypeIdName); | ||
5177 | Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length); | ||
5178 | break; | ||
5179 | |||
5180 | case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED: | ||
5181 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n")); | ||
5182 | ulInfo = 1; // 1 is support wep else 2 is not support. | ||
5183 | wrq->u.data.length = sizeof(ulInfo); | ||
5184 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
5185 | break; | ||
5186 | |||
5187 | case RT_OID_802_11_POWERMANAGEMENTMODE: | ||
5188 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_POWERMANAGEMENTMODE \n")); | ||
5189 | if (pAd->StaCfg.Psm == PSMP_ACTION) | ||
5190 | ulInfo = 1; // 1 is power active else 2 is power save. | ||
5191 | else | ||
5192 | ulInfo = 2; | ||
5193 | |||
5194 | wrq->u.data.length = sizeof(ulInfo); | ||
5195 | Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); | ||
5196 | break; | ||
5197 | |||
5198 | case OID_802_11_WEPDEFAULTKEYVALUE: | ||
5199 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEPDEFAULTKEYVALUE \n")); | ||
5200 | //KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId; | ||
5201 | pKeyIdxValue = wrq->u.data.pointer; | ||
5202 | DBGPRINT(RT_DEBUG_TRACE,("KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx)); | ||
5203 | valueLen = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen; | ||
5204 | NdisMoveMemory(pKeyIdxValue->Value, | ||
5205 | &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, | ||
5206 | valueLen); | ||
5207 | pKeyIdxValue->Value[valueLen]='\0'; | ||
5208 | |||
5209 | wrq->u.data.length = sizeof(DefaultKeyIdxValue); | ||
5210 | |||
5211 | Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length); | ||
5212 | DBGPRINT(RT_DEBUG_TRACE,("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \n", | ||
5213 | pAd->StaCfg.DefaultKeyId, | ||
5214 | wrq->u.data.length, | ||
5215 | pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen, | ||
5216 | pAd->SharedKey[BSS0][0].Key[0], | ||
5217 | pAd->SharedKey[BSS0][1].Key[0], | ||
5218 | pAd->SharedKey[BSS0][2].Key[0], | ||
5219 | pAd->SharedKey[BSS0][3].Key[0])); | ||
5220 | break; | ||
5221 | |||
5222 | case OID_802_11_WEPDEFAULTKEYID: | ||
5223 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPDEFAULTKEYID \n")); | ||
5224 | wrq->u.data.length = sizeof(UCHAR); | ||
5225 | Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.DefaultKeyId, wrq->u.data.length); | ||
5226 | DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyId =%d \n", pAd->StaCfg.DefaultKeyId)); | ||
5227 | break; | ||
5228 | |||
5229 | case RT_OID_802_11_WEPKEYMAPPINGLENGTH: | ||
5230 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n")); | ||
5231 | wrq->u.data.length = sizeof(UCHAR); | ||
5232 | Status = copy_to_user(wrq->u.data.pointer, | ||
5233 | &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen, | ||
5234 | wrq->u.data.length); | ||
5235 | break; | ||
5236 | |||
5237 | case OID_802_11_SHORTRETRYLIMIT: | ||
5238 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SHORTRETRYLIMIT \n")); | ||
5239 | wrq->u.data.length = sizeof(ULONG); | ||
5240 | RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); | ||
5241 | ShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit; | ||
5242 | DBGPRINT(RT_DEBUG_TRACE, ("ShortRetryLimit =%ld, tx_rty_cfg.field.ShortRetryLimit=%d\n", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit)); | ||
5243 | Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length); | ||
5244 | break; | ||
5245 | |||
5246 | case OID_802_11_LONGRETRYLIMIT: | ||
5247 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_LONGRETRYLIMIT \n")); | ||
5248 | wrq->u.data.length = sizeof(ULONG); | ||
5249 | RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); | ||
5250 | LongRetryLimit = tx_rty_cfg.field.LongRtyLimit; | ||
5251 | DBGPRINT(RT_DEBUG_TRACE, ("LongRetryLimit =%ld, tx_rty_cfg.field.LongRtyLimit=%d\n", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit)); | ||
5252 | Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length); | ||
5253 | break; | ||
5254 | |||
5255 | case RT_OID_802_11_PRODUCTID: | ||
5256 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRODUCTID \n")); | ||
5257 | |||
5258 | #ifdef RTMP_MAC_PCI | ||
5259 | { | ||
5260 | |||
5261 | USHORT device_id; | ||
5262 | if (((POS_COOKIE)pAd->OS_Cookie)->pci_dev != NULL) | ||
5263 | pci_read_config_word(((POS_COOKIE)pAd->OS_Cookie)->pci_dev, PCI_DEVICE_ID, &device_id); | ||
5264 | else | ||
5265 | DBGPRINT(RT_DEBUG_TRACE, (" pci_dev = NULL\n")); | ||
5266 | sprintf((PSTRING)tmp, "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id); | ||
5267 | } | ||
5268 | #endif // RTMP_MAC_PCI // | ||
5269 | wrq->u.data.length = strlen((PSTRING)tmp); | ||
5270 | Status = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length); | ||
5271 | break; | ||
5272 | |||
5273 | case RT_OID_802_11_MANUFACTUREID: | ||
5274 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREID \n")); | ||
5275 | wrq->u.data.length = strlen(ManufacturerNAME); | ||
5276 | Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length); | ||
5277 | break; | ||
5278 | |||
5279 | case OID_802_11_CURRENTCHANNEL: | ||
5280 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CURRENTCHANNEL \n")); | ||
5281 | wrq->u.data.length = sizeof(UCHAR); | ||
5282 | DBGPRINT(RT_DEBUG_TRACE, ("sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAd->CommonCfg.Channel)); | ||
5283 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length); | ||
5284 | DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); | ||
5285 | break; | ||
5286 | #endif //SNMP_SUPPORT | ||
5287 | |||
5288 | case OID_802_11_BUILD_CHANNEL_EX: | ||
5289 | { | ||
5290 | UCHAR value; | ||
5291 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BUILD_CHANNEL_EX \n")); | ||
5292 | wrq->u.data.length = sizeof(UCHAR); | ||
5293 | #ifdef EXT_BUILD_CHANNEL_LIST | ||
5294 | DBGPRINT(RT_DEBUG_TRACE, ("Support EXT_BUILD_CHANNEL_LIST.\n")); | ||
5295 | value = 1; | ||
5296 | #else | ||
5297 | DBGPRINT(RT_DEBUG_TRACE, ("Doesn't support EXT_BUILD_CHANNEL_LIST.\n")); | ||
5298 | value = 0; | ||
5299 | #endif // EXT_BUILD_CHANNEL_LIST // | ||
5300 | Status = copy_to_user(wrq->u.data.pointer, &value, 1); | ||
5301 | DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); | ||
5302 | } | ||
5303 | break; | ||
5304 | |||
5305 | case OID_802_11_GET_CH_LIST: | ||
5306 | { | ||
5307 | PRT_CHANNEL_LIST_INFO pChListBuf; | ||
5308 | |||
5309 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CH_LIST \n")); | ||
5310 | if (pAd->ChannelListNum == 0) | ||
5311 | { | ||
5312 | wrq->u.data.length = 0; | ||
5313 | break; | ||
5314 | } | ||
5315 | |||
5316 | pChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG); | ||
5317 | if (pChListBuf == NULL) | ||
5318 | { | ||
5319 | wrq->u.data.length = 0; | ||
5320 | break; | ||
5321 | } | ||
5322 | |||
5323 | pChListBuf->ChannelListNum = pAd->ChannelListNum; | ||
5324 | for (i = 0; i < pChListBuf->ChannelListNum; i++) | ||
5325 | pChListBuf->ChannelList[i] = pAd->ChannelList[i].Channel; | ||
5326 | |||
5327 | wrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO); | ||
5328 | Status = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO)); | ||
5329 | DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); | ||
5330 | |||
5331 | if (pChListBuf) | ||
5332 | kfree(pChListBuf); | ||
5333 | } | ||
5334 | break; | ||
5335 | |||
5336 | case OID_802_11_GET_COUNTRY_CODE: | ||
5337 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_COUNTRY_CODE \n")); | ||
5338 | wrq->u.data.length = 2; | ||
5339 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.CountryCode, 2); | ||
5340 | DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); | ||
5341 | break; | ||
5342 | |||
5343 | case OID_802_11_GET_CHANNEL_GEOGRAPHY: | ||
5344 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \n")); | ||
5345 | wrq->u.data.length = 1; | ||
5346 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Geography, 1); | ||
5347 | DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); | ||
5348 | break; | ||
5349 | |||
5350 | |||
5351 | #ifdef QOS_DLS_SUPPORT | ||
5352 | case RT_OID_802_11_QUERY_DLS: | ||
5353 | wrq->u.data.length = sizeof(BOOLEAN); | ||
5354 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bDLSCapable, wrq->u.data.length); | ||
5355 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS(=%d)\n", pAd->CommonCfg.bDLSCapable)); | ||
5356 | break; | ||
5357 | |||
5358 | case RT_OID_802_11_QUERY_DLS_PARAM: | ||
5359 | { | ||
5360 | PRT_802_11_DLS_INFO pDlsInfo = kmalloc(sizeof(RT_802_11_DLS_INFO), GFP_ATOMIC); | ||
5361 | if (pDlsInfo == NULL) | ||
5362 | break; | ||
5363 | |||
5364 | for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) | ||
5365 | { | ||
5366 | RTMPMoveMemory(&pDlsInfo->Entry[i], &pAd->StaCfg.DLSEntry[i], sizeof(RT_802_11_DLS_UI)); | ||
5367 | } | ||
5368 | |||
5369 | pDlsInfo->num = MAX_NUM_OF_DLS_ENTRY; | ||
5370 | wrq->u.data.length = sizeof(RT_802_11_DLS_INFO); | ||
5371 | Status = copy_to_user(wrq->u.data.pointer, pDlsInfo, wrq->u.data.length); | ||
5372 | DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS_PARAM\n")); | ||
5373 | |||
5374 | if (pDlsInfo) | ||
5375 | kfree(pDlsInfo); | ||
5376 | } | ||
5377 | break; | ||
5378 | #endif // QOS_DLS_SUPPORT // | ||
5379 | |||
5380 | case OID_802_11_SET_PSPXLINK_MODE: | ||
5381 | wrq->u.data.length = sizeof(BOOLEAN); | ||
5382 | Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.PSPXlink, wrq->u.data.length); | ||
5383 | DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SET_PSPXLINK_MODE(=%d)\n", pAd->CommonCfg.PSPXlink)); | ||
5384 | break; | ||
5385 | |||
5386 | |||
5387 | default: | ||
5388 | DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd)); | ||
5389 | Status = -EOPNOTSUPP; | ||
5390 | break; | ||
5391 | } | ||
5392 | return Status; | ||
5393 | } | ||
5394 | |||
5395 | INT rt28xx_sta_ioctl( | 3122 | INT rt28xx_sta_ioctl( |
5396 | IN struct net_device *net_dev, | 3123 | IN struct net_device *net_dev, |
5397 | IN OUT struct ifreq *rq, | 3124 | IN OUT struct ifreq *rq, |
@@ -5402,8 +3129,6 @@ INT rt28xx_sta_ioctl( | |||
5402 | struct iwreq *wrq = (struct iwreq *) rq; | 3129 | struct iwreq *wrq = (struct iwreq *) rq; |
5403 | BOOLEAN StateMachineTouched = FALSE; | 3130 | BOOLEAN StateMachineTouched = FALSE; |
5404 | INT Status = NDIS_STATUS_SUCCESS; | 3131 | INT Status = NDIS_STATUS_SUCCESS; |
5405 | USHORT subcmd; | ||
5406 | |||
5407 | 3132 | ||
5408 | pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); | 3133 | pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); |
5409 | if (pAd == NULL) | 3134 | if (pAd == NULL) |
@@ -5576,15 +3301,9 @@ INT rt28xx_sta_ioctl( | |||
5576 | case SIOCGIWRANGE: //Get range of parameters | 3301 | case SIOCGIWRANGE: //Get range of parameters |
5577 | case SIOCGIWRETRY: //get retry limits and lifetime | 3302 | case SIOCGIWRETRY: //get retry limits and lifetime |
5578 | case SIOCSIWRETRY: //set retry limits and lifetime | 3303 | case SIOCSIWRETRY: //set retry limits and lifetime |
5579 | Status = -EOPNOTSUPP; | ||
5580 | break; | ||
5581 | case RT_PRIV_IOCTL: | 3304 | case RT_PRIV_IOCTL: |
5582 | case RT_PRIV_IOCTL_EXT: | 3305 | case RT_PRIV_IOCTL_EXT: |
5583 | subcmd = wrq->u.data.flags; | 3306 | Status = -EOPNOTSUPP; |
5584 | if( subcmd & OID_GET_SET_TOGGLE) | ||
5585 | Status = RTMPSetInformation(pAd, rq, subcmd); | ||
5586 | else | ||
5587 | Status = RTMPQueryInformation(pAd, rq, subcmd); | ||
5588 | break; | 3307 | break; |
5589 | case SIOCGIWPRIV: | 3308 | case SIOCGIWPRIV: |
5590 | if (wrq->u.data.pointer) | 3309 | if (wrq->u.data.pointer) |