View | Details | Raw Unified | Return to bug 540589
Collapse All | Expand All

(-)a/drivers/staging/rt2860/2860_main_dev.c (+7 lines)
Lines 99-104 static struct pci_device_id rt2860_pci_tbl[] __devinitdata = Link Here
99
	{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)},
99
	{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)},
100
	{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)},
100
	{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)},
101
	{PCI_DEVICE(VEN_AWT_PCI_VENDOR_ID, VEN_AWT_PCIe_DEVICE_ID)},
101
	{PCI_DEVICE(VEN_AWT_PCI_VENDOR_ID, VEN_AWT_PCIe_DEVICE_ID)},
102
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7708)},
103
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7728)},
104
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7758)},
105
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7727)},
106
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7738)},
107
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7748)},
108
	{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7768)},
102
    {0,}		// terminate list
109
    {0,}		// terminate list
103
};
110
};
104
111
(-)a/drivers/staging/rt2860/ap.h (-453 lines)
Lines 40-329 Link Here
40
#ifndef __AP_H__
40
#ifndef __AP_H__
41
#define __AP_H__
41
#define __AP_H__
42
42
43
44
45
// ========================= AP RTMP.h ================================
46
47
48
49
// =============================================================
50
//      Function Prototypes
51
// =============================================================
52
53
// ap_data.c
54
55
BOOLEAN APBridgeToWirelessSta(
56
    IN  PRTMP_ADAPTER   pAd,
57
    IN  PUCHAR          pHeader,
58
    IN  UINT            HdrLen,
59
    IN  PUCHAR          pData,
60
    IN  UINT            DataLen,
61
    IN  ULONG           fromwdsidx);
62
63
BOOLEAN APHandleRxDoneInterrupt(
64
    IN  PRTMP_ADAPTER   pAd);
65
66
VOID	APSendPackets(
67
	IN	NDIS_HANDLE		MiniportAdapterContext,
68
	IN	PPNDIS_PACKET	ppPacketArray,
69
	IN	UINT			NumberOfPackets);
70
71
NDIS_STATUS APSendPacket(
72
    IN  PRTMP_ADAPTER   pAd,
73
    IN  PNDIS_PACKET    pPacket);
74
75
76
NDIS_STATUS APHardTransmit(
77
	IN	PRTMP_ADAPTER	pAd,
78
	IN	TX_BLK			*pTxBlk,
79
	IN	UCHAR			QueIdx);
80
81
VOID APRxEAPOLFrameIndicate(
82
	IN	PRTMP_ADAPTER	pAd,
83
	IN	MAC_TABLE_ENTRY	*pEntry,
84
	IN	RX_BLK			*pRxBlk,
85
	IN	UCHAR			FromWhichBSSID);
86
87
NDIS_STATUS APCheckRxError(
88
	IN	PRTMP_ADAPTER	pAd,
89
	IN	PRT28XX_RXD_STRUC		pRxD,
90
	IN	UCHAR			Wcid);
91
92
BOOLEAN APCheckClass2Class3Error(
93
    IN  PRTMP_ADAPTER   pAd,
94
	IN ULONG Wcid,
95
	IN  PHEADER_802_11  pHeader);
96
97
VOID APHandleRxPsPoll(
98
	IN	PRTMP_ADAPTER	pAd,
99
	IN	PUCHAR			pAddr,
100
	IN	USHORT			Aid,
101
    IN	BOOLEAN			isActive);
102
103
VOID    RTMPDescriptorEndianChange(
104
    IN  PUCHAR          pData,
105
    IN  ULONG           DescriptorType);
106
107
VOID    RTMPFrameEndianChange(
108
    IN  PRTMP_ADAPTER   pAd,
109
    IN  PUCHAR          pData,
110
    IN  ULONG           Dir,
111
    IN  BOOLEAN         FromRxDoneInt);
112
113
// ap_assoc.c
114
115
VOID APAssocStateMachineInit(
116
    IN  PRTMP_ADAPTER   pAd,
117
    IN  STATE_MACHINE *S,
118
    OUT STATE_MACHINE_FUNC Trans[]);
119
120
VOID  APPeerAssocReqAction(
121
    IN  PRTMP_ADAPTER   pAd,
122
    IN  MLME_QUEUE_ELEM *Elem);
123
124
VOID  APPeerReassocReqAction(
125
    IN  PRTMP_ADAPTER   pAd,
126
    IN  MLME_QUEUE_ELEM *Elem);
127
128
VOID  APPeerDisassocReqAction(
129
    IN  PRTMP_ADAPTER   pAd,
130
    IN  MLME_QUEUE_ELEM *Elem);
131
132
VOID MbssKickOutStas(
133
	IN PRTMP_ADAPTER pAd,
134
	IN INT apidx,
135
	IN USHORT Reason);
136
137
VOID APMlmeKickOutSta(
138
    IN PRTMP_ADAPTER pAd,
139
	IN PUCHAR pStaAddr,
140
	IN UCHAR Wcid,
141
	IN USHORT Reason);
142
143
VOID APMlmeDisassocReqAction(
144
    IN PRTMP_ADAPTER pAd,
145
    IN MLME_QUEUE_ELEM *Elem);
146
147
VOID  APCls3errAction(
148
    IN  PRTMP_ADAPTER   pAd,
149
	IN 	ULONG Wcid,
150
    IN	PHEADER_802_11	pHeader);
151
152
153
USHORT APBuildAssociation(
154
    IN PRTMP_ADAPTER pAd,
155
    IN MAC_TABLE_ENTRY *pEntry,
156
    IN USHORT CapabilityInfo,
157
    IN UCHAR  MaxSupportedRateIn500Kbps,
158
    IN UCHAR  *RSN,
159
    IN UCHAR  *pRSNLen,
160
    IN BOOLEAN bWmmCapable,
161
    IN ULONG  RalinkIe,
162
	IN HT_CAPABILITY_IE		*pHtCapability,
163
	IN UCHAR		 HtCapabilityLen,
164
    OUT USHORT *pAid);
165
166
// ap_auth.c
167
168
void APAuthStateMachineInit(
169
    IN PRTMP_ADAPTER pAd,
170
    IN STATE_MACHINE *Sm,
171
    OUT STATE_MACHINE_FUNC Trans[]);
172
173
VOID APMlmeDeauthReqAction(
174
    IN PRTMP_ADAPTER pAd,
175
    IN MLME_QUEUE_ELEM *Elem);
176
177
VOID APCls2errAction(
178
    IN PRTMP_ADAPTER pAd,
179
	IN 	ULONG Wcid,
180
    IN	PHEADER_802_11	pHeader);
181
182
// ap_authrsp.c
183
184
VOID APAuthRspStateMachineInit(
185
    IN PRTMP_ADAPTER pAd,
186
    IN PSTATE_MACHINE Sm,
187
    IN STATE_MACHINE_FUNC Trans[]);
188
189
VOID APPeerAuthAtAuthRspIdleAction(
190
    IN  PRTMP_ADAPTER   pAd,
191
    IN  MLME_QUEUE_ELEM *Elem);
192
193
VOID APPeerDeauthReqAction(
194
    IN PRTMP_ADAPTER	pAd,
195
    IN MLME_QUEUE_ELEM *Elem);
196
197
VOID APPeerAuthSimpleRspGenAndSend(
198
    IN  PRTMP_ADAPTER   pAd,
199
    IN  PHEADER_802_11 pHdr80211,
200
    IN  USHORT Alg,
201
    IN  USHORT Seq,
202
    IN  USHORT StatusCode);
203
204
// ap_connect.c
205
206
BOOLEAN BeaconTransmitRequired(
207
	IN PRTMP_ADAPTER	pAd,
208
	IN INT				apidx);
209
210
VOID APMakeBssBeacon(
211
    IN  PRTMP_ADAPTER   pAd,
212
	IN	INT				apidx);
213
214
VOID  APUpdateBeaconFrame(
215
    IN  PRTMP_ADAPTER   pAd,
216
	IN	INT				apidx);
217
218
VOID APMakeAllBssBeacon(
219
    IN  PRTMP_ADAPTER   pAd);
220
221
VOID  APUpdateAllBeaconFrame(
222
    IN  PRTMP_ADAPTER   pAd);
223
224
225
// ap_sync.c
226
227
VOID APSyncStateMachineInit(
228
    IN PRTMP_ADAPTER pAd,
229
    IN STATE_MACHINE *Sm,
230
    OUT STATE_MACHINE_FUNC Trans[]);
231
232
VOID APScanTimeout(
233
	IN PVOID SystemSpecific1,
234
	IN PVOID FunctionContext,
235
	IN PVOID SystemSpecific2,
236
	IN PVOID SystemSpecific3);
237
238
VOID APInvalidStateWhenScan(
239
	IN PRTMP_ADAPTER pAd,
240
	IN MLME_QUEUE_ELEM *Elem);
241
242
VOID APScanTimeoutAction(
243
	IN PRTMP_ADAPTER pAd,
244
	IN MLME_QUEUE_ELEM *Elem);
245
246
VOID APPeerProbeReqAction(
247
    IN  PRTMP_ADAPTER pAd,
248
    IN  MLME_QUEUE_ELEM *Elem);
249
250
VOID APPeerBeaconAction(
251
    IN PRTMP_ADAPTER pAd,
252
    IN MLME_QUEUE_ELEM *Elem);
253
254
VOID APMlmeScanReqAction(
255
	IN PRTMP_ADAPTER pAd,
256
	IN MLME_QUEUE_ELEM *Elem);
257
258
VOID APPeerBeaconAtScanAction(
259
	IN PRTMP_ADAPTER pAd,
260
	IN MLME_QUEUE_ELEM *Elem);
261
262
VOID APScanCnclAction(
263
	IN PRTMP_ADAPTER pAd,
264
	IN MLME_QUEUE_ELEM *Elem);
265
266
VOID ApSiteSurvey(
267
	IN PRTMP_ADAPTER pAd);
268
269
VOID SupportRate(
270
	IN PUCHAR SupRate,
271
	IN UCHAR SupRateLen,
272
	IN PUCHAR ExtRate,
273
	IN UCHAR ExtRateLen,
274
	OUT PUCHAR *Rates,
275
	OUT PUCHAR RatesLen,
276
	OUT PUCHAR pMaxSupportRate);
277
278
279
BOOLEAN ApScanRunning(
280
	IN PRTMP_ADAPTER pAd);
281
282
// ap_wpa.c
283
284
VOID APWpaStateMachineInit(
285
    IN  PRTMP_ADAPTER   pAd,
286
    IN  STATE_MACHINE *Sm,
287
    OUT STATE_MACHINE_FUNC Trans[]);
288
289
// ap_mlme.c
43
// ap_mlme.c
290
44
291
VOID APMlmePeriodicExec(
292
    IN  PRTMP_ADAPTER   pAd);
293
294
VOID APMlmeSelectTxRateTable(
295
	IN PRTMP_ADAPTER		pAd,
296
	IN PMAC_TABLE_ENTRY		pEntry,
297
	IN PUCHAR				*ppTable,
298
	IN PUCHAR				pTableSize,
299
	IN PUCHAR				pInitTxRateIdx);
300
301
VOID APMlmeSetTxRate(
302
	IN PRTMP_ADAPTER		pAd,
303
	IN PMAC_TABLE_ENTRY		pEntry,
304
	IN PRTMP_TX_RATE_SWITCH	pTxRate);
305
306
VOID APMlmeDynamicTxRateSwitching(
307
    IN PRTMP_ADAPTER pAd);
308
309
VOID APQuickResponeForRateUpExec(
310
    IN PVOID SystemSpecific1,
311
    IN PVOID FunctionContext,
312
    IN PVOID SystemSpecific2,
313
    IN PVOID SystemSpecific3);
314
315
BOOLEAN APMsgTypeSubst(
316
    IN PRTMP_ADAPTER pAd,
317
    IN PFRAME_802_11 pFrame,
318
    OUT INT *Machine,
319
    OUT INT *MsgType);
320
321
VOID APQuickResponeForRateUpExec(
322
    IN PVOID SystemSpecific1,
323
    IN PVOID FunctionContext,
324
    IN PVOID SystemSpecific2,
325
    IN PVOID SystemSpecific3);
326
327
#ifdef RT2870
45
#ifdef RT2870
328
VOID BeaconUpdateExec(
46
VOID BeaconUpdateExec(
329
    IN PVOID SystemSpecific1,
47
    IN PVOID SystemSpecific1,
Lines 336-369 VOID RTMPSetPiggyBack( Link Here
336
	IN PRTMP_ADAPTER	pAd,
54
	IN PRTMP_ADAPTER	pAd,
337
	IN BOOLEAN			bPiggyBack);
55
	IN BOOLEAN			bPiggyBack);
338
56
339
VOID APAsicEvaluateRxAnt(
340
	IN PRTMP_ADAPTER	pAd);
341
342
VOID APAsicRxAntEvalTimeout(
343
	IN PRTMP_ADAPTER	pAd);
344
345
// ap.c
57
// ap.c
346
58
347
VOID APSwitchChannel(
348
	IN PRTMP_ADAPTER pAd,
349
	IN INT Channel);
350
351
NDIS_STATUS APInitialize(
352
    IN  PRTMP_ADAPTER   pAd);
353
354
VOID APShutdown(
355
    IN PRTMP_ADAPTER    pAd);
356
357
VOID APStartUp(
358
    IN  PRTMP_ADAPTER   pAd);
359
360
VOID APStop(
361
    IN  PRTMP_ADAPTER   pAd);
362
363
VOID APCleanupPsQueue(
364
    IN  PRTMP_ADAPTER   pAd,
365
    IN  PQUEUE_HEADER   pQueue);
366
367
VOID MacTableReset(
59
VOID MacTableReset(
368
    IN  PRTMP_ADAPTER   pAd);
60
    IN  PRTMP_ADAPTER   pAd);
369
61
Lines 382-531 MAC_TABLE_ENTRY *MacTableLookup( Link Here
382
    IN  PRTMP_ADAPTER   pAd,
74
    IN  PRTMP_ADAPTER   pAd,
383
    IN  PUCHAR          pAddr);
75
    IN  PUCHAR          pAddr);
384
76
385
VOID MacTableMaintenance(
386
    IN PRTMP_ADAPTER pAd);
387
388
UINT32 MacTableAssocStaNumGet(
389
	IN PRTMP_ADAPTER pAd);
390
391
MAC_TABLE_ENTRY *APSsPsInquiry(
392
    IN  PRTMP_ADAPTER   pAd,
393
    IN  PUCHAR          pAddr,
394
    OUT SST             *Sst,
395
    OUT USHORT          *Aid,
396
    OUT UCHAR           *PsMode,
397
    OUT UCHAR           *Rate);
398
399
BOOLEAN APPsIndicate(
400
    IN  PRTMP_ADAPTER   pAd,
401
    IN  PUCHAR          pAddr,
402
	IN ULONG Wcid,
403
    IN  UCHAR           Psm);
404
405
VOID ApLogEvent(
406
    IN PRTMP_ADAPTER    pAd,
407
    IN PUCHAR           pAddr,
408
    IN USHORT           Event);
409
410
VOID APUpdateOperationMode(
411
    IN PRTMP_ADAPTER pAd);
412
413
VOID APUpdateCapabilityAndErpIe(
414
	IN PRTMP_ADAPTER pAd);
415
416
BOOLEAN ApCheckAccessControlList(
417
	IN PRTMP_ADAPTER pAd,
418
	IN PUCHAR        pAddr,
419
	IN UCHAR         Apidx);
420
421
VOID ApUpdateAccessControlList(
422
    IN PRTMP_ADAPTER pAd,
423
    IN UCHAR         Apidx);
424
425
VOID ApEnqueueNullFrame(
426
	IN PRTMP_ADAPTER pAd,
427
	IN PUCHAR        pAddr,
428
	IN UCHAR         TxRate,
429
	IN UCHAR         PID,
430
	IN UCHAR         apidx,
431
    IN BOOLEAN       bQosNull,
432
    IN BOOLEAN       bEOSP,
433
    IN UCHAR         OldUP);
434
435
VOID ApSendFrame(
436
    IN  PRTMP_ADAPTER   pAd,
437
    IN  PVOID           pBuffer,
438
    IN  ULONG           Length,
439
    IN  UCHAR           TxRate,
440
    IN  UCHAR           PID);
441
442
VOID ApEnqueueAckFrame(
443
    IN PRTMP_ADAPTER pAd,
444
    IN PUCHAR        pAddr,
445
    IN UCHAR         TxRate,
446
	IN UCHAR         apidx);
447
448
UCHAR APAutoSelectChannel(
449
	IN PRTMP_ADAPTER pAd,
450
	IN BOOLEAN Optimal);
451
452
// ap_sanity.c
453
454
455
BOOLEAN PeerAssocReqCmmSanity(
456
    IN PRTMP_ADAPTER pAd,
457
	IN BOOLEAN isRessoc,
458
    IN VOID *Msg,
459
    IN ULONG MsgLen,
460
    OUT PUCHAR pAddr2,
461
    OUT USHORT *pCapabilityInfo,
462
    OUT USHORT *pListenInterval,
463
    OUT PUCHAR pApAddr,
464
    OUT UCHAR *pSsidLen,
465
    OUT char *Ssid,
466
    OUT UCHAR *pRatesLen,
467
    OUT UCHAR Rates[],
468
    OUT UCHAR *RSN,
469
    OUT UCHAR *pRSNLen,
470
    OUT BOOLEAN *pbWmmCapable,
471
    OUT ULONG  *pRalinkIe,
472
    OUT UCHAR		 *pHtCapabilityLen,
473
    OUT HT_CAPABILITY_IE *pHtCapability);
474
475
BOOLEAN PeerDisassocReqSanity(
476
    IN PRTMP_ADAPTER pAd,
477
    IN VOID *Msg,
478
    IN ULONG MsgLen,
479
    OUT PUCHAR pAddr2,
480
    OUT USHORT *Reason);
481
482
BOOLEAN PeerDeauthReqSanity(
483
    IN PRTMP_ADAPTER pAd,
484
    IN VOID *Msg,
485
    IN ULONG MsgLen,
486
    OUT PUCHAR pAddr2,
487
    OUT USHORT *Reason);
488
489
BOOLEAN APPeerAuthSanity(
490
    IN PRTMP_ADAPTER pAd,
491
    IN VOID *Msg,
492
    IN ULONG MsgLen,
493
	OUT PUCHAR pAddr1,
494
    OUT PUCHAR pAddr2,
495
    OUT USHORT *Alg,
496
    OUT USHORT *Seq,
497
    OUT USHORT *Status,
498
    CHAR *ChlgText);
499
500
BOOLEAN APPeerProbeReqSanity(
501
    IN PRTMP_ADAPTER pAd,
502
    IN VOID *Msg,
503
    IN ULONG MsgLen,
504
    OUT PUCHAR pAddr2,
505
    OUT CHAR Ssid[],
506
    OUT UCHAR *SsidLen);
507
508
BOOLEAN APPeerBeaconAndProbeRspSanity(
509
    IN PRTMP_ADAPTER pAd,
510
    IN VOID *Msg,
511
    IN ULONG MsgLen,
512
    OUT PUCHAR pAddr2,
513
    OUT PUCHAR pBssid,
514
    OUT CHAR Ssid[],
515
    OUT UCHAR *SsidLen,
516
    OUT UCHAR *BssType,
517
    OUT USHORT *BeaconPeriod,
518
    OUT UCHAR *Channel,
519
    OUT LARGE_INTEGER *Timestamp,
520
    OUT USHORT *CapabilityInfo,
521
    OUT UCHAR Rate[],
522
    OUT UCHAR *RateLen,
523
    OUT BOOLEAN *ExtendedRateIeExist,
524
    OUT UCHAR *Erp);
525
526
527
// ================== end of AP RTMP.h ========================
528
529
530
#endif  // __AP_H__
77
#endif  // __AP_H__
531
78
(-)a/drivers/staging/rt2860/chlist.h (-5 lines)
Lines 524-535 static CH_REGION ChRegion[] = Link Here
524
			JAP,
524
			JAP,
525
			{
525
			{
526
				{ 1,   14,  20, BOTH, FALSE},	// 2.4 G, ch 1~14
526
				{ 1,   14,  20, BOTH, FALSE},	// 2.4 G, ch 1~14
527
#ifndef RT30xx
528
				{ 36, 	4,  23, IDOR, FALSE},	// 5G, ch 36~48
527
				{ 36, 	4,  23, IDOR, FALSE},	// 5G, ch 36~48
529
#endif
530
#ifdef RT30xx
531
				{ 34, 	4,  23, IDOR, FALSE},	// 5G, ch 34~46
532
#endif
533
				{ 0},							// end
528
				{ 0},							// end
534
			}
529
			}
535
		},
530
		},
(-)a/drivers/staging/rt2860/common/action.c (-9 / +2 lines)
Lines 528-542 VOID SendRefreshBAR( Link Here
528
							  sizeof(FRAME_BAR),	  &FrameBar,
528
							  sizeof(FRAME_BAR),	  &FrameBar,
529
							  END_OF_ARGS);
529
							  END_OF_ARGS);
530
530
531
			if (1)	// Now we always send BAR.
531
			MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
532
			{
532
533
#ifndef RT30xx
534
				MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
535
#endif
536
#ifdef RT30xx
537
				MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
538
#endif
539
			}
540
			MlmeFreeMemory(pAd, pOutBuffer);
533
			MlmeFreeMemory(pAd, pOutBuffer);
541
		}
534
		}
542
	}
535
	}
(-)a/drivers/staging/rt2860/common/ba_action.c (-15 / +4 lines)
Lines 531-542 VOID BAOriSessionSetUp( Link Here
531
	pBAEntry->TimeOutValue = TimeOut;
531
	pBAEntry->TimeOutValue = TimeOut;
532
	pBAEntry->pAdapter = pAd;
532
	pBAEntry->pAdapter = pAd;
533
533
534
#ifdef RT30xx
535
	DBGPRINT(RT_DEBUG_TRACE,("Send AddBA to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d isForced:%d Wcid:%d\n"
534
	DBGPRINT(RT_DEBUG_TRACE,("Send AddBA to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d isForced:%d Wcid:%d\n"
536
		,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
535
		,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
537
		,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
536
		,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
538
		,TID,isForced,pEntry->Aid));
537
		,TID,isForced,pEntry->Aid));
539
#endif
540
538
541
	if (!(pEntry->TXBAbitmap & (1<<TID)))
539
	if (!(pEntry->TXBAbitmap & (1<<TID)))
542
	{
540
	{
Lines 869-874 VOID BAOriSessionTearDown( Link Here
869
			// force send specified TID DelBA
867
			// force send specified TID DelBA
870
			MLME_DELBA_REQ_STRUCT   DelbaReq;
868
			MLME_DELBA_REQ_STRUCT   DelbaReq;
871
			MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
869
			MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
870
			if (Elem == NULL)
871
				return;
872
872
873
			NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
873
			NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
874
			NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
874
			NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
Lines 902-907 VOID BAOriSessionTearDown( Link Here
902
	{
902
	{
903
		MLME_DELBA_REQ_STRUCT   DelbaReq;
903
		MLME_DELBA_REQ_STRUCT   DelbaReq;
904
		MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
904
		MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
905
		if (Elem == NULL)
906
			return;
905
907
906
		NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
908
		NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
907
		NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
909
		NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
Lines 1078-1093 VOID BAOriSessionSetupTimeout( Link Here
1078
		AddbaReq.Token = pBAEntry->Token;
1080
		AddbaReq.Token = pBAEntry->Token;
1079
		MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq);
1081
		MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq);
1080
		RT28XX_MLME_HANDLER(pAd);
1082
		RT28XX_MLME_HANDLER(pAd);
1081
#ifndef RT30xx
1082
		DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) : Send ADD BA again\n", pBAEntry->Token));
1083
#endif
1084
#ifdef RT30xx
1085
		DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d Wcid:%d\n"
1083
		DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d Wcid:%d\n"
1086
		,pBAEntry->Token
1084
		,pBAEntry->Token
1087
		,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
1085
		,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
1088
		,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
1086
		,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
1089
		,pBAEntry->TID,pEntry->Aid));
1087
		,pBAEntry->TID,pEntry->Aid));
1090
#endif
1091
		pBAEntry->Token++;
1088
		pBAEntry->Token++;
1092
		RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);
1089
		RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);
1093
	}
1090
	}
Lines 1391-1400 VOID SendPSMPAction( Link Here
1391
	//ULONG           Idx;
1388
	//ULONG           Idx;
1392
	FRAME_PSMP_ACTION   Frame;
1389
	FRAME_PSMP_ACTION   Frame;
1393
	ULONG           FrameLen;
1390
	ULONG           FrameLen;
1394
#ifdef RT30xx
1395
	UCHAR			bbpdata=0;
1391
	UCHAR			bbpdata=0;
1396
	UINT32			macdata;
1392
	UINT32			macdata;
1397
#endif // RT30xx //
1398
1393
1399
	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);	 //Get an unused nonpaged memory
1394
	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);	 //Get an unused nonpaged memory
1400
	if (NStatus != NDIS_STATUS_SUCCESS)
1395
	if (NStatus != NDIS_STATUS_SUCCESS)
Lines 1410-1416 VOID SendPSMPAction( Link Here
1410
	switch (Psmp)
1405
	switch (Psmp)
1411
	{
1406
	{
1412
		case MMPS_ENABLE:
1407
		case MMPS_ENABLE:
1413
#ifdef RT30xx
1414
			if (IS_RT3090(pAd))
1408
			if (IS_RT3090(pAd))
1415
			{
1409
			{
1416
				// disable MMPS BBP control register
1410
				// disable MMPS BBP control register
Lines 1423-1433 VOID SendPSMPAction( Link Here
1423
				macdata &= ~(0x09);	//bit 0, 3
1417
				macdata &= ~(0x09);	//bit 0, 3
1424
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1418
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1425
			}
1419
			}
1426
#endif // RT30xx //
1427
			Frame.Psmp = 0;
1420
			Frame.Psmp = 0;
1428
			break;
1421
			break;
1429
		case MMPS_DYNAMIC:
1422
		case MMPS_DYNAMIC:
1430
#ifdef RT30xx
1431
			if (IS_RT3090(pAd))
1423
			if (IS_RT3090(pAd))
1432
			{
1424
			{
1433
				// enable MMPS BBP control register
1425
				// enable MMPS BBP control register
Lines 1440-1450 VOID SendPSMPAction( Link Here
1440
				macdata |= 0x09;	//bit 0, 3
1432
				macdata |= 0x09;	//bit 0, 3
1441
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1433
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1442
			}
1434
			}
1443
#endif // RT30xx //
1444
			Frame.Psmp = 3;
1435
			Frame.Psmp = 3;
1445
			break;
1436
			break;
1446
		case MMPS_STATIC:
1437
		case MMPS_STATIC:
1447
#ifdef RT30xx
1448
			if (IS_RT3090(pAd))
1438
			if (IS_RT3090(pAd))
1449
			{
1439
			{
1450
				// enable MMPS BBP control register
1440
				// enable MMPS BBP control register
Lines 1457-1463 VOID SendPSMPAction( Link Here
1457
				macdata |= 0x09;	//bit 0, 3
1447
				macdata |= 0x09;	//bit 0, 3
1458
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1448
				RTMP_IO_WRITE32(pAd, 0x1210, macdata);
1459
			}
1449
			}
1460
#endif // RT30xx //
1461
			Frame.Psmp = 1;
1450
			Frame.Psmp = 1;
1462
			break;
1451
			break;
1463
	}
1452
	}
(-)a/drivers/staging/rt2860/common/cmm_data.c (-290 / +8 lines)
Lines 252-365 NDIS_STATUS MiniportMMRequestUnlock( Link Here
252
	return Status;
252
	return Status;
253
}
253
}
254
#endif
254
#endif
255
#ifdef RT30xx
256
NDIS_STATUS MlmeDataHardTransmit(
257
	IN	PRTMP_ADAPTER	pAd,
258
	IN	UCHAR	QueIdx,
259
	IN	PNDIS_PACKET	pPacket);
260
261
#define MAX_DATAMM_RETRY	3
262
/*
263
	========================================================================
264
265
	Routine Description:
266
		API for MLME to transmit management frame to AP (BSS Mode)
267
	or station (IBSS Mode)
268
269
	Arguments:
270
		pAd Pointer to our adapter
271
		pData		Pointer to the outgoing 802.11 frame
272
		Length		Size of outgoing management frame
273
274
	Return Value:
275
		NDIS_STATUS_FAILURE
276
		NDIS_STATUS_PENDING
277
		NDIS_STATUS_SUCCESS
278
279
	IRQL = PASSIVE_LEVEL
280
	IRQL = DISPATCH_LEVEL
281
282
	Note:
283
284
	========================================================================
285
*/
286
NDIS_STATUS MiniportDataMMRequest(
287
							 IN  PRTMP_ADAPTER   pAd,
288
							 IN  UCHAR           QueIdx,
289
							 IN  PUCHAR          pData,
290
							 IN  UINT            Length)
291
{
292
	PNDIS_PACKET    pPacket;
293
	NDIS_STATUS  Status = NDIS_STATUS_SUCCESS;
294
	ULONG    FreeNum;
295
	int 	retry = 0;
296
	UCHAR           IrqState;
297
	UCHAR			rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; //RTMP_HW_HDR_LEN];
298
299
	ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);
300
301
	// 2860C use Tx Ring
302
	IrqState = pAd->irq_disabled;
303
304
	do
305
	{
306
		// Reset is in progress, stop immediately
307
		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
308
			 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)||
309
			!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))
310
		{
311
			Status = NDIS_STATUS_FAILURE;
312
			break;
313
		}
314
315
		// Check Free priority queue
316
		// Since we use PBF Queue2 for management frame.  Its corresponding DMA ring should be using TxRing.
317
318
		// 2860C use Tx Ring
319
320
		// free Tx(QueIdx) resources
321
		FreeNum = GET_TXRING_FREENO(pAd, QueIdx);
322
323
		if ((FreeNum > 0))
324
		{
325
			// We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870
326
			NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE));
327
			Status = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE), pData, Length);
328
			if (Status != NDIS_STATUS_SUCCESS)
329
			{
330
				DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));
331
				break;
332
			}
333
334
			//pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
335
			//pAd->CommonCfg.MlmeRate = RATE_2;
336
337
338
			Status = MlmeDataHardTransmit(pAd, QueIdx, pPacket);
339
			if (Status != NDIS_STATUS_SUCCESS)
340
				RTMPFreeNdisPacket(pAd, pPacket);
341
			retry = MAX_DATAMM_RETRY;
342
		}
343
		else
344
		{
345
			retry ++;
346
347
			printk("retry %d\n", retry);
348
			pAd->RalinkCounters.MgmtRingFullCount++;
349
350
			if (retry >= MAX_DATAMM_RETRY)
351
			{
352
				DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n",
353
											QueIdx, pAd->RalinkCounters.MgmtRingFullCount));
354
			}
355
		}
356
357
	} while (retry < MAX_DATAMM_RETRY);
358
359
360
	return Status;
361
}
362
#endif /* RT30xx */
363
255
364
/*
256
/*
365
	========================================================================
257
	========================================================================
Lines 588-611 NDIS_STATUS MlmeHardTransmitTxRing( Link Here
588
}
480
}
589
#endif /* RT2860 */
481
#endif /* RT2860 */
590
482
591
#ifdef RT30xx
592
NDIS_STATUS MlmeDataHardTransmit(
593
	IN	PRTMP_ADAPTER	pAd,
594
	IN	UCHAR	QueIdx,
595
	IN	PNDIS_PACKET	pPacket)
596
{
597
	if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
598
		)
599
	{
600
		return NDIS_STATUS_FAILURE;
601
	}
602
603
#ifdef RT2870
604
	return MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);
605
#endif // RT2870 //
606
}
607
#endif /* RT30xx */
608
609
NDIS_STATUS MlmeHardTransmitMgmtRing(
483
NDIS_STATUS MlmeHardTransmitMgmtRing(
610
	IN	PRTMP_ADAPTER	pAd,
484
	IN	PRTMP_ADAPTER	pAd,
611
	IN	UCHAR	QueIdx,
485
	IN	UCHAR	QueIdx,
Lines 1013-1023 BOOLEAN RTMP_FillTxBlkInfo( Link Here
1013
	}
887
	}
1014
888
1015
	return TRUE;
889
	return TRUE;
1016
1017
#ifdef RT30xx
1018
FillTxBlkErr:
1019
	return FALSE;
1020
#endif
1021
}
890
}
1022
891
1023
892
Lines 1096-1105 VOID RTMPDeQueuePacket( Link Here
1096
	TX_BLK			TxBlk;
965
	TX_BLK			TxBlk;
1097
	TX_BLK			*pTxBlk;
966
	TX_BLK			*pTxBlk;
1098
967
1099
#ifdef DBG_DIAGNOSE
1100
	BOOLEAN			firstRound;
1101
	RtmpDiagStruct	*pDiagStruct = &pAd->DiagStruct;
1102
#endif
1103
968
1104
969
1105
	if (QIdx == NUM_OF_TX_RING)
970
	if (QIdx == NUM_OF_TX_RING)
Lines 1119-1127 VOID RTMPDeQueuePacket( Link Here
1119
984
1120
		RT28XX_START_DEQUEUE(pAd, QueIdx, IrqFlags);
985
		RT28XX_START_DEQUEUE(pAd, QueIdx, IrqFlags);
1121
986
1122
#ifdef DBG_DIAGNOSE
1123
		firstRound = ((QueIdx == 0) ? TRUE : FALSE);
1124
#endif // DBG_DIAGNOSE //
1125
987
1126
		while (1)
988
		while (1)
1127
		{
989
		{
Lines 1141-1171 VOID RTMPDeQueuePacket( Link Here
1141
			DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);
1003
			DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);
1142
			if (&pAd->TxSwQueue[QueIdx] == NULL)
1004
			if (&pAd->TxSwQueue[QueIdx] == NULL)
1143
			{
1005
			{
1144
#ifdef DBG_DIAGNOSE
1145
				if (firstRound == TRUE)
1146
					pDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][0]++;
1147
#endif // DBG_DIAGNOSE //
1148
				DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);
1006
				DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);
1149
				break;
1007
				break;
1150
			}
1008
			}
1151
#ifdef RT2860
1009
#ifdef RT2860
1152
			FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);
1010
			FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);
1153
1011
1154
#ifdef DBG_DIAGNOSE
1155
			if (firstRound == TRUE)
1156
			{
1157
				UCHAR	txDescNumLevel, txSwQNumLevel;
1158
1159
				txDescNumLevel = (TX_RING_SIZE - FreeNumber[QueIdx]); // Number of occupied hw desc.
1160
				txDescNumLevel = ((txDescNumLevel <=15) ? txDescNumLevel : 15);
1161
				pDiagStruct->TxDescCnt[pDiagStruct->ArrayCurIdx][txDescNumLevel]++;
1162
1163
				txSwQNumLevel = ((pAd->TxSwQueue[QueIdx].Number <=7) ? pAd->TxSwQueue[QueIdx].Number : 8);
1164
				pDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][txSwQNumLevel]++;
1165
1166
				firstRound = FALSE;
1167
			}
1168
#endif // DBG_DIAGNOSE //
1169
1012
1170
			if (FreeNumber[QueIdx] <= 5)
1013
			if (FreeNumber[QueIdx] <= 5)
1171
			{
1014
			{
Lines 1533-1545 VOID RTMPWriteTxWI_Data( Link Here
1533
		}
1376
		}
1534
	}
1377
	}
1535
1378
1536
#ifdef DBG_DIAGNOSE
1537
		if (pTxBlk->QueIdx== 0)
1538
		{
1539
			pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;
1540
			pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;
1541
		}
1542
#endif // DBG_DIAGNOSE //
1543
1379
1544
	// for rate adapation
1380
	// for rate adapation
1545
	pTxWI->PacketId = pTxWI->MCS;
1381
	pTxWI->PacketId = pTxWI->MCS;
Lines 1598-1610 VOID RTMPWriteTxWI_Cache( Link Here
1598
		}
1434
		}
1599
	}
1435
	}
1600
1436
1601
#ifdef DBG_DIAGNOSE
1602
	if (pTxBlk->QueIdx== 0)
1603
	{
1604
		pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;
1605
		pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;
1606
	}
1607
#endif // DBG_DIAGNOSE //
1608
1437
1609
	pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
1438
	pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
1610
1439
Lines 2062-2180 VOID RTMPHandleRxCoherentInterrupt( Link Here
2062
1891
2063
	DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n"));
1892
	DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n"));
2064
}
1893
}
2065
2066
2067
VOID DBGPRINT_TX_RING(
2068
	IN PRTMP_ADAPTER  pAd,
2069
	IN UCHAR          QueIdx)
2070
{
2071
	UINT32		Ac0Base;
2072
	UINT32		Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx;
2073
	int			i;
2074
	PULONG	ptemp;
2075
2076
	DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n "  ));
2077
	switch (QueIdx)
2078
	{
2079
		case QID_AC_BE:
2080
			RTMP_IO_READ32(pAd, TX_BASE_PTR0, &Ac0Base);
2081
			RTMP_IO_READ32(pAd, TX_CTX_IDX0, &Ac0SwIdx);
2082
			RTMP_IO_READ32(pAd, TX_DTX_IDX0, &Ac0HwIdx);
2083
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BE DESCRIPTOR  \n "  ));
2084
			for (i=0;i<TX_RING_SIZE;i++)
2085
			{
2086
				ptemp= (PULONG)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa;
2087
				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2088
			}
2089
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));
2090
			break;
2091
		case QID_AC_BK:
2092
			RTMP_IO_READ32(pAd, TX_BASE_PTR1, &Ac0Base);
2093
			RTMP_IO_READ32(pAd, TX_CTX_IDX1, &Ac0SwIdx);
2094
			RTMP_IO_READ32(pAd, TX_DTX_IDX1, &Ac0HwIdx);
2095
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BK DESCRIPTOR  \n "  ));
2096
			for (i=0;i<TX_RING_SIZE;i++)
2097
			{
2098
				ptemp= (PULONG)pAd->TxRing[QID_AC_BK].Cell[i].AllocVa;
2099
				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2100
			}
2101
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));
2102
			break;
2103
		case QID_AC_VI:
2104
			RTMP_IO_READ32(pAd, TX_BASE_PTR2, &Ac0Base);
2105
			RTMP_IO_READ32(pAd, TX_CTX_IDX2, &Ac0SwIdx);
2106
			RTMP_IO_READ32(pAd, TX_DTX_IDX2, &Ac0HwIdx);
2107
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VI DESCRIPTOR \n "  ));
2108
			for (i=0;i<TX_RING_SIZE;i++)
2109
			{
2110
				ptemp= (PULONG)pAd->TxRing[QID_AC_VI].Cell[i].AllocVa;
2111
				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2112
			}
2113
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));
2114
			break;
2115
		case QID_AC_VO:
2116
			RTMP_IO_READ32(pAd, TX_BASE_PTR3, &Ac0Base);
2117
			RTMP_IO_READ32(pAd, TX_CTX_IDX3, &Ac0SwIdx);
2118
			RTMP_IO_READ32(pAd, TX_DTX_IDX3, &Ac0HwIdx);
2119
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VO DESCRIPTOR \n "  ));
2120
			for (i=0;i<TX_RING_SIZE;i++)
2121
			{
2122
				ptemp= (PULONG)pAd->TxRing[QID_AC_VO].Cell[i].AllocVa;
2123
				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2124
			}
2125
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));
2126
			break;
2127
		case QID_MGMT:
2128
			RTMP_IO_READ32(pAd, TX_BASE_PTR5, &Ac0Base);
2129
			RTMP_IO_READ32(pAd, TX_CTX_IDX5, &Ac0SwIdx);
2130
			RTMP_IO_READ32(pAd, TX_DTX_IDX5, &Ac0HwIdx);
2131
			DBGPRINT_RAW(RT_DEBUG_TRACE, (" All QID_MGMT  DESCRIPTOR \n "  ));
2132
			for (i=0;i<MGMT_RING_SIZE;i++)
2133
			{
2134
				ptemp= (PULONG)pAd->MgmtRing.Cell[i].AllocVa;
2135
				DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2136
			}
2137
			DBGPRINT_RAW(RT_DEBUG_TRACE, ("  \n "  ));
2138
			break;
2139
2140
		default:
2141
			DBGPRINT_ERR(("DBGPRINT_TX_RING(Ring %d) not supported\n", QueIdx));
2142
			break;
2143
	}
2144
	AC0freeIdx = pAd->TxRing[QueIdx].TxSwFreeIdx;
2145
2146
	DBGPRINT(RT_DEBUG_TRACE,("TxRing%d, TX_DTX_IDX=%d, TX_CTX_IDX=%d\n", QueIdx, Ac0HwIdx, Ac0SwIdx));
2147
	DBGPRINT_RAW(RT_DEBUG_TRACE,(" 	TxSwFreeIdx[%d]", AC0freeIdx));
2148
	DBGPRINT_RAW(RT_DEBUG_TRACE,("	pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount));
2149
2150
2151
}
2152
2153
2154
VOID DBGPRINT_RX_RING(
2155
	IN PRTMP_ADAPTER  pAd)
2156
{
2157
	UINT32		Ac0Base;
2158
	UINT32		Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx;
2159
	int			i;
2160
	UINT32	*ptemp;
2161
2162
	DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n "  ));
2163
	RTMP_IO_READ32(pAd, RX_BASE_PTR, &Ac0Base);
2164
	RTMP_IO_READ32(pAd, RX_CRX_IDX, &Ac0SwIdx);
2165
	RTMP_IO_READ32(pAd, RX_DRX_IDX, &Ac0HwIdx);
2166
	AC0freeIdx = pAd->RxRing.RxSwReadIdx;
2167
2168
	DBGPRINT_RAW(RT_DEBUG_TRACE, ("All RX DSP  \n "  ));
2169
	for (i=0;i<RX_RING_SIZE;i++)
2170
	{
2171
		ptemp = (UINT32 *)pAd->RxRing.Cell[i].AllocVa;
2172
		DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d]  %08x: %08x: %08x: %08x\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3)));
2173
	}
2174
	DBGPRINT(RT_DEBUG_TRACE,("RxRing, RX_DRX_IDX=%d, RX_CRX_IDX=%d \n", Ac0HwIdx, Ac0SwIdx));
2175
	DBGPRINT_RAW(RT_DEBUG_TRACE,(" 	RxSwReadIdx [%d]=", AC0freeIdx));
2176
	DBGPRINT_RAW(RT_DEBUG_TRACE,("	pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount));
2177
}
2178
#endif /* RT2860 */
1894
#endif /* RT2860 */
2179
1895
2180
/*
1896
/*
Lines 2235-2241 VOID RTMPResumeMsduTransmission( Link Here
2235
{
1951
{
2236
	DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));
1952
	DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));
2237
1953
2238
#ifdef RT30xx
2239
	// After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value
1954
	// After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value
2240
	// R66 should not be 0
1955
	// R66 should not be 0
2241
	if (pAd->BbpTuning.R66CurrentValue == 0)
1956
	if (pAd->BbpTuning.R66CurrentValue == 0)
Lines 2243-2249 VOID RTMPResumeMsduTransmission( Link Here
2243
		pAd->BbpTuning.R66CurrentValue = 0x38;
1958
		pAd->BbpTuning.R66CurrentValue = 0x38;
2244
		DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n"));
1959
		DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n"));
2245
	}
1960
	}
2246
#endif
1961
2247
	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);
1962
	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);
2248
1963
2249
	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
1964
	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
Lines 2296-2301 UINT deaggregate_AMSDU_announce( Link Here
2296
		{
2011
		{
2297
		    // avoid local heap overflow, use dyanamic allocation
2012
		    // avoid local heap overflow, use dyanamic allocation
2298
		   MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
2013
		   MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
2014
		   if (Elem == NULL)
2015
			return;
2299
		   memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize);
2016
		   memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize);
2300
		   Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize;
2017
		   Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize;
2301
		   WpaEAPOLKeyAction(pAd, Elem);
2018
		   WpaEAPOLKeyAction(pAd, Elem);
Lines 2617-2627 BOOLEAN MacTableDeleteEntry( Link Here
2617
	if (pAd->MacTab.Size == 0)
2334
	if (pAd->MacTab.Size == 0)
2618
	{
2335
	{
2619
		pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;
2336
		pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;
2620
#ifndef RT30xx
2337
#ifdef RT2860
2621
		AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);
2338
		AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);
2622
#endif
2339
#else
2623
#ifdef RT30xx
2340
		// edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
2624
		RT28XX_UPDATE_PROTECT(pAd);  // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
2341
		// Set MAC register value according operation mode
2342
		RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_UPDATE_PROTECT, NULL, 0);
2625
#endif
2343
#endif
2626
	}
2344
	}
2627
2345
(-)a/drivers/staging/rt2860/common/cmm_info.c (-24 / +2 lines)
Lines 25-30 Link Here
25
 *************************************************************************
25
 *************************************************************************
26
*/
26
*/
27
27
28
#include <linux/sched.h>
28
#include "../rt_config.h"
29
#include "../rt_config.h"
29
30
30
INT	Show_SSID_Proc(
31
INT	Show_SSID_Proc(
Lines 1419-1435 VOID RTMPSetHT( Link Here
1419
		pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
1420
		pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
1420
	}
1421
	}
1421
1422
1422
#ifndef RT30xx
1423
#ifdef RT2870
1424
	/* Frank recommend ,If not, Tx maybe block in high power. Rx has no problem*/
1425
	if(IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020)))
1426
	{
1427
		pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 0;
1428
		pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
1429
	}
1430
#endif // RT2870 //
1431
#endif
1432
1433
	if(pHTPhyMode->SHORTGI == GI_400)
1423
	if(pHTPhyMode->SHORTGI == GI_400)
1434
	{
1424
	{
1435
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
1425
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
Lines 2491-2514 INT Set_HtAutoBa_Proc( Link Here
2491
	if (Value == 0)
2481
	if (Value == 0)
2492
	{
2482
	{
2493
		pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2483
		pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
2494
#ifdef RT30xx
2495
		pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
2484
		pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
2496
#endif
2497
	}
2485
	}
2498
    else if (Value == 1)
2486
    else if (Value == 1)
2499
	{
2487
	{
2500
		pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
2488
		pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
2501
#ifdef RT30xx
2502
		pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
2489
		pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
2503
#endif
2504
	}
2490
	}
2505
	else
2491
	else
2506
		return FALSE; //Invalid argument
2492
		return FALSE; //Invalid argument
2507
2493
2508
    pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
2494
    pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
2509
#ifdef RT30xx
2510
    pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
2495
    pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
2511
#endif
2496
2512
	SetCommonHT(pAd);
2497
	SetCommonHT(pAd);
2513
2498
2514
	DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
2499
	DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));
Lines 2725-2733 PCHAR RTMPGetRalinkAuthModeStr( Link Here
2725
	{
2710
	{
2726
		case Ndis802_11AuthModeOpen:
2711
		case Ndis802_11AuthModeOpen:
2727
			return "OPEN";
2712
			return "OPEN";
2728
#if defined(RT2860) || defined(RT30xx)
2729
        default:
2730
#endif
2731
		case Ndis802_11AuthModeWPAPSK:
2713
		case Ndis802_11AuthModeWPAPSK:
2732
			return "WPAPSK";
2714
			return "WPAPSK";
2733
		case Ndis802_11AuthModeShared:
2715
		case Ndis802_11AuthModeShared:
Lines 2742-2755 PCHAR RTMPGetRalinkAuthModeStr( Link Here
2742
			return "WPAPSKWPA2PSK";
2724
			return "WPAPSKWPA2PSK";
2743
        case Ndis802_11AuthModeWPA1WPA2:
2725
        case Ndis802_11AuthModeWPA1WPA2:
2744
			return "WPA1WPA2";
2726
			return "WPA1WPA2";
2745
#ifndef RT30xx
2746
		case Ndis802_11AuthModeWPANone:
2727
		case Ndis802_11AuthModeWPANone:
2747
			return "WPANONE";
2728
			return "WPANONE";
2748
#ifdef RT2870
2749
		default:
2729
		default:
2750
			return "UNKNOW";
2730
			return "UNKNOW";
2751
#endif
2752
#endif
2753
	}
2731
	}
2754
}
2732
}
2755
2733
(-)a/drivers/staging/rt2860/common/cmm_sanity.c (-184 lines)
Lines 1052-1238 NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity( Link Here
1052
1052
1053
	return NetWorkType;
1053
	return NetWorkType;
1054
}
1054
}
1055
1056
/*
1057
    ==========================================================================
1058
    Description:
1059
        WPA message sanity check
1060
    Return:
1061
        TRUE if all parameters are OK, FALSE otherwise
1062
    ==========================================================================
1063
 */
1064
BOOLEAN PeerWpaMessageSanity(
1065
    IN 	PRTMP_ADAPTER 		pAd,
1066
    IN 	PEAPOL_PACKET 		pMsg,
1067
    IN 	ULONG 				MsgLen,
1068
    IN 	UCHAR				MsgType,
1069
    IN 	MAC_TABLE_ENTRY  	*pEntry)
1070
{
1071
	UCHAR			mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];
1072
	BOOLEAN			bReplayDiff = FALSE;
1073
	BOOLEAN			bWPA2 = FALSE;
1074
	KEY_INFO		EapolKeyInfo;
1075
	UCHAR			GroupKeyIndex = 0;
1076
1077
1078
	NdisZeroMemory(mic, sizeof(mic));
1079
	NdisZeroMemory(digest, sizeof(digest));
1080
	NdisZeroMemory(KEYDATA, sizeof(KEYDATA));
1081
	NdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo));
1082
1083
	NdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO));
1084
1085
	*((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo));
1086
1087
	// Choose WPA2 or not
1088
	if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))
1089
		bWPA2 = TRUE;
1090
1091
	// 0. Check MsgType
1092
	if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1))
1093
	{
1094
		DBGPRINT(RT_DEBUG_ERROR, ("The message type is invalid(%d)! \n", MsgType));
1095
		return FALSE;
1096
	}
1097
1098
	// 1. Replay counter check
1099
 	if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)	// For supplicant
1100
    {
1101
    	// First validate replay counter, only accept message with larger replay counter.
1102
		// Let equal pass, some AP start with all zero replay counter
1103
		UCHAR	ZeroReplay[LEN_KEY_DESC_REPLAY];
1104
1105
        NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);
1106
		if ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY) != 1) &&
1107
			(RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0))
1108
    	{
1109
			bReplayDiff = TRUE;
1110
    	}
1111
 	}
1112
	else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)	// For authenticator
1113
	{
1114
		// check Replay Counter coresponds to MSG from authenticator, otherwise discard
1115
    	if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))
1116
    	{
1117
			bReplayDiff = TRUE;
1118
    	}
1119
	}
1120
1121
	// Replay Counter different condition
1122
	if (bReplayDiff)
1123
	{
1124
		// send wireless event - for replay counter different
1125
		if (pAd->CommonCfg.bWirelessEvent)
1126
			RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);
1127
1128
		if (MsgType < EAPOL_GROUP_MSG_1)
1129
		{
1130
           	DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", MsgType));
1131
		}
1132
		else
1133
		{
1134
			DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));
1135
		}
1136
1137
		hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);
1138
		hex_dump("Current replay counter ", pEntry->R_Counter, LEN_KEY_DESC_REPLAY);
1139
        return FALSE;
1140
	}
1141
1142
	// 2. Verify MIC except Pairwise Msg1
1143
	if (MsgType != EAPOL_PAIR_MSG_1)
1144
	{
1145
		UCHAR			rcvd_mic[LEN_KEY_DESC_MIC];
1146
1147
		// Record the received MIC for check later
1148
		NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
1149
		NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
1150
1151
        if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)	// TKIP
1152
        {
1153
            hmac_md5(pEntry->PTK, LEN_EAP_MICK, (PUCHAR)pMsg, MsgLen, mic);
1154
        }
1155
        else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled)	// AES
1156
        {
1157
            HMAC_SHA1((PUCHAR)pMsg, MsgLen, pEntry->PTK, LEN_EAP_MICK, digest);
1158
            NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
1159
        }
1160
1161
        if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))
1162
        {
1163
			// send wireless event - for MIC different
1164
			if (pAd->CommonCfg.bWirelessEvent)
1165
				RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);
1166
1167
			if (MsgType < EAPOL_GROUP_MSG_1)
1168
			{
1169
            	DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in pairwise msg %d of 4-way handshake!\n", MsgType));
1170
			}
1171
			else
1172
			{
1173
				DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));
1174
			}
1175
1176
			hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);
1177
			hex_dump("Desired  MIC", mic, LEN_KEY_DESC_MIC);
1178
1179
			return FALSE;
1180
        }
1181
	}
1182
1183
	// Extract the context of the Key Data field if it exist
1184
	// The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is un-encrypted.
1185
	// The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.
1186
	if (pMsg->KeyDesc.KeyDataLen[1] > 0)
1187
	{
1188
		// Decrypt this field
1189
		if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))
1190
		{
1191
			if(pEntry->WepStatus == Ndis802_11Encryption3Enabled)
1192
			{
1193
				// AES
1194
				AES_GTK_KEY_UNWRAP(&pEntry->PTK[16], KEYDATA, pMsg->KeyDesc.KeyDataLen[1],pMsg->KeyDesc.KeyData);
1195
			}
1196
			else
1197
			{
1198
				INT 	i;
1199
				UCHAR   Key[32];
1200
				// Decrypt TKIP GTK
1201
				// Construct 32 bytes RC4 Key
1202
				NdisMoveMemory(Key, pMsg->KeyDesc.KeyIv, 16);
1203
				NdisMoveMemory(&Key[16], &pEntry->PTK[16], 16);
1204
				ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, Key, 32);
1205
				//discard first 256 bytes
1206
				for(i = 0; i < 256; i++)
1207
					ARCFOUR_BYTE(&pAd->PrivateInfo.WEPCONTEXT);
1208
				// Decrypt GTK. Becareful, there is no ICV to check the result is correct or not
1209
				ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);
1210
			}
1211
1212
			if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))
1213
				GroupKeyIndex = EapolKeyInfo.KeyIndex;
1214
1215
		}
1216
		else if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))
1217
		{
1218
			NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);
1219
		}
1220
		else
1221
		{
1222
1223
			return TRUE;
1224
		}
1225
1226
		// Parse Key Data field to
1227
		// 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)
1228
		// 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2
1229
		// 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)
1230
		if (!RTMPParseEapolKeyData(pAd, KEYDATA, pMsg->KeyDesc.KeyDataLen[1], GroupKeyIndex, MsgType, bWPA2, pEntry))
1231
		{
1232
			return FALSE;
1233
		}
1234
	}
1235
1236
	return TRUE;
1237
1238
}
(-)a/drivers/staging/rt2860/common/cmm_wpa.c (-804 / +2 lines)
Lines 39-52 Link Here
39
// WPA OUI
39
// WPA OUI
40
UCHAR		OUI_WPA_NONE_AKM[4]		= {0x00, 0x50, 0xF2, 0x00};
40
UCHAR		OUI_WPA_NONE_AKM[4]		= {0x00, 0x50, 0xF2, 0x00};
41
UCHAR       OUI_WPA_VERSION[4]      = {0x00, 0x50, 0xF2, 0x01};
41
UCHAR       OUI_WPA_VERSION[4]      = {0x00, 0x50, 0xF2, 0x01};
42
#ifndef RT30xx
43
UCHAR       OUI_WPA_WEP40[4]      = {0x00, 0x50, 0xF2, 0x01};
42
UCHAR       OUI_WPA_WEP40[4]      = {0x00, 0x50, 0xF2, 0x01};
44
#endif
45
UCHAR       OUI_WPA_TKIP[4]     = {0x00, 0x50, 0xF2, 0x02};
43
UCHAR       OUI_WPA_TKIP[4]     = {0x00, 0x50, 0xF2, 0x02};
46
UCHAR       OUI_WPA_CCMP[4]     = {0x00, 0x50, 0xF2, 0x04};
44
UCHAR       OUI_WPA_CCMP[4]     = {0x00, 0x50, 0xF2, 0x04};
47
#ifndef RT30xx
48
UCHAR       OUI_WPA_WEP104[4]      = {0x00, 0x50, 0xF2, 0x05};
45
UCHAR       OUI_WPA_WEP104[4]      = {0x00, 0x50, 0xF2, 0x05};
49
#endif
50
UCHAR       OUI_WPA_8021X_AKM[4]	= {0x00, 0x50, 0xF2, 0x01};
46
UCHAR       OUI_WPA_8021X_AKM[4]	= {0x00, 0x50, 0xF2, 0x01};
51
UCHAR       OUI_WPA_PSK_AKM[4]      = {0x00, 0x50, 0xF2, 0x02};
47
UCHAR       OUI_WPA_PSK_AKM[4]      = {0x00, 0x50, 0xF2, 0x02};
52
// WPA2 OUI
48
// WPA2 OUI
Lines 55-63 UCHAR OUI_WPA2_TKIP[4] = {0x00, 0x0F, 0xAC, 0x02}; Link Here
55
UCHAR       OUI_WPA2_CCMP[4]        = {0x00, 0x0F, 0xAC, 0x04};
51
UCHAR       OUI_WPA2_CCMP[4]        = {0x00, 0x0F, 0xAC, 0x04};
56
UCHAR       OUI_WPA2_8021X_AKM[4]   = {0x00, 0x0F, 0xAC, 0x01};
52
UCHAR       OUI_WPA2_8021X_AKM[4]   = {0x00, 0x0F, 0xAC, 0x01};
57
UCHAR       OUI_WPA2_PSK_AKM[4]   	= {0x00, 0x0F, 0xAC, 0x02};
53
UCHAR       OUI_WPA2_PSK_AKM[4]   	= {0x00, 0x0F, 0xAC, 0x02};
58
#ifndef RT30xx
59
UCHAR       OUI_WPA2_WEP104[4]   = {0x00, 0x0F, 0xAC, 0x05};
54
UCHAR       OUI_WPA2_WEP104[4]   = {0x00, 0x0F, 0xAC, 0x05};
60
#endif
61
// MSA OUI
55
// MSA OUI
62
UCHAR   	OUI_MSA_8021X_AKM[4]    = {0x00, 0x0F, 0xAC, 0x05};		// Not yet final - IEEE 802.11s-D1.06
56
UCHAR   	OUI_MSA_8021X_AKM[4]    = {0x00, 0x0F, 0xAC, 0x05};		// Not yet final - IEEE 802.11s-D1.06
63
UCHAR   	OUI_MSA_PSK_AKM[4]   	= {0x00, 0x0F, 0xAC, 0x06};		// Not yet final - IEEE 802.11s-D1.06
57
UCHAR   	OUI_MSA_PSK_AKM[4]   	= {0x00, 0x0F, 0xAC, 0x06};		// Not yet final - IEEE 802.11s-D1.06
Lines 376-382 static VOID RTMPInsertRsnIeCipher( Link Here
376
                break;
370
                break;
377
        }
371
        }
378
372
379
#ifndef RT30xx
380
		if ((pAd->OpMode == OPMODE_STA) &&
373
		if ((pAd->OpMode == OPMODE_STA) &&
381
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
374
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
382
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
375
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
Lines 392-398 static VOID RTMPInsertRsnIeCipher( Link Here
392
					break;
385
					break;
393
			}
386
			}
394
		}
387
		}
395
#endif
388
396
		// swap for big-endian platform
389
		// swap for big-endian platform
397
		pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
390
		pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
398
	    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
391
	    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
Lines 453-459 static VOID RTMPInsertRsnIeCipher( Link Here
453
                break;
446
                break;
454
        }
447
        }
455
448
456
#ifndef RT30xx
457
		if ((pAd->OpMode == OPMODE_STA) &&
449
		if ((pAd->OpMode == OPMODE_STA) &&
458
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
450
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
459
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
451
			(pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
Lines 469-475 static VOID RTMPInsertRsnIeCipher( Link Here
469
					break;
461
					break;
470
			}
462
			}
471
		}
463
		}
472
#endif
464
473
		// swap for big-endian platform
465
		// swap for big-endian platform
474
		pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
466
		pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
475
	    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
467
	    pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
Lines 771-840 BOOLEAN RTMPCheckWPAframe( Link Here
771
    return TRUE;
763
    return TRUE;
772
}
764
}
773
765
774
775
/*
776
    ==========================================================================
777
    Description:
778
        ENCRYPT AES GTK before sending in EAPOL frame.
779
        AES GTK length = 128 bit,  so fix blocks for aes-key-wrap as 2 in this function.
780
        This function references to RFC 3394 for aes key wrap algorithm.
781
    Return:
782
    ==========================================================================
783
*/
784
VOID AES_GTK_KEY_WRAP(
785
    IN UCHAR    *key,
786
    IN UCHAR    *plaintext,
787
    IN UCHAR    p_len,
788
    OUT UCHAR   *ciphertext)
789
{
790
    UCHAR       A[8], BIN[16], BOUT[16];
791
    UCHAR       R[512];
792
    INT         num_blocks = p_len/8;   // unit:64bits
793
    INT         i, j;
794
    aes_context aesctx;
795
    UCHAR       xor;
796
797
    rtmp_aes_set_key(&aesctx, key, 128);
798
799
    // Init IA
800
    for (i = 0; i < 8; i++)
801
        A[i] = 0xa6;
802
803
    //Input plaintext
804
    for (i = 0; i < num_blocks; i++)
805
    {
806
        for (j = 0 ; j < 8; j++)
807
            R[8 * (i + 1) + j] = plaintext[8 * i + j];
808
    }
809
810
    // Key Mix
811
    for (j = 0; j < 6; j++)
812
    {
813
        for(i = 1; i <= num_blocks; i++)
814
        {
815
            //phase 1
816
            NdisMoveMemory(BIN, A, 8);
817
            NdisMoveMemory(&BIN[8], &R[8 * i], 8);
818
            rtmp_aes_encrypt(&aesctx, BIN, BOUT);
819
820
            NdisMoveMemory(A, &BOUT[0], 8);
821
            xor = num_blocks * j + i;
822
            A[7] = BOUT[7] ^ xor;
823
            NdisMoveMemory(&R[8 * i], &BOUT[8], 8);
824
        }
825
    }
826
827
    // Output ciphertext
828
    NdisMoveMemory(ciphertext, A, 8);
829
830
    for (i = 1; i <= num_blocks; i++)
831
    {
832
        for (j = 0 ; j < 8; j++)
833
            ciphertext[8 * i + j] = R[8 * i + j];
834
    }
835
}
836
837
838
/*
766
/*
839
	========================================================================
767
	========================================================================
840
768
Lines 906-1638 VOID AES_GTK_KEY_UNWRAP( Link Here
906
834
907
	os_free_mem(NULL, R);
835
	os_free_mem(NULL, R);
908
}
836
}
909
910
/*
911
    ==========================================================================
912
    Description:
913
		Report the EAP message type
914
915
	Arguments:
916
		msg		-	EAPOL_PAIR_MSG_1
917
					EAPOL_PAIR_MSG_2
918
					EAPOL_PAIR_MSG_3
919
					EAPOL_PAIR_MSG_4
920
					EAPOL_GROUP_MSG_1
921
					EAPOL_GROUP_MSG_2
922
923
    Return:
924
         message type string
925
926
    ==========================================================================
927
*/
928
CHAR *GetEapolMsgType(CHAR msg)
929
{
930
    if(msg == EAPOL_PAIR_MSG_1)
931
        return "Pairwise Message 1";
932
    else if(msg == EAPOL_PAIR_MSG_2)
933
        return "Pairwise Message 2";
934
	else if(msg == EAPOL_PAIR_MSG_3)
935
        return "Pairwise Message 3";
936
	else if(msg == EAPOL_PAIR_MSG_4)
937
        return "Pairwise Message 4";
938
	else if(msg == EAPOL_GROUP_MSG_1)
939
        return "Group Message 1";
940
	else if(msg == EAPOL_GROUP_MSG_2)
941
        return "Group Message 2";
942
    else
943
    	return "Invalid Message";
944
}
945
946
947
/*
948
    ========================================================================
949
950
    Routine Description:
951
    Check Sanity RSN IE of EAPoL message
952
953
    Arguments:
954
955
    Return Value:
956
957
958
    ========================================================================
959
*/
960
BOOLEAN RTMPCheckRSNIE(
961
	IN  PRTMP_ADAPTER   pAd,
962
	IN  PUCHAR          pData,
963
	IN  UCHAR           DataLen,
964
	IN  MAC_TABLE_ENTRY *pEntry,
965
	OUT	UCHAR			*Offset)
966
{
967
	PUCHAR              pVIE;
968
	UCHAR               len;
969
	PEID_STRUCT         pEid;
970
	BOOLEAN				result = FALSE;
971
972
	pVIE = pData;
973
	len	 = DataLen;
974
	*Offset = 0;
975
976
	while (len > sizeof(RSNIE2))
977
	{
978
		pEid = (PEID_STRUCT) pVIE;
979
		// WPA RSN IE
980
		if ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)))
981
		{
982
			if ((pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) &&
983
				(NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&
984
				(pEntry->RSNIE_Len == (pEid->Len + 2)))
985
			{
986
					result = TRUE;
987
			}
988
989
			*Offset += (pEid->Len + 2);
990
		}
991
		// WPA2 RSN IE
992
		else if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)))
993
		{
994
			if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) &&
995
				(NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&
996
				(pEntry->RSNIE_Len == (pEid->Len + 2))/* ToDo-AlbertY for mesh*/)
997
			{
998
					result = TRUE;
999
			}
1000
1001
			*Offset += (pEid->Len + 2);
1002
		}
1003
		else
1004
		{
1005
			break;
1006
		}
1007
1008
		pVIE += (pEid->Len + 2);
1009
		len  -= (pEid->Len + 2);
1010
	}
1011
1012
1013
	return result;
1014
1015
}
1016
1017
1018
/*
1019
    ========================================================================
1020
1021
    Routine Description:
1022
    Parse KEYDATA field.  KEYDATA[] May contain 2 RSN IE and optionally GTK.
1023
    GTK  is encaptulated in KDE format at  p.83 802.11i D10
1024
1025
    Arguments:
1026
1027
    Return Value:
1028
1029
    Note:
1030
        802.11i D10
1031
1032
    ========================================================================
1033
*/
1034
BOOLEAN RTMPParseEapolKeyData(
1035
	IN  PRTMP_ADAPTER   pAd,
1036
	IN  PUCHAR          pKeyData,
1037
	IN  UCHAR           KeyDataLen,
1038
	IN	UCHAR			GroupKeyIndex,
1039
	IN	UCHAR			MsgType,
1040
	IN	BOOLEAN			bWPA2,
1041
	IN  MAC_TABLE_ENTRY *pEntry)
1042
{
1043
    PKDE_ENCAP          pKDE = NULL;
1044
    PUCHAR              pMyKeyData = pKeyData;
1045
    UCHAR               KeyDataLength = KeyDataLen;
1046
    UCHAR               GTKLEN = 0;
1047
	UCHAR				DefaultIdx = 0;
1048
	UCHAR				skip_offset;
1049
1050
	// Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it
1051
	if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3)
1052
    {
1053
		// Check RSN IE whether it is WPA2/WPA2PSK
1054
		if (!RTMPCheckRSNIE(pAd, pKeyData, KeyDataLen, pEntry, &skip_offset))
1055
		{
1056
			// send wireless event - for RSN IE different
1057
			if (pAd->CommonCfg.bWirelessEvent)
1058
				RTMPSendWirelessEvent(pAd, IW_RSNIE_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);
1059
1060
        	DBGPRINT(RT_DEBUG_ERROR, ("RSN_IE Different in msg %d of 4-way handshake!\n", MsgType));
1061
			hex_dump("Receive RSN_IE ", pKeyData, KeyDataLen);
1062
			hex_dump("Desired RSN_IE ", pEntry->RSN_IE, pEntry->RSNIE_Len);
1063
1064
			return FALSE;
1065
    	}
1066
    	else
1067
		{
1068
			if (bWPA2 && MsgType == EAPOL_PAIR_MSG_3)
1069
			{
1070
				// skip RSN IE
1071
				pMyKeyData += skip_offset;
1072
				KeyDataLength -= skip_offset;
1073
				DBGPRINT(RT_DEBUG_TRACE, ("RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d) \n", skip_offset));
1074
			}
1075
			else
1076
				return TRUE;
1077
		}
1078
	}
1079
1080
	DBGPRINT(RT_DEBUG_TRACE,("RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE \n", KeyDataLength));
1081
1082
	// Parse EKD format in pairwise_msg_3_WPA2 && group_msg_1_WPA2
1083
	if (bWPA2 && (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1))
1084
	{
1085
		if (KeyDataLength >= 8)	// KDE format exclude GTK length
1086
    	{
1087
        	pKDE = (PKDE_ENCAP) pMyKeyData;
1088
1089
1090
			DefaultIdx = pKDE->GTKEncap.Kid;
1091
1092
			// Sanity check - KED length
1093
			if (KeyDataLength < (pKDE->Len + 2))
1094
    		{
1095
        		DBGPRINT(RT_DEBUG_ERROR, ("ERROR: The len from KDE is too short \n"));
1096
        		return FALSE;
1097
    		}
1098
1099
			// Get GTK length - refer to IEEE 802.11i-2004 p.82
1100
			GTKLEN = pKDE->Len -6;
1101
			if (GTKLEN < LEN_AES_KEY)
1102
			{
1103
				DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN));
1104
        		return FALSE;
1105
			}
1106
1107
    	}
1108
		else
1109
    	{
1110
			DBGPRINT(RT_DEBUG_ERROR, ("ERROR: KDE format length is too short \n"));
1111
	        return FALSE;
1112
    	}
1113
1114
		DBGPRINT(RT_DEBUG_TRACE, ("GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d \n", DefaultIdx, GTKLEN));
1115
		// skip it
1116
		pMyKeyData += 8;
1117
		KeyDataLength -= 8;
1118
1119
	}
1120
	else if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1)
1121
	{
1122
		DefaultIdx = GroupKeyIndex;
1123
		DBGPRINT(RT_DEBUG_TRACE, ("GTK DefaultKeyID=%d \n", DefaultIdx));
1124
	}
1125
1126
	// Sanity check - shared key index must be 1 ~ 3
1127
	if (DefaultIdx < 1 || DefaultIdx > 3)
1128
    {
1129
     	DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key index(%d) is invalid in %s %s \n", DefaultIdx, ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType)));
1130
        return FALSE;
1131
    }
1132
1133
	return TRUE;
1134
1135
}
1136
1137
1138
/*
1139
	========================================================================
1140
1141
	Routine Description:
1142
		Construct EAPoL message for WPA handshaking
1143
		Its format is below,
1144
1145
		+--------------------+
1146
		| Protocol Version	 |  1 octet
1147
		+--------------------+
1148
		| Protocol Type		 |	1 octet
1149
		+--------------------+
1150
		| Body Length		 |  2 octets
1151
		+--------------------+
1152
		| Descriptor Type	 |	1 octet
1153
		+--------------------+
1154
		| Key Information    |	2 octets
1155
		+--------------------+
1156
		| Key Length	     |  1 octet
1157
		+--------------------+
1158
		| Key Repaly Counter |	8 octets
1159
		+--------------------+
1160
		| Key Nonce		     |  32 octets
1161
		+--------------------+
1162
		| Key IV			 |  16 octets
1163
		+--------------------+
1164
		| Key RSC			 |  8 octets
1165
		+--------------------+
1166
		| Key ID or Reserved |	8 octets
1167
		+--------------------+
1168
		| Key MIC			 |	16 octets
1169
		+--------------------+
1170
		| Key Data Length	 |	2 octets
1171
		+--------------------+
1172
		| Key Data			 |	n octets
1173
		+--------------------+
1174
1175
1176
	Arguments:
1177
		pAd			Pointer	to our adapter
1178
1179
	Return Value:
1180
		None
1181
1182
	Note:
1183
1184
	========================================================================
1185
*/
1186
VOID	ConstructEapolMsg(
1187
	IN 	PRTMP_ADAPTER    	pAd,
1188
    IN 	UCHAR				AuthMode,
1189
    IN 	UCHAR				WepStatus,
1190
    IN 	UCHAR				GroupKeyWepStatus,
1191
    IN 	UCHAR				MsgType,
1192
    IN	UCHAR				DefaultKeyIdx,
1193
    IN 	UCHAR				*ReplayCounter,
1194
	IN 	UCHAR				*KeyNonce,
1195
	IN	UCHAR				*TxRSC,
1196
	IN	UCHAR				*PTK,
1197
	IN	UCHAR				*GTK,
1198
	IN	UCHAR				*RSNIE,
1199
	IN	UCHAR				RSNIE_Len,
1200
    OUT PEAPOL_PACKET       pMsg)
1201
{
1202
	BOOLEAN	bWPA2 = FALSE;
1203
1204
	// Choose WPA2 or not
1205
	if ((AuthMode == Ndis802_11AuthModeWPA2) || (AuthMode == Ndis802_11AuthModeWPA2PSK))
1206
		bWPA2 = TRUE;
1207
1208
    // Init Packet and Fill header
1209
    pMsg->ProVer = EAPOL_VER;
1210
    pMsg->ProType = EAPOLKey;
1211
1212
	// Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field
1213
	pMsg->Body_Len[1] = LEN_EAPOL_KEY_MSG;
1214
1215
	// Fill in EAPoL descriptor
1216
	if (bWPA2)
1217
		pMsg->KeyDesc.Type = WPA2_KEY_DESC;
1218
	else
1219
		pMsg->KeyDesc.Type = WPA1_KEY_DESC;
1220
1221
	// Fill in Key information, refer to IEEE Std 802.11i-2004 page 78
1222
	// When either the pairwise or the group cipher is AES, the DESC_TYPE_AES(2) shall be used.
1223
	pMsg->KeyDesc.KeyInfo.KeyDescVer =
1224
        	(((WepStatus == Ndis802_11Encryption3Enabled) || (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)) ? (DESC_TYPE_AES) : (DESC_TYPE_TKIP));
1225
1226
	// Specify Key Type as Group(0) or Pairwise(1)
1227
	if (MsgType >= EAPOL_GROUP_MSG_1)
1228
		pMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY;
1229
	else
1230
		pMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY;
1231
1232
	// Specify Key Index, only group_msg1_WPA1
1233
	if (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))
1234
		pMsg->KeyDesc.KeyInfo.KeyIndex = DefaultKeyIdx;
1235
1236
	if (MsgType == EAPOL_PAIR_MSG_3)
1237
		pMsg->KeyDesc.KeyInfo.Install = 1;
1238
1239
	if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1))
1240
		pMsg->KeyDesc.KeyInfo.KeyAck = 1;
1241
1242
	if (MsgType != EAPOL_PAIR_MSG_1)
1243
		pMsg->KeyDesc.KeyInfo.KeyMic = 1;
1244
1245
	if ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)))
1246
    {
1247
       	pMsg->KeyDesc.KeyInfo.Secure = 1;
1248
    }
1249
1250
	if (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)))
1251
    {
1252
        pMsg->KeyDesc.KeyInfo.EKD_DL = 1;
1253
    }
1254
1255
	// key Information element has done.
1256
	*(USHORT *)(&pMsg->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pMsg->KeyDesc.KeyInfo));
1257
1258
	// Fill in Key Length
1259
	{
1260
		if (MsgType >= EAPOL_GROUP_MSG_1)
1261
		{
1262
			// the length of group key cipher
1263
			pMsg->KeyDesc.KeyLength[1] = ((GroupKeyWepStatus == Ndis802_11Encryption2Enabled) ? TKIP_GTK_LENGTH : LEN_AES_KEY);
1264
		}
1265
		else
1266
		{
1267
			// the length of pairwise key cipher
1268
			pMsg->KeyDesc.KeyLength[1] = ((WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_KEY : LEN_AES_KEY);
1269
		}
1270
	}
1271
1272
 	// Fill in replay counter
1273
    NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, ReplayCounter, LEN_KEY_DESC_REPLAY);
1274
1275
	// Fill Key Nonce field
1276
	// ANonce : pairwise_msg1 & pairwise_msg3
1277
	// SNonce : pairwise_msg2
1278
	// GNonce : group_msg1_wpa1
1279
	if ((MsgType <= EAPOL_PAIR_MSG_3) || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))))
1280
    	NdisMoveMemory(pMsg->KeyDesc.KeyNonce, KeyNonce, LEN_KEY_DESC_NONCE);
1281
1282
	// Fill key IV - WPA2 as 0, WPA1 as random
1283
	if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))
1284
	{
1285
		// Suggest IV be random number plus some number,
1286
		NdisMoveMemory(pMsg->KeyDesc.KeyIv, &KeyNonce[16], LEN_KEY_DESC_IV);
1287
        pMsg->KeyDesc.KeyIv[15] += 2;
1288
	}
1289
1290
    // Fill Key RSC field
1291
    // It contains the RSC for the GTK being installed.
1292
	if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))
1293
	{
1294
        NdisMoveMemory(pMsg->KeyDesc.KeyRsc, TxRSC, 6);
1295
	}
1296
1297
	// Clear Key MIC field for MIC calculation later
1298
    NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
1299
1300
	ConstructEapolKeyData(pAd,
1301
						  AuthMode,
1302
						  WepStatus,
1303
						  GroupKeyWepStatus,
1304
						  MsgType,
1305
						  DefaultKeyIdx,
1306
						  bWPA2,
1307
						  PTK,
1308
						  GTK,
1309
						  RSNIE,
1310
						  RSNIE_Len,
1311
						  pMsg);
1312
1313
	// Calculate MIC and fill in KeyMic Field except Pairwise Msg 1.
1314
	if (MsgType != EAPOL_PAIR_MSG_1)
1315
	{
1316
		CalculateMIC(pAd, WepStatus, PTK, pMsg);
1317
	}
1318
1319
	DBGPRINT(RT_DEBUG_TRACE, ("===> ConstructEapolMsg for %s %s\n", ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType)));
1320
	DBGPRINT(RT_DEBUG_TRACE, ("	     Body length = %d \n", pMsg->Body_Len[1]));
1321
	DBGPRINT(RT_DEBUG_TRACE, ("	     Key length  = %d \n", pMsg->KeyDesc.KeyLength[1]));
1322
1323
1324
}
1325
1326
/*
1327
	========================================================================
1328
1329
	Routine Description:
1330
		Construct the Key Data field of EAPoL message
1331
1332
	Arguments:
1333
		pAd			Pointer	to our adapter
1334
		Elem		Message body
1335
1336
	Return Value:
1337
		None
1338
1339
	Note:
1340
1341
	========================================================================
1342
*/
1343
VOID	ConstructEapolKeyData(
1344
	IN	PRTMP_ADAPTER	pAd,
1345
	IN	UCHAR			AuthMode,
1346
	IN	UCHAR			WepStatus,
1347
	IN	UCHAR			GroupKeyWepStatus,
1348
	IN 	UCHAR			MsgType,
1349
	IN	UCHAR			DefaultKeyIdx,
1350
	IN	BOOLEAN			bWPA2Capable,
1351
	IN	UCHAR			*PTK,
1352
	IN	UCHAR			*GTK,
1353
	IN	UCHAR			*RSNIE,
1354
	IN	UCHAR			RSNIE_LEN,
1355
	OUT PEAPOL_PACKET   pMsg)
1356
{
1357
	UCHAR		*mpool, *Key_Data, *Rc4GTK;
1358
	UCHAR       ekey[(LEN_KEY_DESC_IV+LEN_EAP_EK)];
1359
	UCHAR		data_offset;
1360
1361
1362
	if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)
1363
		return;
1364
1365
	// allocate memory pool
1366
	os_alloc_mem(pAd, (PUCHAR *)&mpool, 1500);
1367
1368
    if (mpool == NULL)
1369
		return;
1370
1371
	/* Rc4GTK Len = 512 */
1372
	Rc4GTK = (UCHAR *) ROUND_UP(mpool, 4);
1373
	/* Key_Data Len = 512 */
1374
	Key_Data = (UCHAR *) ROUND_UP(Rc4GTK + 512, 4);
1375
1376
	NdisZeroMemory(Key_Data, 512);
1377
	pMsg->KeyDesc.KeyDataLen[1] = 0;
1378
	data_offset = 0;
1379
1380
	// Encapsulate RSNIE in pairwise_msg2 & pairwise_msg3
1381
	if (RSNIE_LEN && ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3)))
1382
	{
1383
		if (bWPA2Capable)
1384
			Key_Data[data_offset + 0] = IE_WPA2;
1385
		else
1386
			Key_Data[data_offset + 0] = IE_WPA;
1387
1388
        Key_Data[data_offset + 1] = RSNIE_LEN;
1389
		NdisMoveMemory(&Key_Data[data_offset + 2], RSNIE, RSNIE_LEN);
1390
		data_offset += (2 + RSNIE_LEN);
1391
	}
1392
1393
	// Encapsulate KDE format in pairwise_msg3_WPA2 & group_msg1_WPA2
1394
	if (bWPA2Capable && ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)))
1395
	{
1396
		// Key Data Encapsulation (KDE) format - 802.11i-2004  Figure-43w and Table-20h
1397
        Key_Data[data_offset + 0] = 0xDD;
1398
1399
		if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)
1400
		{
1401
			Key_Data[data_offset + 1] = 0x16;// 4+2+16(OUI+DataType+DataField)
1402
		}
1403
		else
1404
		{
1405
			Key_Data[data_offset + 1] = 0x26;// 4+2+32(OUI+DataType+DataField)
1406
		}
1407
1408
        Key_Data[data_offset + 2] = 0x00;
1409
        Key_Data[data_offset + 3] = 0x0F;
1410
        Key_Data[data_offset + 4] = 0xAC;
1411
        Key_Data[data_offset + 5] = 0x01;
1412
1413
		// GTK KDE format - 802.11i-2004  Figure-43x
1414
        Key_Data[data_offset + 6] = (DefaultKeyIdx & 0x03);
1415
        Key_Data[data_offset + 7] = 0x00;	// Reserved Byte
1416
1417
		data_offset += 8;
1418
	}
1419
1420
1421
	// Encapsulate GTK and encrypt the key-data field with KEK.
1422
	// Only for pairwise_msg3_WPA2 and group_msg1
1423
	if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable) || (MsgType == EAPOL_GROUP_MSG_1))
1424
	{
1425
		// Fill in GTK
1426
		if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)
1427
		{
1428
			NdisMoveMemory(&Key_Data[data_offset], GTK, LEN_AES_KEY);
1429
			data_offset += LEN_AES_KEY;
1430
		}
1431
		else
1432
		{
1433
			NdisMoveMemory(&Key_Data[data_offset], GTK, TKIP_GTK_LENGTH);
1434
			data_offset += TKIP_GTK_LENGTH;
1435
		}
1436
1437
		// Still dont know why, but if not append will occur "GTK not include in MSG3"
1438
		// Patch for compatibility between zero config and funk
1439
		if (MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable)
1440
		{
1441
			if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)
1442
			{
1443
				Key_Data[data_offset + 0] = 0xDD;
1444
				Key_Data[data_offset + 1] = 0;
1445
				data_offset += 2;
1446
			}
1447
			else
1448
			{
1449
				Key_Data[data_offset + 0] = 0xDD;
1450
				Key_Data[data_offset + 1] = 0;
1451
				Key_Data[data_offset + 2] = 0;
1452
				Key_Data[data_offset + 3] = 0;
1453
				Key_Data[data_offset + 4] = 0;
1454
				Key_Data[data_offset + 5] = 0;
1455
				data_offset += 6;
1456
			}
1457
		}
1458
1459
		// Encrypt the data material in key data field
1460
		if (WepStatus == Ndis802_11Encryption3Enabled)
1461
		{
1462
			AES_GTK_KEY_WRAP(&PTK[16], Key_Data, data_offset, Rc4GTK);
1463
            // AES wrap function will grow 8 bytes in length
1464
            data_offset += 8;
1465
		}
1466
		else
1467
		{
1468
			// PREPARE Encrypted  "Key DATA" field.  (Encrypt GTK with RC4, usinf PTK[16]->[31] as Key, IV-field as IV)
1469
			// put TxTsc in Key RSC field
1470
			pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32;   //Init crc32.
1471
1472
			// ekey is the contanetion of IV-field, and PTK[16]->PTK[31]
1473
			NdisMoveMemory(ekey, pMsg->KeyDesc.KeyIv, LEN_KEY_DESC_IV);
1474
			NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], &PTK[16], LEN_EAP_EK);
1475
			ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, ekey, sizeof(ekey));  //INIT SBOX, KEYLEN+3(IV)
1476
			pAd->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, Key_Data, data_offset);
1477
			WPAARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, Rc4GTK, Key_Data, data_offset);
1478
		}
1479
1480
		NdisMoveMemory(pMsg->KeyDesc.KeyData, Rc4GTK, data_offset);
1481
	}
1482
	else
1483
	{
1484
		NdisMoveMemory(pMsg->KeyDesc.KeyData, Key_Data, data_offset);
1485
	}
1486
1487
	// set key data length field and total length
1488
	pMsg->KeyDesc.KeyDataLen[1] = data_offset;
1489
    pMsg->Body_Len[1] += data_offset;
1490
1491
	os_free_mem(pAd, mpool);
1492
1493
}
1494
1495
/*
1496
	========================================================================
1497
1498
	Routine Description:
1499
		Calcaulate MIC. It is used during 4-ways handsharking.
1500
1501
	Arguments:
1502
		pAd				-	pointer to our pAdapter context
1503
    	PeerWepStatus	-	indicate the encryption type
1504
1505
	Return Value:
1506
1507
	Note:
1508
1509
	========================================================================
1510
*/
1511
VOID	CalculateMIC(
1512
	IN	PRTMP_ADAPTER	pAd,
1513
	IN	UCHAR			PeerWepStatus,
1514
	IN	UCHAR			*PTK,
1515
	OUT PEAPOL_PACKET   pMsg)
1516
{
1517
    UCHAR   *OutBuffer;
1518
	ULONG	FrameLen = 0;
1519
	UCHAR	mic[LEN_KEY_DESC_MIC];
1520
	UCHAR	digest[80];
1521
1522
	// allocate memory for MIC calculation
1523
	os_alloc_mem(pAd, (PUCHAR *)&OutBuffer, 512);
1524
1525
    if (OutBuffer == NULL)
1526
    {
1527
		DBGPRINT(RT_DEBUG_ERROR, ("!!!CalculateMIC: no memory!!!\n"));
1528
		return;
1529
    }
1530
1531
	// make a frame for calculating MIC.
1532
    MakeOutgoingFrame(OutBuffer,            	&FrameLen,
1533
                      pMsg->Body_Len[1] + 4,  	pMsg,
1534
                      END_OF_ARGS);
1535
1536
	NdisZeroMemory(mic, sizeof(mic));
1537
1538
	// Calculate MIC
1539
    if (PeerWepStatus == Ndis802_11Encryption3Enabled)
1540
 	{
1541
		HMAC_SHA1(OutBuffer,  FrameLen, PTK, LEN_EAP_MICK, digest);
1542
		NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
1543
	}
1544
	else
1545
	{
1546
		hmac_md5(PTK,  LEN_EAP_MICK, OutBuffer, FrameLen, mic);
1547
	}
1548
1549
	// store the calculated MIC
1550
	NdisMoveMemory(pMsg->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC);
1551
1552
	os_free_mem(pAd, OutBuffer);
1553
}
1554
1555
/*
1556
	========================================================================
1557
1558
	Routine Description:
1559
		Some received frames can't decrypt by Asic, so decrypt them by software.
1560
1561
	Arguments:
1562
		pAd				-	pointer to our pAdapter context
1563
    	PeerWepStatus	-	indicate the encryption type
1564
1565
	Return Value:
1566
		NDIS_STATUS_SUCCESS		-	decryption successful
1567
		NDIS_STATUS_FAILURE		-	decryption failure
1568
1569
	========================================================================
1570
*/
1571
NDIS_STATUS	RTMPSoftDecryptBroadCastData(
1572
	IN	PRTMP_ADAPTER					pAd,
1573
	IN	RX_BLK							*pRxBlk,
1574
	IN  NDIS_802_11_ENCRYPTION_STATUS 	GroupCipher,
1575
	IN  PCIPHER_KEY						pShard_key)
1576
{
1577
	PRXWI_STRUC			pRxWI = pRxBlk->pRxWI;
1578
1579
1580
1581
	// handle WEP decryption
1582
	if (GroupCipher == Ndis802_11Encryption1Enabled)
1583
    {
1584
		if (RTMPSoftDecryptWEP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, pShard_key))
1585
		{
1586
1587
			//Minus IV[4] & ICV[4]
1588
			pRxWI->MPDUtotalByteCount -= 8;
1589
		}
1590
		else
1591
		{
1592
			DBGPRINT(RT_DEBUG_ERROR, ("ERROR : Software decrypt WEP data fails.\n"));
1593
			// give up this frame
1594
			return NDIS_STATUS_FAILURE;
1595
		}
1596
	}
1597
	// handle TKIP decryption
1598
	else if (GroupCipher == Ndis802_11Encryption2Enabled)
1599
	{
1600
		if (RTMPSoftDecryptTKIP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, 0, pShard_key))
1601
		{
1602
1603
			//Minus 8 bytes MIC, 8 bytes IV/EIV, 4 bytes ICV
1604
			pRxWI->MPDUtotalByteCount -= 20;
1605
		}
1606
        else
1607
		{
1608
			DBGPRINT(RT_DEBUG_ERROR, ("ERROR : RTMPSoftDecryptTKIP Failed\n"));
1609
			// give up this frame
1610
			return NDIS_STATUS_FAILURE;
1611
        }
1612
	}
1613
	// handle AES decryption
1614
	else if (GroupCipher == Ndis802_11Encryption3Enabled)
1615
	{
1616
		if (RTMPSoftDecryptAES(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount , pShard_key))
1617
		{
1618
1619
			//8 bytes MIC, 8 bytes IV/EIV (CCMP Header)
1620
			pRxWI->MPDUtotalByteCount -= 16;
1621
		}
1622
		else
1623
		{
1624
			DBGPRINT(RT_DEBUG_ERROR, ("ERROR : RTMPSoftDecryptAES Failed\n"));
1625
			// give up this frame
1626
			return NDIS_STATUS_FAILURE;
1627
		}
1628
	}
1629
	else
1630
	{
1631
		// give up this frame
1632
		return NDIS_STATUS_FAILURE;
1633
	}
1634
1635
	return NDIS_STATUS_SUCCESS;
1636
1637
}
1638
(-)a/drivers/staging/rt2860/common/eeprom.c (-43 / +12 lines)
Lines 73-88 USHORT ShiftInBits( Link Here
73
        RaiseClock(pAd, &x);
73
        RaiseClock(pAd, &x);
74
74
75
        RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
75
        RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
76
#ifdef RT30xx
76
77
		LowerClock(pAd, &x); //prevent read failed
77
	LowerClock(pAd, &x); /* prevent read failed */
78
#endif
78
79
        x &= ~(EEDI);
79
        x &= ~(EEDI);
80
        if(x & EEDO)
80
        if(x & EEDO)
81
            data |= 1;
81
            data |= 1;
82
83
#ifndef RT30xx
84
        LowerClock(pAd, &x);
85
#endif
86
    }
82
    }
87
83
88
    return data;
84
    return data;
Lines 185-198 USHORT RTMP_EEPROM_READ16( Link Here
185
    UINT32		x;
181
    UINT32		x;
186
    USHORT		data;
182
    USHORT		data;
187
183
188
#ifdef RT30xx
184
#ifdef RT2870
189
	if (pAd->NicConfig2.field.AntDiversity)
185
	if (pAd->NicConfig2.field.AntDiversity)
190
    {
186
    {
191
    	pAd->EepromAccess = TRUE;
187
    	pAd->EepromAccess = TRUE;
192
    }
188
    }
193
//2008/09/11:KH add to support efuse<--
194
//2008/09/11:KH add to support efuse-->
195
{
196
#endif
189
#endif
197
    Offset /= 2;
190
    Offset /= 2;
198
    // reset bits and set EECS
191
    // reset bits and set EECS
Lines 201-217 USHORT RTMP_EEPROM_READ16( Link Here
201
    x |= EECS;
194
    x |= EECS;
202
    RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
195
    RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
203
196
204
#ifdef RT30xx
205
	// patch can not access e-Fuse issue
197
	// patch can not access e-Fuse issue
206
    if (!IS_RT3090(pAd))
198
    if (!IS_RT3090(pAd))
207
    {
199
    {
208
#endif
209
	// kick a pulse
200
	// kick a pulse
210
	RaiseClock(pAd, &x);
201
	RaiseClock(pAd, &x);
211
	LowerClock(pAd, &x);
202
	LowerClock(pAd, &x);
212
#ifdef RT30xx
213
    }
203
    }
214
#endif
215
204
216
    // output the read_opcode and register number in that order
205
    // output the read_opcode and register number in that order
217
    ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);
206
    ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);
Lines 222-228 USHORT RTMP_EEPROM_READ16( Link Here
222
211
223
    EEpromCleanup(pAd);
212
    EEpromCleanup(pAd);
224
213
225
#ifdef RT30xx
214
#ifdef RT2870
226
	// Antenna and EEPROM access are both using EESK pin,
215
	// Antenna and EEPROM access are both using EESK pin,
227
    // Therefor we should avoid accessing EESK at the same time
216
    // Therefor we should avoid accessing EESK at the same time
228
    // Then restore antenna after EEPROM access
217
    // Then restore antenna after EEPROM access
Lines 231-237 USHORT RTMP_EEPROM_READ16( Link Here
231
	    pAd->EepromAccess = FALSE;
220
	    pAd->EepromAccess = FALSE;
232
	    AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
221
	    AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
233
    }
222
    }
234
}
235
#endif
223
#endif
236
    return data;
224
    return data;
237
}	//ReadEEprom
225
}	//ReadEEprom
Lines 243-256 VOID RTMP_EEPROM_WRITE16( Link Here
243
{
231
{
244
    UINT32 x;
232
    UINT32 x;
245
233
246
#ifdef RT30xx
234
#ifdef RT2870
247
	if (pAd->NicConfig2.field.AntDiversity)
235
	if (pAd->NicConfig2.field.AntDiversity)
248
    {
236
    {
249
    	pAd->EepromAccess = TRUE;
237
    	pAd->EepromAccess = TRUE;
250
    }
238
    }
251
	//2008/09/11:KH add to support efuse<--
252
//2008/09/11:KH add to support efuse-->
253
	{
254
#endif
239
#endif
255
	Offset /= 2;
240
	Offset /= 2;
256
241
Lines 262-278 VOID RTMP_EEPROM_WRITE16( Link Here
262
    x |= EECS;
247
    x |= EECS;
263
    RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
248
    RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
264
249
265
#ifdef RT30xx
266
	// patch can not access e-Fuse issue
250
	// patch can not access e-Fuse issue
267
    if (!IS_RT3090(pAd))
251
    if (!IS_RT3090(pAd))
268
    {
252
    {
269
#endif
270
	// kick a pulse
253
	// kick a pulse
271
	RaiseClock(pAd, &x);
254
	RaiseClock(pAd, &x);
272
	LowerClock(pAd, &x);
255
	LowerClock(pAd, &x);
273
#ifdef RT30xx
274
    }
256
    }
275
#endif
276
257
277
    // output the read_opcode ,register number and data in that order
258
    // output the read_opcode ,register number and data in that order
278
    ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);
259
    ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);
Lines 290-296 VOID RTMP_EEPROM_WRITE16( Link Here
290
271
291
    EEpromCleanup(pAd);
272
    EEpromCleanup(pAd);
292
273
293
#ifdef RT30xx
274
#ifdef RT2870
294
	// Antenna and EEPROM access are both using EESK pin,
275
	// Antenna and EEPROM access are both using EESK pin,
295
    // Therefor we should avoid accessing EESK at the same time
276
    // Therefor we should avoid accessing EESK at the same time
296
    // Then restore antenna after EEPROM access
277
    // Then restore antenna after EEPROM access
Lines 299-310 VOID RTMP_EEPROM_WRITE16( Link Here
299
	    pAd->EepromAccess = FALSE;
280
	    pAd->EepromAccess = FALSE;
300
	    AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
281
	    AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
301
    }
282
    }
302
}
303
#endif
283
#endif
304
}
284
}
305
285
306
//2008/09/11:KH add to support efuse<--
286
#ifdef RT2870
307
#ifdef RT30xx
308
/*
287
/*
309
	========================================================================
288
	========================================================================
310
289
Lines 1038-1044 INT set_eFuseLoadFromBin_Proc( Link Here
1038
{
1017
{
1039
	CHAR					*src;
1018
	CHAR					*src;
1040
	struct file				*srcf;
1019
	struct file				*srcf;
1041
	INT 					retval, orgfsuid, orgfsgid;
1020
	INT 					retval;
1042
   	mm_segment_t			orgfs;
1021
   	mm_segment_t			orgfs;
1043
	UCHAR					*buffer;
1022
	UCHAR					*buffer;
1044
	UCHAR					BinFileSize=0;
1023
	UCHAR					BinFileSize=0;
Lines 1078-1089 INT set_eFuseLoadFromBin_Proc( Link Here
1078
		kfree(buffer);
1057
		kfree(buffer);
1079
		return FALSE;
1058
		return FALSE;
1080
	}
1059
	}
1081
	/* Don't change to uid 0, let the file be opened as the "normal" user */
1060
1082
#if 0
1083
	orgfsuid = current->fsuid;
1084
	orgfsgid = current->fsgid;
1085
	current->fsuid=current->fsgid = 0;
1086
#endif
1087
    	orgfs = get_fs();
1061
    	orgfs = get_fs();
1088
   	 set_fs(KERNEL_DS);
1062
   	 set_fs(KERNEL_DS);
1089
1063
Lines 1146-1155 INT set_eFuseLoadFromBin_Proc( Link Here
1146
		DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1120
		DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));
1147
	}
1121
	}
1148
	set_fs(orgfs);
1122
	set_fs(orgfs);
1149
#if 0
1123
1150
	current->fsuid = orgfsuid;
1151
	current->fsgid = orgfsgid;
1152
#endif
1153
	for(j=0;j<i;j++)
1124
	for(j=0;j<i;j++)
1154
	{
1125
	{
1155
		DBGPRINT(RT_DEBUG_TRACE, ("%02X ",buffer[j]));
1126
		DBGPRINT(RT_DEBUG_TRACE, ("%02X ",buffer[j]));
Lines 1505-1510 NTSTATUS eFuseWriteRegistersFromBin( Link Here
1505
1476
1506
	return TRUE;
1477
	return TRUE;
1507
}
1478
}
1508
1479
#endif
1509
#endif // RT30xx //
1510
//2008/09/11:KH add to support efuse-->
(-)a/drivers/staging/rt2860/common/mlme.c (-542 / +48 lines)
Lines 43-49 UCHAR CISCO_OUI[] = {0x00, 0x40, 0x96}; Link Here
43
43
44
UCHAR	WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};
44
UCHAR	WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};
45
UCHAR	RSN_OUI[] = {0x00, 0x0f, 0xac};
45
UCHAR	RSN_OUI[] = {0x00, 0x0f, 0xac};
46
UCHAR	WAPI_OUI[] = {0x00, 0x14, 0x72};
47
UCHAR   WME_INFO_ELEM[]  = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
46
UCHAR   WME_INFO_ELEM[]  = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
48
UCHAR   WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
47
UCHAR   WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
49
UCHAR	Ccx2QosInfo[] = {0x00, 0x40, 0x96, 0x04};
48
UCHAR	Ccx2QosInfo[] = {0x00, 0x40, 0x96, 0x04};
Lines 338-346 UCHAR WpaIe = IE_WPA; Link Here
338
UCHAR  Wpa2Ie	 = IE_WPA2;
337
UCHAR  Wpa2Ie	 = IE_WPA2;
339
UCHAR  IbssIe	 = IE_IBSS_PARM;
338
UCHAR  IbssIe	 = IE_IBSS_PARM;
340
UCHAR  Ccx2Ie	 = IE_CCX_V2;
339
UCHAR  Ccx2Ie	 = IE_CCX_V2;
341
#ifdef RT2870
342
UCHAR  WapiIe	 = IE_WAPI;
343
#endif
344
340
345
extern UCHAR	WPA_OUI[];
341
extern UCHAR	WPA_OUI[];
346
342
Lines 449-461 FREQUENCY_ITEM FreqItems3020[] = Link Here
449
	{13,   247,	 2,  2},
445
	{13,   247,	 2,  2},
450
	{14,   248,	 2,  4},
446
	{14,   248,	 2,  4},
451
};
447
};
452
#ifndef RT30xx
453
#define	NUM_OF_3020_CHNL	(sizeof(FreqItems3020) / sizeof(FREQUENCY_ITEM))
454
#endif
455
#ifdef RT30xx
456
//2008/07/10:KH Modified to share this variable
457
UCHAR	NUM_OF_3020_CHNL=(sizeof(FreqItems3020) / sizeof(FREQUENCY_ITEM));
448
UCHAR	NUM_OF_3020_CHNL=(sizeof(FreqItems3020) / sizeof(FREQUENCY_ITEM));
458
#endif
459
449
460
/*
450
/*
461
	==========================================================================
451
	==========================================================================
Lines 1576-1587 VOID MlmeSelectTxRateTable( Link Here
1576
		}
1566
		}
1577
1567
1578
		//else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
1568
		//else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
1579
		if ((pEntry->RateLen == 4)
1569
		if (pEntry->RateLen == 4)
1580
#ifndef RT30xx
1581
//Iverson mark for Adhoc b mode,sta will use rate 54  Mbps when connect with sta b/g/n mode
1582
			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)
1583
#endif
1584
			)
1585
		{// B only AP
1570
		{// B only AP
1586
			*ppTable = RateSwitchTable11B;
1571
			*ppTable = RateSwitchTable11B;
1587
			*pTableSize = RateSwitchTable11B[0];
1572
			*pTableSize = RateSwitchTable11B[0];
Lines 2777-2819 VOID MlmeCheckPsmChange( Link Here
2777
		(pAd->StaCfg.Psm == PWR_ACTIVE) &&
2762
		(pAd->StaCfg.Psm == PWR_ACTIVE) &&
2778
#ifdef RT2860
2763
#ifdef RT2860
2779
		RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP))
2764
		RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP))
2780
#endif
2765
#else
2781
#if !defined(RT2860) && !defined(RT30xx)
2782
		(pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE))
2766
		(pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE))
2783
#endif
2767
#endif
2784
#ifndef RT30xx
2785
	{
2786
		NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime);
2787
		pAd->RalinkCounters.RxCountSinceLastNULL = 0;
2788
		MlmeSetPsmBit(pAd, PWR_SAVE);
2789
		if (!(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable))
2790
		{
2791
			RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE);
2792
		}
2793
		else
2794
		{
2795
			RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
2796
		}
2797
	}
2798
#endif
2799
#ifdef RT30xx
2800
//		(! RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
2801
		(pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) /*&&
2802
		(pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&
2803
		(pAd->RalinkCounters.OneSecTxRetryOkCount == 0)*/)
2804
	{
2768
	{
2805
		// add by johnli, use Rx OK data count per second to calculate throughput
2769
		// add by johnli, use Rx OK data count per second to calculate throughput
2806
		// If Ttraffic is too high ( > 400 Rx per second), don't go to sleep mode. If tx rate is low, use low criteria
2770
		// If Ttraffic is too high ( > 400 Rx per second), don't go to sleep mode. If tx rate is low, use low criteria
2807
		// Mode=CCK/MCS=3 => 11 Mbps, Mode=OFDM/MCS=3 => 18 Mbps
2771
		// Mode=CCK/MCS=3 => 11 Mbps, Mode=OFDM/MCS=3 => 18 Mbps
2808
		if (((pAd->StaCfg.HTPhyMode.field.MCS <= 3) &&
2772
		if (((pAd->StaCfg.HTPhyMode.field.MCS <= 3) &&
2809
/* Iverson mark
2810
				(pAd->StaCfg.HTPhyMode.field.MODE <= MODE_OFDM) &&
2811
*/
2812
				(pAd->RalinkCounters.OneSecRxOkDataCnt < (ULONG)100)) ||
2773
				(pAd->RalinkCounters.OneSecRxOkDataCnt < (ULONG)100)) ||
2813
			((pAd->StaCfg.HTPhyMode.field.MCS > 3) &&
2774
			((pAd->StaCfg.HTPhyMode.field.MCS > 3) &&
2814
/* Iverson mark
2815
			(pAd->StaCfg.HTPhyMode.field.MODE > MODE_OFDM) &&
2816
*/
2817
			(pAd->RalinkCounters.OneSecRxOkDataCnt < (ULONG)400)))
2775
			(pAd->RalinkCounters.OneSecRxOkDataCnt < (ULONG)400)))
2818
		{
2776
		{
2819
				// Get this time
2777
				// Get this time
Lines 2830-2836 VOID MlmeCheckPsmChange( Link Here
2830
			}
2788
			}
2831
		}
2789
		}
2832
	}
2790
	}
2833
#endif
2834
}
2791
}
2835
2792
2836
// IRQL = PASSIVE_LEVEL
2793
// IRQL = PASSIVE_LEVEL
Lines 2845-2853 VOID MlmeSetPsmBit( Link Here
2845
	RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
2802
	RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
2846
	csr4.field.AckCtsPsmBit = (psm == PWR_SAVE)? 1:0;
2803
	csr4.field.AckCtsPsmBit = (psm == PWR_SAVE)? 1:0;
2847
	RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
2804
	RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
2848
#ifndef RT30xx
2805
2849
	DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetPsmBit = %d\n", psm));
2806
	DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetPsmBit = %d\n", psm));
2850
#endif
2851
}
2807
}
2852
2808
2853
// IRQL = DISPATCH_LEVEL
2809
// IRQL = DISPATCH_LEVEL
Lines 3877-3894 ULONG BssTableSetEntry( Link Here
3877
	}
3833
	}
3878
	else
3834
	else
3879
	{
3835
	{
3880
#ifdef RT30xx
3881
		/* avoid  Hidden SSID form beacon to overwirite correct SSID from probe response */
3836
		/* avoid  Hidden SSID form beacon to overwirite correct SSID from probe response */
3882
		if ((SSID_EQUAL(Ssid, SsidLen, Tab->BssEntry[Idx].Ssid, Tab->BssEntry[Idx].SsidLen)) ||
3837
		if ((SSID_EQUAL(Ssid, SsidLen, Tab->BssEntry[Idx].Ssid, Tab->BssEntry[Idx].SsidLen)) ||
3883
			(NdisEqualMemory(Tab->BssEntry[Idx].Ssid, ZeroSsid, Tab->BssEntry[Idx].SsidLen)))
3838
			(NdisEqualMemory(Tab->BssEntry[Idx].Ssid, ZeroSsid, Tab->BssEntry[Idx].SsidLen)))
3884
		{
3839
		{
3885
#endif
3886
		BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen, BssType, BeaconPeriod,CfParm, AtimWin,
3840
		BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen, BssType, BeaconPeriod,CfParm, AtimWin,
3887
					CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,pHtCapability, pAddHtInfo,HtCapabilityLen, AddHtInfoLen,
3841
					CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,pHtCapability, pAddHtInfo,HtCapabilityLen, AddHtInfoLen,
3888
					NewExtChanOffset, ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm, pQosCapability, pQbssLoad, LengthVIE, pVIE);
3842
					NewExtChanOffset, ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm, pQosCapability, pQbssLoad, LengthVIE, pVIE);
3889
#ifdef RT30xx
3890
		}
3843
		}
3891
#endif
3892
	}
3844
	}
3893
3845
3894
	return Idx;
3846
	return Idx;
Lines 3949-3962 VOID BssTableSsidSort( Link Here
3949
							continue;
3901
							continue;
3950
3902
3951
					// check group cipher
3903
					// check group cipher
3952
#ifndef RT30xx
3904
					if (pInBss->WPA.GroupCipher != Ndis802_11GroupWEP40Enabled &&
3953
					if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&
3905
					    pInBss->WPA.GroupCipher != Ndis802_11GroupWEP104Enabled &&
3954
						(pInBss->WPA.GroupCipher != Ndis802_11GroupWEP40Enabled) &&
3906
					    pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher)
3955
						(pInBss->WPA.GroupCipher != Ndis802_11GroupWEP104Enabled))
3956
#endif
3957
#ifdef RT30xx
3958
					if (pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher)
3959
#endif
3960
						continue;
3907
						continue;
3961
3908
3962
					// check pairwise cipher, skip if none matched
3909
					// check pairwise cipher, skip if none matched
Lines 3975-3988 VOID BssTableSsidSort( Link Here
3975
							continue;
3922
							continue;
3976
3923
3977
					// check group cipher
3924
					// check group cipher
3978
#ifndef RT30xx
3925
					if (pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP40Enabled &&
3979
					if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&
3926
					    pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP104Enabled &&
3980
						(pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP40Enabled) &&
3927
					    pAd->StaCfg.WepStatus < pInBss->WPA2.GroupCipher)
3981
						(pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP104Enabled))
3982
#endif
3983
#ifdef RT30xx
3984
					if (pAd->StaCfg.WepStatus < pInBss->WPA2.GroupCipher)
3985
#endif
3986
						continue;
3928
						continue;
3987
3929
3988
					// check pairwise cipher, skip if none matched
3930
					// check pairwise cipher, skip if none matched
Lines 4260-4275 VOID BssCipherParse( Link Here
4260
				switch (*pTmp)
4202
				switch (*pTmp)
4261
				{
4203
				{
4262
					case 1:
4204
					case 1:
4263
#ifndef RT30xx
4264
						pBss->WPA.GroupCipher = Ndis802_11GroupWEP40Enabled;
4205
						pBss->WPA.GroupCipher = Ndis802_11GroupWEP40Enabled;
4265
						break;
4206
						break;
4266
					case 5:
4207
					case 5:
4267
						pBss->WPA.GroupCipher = Ndis802_11GroupWEP104Enabled;
4208
						pBss->WPA.GroupCipher = Ndis802_11GroupWEP104Enabled;
4268
#endif
4269
#ifdef RT30xx
4270
					case 5:	// Although WEP is not allowed in WPA related auth mode, we parse it anyway
4271
						pBss->WPA.GroupCipher = Ndis802_11Encryption1Enabled;
4272
#endif
4273
						break;
4209
						break;
4274
					case 2:
4210
					case 2:
4275
						pBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled;
4211
						pBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled;
Lines 4385-4400 VOID BssCipherParse( Link Here
4385
				switch (pCipher->Type)
4321
				switch (pCipher->Type)
4386
				{
4322
				{
4387
					case 1:
4323
					case 1:
4388
#ifndef RT30xx
4389
						pBss->WPA2.GroupCipher = Ndis802_11GroupWEP40Enabled;
4324
						pBss->WPA2.GroupCipher = Ndis802_11GroupWEP40Enabled;
4390
						break;
4325
						break;
4391
					case 5:
4326
					case 5:
4392
						pBss->WPA2.GroupCipher = Ndis802_11GroupWEP104Enabled;
4327
						pBss->WPA2.GroupCipher = Ndis802_11GroupWEP104Enabled;
4393
#endif
4394
#ifdef RT30xx
4395
					case 5:	// Although WEP is not allowed in WPA related auth mode, we parse it anyway
4396
						pBss->WPA2.GroupCipher = Ndis802_11Encryption1Enabled;
4397
#endif
4398
						break;
4328
						break;
4399
					case 2:
4329
					case 2:
4400
						pBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled;
4330
						pBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled;
Lines 5635-5753 VOID AsicUpdateProtect( Link Here
5635
	}
5565
	}
5636
}
5566
}
5637
5567
5638
#ifdef RT30xx
5568
#ifdef RT2870
5639
/*
5640
	========================================================================
5641
5642
	Routine Description: Write RT30xx RF register through MAC
5643
5644
	Arguments:
5645
5646
	Return Value:
5647
5648
	IRQL =
5649
5650
	Note:
5651
5652
	========================================================================
5653
*/
5654
NTSTATUS RT30xxWriteRFRegister(
5655
	IN	PRTMP_ADAPTER	pAd,
5656
	IN	UCHAR			RegID,
5657
	IN	UCHAR			Value)
5658
{
5659
	RF_CSR_CFG_STRUC	rfcsr;
5660
	UINT				i = 0;
5661
5662
	do
5663
	{
5664
		RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
5665
5666
		if (!rfcsr.field.RF_CSR_KICK)
5667
			break;
5668
		i++;
5669
	}
5670
	while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
5671
5672
	if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
5673
	{
5674
		DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
5675
		return STATUS_UNSUCCESSFUL;
5676
	}
5677
5678
	rfcsr.field.RF_CSR_WR = 1;
5679
	rfcsr.field.RF_CSR_KICK = 1;
5680
	rfcsr.field.TESTCSR_RFACC_REGNUM = RegID;
5681
	rfcsr.field.RF_CSR_DATA = Value;
5682
5683
	RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
5684
5685
	return STATUS_SUCCESS;
5686
}
5687
5688
5689
/*
5690
	========================================================================
5691
5692
	Routine Description: Read RT30xx RF register through MAC
5693
5694
	Arguments:
5695
5696
	Return Value:
5697
5698
	IRQL =
5699
5700
	Note:
5701
5702
	========================================================================
5703
*/
5704
NTSTATUS RT30xxReadRFRegister(
5705
	IN	PRTMP_ADAPTER	pAd,
5706
	IN	UCHAR			RegID,
5707
	IN	PUCHAR			pValue)
5708
{
5709
	RF_CSR_CFG_STRUC	rfcsr;
5710
	UINT				i=0, k=0;
5711
5712
	for (i=0; i<MAX_BUSY_COUNT; i++)
5713
	{
5714
		RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
5715
5716
		if (rfcsr.field.RF_CSR_KICK == BUSY)
5717
		{
5718
			continue;
5719
		}
5720
		rfcsr.word = 0;
5721
		rfcsr.field.RF_CSR_WR = 0;
5722
		rfcsr.field.RF_CSR_KICK = 1;
5723
		rfcsr.field.TESTCSR_RFACC_REGNUM = RegID;
5724
		RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
5725
		for (k=0; k<MAX_BUSY_COUNT; k++)
5726
		{
5727
			RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
5728
5729
			if (rfcsr.field.RF_CSR_KICK == IDLE)
5730
				break;
5731
		}
5732
		if ((rfcsr.field.RF_CSR_KICK == IDLE) &&
5733
			(rfcsr.field.TESTCSR_RFACC_REGNUM == RegID))
5734
		{
5735
			*pValue = (UCHAR)rfcsr.field.RF_CSR_DATA;
5736
			break;
5737
		}
5738
	}
5739
	if (rfcsr.field.RF_CSR_KICK == BUSY)
5740
	{
5741
		DBGPRINT_ERR(("RF read R%d=0x%x fail, i[%d], k[%d]\n", RegID, rfcsr.word,i,k));
5742
		return STATUS_UNSUCCESSFUL;
5743
	}
5744
5745
	return STATUS_SUCCESS;
5746
}
5747
#endif // RT30xx //
5748
5749
#ifdef RT30xx
5750
// add by johnli, RF power sequence setup
5751
/*
5569
/*
5752
	==========================================================================
5570
	==========================================================================
5753
	Description:
5571
	Description:
Lines 5902-5909 VOID RT30xxReverseRFSleepModeSetup( Link Here
5902
		RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
5720
		RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
5903
	}
5721
	}
5904
}
5722
}
5905
// end johnli
5723
#endif
5906
#endif // RT30xx //
5907
5724
5908
/*
5725
/*
5909
	==========================================================================
5726
	==========================================================================
Lines 5926-5932 VOID AsicSwitchChannel( Link Here
5926
	RTMP_RF_REGS *RFRegTable;
5743
	RTMP_RF_REGS *RFRegTable;
5927
5744
5928
	// Search Tx power value
5745
	// Search Tx power value
5929
#ifdef RT30xx
5930
	// We can't use ChannelList to search channel, since some central channl's txpowr doesn't list
5746
	// We can't use ChannelList to search channel, since some central channl's txpowr doesn't list
5931
	// in ChannelList, so use TxPower array instead.
5747
	// in ChannelList, so use TxPower array instead.
5932
	//
5748
	//
Lines 5939-5976 VOID AsicSwitchChannel( Link Here
5939
			break;
5755
			break;
5940
		}
5756
		}
5941
	}
5757
	}
5942
#endif
5943
#ifndef RT30xx
5944
	for (index = 0; index < pAd->ChannelListNum; index++)
5945
	{
5946
		if (Channel == pAd->ChannelList[index].Channel)
5947
		{
5948
			TxPwer = pAd->ChannelList[index].Power;
5949
			TxPwer2 = pAd->ChannelList[index].Power2;
5950
			break;
5951
		}
5952
	}
5953
#endif
5954
5758
5955
	if (index == MAX_NUM_OF_CHANNELS)
5759
	if (index == MAX_NUM_OF_CHANNELS)
5956
	{
5957
#ifndef RT30xx
5958
		DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: Cant find the Channel#%d \n", Channel));
5959
#endif
5960
#ifdef RT30xx
5961
		DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: Can't find the Channel#%d \n", Channel));
5760
		DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: Can't find the Channel#%d \n", Channel));
5962
#endif
5963
	}
5964
5761
5965
#ifdef RT2870
5762
#ifdef RT2870
5966
	// The RF programming sequence is difference between 3xxx and 2xxx
5763
	// The RF programming sequence is difference between 3xxx and 2xxx
5967
#ifdef RT30xx
5764
	if ((IS_RT3070(pAd) || IS_RT3090(pAd)) && (
5968
	if ((IS_RT3070(pAd) || IS_RT3090(pAd)) && ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020) ||
5765
	     (pAd->RfIcType == RFIC_3022) || (pAd->RfIcType == RFIC_3021) ||
5969
		(pAd->RfIcType == RFIC_3021) || (pAd->RfIcType == RFIC_3022)))
5766
	     (pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020)))
5970
#endif
5971
#ifndef RT30xx
5972
	if (IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020)))
5973
#endif
5974
	{
5767
	{
5975
		/* modify by WY for Read RF Reg. error */
5768
		/* modify by WY for Read RF Reg. error */
5976
		UCHAR RFValue;
5769
		UCHAR RFValue;
Lines 5983-6004 VOID AsicSwitchChannel( Link Here
5983
				RT30xxWriteRFRegister(pAd, RF_R02, FreqItems3020[index].N);
5776
				RT30xxWriteRFRegister(pAd, RF_R02, FreqItems3020[index].N);
5984
				RT30xxWriteRFRegister(pAd, RF_R03, FreqItems3020[index].K);
5777
				RT30xxWriteRFRegister(pAd, RF_R03, FreqItems3020[index].K);
5985
5778
5986
#ifndef RT30xx
5987
				RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RFValue);
5988
				RFValue = (RFValue & 0xFC) | FreqItems3020[index].R;
5989
				RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RFValue);
5990
5991
				// Set Tx Power
5992
				RT30xxReadRFRegister(pAd, RF_R12, (PUCHAR)&RFValue);
5993
				RFValue = (RFValue & 0xE0) | TxPwer;
5994
				RT30xxWriteRFRegister(pAd, RF_R12, (UCHAR)RFValue);
5995
5996
				// Set RF offset
5997
				RT30xxReadRFRegister(pAd, RF_R23, (PUCHAR)&RFValue);
5998
				RFValue = (RFValue & 0x80) | pAd->RfFreqOffset;
5999
				RT30xxWriteRFRegister(pAd, RF_R23, (UCHAR)RFValue);
6000
#endif
6001
#ifdef RT30xx
6002
				RT30xxReadRFRegister(pAd, RF_R06, &RFValue);
5779
				RT30xxReadRFRegister(pAd, RF_R06, &RFValue);
6003
				RFValue = (RFValue & 0xFC) | FreqItems3020[index].R;
5780
				RFValue = (RFValue & 0xFC) | FreqItems3020[index].R;
6004
				RT30xxWriteRFRegister(pAd, RF_R06, RFValue);
5781
				RT30xxWriteRFRegister(pAd, RF_R06, RFValue);
Lines 6032-6038 VOID AsicSwitchChannel( Link Here
6032
				RT30xxReadRFRegister(pAd, RF_R23, &RFValue);
5809
				RT30xxReadRFRegister(pAd, RF_R23, &RFValue);
6033
				RFValue = (RFValue & 0x80) | pAd->RfFreqOffset;
5810
				RFValue = (RFValue & 0x80) | pAd->RfFreqOffset;
6034
				RT30xxWriteRFRegister(pAd, RF_R23, RFValue);
5811
				RT30xxWriteRFRegister(pAd, RF_R23, RFValue);
6035
#endif
6036
5812
6037
				// Set BW
5813
				// Set BW
6038
				if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40))
5814
				if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40))
Lines 6044-6061 VOID AsicSwitchChannel( Link Here
6044
				{
5820
				{
6045
					RFValue = pAd->Mlme.CaliBW20RfR24;
5821
					RFValue = pAd->Mlme.CaliBW20RfR24;
6046
				}
5822
				}
6047
#ifndef RT30xx
6048
				RT30xxWriteRFRegister(pAd, RF_R24, (UCHAR)RFValue);
6049
6050
				// Enable RF tuning
6051
				RT30xxReadRFRegister(pAd, RF_R07, (PUCHAR)&RFValue);
6052
				RFValue = RFValue | 0x1;
6053
				RT30xxWriteRFRegister(pAd, RF_R07, (UCHAR)RFValue);
6054
6055
				// latch channel for future usage.
6056
				pAd->LatchRfRegs.Channel = Channel;
6057
#endif
6058
#ifdef RT30xx
6059
				RT30xxWriteRFRegister(pAd, RF_R24, RFValue);
5823
				RT30xxWriteRFRegister(pAd, RF_R24, RFValue);
6060
				RT30xxWriteRFRegister(pAd, RF_R31, RFValue);
5824
				RT30xxWriteRFRegister(pAd, RF_R31, RFValue);
6061
5825
Lines 6076-6088 VOID AsicSwitchChannel( Link Here
6076
					FreqItems3020[index].N,
5840
					FreqItems3020[index].N,
6077
					FreqItems3020[index].K,
5841
					FreqItems3020[index].K,
6078
					FreqItems3020[index].R));
5842
					FreqItems3020[index].R));
6079
#endif
6080
6081
				break;
5843
				break;
6082
			}
5844
			}
6083
		}
5845
		}
6084
5846
6085
#ifndef RT30xx
6086
		DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n",
5847
		DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n",
6087
			Channel,
5848
			Channel,
6088
			pAd->RfIcType,
5849
			pAd->RfIcType,
Lines 6092-6098 VOID AsicSwitchChannel( Link Here
6092
			FreqItems3020[index].N,
5853
			FreqItems3020[index].N,
6093
			FreqItems3020[index].K,
5854
			FreqItems3020[index].K,
6094
			FreqItems3020[index].R));
5855
			FreqItems3020[index].R));
6095
#endif
6096
	}
5856
	}
6097
	else
5857
	else
6098
#endif // RT2870 //
5858
#endif // RT2870 //
Lines 6336-6433 VOID AsicLockChannel( Link Here
6336
{
6096
{
6337
}
6097
}
6338
6098
6339
/*
6340
	==========================================================================
6341
	Description:
6342
6343
	IRQL = PASSIVE_LEVEL
6344
	IRQL = DISPATCH_LEVEL
6345
6346
	==========================================================================
6347
 */
6348
VOID	AsicAntennaSelect(
6349
	IN	PRTMP_ADAPTER	pAd,
6350
	IN	UCHAR			Channel)
6351
{
6352
#ifdef RT30xx
6353
			if (pAd->Mlme.OneSecPeriodicRound % 2 == 1)
6354
			{
6355
				// patch for AsicSetRxAnt failed
6356
				pAd->RxAnt.EvaluatePeriod = 0;
6357
6358
				// check every 2 second. If rcv-beacon less than 5 in the past 2 second, then AvgRSSI is no longer a
6359
				// valid indication of the distance between this AP and its clients.
6360
				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
6361
				{
6362
					SHORT	realavgrssi1;
6363
6364
					// if no traffic then reset average rssi to trigger evaluation
6365
					if (pAd->StaCfg.NumOfAvgRssiSample < 5)
6366
					{
6367
						pAd->RxAnt.Pair1LastAvgRssi = (-99);
6368
						pAd->RxAnt.Pair2LastAvgRssi = (-99);
6369
						DBGPRINT(RT_DEBUG_TRACE, ("MlmePeriodicExec: no traffic/beacon, reset RSSI\n"));
6370
					}
6371
6372
					pAd->StaCfg.NumOfAvgRssiSample = 0;
6373
					realavgrssi1 = (pAd->RxAnt.Pair1AvgRssi[pAd->RxAnt.Pair1PrimaryRxAnt] >> 3);
6374
6375
					DBGPRINT(RT_DEBUG_TRACE,("Ant-realrssi0(%d), Lastrssi0(%d), EvaluateStableCnt=%d\n", realavgrssi1, pAd->RxAnt.Pair1LastAvgRssi, pAd->RxAnt.EvaluateStableCnt));
6376
6377
					// if the difference between two rssi is larger or less than 5, then evaluate the other antenna
6378
					if ((pAd->RxAnt.EvaluateStableCnt < 2) || (realavgrssi1 > (pAd->RxAnt.Pair1LastAvgRssi + 5)) || (realavgrssi1 < (pAd->RxAnt.Pair1LastAvgRssi - 5)))
6379
					{
6380
						pAd->RxAnt.Pair1LastAvgRssi = realavgrssi1;
6381
						AsicEvaluateRxAnt(pAd);
6382
					}
6383
				}
6384
				else
6385
				{
6386
					// if not connected, always switch antenna to try to connect
6387
					UCHAR	temp;
6388
6389
					temp = pAd->RxAnt.Pair1PrimaryRxAnt;
6390
					pAd->RxAnt.Pair1PrimaryRxAnt = pAd->RxAnt.Pair1SecondaryRxAnt;
6391
					pAd->RxAnt.Pair1SecondaryRxAnt = temp;
6392
6393
					DBGPRINT(RT_DEBUG_TRACE, ("MlmePeriodicExec: no connect, switch to another one to try connection\n"));
6394
6395
					AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
6396
				}
6397
			}
6398
#endif /* RT30xx */
6399
}
6400
6401
/*
6402
	========================================================================
6403
6404
	Routine Description:
6405
		Antenna miscellaneous setting.
6406
6407
	Arguments:
6408
		pAd						Pointer to our adapter
6409
		BandState				Indicate current Band State.
6410
6411
	Return Value:
6412
		None
6413
6414
	IRQL <= DISPATCH_LEVEL
6415
6416
	Note:
6417
		1.) Frame End type control
6418
			only valid for G only (RF_2527 & RF_2529)
6419
			0: means DPDT, set BBP R4 bit 5 to 1
6420
			1: means SPDT, set BBP R4 bit 5 to 0
6421
6422
6423
	========================================================================
6424
*/
6425
VOID	AsicAntennaSetting(
6426
	IN	PRTMP_ADAPTER	pAd,
6427
	IN	ABGBAND_STATE	BandState)
6428
{
6429
}
6430
6431
VOID AsicRfTuningExec(
6099
VOID AsicRfTuningExec(
6432
	IN PVOID SystemSpecific1,
6100
	IN PVOID SystemSpecific1,
6433
	IN PVOID FunctionContext,
6101
	IN PVOID FunctionContext,
Lines 7150-7162 VOID AsicSetEdcaParm( Link Here
7150
				Ac2Cfg.field.AcTxop = 5;
6818
				Ac2Cfg.field.AcTxop = 5;
7151
			}
6819
			}
7152
6820
7153
#ifdef RT30xx
6821
#ifdef RT2870
7154
			if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020)
6822
			if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020)
7155
			{
6823
			{
7156
				// Tuning for WiFi WMM S3-T07: connexant legacy sta ==> broadcom 11n sta.
6824
				// Tuning for WiFi WMM S3-T07: connexant legacy sta ==> broadcom 11n sta.
7157
				Ac2Cfg.field.Aifsn = 5;
6825
				Ac2Cfg.field.Aifsn = 5;
7158
			}
6826
			}
7159
#endif // RT30xx //
6827
#endif
7160
		}
6828
		}
7161
6829
7162
		Ac3Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VO];
6830
		Ac3Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VO];
Lines 7237-7247 VOID AsicSetEdcaParm( Link Here
7237
		}
6905
		}
7238
6906
7239
		AifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn - 1; //pEdcaParm->Aifsn[QID_AC_VO]; //for TGn wifi test
6907
		AifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn - 1; //pEdcaParm->Aifsn[QID_AC_VO]; //for TGn wifi test
7240
#ifdef RT30xx
6908
#ifdef RT2870
7241
		if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020)
6909
		if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020)
7242
			AifsnCsr.field.Aifsn2 = 0x2; //pEdcaParm->Aifsn[QID_AC_VI]; //for WiFi WMM S4-T04.
6910
			AifsnCsr.field.Aifsn2 = 0x2; //pEdcaParm->Aifsn[QID_AC_VI]; //for WiFi WMM S4-T04.
7243
#endif // RT30xx //
6911
#endif
7244
7245
		RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, AifsnCsr.word);
6912
		RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, AifsnCsr.word);
7246
6913
7247
		NdisMoveMemory(&pAd->CommonCfg.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));
6914
		NdisMoveMemory(&pAd->CommonCfg.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));
Lines 7303-7309 VOID AsicSetSlotTime( Link Here
7303
	SlotTime = (bUseShortSlotTime)? 9 : 20;
6970
	SlotTime = (bUseShortSlotTime)? 9 : 20;
7304
6971
7305
	{
6972
	{
7306
#ifndef RT30xx
7307
		// force using short SLOT time for FAE to demo performance when TxBurst is ON
6973
		// force using short SLOT time for FAE to demo performance when TxBurst is ON
7308
		if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))
6974
		if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))
7309
			|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))
6975
			|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))
Lines 7313-7322 VOID AsicSetSlotTime( Link Here
7313
			// And we will not set to short slot when bEnableTxBurst is TRUE.
6979
			// And we will not set to short slot when bEnableTxBurst is TRUE.
7314
		}
6980
		}
7315
		else if (pAd->CommonCfg.bEnableTxBurst)
6981
		else if (pAd->CommonCfg.bEnableTxBurst)
7316
#endif
7317
#ifdef RT30xx
7318
		if (pAd->CommonCfg.bEnableTxBurst)
7319
#endif
7320
			SlotTime = 9;
6982
			SlotTime = 9;
7321
	}
6983
	}
7322
6984
Lines 8331-8337 CHAR RTMPMaxRssi( Link Here
8331
	return larger;
7993
	return larger;
8332
}
7994
}
8333
7995
8334
#ifdef RT30xx
7996
#ifdef RT2870
8335
// Antenna divesity use GPIO3 and EESK pin for control
7997
// Antenna divesity use GPIO3 and EESK pin for control
8336
// Antenna and EEPROM access are both using EESK pin,
7998
// Antenna and EEPROM access are both using EESK pin,
8337
// Therefor we should avoid accessing EESK at the same time
7999
// Therefor we should avoid accessing EESK at the same time
Lines 8340-8346 VOID AsicSetRxAnt( Link Here
8340
	IN PRTMP_ADAPTER	pAd,
8002
	IN PRTMP_ADAPTER	pAd,
8341
	IN UCHAR			Ant)
8003
	IN UCHAR			Ant)
8342
{
8004
{
8343
#ifdef RT30xx
8344
	UINT32	Value;
8005
	UINT32	Value;
8345
	UINT32	x;
8006
	UINT32	x;
8346
8007
Lines 8379-8387 VOID AsicSetRxAnt( Link Here
8379
		RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
8040
		RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
8380
		DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n"));
8041
		DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n"));
8381
	}
8042
	}
8382
#endif // RT30xx //
8383
}
8043
}
8384
#endif /* RT30xx */
8044
#endif
8385
8045
8386
/*
8046
/*
8387
    ========================================================================
8047
    ========================================================================
Lines 8401-8478 VOID AsicEvaluateRxAnt( Link Here
8401
{
8061
{
8402
	UCHAR	BBPR3 = 0;
8062
	UCHAR	BBPR3 = 0;
8403
8063
8404
#ifndef RT30xx
8064
	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |
8405
	{
8065
				fRTMP_ADAPTER_HALT_IN_PROGRESS |
8406
		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS	|
8066
				fRTMP_ADAPTER_RADIO_OFF |
8407
								fRTMP_ADAPTER_HALT_IN_PROGRESS	|
8067
				fRTMP_ADAPTER_NIC_NOT_EXIST |
8408
								fRTMP_ADAPTER_RADIO_OFF			|
8068
				fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)
8409
								fRTMP_ADAPTER_NIC_NOT_EXIST		|
8069
				|| OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
8410
								fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
8411
			return;
8412
8413
		if (pAd->StaCfg.Psm == PWR_SAVE)
8414
			return;
8415
	}
8416
8417
	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
8418
	BBPR3 &= (~0x18);
8419
	if(pAd->Antenna.field.RxPath == 3)
8420
	{
8421
		BBPR3 |= (0x10);
8422
	}
8423
	else if(pAd->Antenna.field.RxPath == 2)
8424
	{
8425
		BBPR3 |= (0x8);
8426
	}
8427
	else if(pAd->Antenna.field.RxPath == 1)
8428
	{
8429
		BBPR3 |= (0x0);
8430
	}
8431
	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8432
8433
#ifdef RT2860
8434
    	pAd->StaCfg.BBPR3 = BBPR3;
8435
#endif
8436
#ifdef RT2870
8070
#ifdef RT2870
8437
	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
8071
				|| (pAd->EepromAccess)
8438
		)
8439
	{
8440
		ULONG	TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount +
8441
								pAd->RalinkCounters.OneSecTxRetryOkCount +
8442
								pAd->RalinkCounters.OneSecTxFailCount;
8443
8444
		if (TxTotalCnt > 50)
8445
		{
8446
			RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);
8447
			pAd->Mlme.bLowThroughput = FALSE;
8448
		}
8449
		else
8450
		{
8451
			RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
8452
			pAd->Mlme.bLowThroughput = TRUE;
8453
		}
8454
	}
8455
#endif
8072
#endif
8456
#endif /* RT30xx */
8073
				)
8457
#ifdef RT30xx
8074
			return;
8458
	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS	|
8459
							fRTMP_ADAPTER_HALT_IN_PROGRESS	|
8460
							fRTMP_ADAPTER_RADIO_OFF			|
8461
							fRTMP_ADAPTER_NIC_NOT_EXIST		|
8462
							fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) ||
8463
							OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
8464
#ifdef RT30xx
8465
							|| (pAd->EepromAccess)
8466
#endif // RT30xx //
8467
							)
8468
		return;
8469
8470
8471
	{
8472
		//if (pAd->StaCfg.Psm == PWR_SAVE)
8473
		//	return;
8474
	}
8475
8075
8076
#ifdef RT30xx
8476
	// two antenna selection mechanism- one is antenna diversity, the other is failed antenna remove
8077
	// two antenna selection mechanism- one is antenna diversity, the other is failed antenna remove
8477
	// one is antenna diversity:there is only one antenna can rx and tx
8078
	// one is antenna diversity:there is only one antenna can rx and tx
8478
	// the other is failed antenna remove:two physical antenna can rx and tx
8079
	// the other is failed antenna remove:two physical antenna can rx and tx
Lines 8495-8500 VOID AsicEvaluateRxAnt( Link Here
8495
			RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
8096
			RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
8496
	}
8097
	}
8497
	else
8098
	else
8099
#endif
8498
	{
8100
	{
8499
		if (pAd->StaCfg.Psm == PWR_SAVE)
8101
		if (pAd->StaCfg.Psm == PWR_SAVE)
8500
			return;
8102
			return;
Lines 8514-8521 VOID AsicEvaluateRxAnt( Link Here
8514
			BBPR3 |= (0x0);
8116
			BBPR3 |= (0x0);
8515
		}
8117
		}
8516
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8118
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8119
8120
#ifdef RT2860
8121
		pAd->StaCfg.BBPR3 = BBPR3;
8122
#endif
8517
	}
8123
	}
8518
#endif /* RT30xx */
8519
8124
8520
	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
8125
	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
8521
		)
8126
		)
Lines 8561-8645 VOID AsicRxAntEvalTimeout( Link Here
8561
	UCHAR			BBPR3 = 0;
8166
	UCHAR			BBPR3 = 0;
8562
	CHAR			larger = -127, rssi0, rssi1, rssi2;
8167
	CHAR			larger = -127, rssi0, rssi1, rssi2;
8563
8168
8564
#ifndef RT30xx
8565
	{
8566
		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)	||
8567
			RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)		||
8568
			RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)			||
8569
			RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
8570
			return;
8571
8572
		if (pAd->StaCfg.Psm == PWR_SAVE)
8573
			return;
8574
8575
8576
		// if the traffic is low, use average rssi as the criteria
8577
		if (pAd->Mlme.bLowThroughput == TRUE)
8578
		{
8579
			rssi0 = pAd->StaCfg.RssiSample.LastRssi0;
8580
			rssi1 = pAd->StaCfg.RssiSample.LastRssi1;
8581
			rssi2 = pAd->StaCfg.RssiSample.LastRssi2;
8582
		}
8583
		else
8584
		{
8585
			rssi0 = pAd->StaCfg.RssiSample.AvgRssi0;
8586
			rssi1 = pAd->StaCfg.RssiSample.AvgRssi1;
8587
			rssi2 = pAd->StaCfg.RssiSample.AvgRssi2;
8588
		}
8589
8590
		if(pAd->Antenna.field.RxPath == 3)
8591
		{
8592
			larger = max(rssi0, rssi1);
8593
8594
			if (larger > (rssi2 + 20))
8595
				pAd->Mlme.RealRxPath = 2;
8596
			else
8597
				pAd->Mlme.RealRxPath = 3;
8598
		}
8599
		else if(pAd->Antenna.field.RxPath == 2)
8600
		{
8601
			if (rssi0 > (rssi1 + 20))
8602
				pAd->Mlme.RealRxPath = 1;
8603
			else
8604
				pAd->Mlme.RealRxPath = 2;
8605
		}
8606
8607
		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
8608
		BBPR3 &= (~0x18);
8609
		if(pAd->Mlme.RealRxPath == 3)
8610
		{
8611
			BBPR3 |= (0x10);
8612
		}
8613
		else if(pAd->Mlme.RealRxPath == 2)
8614
		{
8615
			BBPR3 |= (0x8);
8616
		}
8617
		else if(pAd->Mlme.RealRxPath == 1)
8618
		{
8619
			BBPR3 |= (0x0);
8620
		}
8621
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8622
#ifdef RT2860
8623
		pAd->StaCfg.BBPR3 = BBPR3;
8624
#endif
8625
	}
8626
#endif /* RT30xx */
8627
#ifdef RT30xx
8628
	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS	|
8169
	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS	|
8629
							fRTMP_ADAPTER_HALT_IN_PROGRESS	|
8170
							fRTMP_ADAPTER_HALT_IN_PROGRESS	|
8630
							fRTMP_ADAPTER_RADIO_OFF			|
8171
							fRTMP_ADAPTER_RADIO_OFF			|
8631
							fRTMP_ADAPTER_NIC_NOT_EXIST) ||
8172
							fRTMP_ADAPTER_NIC_NOT_EXIST)
8632
							OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
8173
							|| OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
8633
#ifdef RT30xx
8174
#ifdef RT2870
8634
							|| (pAd->EepromAccess)
8175
							|| (pAd->EepromAccess)
8635
#endif // RT30xx //
8176
#endif
8636
							)
8177
							)
8637
		return;
8178
		return;
8638
8179
8639
	{
8180
	{
8640
		//if (pAd->StaCfg.Psm == PWR_SAVE)
8181
#ifdef RT30xx
8641
		//	return;
8642
8643
		if (pAd->NicConfig2.field.AntDiversity)
8182
		if (pAd->NicConfig2.field.AntDiversity)
8644
		{
8183
		{
8645
			if ((pAd->RxAnt.RcvPktNumWhenEvaluate != 0) && (pAd->RxAnt.Pair1AvgRssi[pAd->RxAnt.Pair1SecondaryRxAnt] >= pAd->RxAnt.Pair1AvgRssi[pAd->RxAnt.Pair1PrimaryRxAnt]))
8184
			if ((pAd->RxAnt.RcvPktNumWhenEvaluate != 0) && (pAd->RxAnt.Pair1AvgRssi[pAd->RxAnt.Pair1SecondaryRxAnt] >= pAd->RxAnt.Pair1AvgRssi[pAd->RxAnt.Pair1PrimaryRxAnt]))
Lines 8671-8676 VOID AsicRxAntEvalTimeout( Link Here
8671
					pAd->RxAnt.Pair1PrimaryRxAnt, (pAd->RxAnt.Pair1AvgRssi[0] >> 3), (pAd->RxAnt.Pair1AvgRssi[1] >> 3), pAd->RxAnt.RcvPktNumWhenEvaluate));
8210
					pAd->RxAnt.Pair1PrimaryRxAnt, (pAd->RxAnt.Pair1AvgRssi[0] >> 3), (pAd->RxAnt.Pair1AvgRssi[1] >> 3), pAd->RxAnt.RcvPktNumWhenEvaluate));
8672
		}
8211
		}
8673
		else
8212
		else
8213
#endif
8674
		{
8214
		{
8675
			if (pAd->StaCfg.Psm == PWR_SAVE)
8215
			if (pAd->StaCfg.Psm == PWR_SAVE)
8676
				return;
8216
				return;
Lines 8721-8733 VOID AsicRxAntEvalTimeout( Link Here
8721
				BBPR3 |= (0x0);
8261
				BBPR3 |= (0x0);
8722
			}
8262
			}
8723
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8263
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
8264
#ifdef RT2860
8265
			pAd->StaCfg.BBPR3 = BBPR3;
8266
#endif
8724
		}
8267
		}
8725
	}
8268
	}
8726
#endif /* RT30xx */
8727
}
8269
}
8728
8270
8729
8730
8731
VOID APSDPeriodicExec(
8271
VOID APSDPeriodicExec(
8732
	IN PVOID SystemSpecific1,
8272
	IN PVOID SystemSpecific1,
8733
	IN PVOID FunctionContext,
8273
	IN PVOID FunctionContext,
Lines 8942-8979 VOID AsicStaBbpTuning( Link Here
8942
#ifdef RT2870
8482
#ifdef RT2870
8943
			// RT3070 is a no LNA solution, it should have different control regarding to AGC gain control
8483
			// RT3070 is a no LNA solution, it should have different control regarding to AGC gain control
8944
			// Otherwise, it will have some throughput side effect when low RSSI
8484
			// Otherwise, it will have some throughput side effect when low RSSI
8945
#ifndef RT30xx
8946
			if (IS_RT3070(pAd))
8947
#endif
8948
#ifdef RT30xx
8949
			if (IS_RT30xx(pAd))
8485
			if (IS_RT30xx(pAd))
8950
#endif
8951
			{
8486
			{
8952
				if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)
8487
				if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)
8953
				{
8488
				{
8954
					R66 = 0x1C + 2*GET_LNA_GAIN(pAd) + 0x20;
8489
					R66 = 0x1C + 2*GET_LNA_GAIN(pAd) + 0x20;
8955
					if (OrigR66Value != R66)
8490
					if (OrigR66Value != R66)
8956
					{
8957
#ifndef RT30xx
8958
						RTUSBWriteBBPRegister(pAd, BBP_R66, R66);
8959
#endif
8960
#ifdef RT30xx
8961
						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
8491
						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
8962
#endif
8963
					}
8964
				}
8492
				}
8965
				else
8493
				else
8966
				{
8494
				{
8967
					R66 = 0x1C + 2*GET_LNA_GAIN(pAd);
8495
					R66 = 0x1C + 2*GET_LNA_GAIN(pAd);
8968
					if (OrigR66Value != R66)
8496
					if (OrigR66Value != R66)
8969
					{
8970
#ifndef RT30xx
8971
						RTUSBWriteBBPRegister(pAd, BBP_R66, R66);
8972
#endif
8973
#ifdef RT30xx
8974
						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
8497
						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
8975
#endif
8976
					}
8977
				}
8498
				}
8978
			}
8499
			}
8979
			else
8500
			else
Lines 9182-9196 VOID AsicTurnOffRFClk( Link Here
9182
	UCHAR			index;
8703
	UCHAR			index;
9183
	RTMP_RF_REGS	*RFRegTable;
8704
	RTMP_RF_REGS	*RFRegTable;
9184
8705
9185
#ifdef RT30xx
9186
	// The RF programming sequence is difference between 3xxx and 2xxx
8706
	// The RF programming sequence is difference between 3xxx and 2xxx
9187
	if (IS_RT3090(pAd))
8707
	if (IS_RT3090(pAd))
9188
	{
8708
	{
9189
		RT30xxLoadRFSleepModeSetup(pAd);  // add by johnli,  RF power sequence setup, load RF sleep-mode setup
8709
		RT30xxLoadRFSleepModeSetup(pAd);  // add by johnli,  RF power sequence setup, load RF sleep-mode setup
8710
		return;
9190
	}
8711
	}
9191
	else
8712
9192
	{
9193
#endif // RT30xx //
9194
	RFRegTable = RF2850RegTable;
8713
	RFRegTable = RF2850RegTable;
9195
8714
9196
	switch (pAd->RfIcType)
8715
	switch (pAd->RfIcType)
Lines 9232-9241 VOID AsicTurnOffRFClk( Link Here
9232
		default:
8751
		default:
9233
			break;
8752
			break;
9234
	}
8753
	}
9235
#ifdef RT30xx
9236
	}
9237
#endif // RT30xx //
9238
9239
}
8754
}
9240
8755
9241
8756
Lines 9249-9262 VOID AsicTurnOnRFClk( Link Here
9249
	UCHAR			index;
8764
	UCHAR			index;
9250
	RTMP_RF_REGS	*RFRegTable;
8765
	RTMP_RF_REGS	*RFRegTable;
9251
8766
9252
#ifdef RT30xx
9253
	// The RF programming sequence is difference between 3xxx and 2xxx
8767
	// The RF programming sequence is difference between 3xxx and 2xxx
9254
	if (IS_RT3090(pAd))
8768
	if (IS_RT3090(pAd))
9255
	{
8769
		return;
9256
	}
8770
9257
	else
9258
	{
9259
#endif // RT30xx //
9260
	RFRegTable = RF2850RegTable;
8771
	RFRegTable = RF2850RegTable;
9261
8772
9262
	switch (pAd->RfIcType)
8773
	switch (pAd->RfIcType)
Lines 9303-9316 VOID AsicTurnOnRFClk( Link Here
9303
			break;
8814
			break;
9304
	}
8815
	}
9305
8816
9306
#ifndef RT30xx
9307
	DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOnRFClk#%d(RF=%d, ) , R2=0x%08x\n",
8817
	DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOnRFClk#%d(RF=%d, ) , R2=0x%08x\n",
9308
		Channel,
8818
		Channel,
9309
		pAd->RfIcType,
8819
		pAd->RfIcType,
9310
		R2));
8820
		R2));
9311
#endif
9312
#ifdef RT30xx
9313
	}
9314
#endif // RT30xx //
9315
}
8821
}
9316
8822
(-)a/drivers/staging/rt2860/common/rtmp_init.c (-362 / +24 lines)
Lines 38-53 Link Here
38
    Jan Lee  2006-09-15    RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
38
    Jan Lee  2006-09-15    RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
39
*/
39
*/
40
#include "../rt_config.h"
40
#include "../rt_config.h"
41
#ifndef RT30xx
42
#ifdef RT2860
41
#ifdef RT2860
43
#include "firmware.h"
42
#include "firmware.h"
44
#include <linux/bitrev.h>
43
#include <linux/bitrev.h>
45
#endif
44
#endif
46
#ifdef RT2870
45
#ifdef RT2870
47
#include "../../rt2870/common/firmware.h"
46
/* New firmware handles both RT2870 and RT3070. */
48
#endif
49
#endif
50
#ifdef RT30xx
51
#include "../../rt3070/firmware.h"
47
#include "../../rt3070/firmware.h"
52
#endif
48
#endif
53
49
Lines 63-121 ULONG BIT32[] = {0x00000001, 0x00000002, 0x00000004, 0x00000008, Link Here
63
59
64
char*   CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
60
char*   CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128"};
65
61
66
const unsigned short ccitt_16Table[] = {
67
	0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
68
	0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
69
	0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
70
	0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
71
	0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
72
	0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
73
	0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
74
	0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
75
	0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
76
	0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
77
	0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
78
	0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
79
	0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
80
	0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
81
	0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
82
	0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
83
	0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
84
	0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
85
	0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
86
	0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
87
	0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
88
	0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
89
	0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
90
	0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
91
	0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
92
	0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
93
	0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
94
	0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
95
	0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
96
	0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
97
	0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
98
	0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
99
};
100
#define ByteCRC16(v, crc) \
101
	(unsigned short)((crc << 8) ^  ccitt_16Table[((crc >> 8) ^ (v)) & 255])
102
103
#ifdef RT2870
104
unsigned char BitReverse(unsigned char x)
105
{
106
	int i;
107
	unsigned char Temp=0;
108
	for(i=0; ; i++)
109
	{
110
		if(x & 0x80)	Temp |= 0x80;
111
		if(i==7)		break;
112
		x	<<= 1;
113
		Temp >>= 1;
114
	}
115
	return Temp;
116
}
117
#endif
118
119
//
62
//
120
// BBP register initialization set
63
// BBP register initialization set
121
//
64
//
Lines 147-158 REG_PAIR RT30xx_RFRegTable[] = { Link Here
147
        {RF_R06,          0x02},
90
        {RF_R06,          0x02},
148
        {RF_R07,          0x70},
91
        {RF_R07,          0x70},
149
        {RF_R09,          0x0F},
92
        {RF_R09,          0x0F},
150
#ifndef RT30xx
151
        {RF_R10,          0x71},
152
#endif
153
#ifdef RT30xx
154
        {RF_R10,          0x41},
93
        {RF_R10,          0x41},
155
#endif
156
        {RF_R11,          0x21},
94
        {RF_R11,          0x21},
157
        {RF_R12,          0x7B},
95
        {RF_R12,          0x7B},
158
        {RF_R14,          0x90},
96
        {RF_R14,          0x90},
Lines 165-173 REG_PAIR RT30xx_RFRegTable[] = { Link Here
165
        {RF_R21,          0xDB},
103
        {RF_R21,          0xDB},
166
        {RF_R24,          0x16},
104
        {RF_R24,          0x16},
167
        {RF_R25,          0x01},
105
        {RF_R25,          0x01},
168
#ifndef RT30xx
169
        {RF_R27,          0x03},
170
#endif
171
        {RF_R29,          0x1F},
106
        {RF_R29,          0x1F},
172
};
107
};
173
#define	NUM_RF_REG_PARMS	(sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))
108
#define	NUM_RF_REG_PARMS	(sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR))
Lines 1099-1243 NDIS_STATUS NICReadRegParameters( Link Here
1099
1034
1100
	========================================================================
1035
	========================================================================
1101
*/
1036
*/
1102
#ifndef RT30xx
1103
VOID RTUSBFilterCalibration(
1104
	IN PRTMP_ADAPTER pAd)
1105
{
1106
	UCHAR	R55x = 0, value, FilterTarget = 0x1E, BBPValue;
1107
	UINT	loop = 0, count = 0, loopcnt = 0, ReTry = 0;
1108
	UCHAR	RF_R24_Value = 0;
1109
1110
	// Give bbp filter initial value
1111
	pAd->Mlme.CaliBW20RfR24 = 0x16;
1112
	pAd->Mlme.CaliBW40RfR24 = 0x36;  //Bit[5] must be 1 for BW 40
1113
1114
	do
1115
	{
1116
		if (loop == 1)	//BandWidth = 40 MHz
1117
		{
1118
			// Write 0x27 to RF_R24 to program filter
1119
			RF_R24_Value = 0x27;
1120
			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1121
			FilterTarget = 0x19;
1122
1123
			// when calibrate BW40, BBP mask must set to BW40.
1124
			RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1125
			BBPValue&= (~0x18);
1126
			BBPValue|= (0x10);
1127
			RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1128
		}
1129
		else			//BandWidth = 20 MHz
1130
		{
1131
			// Write 0x07 to RF_R24 to program filter
1132
			RF_R24_Value = 0x07;
1133
			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1134
			FilterTarget = 0x16;
1135
		}
1136
1137
		// Write 0x01 to RF_R22 to enable baseband loopback mode
1138
		RT30xxReadRFRegister(pAd, RF_R22, &value);
1139
		value |= 0x01;
1140
		RT30xxWriteRFRegister(pAd, RF_R22, value);
1141
1142
		// Write 0x00 to BBP_R24 to set power & frequency of passband test tone
1143
		RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1144
1145
		do
1146
		{
1147
			// Write 0x90 to BBP_R25 to transmit test tone
1148
			RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1149
1150
			RTMPusecDelay(1000);
1151
			// Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
1152
			RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1153
			R55x = value & 0xFF;
1154
1155
		} while ((ReTry++ < 100) && (R55x == 0));
1156
1157
		// Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
1158
		RTUSBWriteBBPRegister(pAd, BBP_R24, 0x06);
1159
1160
		while(TRUE)
1161
		{
1162
			// Write 0x90 to BBP_R25 to transmit test tone
1163
			RTUSBWriteBBPRegister(pAd, BBP_R25, 0x90);
1164
1165
			//We need to wait for calibration
1166
			RTMPusecDelay(1000);
1167
			RTUSBReadBBPRegister(pAd, BBP_R55, &value);
1168
			value &= 0xFF;
1169
			if ((R55x - value) < FilterTarget)
1170
			{
1171
				RF_R24_Value ++;
1172
			}
1173
			else if ((R55x - value) == FilterTarget)
1174
			{
1175
				RF_R24_Value ++;
1176
				count ++;
1177
			}
1178
			else
1179
			{
1180
				break;
1181
			}
1182
1183
			// prevent infinite loop cause driver hang.
1184
			if (loopcnt++ > 100)
1185
			{
1186
				DBGPRINT(RT_DEBUG_ERROR, ("RTUSBFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
1187
				break;
1188
			}
1189
1190
			// Write RF_R24 to program filter
1191
			RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1192
		}
1193
1194
		if (count > 0)
1195
		{
1196
			RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
1197
		}
1198
1199
		// Store for future usage
1200
		if (loopcnt < 100)
1201
		{
1202
			if (loop++ == 0)
1203
			{
1204
				//BandWidth = 20 MHz
1205
				pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
1206
			}
1207
			else
1208
			{
1209
				//BandWidth = 40 MHz
1210
				pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
1211
				break;
1212
			}
1213
		}
1214
		else
1215
			break;
1216
1217
		RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
1218
1219
		// reset count
1220
		count = 0;
1221
	} while(TRUE);
1222
1223
	//
1224
	// Set back to initial state
1225
	//
1226
	RTUSBWriteBBPRegister(pAd, BBP_R24, 0);
1227
1228
	RT30xxReadRFRegister(pAd, RF_R22, &value);
1229
	value &= ~(0x01);
1230
	RT30xxWriteRFRegister(pAd, RF_R22, value);
1231
1232
	// set BBP back to BW20
1233
	RTUSBReadBBPRegister(pAd, BBP_R4, &BBPValue);
1234
	BBPValue&= (~0x18);
1235
	RTUSBWriteBBPRegister(pAd, BBP_R4, BBPValue);
1236
1237
	DBGPRINT(RT_DEBUG_TRACE, ("RTUSBFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1238
}
1239
#endif /* RT30xx */
1240
#ifdef RT30xx
1241
VOID RTMPFilterCalibration(
1037
VOID RTMPFilterCalibration(
1242
	IN PRTMP_ADAPTER pAd)
1038
	IN PRTMP_ADAPTER pAd)
1243
{
1039
{
Lines 1246-1254 VOID RTMPFilterCalibration( Link Here
1246
	UCHAR	RF_R24_Value = 0;
1042
	UCHAR	RF_R24_Value = 0;
1247
1043
1248
	// Give bbp filter initial value
1044
	// Give bbp filter initial value
1045
#ifndef RT2870
1046
	pAd->Mlme.CaliBW20RfR24 = 0x16;
1047
	pAd->Mlme.CaliBW40RfR24 = 0x36;  //Bit[5] must be 1 for BW 40
1048
#else
1249
	pAd->Mlme.CaliBW20RfR24 = 0x1F;
1049
	pAd->Mlme.CaliBW20RfR24 = 0x1F;
1250
	pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
1050
	pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
1251
1051
#endif
1252
	do
1052
	do
1253
	{
1053
	{
1254
		if (loop == 1)	//BandWidth = 40 MHz
1054
		if (loop == 1)	//BandWidth = 40 MHz
Lines 1266-1276 VOID RTMPFilterCalibration( Link Here
1266
			BBPValue&= (~0x18);
1066
			BBPValue&= (~0x18);
1267
			BBPValue|= (0x10);
1067
			BBPValue|= (0x10);
1268
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1068
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
1269
1069
#ifdef RT2870
1270
			// set to BW40
1070
			// set to BW40
1271
			RT30xxReadRFRegister(pAd, RF_R31, &value);
1071
			RT30xxReadRFRegister(pAd, RF_R31, &value);
1272
			value |= 0x20;
1072
			value |= 0x20;
1273
			RT30xxWriteRFRegister(pAd, RF_R31, value);
1073
			RT30xxWriteRFRegister(pAd, RF_R31, value);
1074
#endif
1274
		}
1075
		}
1275
		else			//BandWidth = 20 MHz
1076
		else			//BandWidth = 20 MHz
1276
		{
1077
		{
Lines 1281-1291 VOID RTMPFilterCalibration( Link Here
1281
				FilterTarget = 0x13;
1082
				FilterTarget = 0x13;
1282
			else
1083
			else
1283
				FilterTarget = 0x16;
1084
				FilterTarget = 0x16;
1284
1085
#ifdef RT2870
1285
			// set to BW20
1086
			// set to BW20
1286
			RT30xxReadRFRegister(pAd, RF_R31, &value);
1087
			RT30xxReadRFRegister(pAd, RF_R31, &value);
1287
			value &= (~0x20);
1088
			value &= (~0x20);
1288
			RT30xxWriteRFRegister(pAd, RF_R31, value);
1089
			RT30xxWriteRFRegister(pAd, RF_R31, value);
1090
#endif
1289
		}
1091
		}
1290
1092
1291
		// Write 0x01 to RF_R22 to enable baseband loopback mode
1093
		// Write 0x01 to RF_R22 to enable baseband loopback mode
Lines 1390-1426 VOID RTMPFilterCalibration( Link Here
1390
1192
1391
	DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1193
	DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
1392
}
1194
}
1393
#endif /* RT30xx */
1394
1195
1395
VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1196
VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd)
1396
{
1197
{
1397
	INT i;
1198
	INT i;
1398
	// Driver must read EEPROM to get RfIcType before initial RF registers
1199
	// Driver must read EEPROM to get RfIcType before initial RF registers
1399
	// Initialize RF register to default value
1200
	// Initialize RF register to default value
1400
#ifndef RT30xx
1401
        if (IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) ||(pAd->RfIcType == RFIC_2020)))
1402
        {
1403
                // Init RF calibration
1404
                // Driver should toggle RF R30 bit7 before init RF registers
1405
                ULONG RfReg = 0;
1406
                RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
1407
                RfReg |= 0x80;
1408
                RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1409
                RTMPusecDelay(1000);
1410
                RfReg &= 0x7F;
1411
                RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
1412
1413
                // Initialize RF register to default value
1414
                for (i = 0; i < NUM_RF_REG_PARMS; i++)
1415
                {
1416
                        RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1417
                }
1418
1419
                //For RF filter Calibration
1420
                RTUSBFilterCalibration(pAd);
1421
        }
1422
#endif
1423
#ifdef RT30xx
1424
	if (IS_RT3070(pAd) || IS_RT3071(pAd))
1201
	if (IS_RT3070(pAd) || IS_RT3071(pAd))
1425
	{
1202
	{
1426
		// Init RF calibration
1203
		// Init RF calibration
Lines 1441-1447 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd) Link Here
1441
			RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1218
			RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
1442
		}
1219
		}
1443
1220
1444
		// add by johnli
1445
		if (IS_RT3070(pAd))
1221
		if (IS_RT3070(pAd))
1446
		{
1222
		{
1447
			//  Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
1223
			//  Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
Lines 1498-1504 VOID NICInitRT30xxRFRegisters(IN PRTMP_ADAPTER pAd) Link Here
1498
			RT30xxLoadRFNormalModeSetup(pAd);
1274
			RT30xxLoadRFNormalModeSetup(pAd);
1499
		}
1275
		}
1500
	}
1276
	}
1501
#endif
1502
}
1277
}
1503
#endif // RT2870 //
1278
#endif // RT2870 //
1504
1279
Lines 1675-1681 VOID NICReadEEPROMParameters( Link Here
1675
	Antenna.word = pAd->EEPROMDefaultValue[0];
1450
	Antenna.word = pAd->EEPROMDefaultValue[0];
1676
	if (Antenna.word == 0xFFFF)
1451
	if (Antenna.word == 0xFFFF)
1677
	{
1452
	{
1678
#ifdef RT30xx
1679
		if(IS_RT3090(pAd))
1453
		if(IS_RT3090(pAd))
1680
		{
1454
		{
1681
			Antenna.word = 0;
1455
			Antenna.word = 0;
Lines 1685-1699 VOID NICReadEEPROMParameters( Link Here
1685
		}
1459
		}
1686
		else
1460
		else
1687
		{
1461
		{
1688
#endif // RT30xx //
1689
		Antenna.word = 0;
1462
		Antenna.word = 0;
1690
		Antenna.field.RfIcType = RFIC_2820;
1463
		Antenna.field.RfIcType = RFIC_2820;
1691
		Antenna.field.TxPath = 1;
1464
		Antenna.field.TxPath = 1;
1692
		Antenna.field.RxPath = 2;
1465
		Antenna.field.RxPath = 2;
1693
		DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1466
		DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word));
1694
#ifdef RT30xx
1695
		}
1467
		}
1696
#endif // RT30xx //
1697
	}
1468
	}
1698
1469
1699
	// Choose the desired Tx&Rx stream.
1470
	// Choose the desired Tx&Rx stream.
Lines 1722-1730 VOID NICReadEEPROMParameters( Link Here
1722
	NicConfig2.word = pAd->EEPROMDefaultValue[1];
1493
	NicConfig2.word = pAd->EEPROMDefaultValue[1];
1723
1494
1724
	{
1495
	{
1725
#ifndef RT30xx
1726
		NicConfig2.word = 0;
1727
#endif
1728
		if ((NicConfig2.word & 0x00ff) == 0xff)
1496
		if ((NicConfig2.word & 0x00ff) == 0xff)
1729
		{
1497
		{
1730
			NicConfig2.word &= 0xff00;
1498
			NicConfig2.word &= 0xff00;
Lines 1917-1930 VOID NICReadEEPROMParameters( Link Here
1917
1685
1918
	RTMPReadTxPwrPerRate(pAd);
1686
	RTMPReadTxPwrPerRate(pAd);
1919
1687
1920
#ifdef RT30xx
1921
	if (IS_RT30xx(pAd))
1922
	{
1923
		eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);
1924
		pAd->EFuseTag = (value & 0xff);
1925
	}
1926
#endif // RT30xx //
1927
1928
	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1688
	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
1929
}
1689
}
1930
1690
Lines 1969-1978 VOID NICInitAsicFromEEPROM( Link Here
1969
		}
1729
		}
1970
	}
1730
	}
1971
1731
1972
#ifndef RT30xx
1732
#ifndef RT2870
1973
	Antenna.word = pAd->Antenna.word;
1733
	Antenna.word = pAd->Antenna.word;
1974
#endif
1734
#else
1975
#ifdef RT30xx
1976
	Antenna.word = pAd->EEPROMDefaultValue[0];
1735
	Antenna.word = pAd->EEPROMDefaultValue[0];
1977
	if (Antenna.word == 0xFFFF)
1736
	if (Antenna.word == 0xFFFF)
1978
	{
1737
	{
Lines 1983-1989 VOID NICInitAsicFromEEPROM( Link Here
1983
	pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1742
	pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath;
1984
	pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1743
	pAd->RfIcType = (UCHAR) Antenna.field.RfIcType;
1985
1744
1986
#ifdef RT30xx
1745
#ifdef RT2870
1987
	DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));
1746
	DBGPRINT(RT_DEBUG_WARN, ("pAd->RfIcType = %d, RealRxPath=%d, TxPath = %d\n", pAd->RfIcType, pAd->Mlme.RealRxPath,Antenna.field.TxPath));
1988
1747
1989
	// Save the antenna for future use
1748
	// Save the antenna for future use
Lines 1991-1997 VOID NICInitAsicFromEEPROM( Link Here
1991
#endif
1750
#endif
1992
	NicConfig2.word = pAd->EEPROMDefaultValue[1];
1751
	NicConfig2.word = pAd->EEPROMDefaultValue[1];
1993
1752
1994
#ifdef RT30xx
1753
#ifdef RT2870
1995
	{
1754
	{
1996
		if ((NicConfig2.word & 0x00ff) == 0xff)
1755
		if ((NicConfig2.word & 0x00ff) == 0xff)
1997
		{
1756
		{
Lines 2007-2013 VOID NICInitAsicFromEEPROM( Link Here
2007
	// Save the antenna for future use
1766
	// Save the antenna for future use
2008
	pAd->NicConfig2.word = NicConfig2.word;
1767
	pAd->NicConfig2.word = NicConfig2.word;
2009
1768
2010
#ifdef RT30xx
1769
#ifdef RT2870
2011
	// set default antenna as main
1770
	// set default antenna as main
2012
	if (pAd->RfIcType == RFIC_3020)
1771
	if (pAd->RfIcType == RFIC_3020)
2013
		AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
1772
		AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
Lines 2078-2087 VOID NICInitAsicFromEEPROM( Link Here
2078
		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
1837
		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
2079
	else
1838
	else
2080
		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
1839
		pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
2081
	//
1840
2082
	// Since BBP has been progamed, to make sure BBP setting will be
1841
	/* BBP has been programmed so reset to UNKNOWN_BAND */
2083
	// upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!!
2084
	//
2085
	pAd->CommonCfg.BandState = UNKNOWN_BAND;
1842
	pAd->CommonCfg.BandState = UNKNOWN_BAND;
2086
1843
2087
	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
1844
	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
Lines 2351-2360 NDIS_STATUS NICInitializeAsic( Link Here
2351
	UINT32			MacCsr0 = 0;
2108
	UINT32			MacCsr0 = 0;
2352
	NTSTATUS		Status;
2109
	NTSTATUS		Status;
2353
	UCHAR			Value = 0xff;
2110
	UCHAR			Value = 0xff;
2354
#endif // RT2870 //
2355
#ifdef RT30xx
2356
	UINT32			eFuseCtrl;
2111
	UINT32			eFuseCtrl;
2357
#endif // RT30xx //
2112
#endif
2358
	USHORT			KeyIdx;
2113
	USHORT			KeyIdx;
2359
	INT				i,apidx;
2114
	INT				i,apidx;
2360
2115
Lines 2418-2438 NDIS_STATUS NICInitializeAsic( Link Here
2418
#endif // RT3070 //
2173
#endif // RT3070 //
2419
		RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2174
		RTMP_IO_WRITE32(pAd, (USHORT)MACRegTable[Index].Register, MACRegTable[Index].Value);
2420
	}
2175
	}
2421
2422
#ifndef RT30xx
2423
	if(IS_RT3070(pAd))
2424
	{
2425
		// According to Frank Hsu (from Gary Tsao)
2426
		RTMP_IO_WRITE32(pAd, (USHORT)TX_SW_CFG0, 0x00000400);
2427
2428
		// Initialize RT3070 serial MAC registers which is different from RT2870 serial
2429
		RTUSBWriteMACRegister(pAd, TX_SW_CFG1, 0);
2430
		RTUSBWriteMACRegister(pAd, TX_SW_CFG2, 0);
2431
	}
2432
#endif
2433
#endif // RT2870 //
2176
#endif // RT2870 //
2434
2177
2435
2436
	{
2178
	{
2437
		for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2179
		for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++)
2438
		{
2180
		{
Lines 2445-2451 NDIS_STATUS NICInitializeAsic( Link Here
2445
		}
2187
		}
2446
	}
2188
	}
2447
2189
2448
#ifdef RT30xx
2449
	// Initialize RT3070 serial MAc registers which is different from RT2870 serial
2190
	// Initialize RT3070 serial MAc registers which is different from RT2870 serial
2450
	if (IS_RT3090(pAd))
2191
	if (IS_RT3090(pAd))
2451
	{
2192
	{
Lines 2468-2473 NDIS_STATUS NICInitializeAsic( Link Here
2468
			RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
2209
			RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
2469
		}
2210
		}
2470
	}
2211
	}
2212
#ifdef RT2870
2471
	else if (IS_RT3070(pAd))
2213
	else if (IS_RT3070(pAd))
2472
	{
2214
	{
2473
		RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
2215
		RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
Lines 2514-2535 NDIS_STATUS NICInitializeAsic( Link Here
2514
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2256
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value);
2515
	}
2257
	}
2516
2258
2517
#ifndef RT30xx
2259
#ifndef RT2870
2518
	// for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2260
	// for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2519
	if ((pAd->MACVersion&0xffff) != 0x0101)
2261
	if ((pAd->MACVersion&0xffff) != 0x0101)
2520
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2262
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
2521
2263
#else
2522
#ifdef RT2870
2523
	//write RT3070 BBP wchich different with 2870 after write RT2870 BBP
2524
	if (IS_RT3070(pAd))
2525
	{
2526
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a);
2527
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x99);
2528
		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, 0x05);
2529
	}
2530
#endif // RT2870 //
2531
#endif
2532
#ifdef RT30xx
2533
	// for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2264
	// for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT.
2534
	// RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
2265
	// RT3090 should not program BBP R84 to 0x19, otherwise TX will block.
2535
	if (((pAd->MACVersion&0xffff) != 0x0101) && (!IS_RT30xx(pAd)))
2266
	if (((pAd->MACVersion&0xffff) != 0x0101) && (!IS_RT30xx(pAd)))
Lines 2666-2673 NDIS_STATUS NICInitializeAsic( Link Here
2666
	Counter&=0xffffff00;
2397
	Counter&=0xffffff00;
2667
	Counter|=0x000001e;
2398
	Counter|=0x000001e;
2668
	RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2399
	RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
2669
#endif // RT2870 //
2400
2670
#ifdef RT30xx
2671
	pAd->bUseEfuse=FALSE;
2401
	pAd->bUseEfuse=FALSE;
2672
	RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
2402
	RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
2673
	pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
2403
	pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
Lines 2678-2686 NDIS_STATUS NICInitializeAsic( Link Here
2678
	else
2408
	else
2679
	{
2409
	{
2680
			DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
2410
			DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
2681
2682
	}
2411
	}
2683
#endif // RT30xx //
2412
#endif
2684
2413
2685
	{
2414
	{
2686
		// for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
2415
		// for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT.
Lines 3160-3232 VOID NICUpdateRawCounters( Link Here
3160
		pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
2889
		pAd->RalinkCounters.TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count / 16);
3161
	}
2890
	}
3162
2891
3163
#ifdef DBG_DIAGNOSE
3164
	{
3165
		RtmpDiagStruct	*pDiag;
3166
		COUNTER_RALINK	*pRalinkCounters;
3167
		UCHAR			ArrayCurIdx, i;
3168
3169
		pDiag = &pAd->DiagStruct;
3170
		pRalinkCounters = &pAd->RalinkCounters;
3171
		ArrayCurIdx = pDiag->ArrayCurIdx;
3172
3173
		if (pDiag->inited == 0)
3174
		{
3175
			NdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_));
3176
			pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0;
3177
			pDiag->inited = 1;
3178
		}
3179
		else
3180
		{
3181
			// Tx
3182
			pDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount;
3183
			pDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount;
3184
			pDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount;
3185
			pDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count;
3186
			pDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count;
3187
			pDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count;
3188
			pDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count;
3189
			pDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count;
3190
			pDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count;
3191
			pDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count;
3192
			pDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count;
3193
			pDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count;
3194
			pDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count;
3195
			pDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count;
3196
			pDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count;
3197
			pDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count;
3198
			pDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count;
3199
			pDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count;
3200
			pDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count;
3201
3202
			pDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr;
3203
3204
			INC_RING_INDEX(pDiag->ArrayCurIdx,  DIAGNOSE_TIME);
3205
			ArrayCurIdx = pDiag->ArrayCurIdx;
3206
			for (i =0; i < 9; i++)
3207
			{
3208
				pDiag->TxDescCnt[ArrayCurIdx][i]= 0;
3209
				pDiag->TxSWQueCnt[ArrayCurIdx][i] =0;
3210
				pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3211
				pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3212
			}
3213
			pDiag->TxDataCnt[ArrayCurIdx] = 0;
3214
			pDiag->TxFailCnt[ArrayCurIdx] = 0;
3215
			pDiag->RxDataCnt[ArrayCurIdx] = 0;
3216
			pDiag->RxCrcErrCnt[ArrayCurIdx]  = 0;
3217
			for (i = 9; i < 24; i++) // 3*3
3218
			{
3219
				pDiag->TxDescCnt[ArrayCurIdx][i] = 0;
3220
				pDiag->TxMcsCnt[ArrayCurIdx][i] = 0;
3221
				pDiag->RxMcsCnt[ArrayCurIdx][i] = 0;
3222
}
3223
3224
			if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx)
3225
				INC_RING_INDEX(pDiag->ArrayStartIdx,  DIAGNOSE_TIME);
3226
		}
3227
3228
	}
3229
#endif // DBG_DIAGNOSE //
3230
2892
3231
2893
3232
}
2894
}
Lines 3652-3658 VOID UserCfgInit( Link Here
3652
		}
3314
		}
3653
	}
3315
	}
3654
3316
3655
#ifdef RT30xx
3317
#ifdef RT2870
3656
	pAd->EepromAccess = FALSE;
3318
	pAd->EepromAccess = FALSE;
3657
#endif
3319
#endif
3658
	pAd->Antenna.word = 0;
3320
	pAd->Antenna.word = 0;
(-)a/drivers/staging/rt2860/common/spectrum.c (-5 lines)
Lines 1570-1581 static VOID PeerMeasureReportAction( Link Here
1570
1570
1571
	if ((pMeasureReportInfo = kmalloc(sizeof(MEASURE_RPI_REPORT), GFP_ATOMIC)) == NULL)
1571
	if ((pMeasureReportInfo = kmalloc(sizeof(MEASURE_RPI_REPORT), GFP_ATOMIC)) == NULL)
1572
	{
1572
	{
1573
#ifndef RT30xx
1574
		DBGPRINT(RT_DEBUG_ERROR, ("%s unable to alloc memory for measure report buffer (size=%zu).\n", __func__, sizeof(MEASURE_RPI_REPORT)));
1573
		DBGPRINT(RT_DEBUG_ERROR, ("%s unable to alloc memory for measure report buffer (size=%zu).\n", __func__, sizeof(MEASURE_RPI_REPORT)));
1575
#endif
1576
#ifdef RT30xx
1577
		DBGPRINT(RT_DEBUG_ERROR, ("%s unable to alloc memory for measure report buffer (size=%d).\n", __func__, sizeof(MEASURE_RPI_REPORT)));
1578
#endif
1579
		return;
1574
		return;
1580
	}
1575
	}
1581
1576
(-)a/drivers/staging/rt2860/dfs.h (-12 lines)
Lines 77-94 ULONG RTMPReadRadarDuration( Link Here
77
VOID RTMPCleanRadarDuration(
77
VOID RTMPCleanRadarDuration(
78
	IN PRTMP_ADAPTER	pAd);
78
	IN PRTMP_ADAPTER	pAd);
79
79
80
VOID RTMPPrepareRDCTSFrame(
81
	IN	PRTMP_ADAPTER	pAd,
82
	IN	PUCHAR			pDA,
83
	IN	ULONG			Duration,
84
	IN  UCHAR           RTSRate,
85
	IN  ULONG           CTSBaseAddr,
86
	IN  UCHAR			FrameGap);
87
88
VOID RTMPPrepareRadarDetectParams(
89
	IN PRTMP_ADAPTER	pAd);
90
91
92
INT Set_ChMovingTime_Proc(
80
INT Set_ChMovingTime_Proc(
93
	IN PRTMP_ADAPTER pAd,
81
	IN PRTMP_ADAPTER pAd,
94
	IN PUCHAR arg);
82
	IN PUCHAR arg);
(-)a/drivers/staging/rt2860/link_list.h (-134 lines)
Lines 1-134 Link Here
1
/*
2
 *************************************************************************
3
 * Ralink Tech Inc.
4
 * 5F., No.36, Taiyuan St., Jhubei City,
5
 * Hsinchu County 302,
6
 * Taiwan, R.O.C.
7
 *
8
 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9
 *
10
 * This program is free software; you can redistribute it and/or modify  *
11
 * it under the terms of the GNU General Public License as published by  *
12
 * the Free Software Foundation; either version 2 of the License, or     *
13
 * (at your option) any later version.                                   *
14
 *                                                                       *
15
 * This program is distributed in the hope that it will be useful,       *
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18
 * GNU General Public License for more details.                          *
19
 *                                                                       *
20
 * You should have received a copy of the GNU General Public License     *
21
 * along with this program; if not, write to the                         *
22
 * Free Software Foundation, Inc.,                                       *
23
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24
 *                                                                       *
25
 *************************************************************************
26
 */
27
28
#ifndef __LINK_LIST_H__
29
#define __LINK_LIST_H__
30
31
typedef struct _LIST_ENTRY
32
{
33
	struct _LIST_ENTRY *pNext;
34
} LIST_ENTRY, *PLIST_ENTRY;
35
36
typedef struct _LIST_HEADR
37
{
38
	PLIST_ENTRY pHead;
39
	PLIST_ENTRY pTail;
40
	UCHAR size;
41
} LIST_HEADER, *PLIST_HEADER;
42
43
static inline VOID initList(
44
	IN PLIST_HEADER pList)
45
{
46
	pList->pHead = pList->pTail = NULL;
47
	pList->size = 0;
48
	return;
49
}
50
51
static inline VOID insertTailList(
52
	IN PLIST_HEADER pList,
53
	IN PLIST_ENTRY pEntry)
54
{
55
	pEntry->pNext = NULL;
56
	if (pList->pTail)
57
		pList->pTail->pNext = pEntry;
58
	else
59
		pList->pHead = pEntry;
60
	pList->pTail = pEntry;
61
	pList->size++;
62
63
	return;
64
}
65
66
static inline PLIST_ENTRY removeHeadList(
67
	IN PLIST_HEADER pList)
68
{
69
	PLIST_ENTRY pNext;
70
	PLIST_ENTRY pEntry;
71
72
	pEntry = pList->pHead;
73
	if (pList->pHead != NULL)
74
	{
75
		pNext = pList->pHead->pNext;
76
		pList->pHead = pNext;
77
		if (pNext == NULL)
78
			pList->pTail = NULL;
79
		pList->size--;
80
	}
81
	return pEntry;
82
}
83
84
static inline int getListSize(
85
	IN PLIST_HEADER pList)
86
{
87
	return pList->size;
88
}
89
90
static inline PLIST_ENTRY delEntryList(
91
	IN PLIST_HEADER pList,
92
	IN PLIST_ENTRY pEntry)
93
{
94
	PLIST_ENTRY pCurEntry;
95
	PLIST_ENTRY pPrvEntry;
96
97
	if(pList->pHead == NULL)
98
		return NULL;
99
100
	if(pEntry == pList->pHead)
101
	{
102
		pCurEntry = pList->pHead;
103
		pList->pHead = pCurEntry->pNext;
104
105
		if(pList->pHead == NULL)
106
			pList->pTail = NULL;
107
108
		pList->size--;
109
		return pCurEntry;
110
	}
111
112
	pPrvEntry = pList->pHead;
113
	pCurEntry = pPrvEntry->pNext;
114
	while(pCurEntry != NULL)
115
	{
116
		if (pEntry == pCurEntry)
117
		{
118
			pPrvEntry->pNext = pCurEntry->pNext;
119
120
			if(pEntry == pList->pTail)
121
				pList->pTail = pPrvEntry;
122
123
			pList->size--;
124
			break;
125
		}
126
		pPrvEntry = pCurEntry;
127
		pCurEntry = pPrvEntry->pNext;
128
	}
129
130
	return pCurEntry;
131
}
132
133
#endif // ___LINK_LIST_H__ //
134
(-)a/drivers/staging/rt2860/oid.h (-163 / +7 lines)
Lines 92-227 Link Here
92
//
92
//
93
#define	OID_GET_SET_TOGGLE			0x8000
93
#define	OID_GET_SET_TOGGLE			0x8000
94
94
95
#define	OID_802_11_NETWORK_TYPES_SUPPORTED			0x0103
95
#define OID_802_11_ADD_WEP			0x0112
96
#define	OID_802_11_NETWORK_TYPE_IN_USE				0x0104
96
#define OID_802_11_DISASSOCIATE			0x0114
97
#define	OID_802_11_RSSI_TRIGGER						0x0107
97
#define OID_802_11_BSSID_LIST_SCAN		0x0508
98
#define	RT_OID_802_11_RSSI							0x0108 //rt2860	only , kathy
98
#define OID_802_11_SSID				0x0509
99
#define	RT_OID_802_11_RSSI_1						0x0109 //rt2860	only , kathy
99
#define OID_802_11_BSSID			0x050A
100
#define	RT_OID_802_11_RSSI_2						0x010A //rt2860	only , kathy
100
#define OID_802_11_MIC_FAILURE_REPORT_FRAME	0x0528
101
#define	OID_802_11_NUMBER_OF_ANTENNAS				0x010B
102
#define	OID_802_11_RX_ANTENNA_SELECTED				0x010C
103
#define	OID_802_11_TX_ANTENNA_SELECTED				0x010D
104
#define	OID_802_11_SUPPORTED_RATES					0x010E
105
#define	OID_802_11_ADD_WEP							0x0112
106
#define	OID_802_11_REMOVE_WEP						0x0113
107
#define	OID_802_11_DISASSOCIATE						0x0114
108
#define	OID_802_11_PRIVACY_FILTER					0x0118
109
#define	OID_802_11_ASSOCIATION_INFORMATION			0x011E
110
#define	OID_802_11_TEST								0x011F
111
#define	RT_OID_802_11_COUNTRY_REGION				0x0507
112
#define	OID_802_11_BSSID_LIST_SCAN					0x0508
113
#define	OID_802_11_SSID								0x0509
114
#define	OID_802_11_BSSID							0x050A
115
#define	RT_OID_802_11_RADIO							0x050B
116
#define	RT_OID_802_11_PHY_MODE						0x050C
117
#define	RT_OID_802_11_STA_CONFIG					0x050D
118
#define	OID_802_11_DESIRED_RATES					0x050E
119
#define	RT_OID_802_11_PREAMBLE						0x050F
120
#define	OID_802_11_WEP_STATUS						0x0510
121
#define	OID_802_11_AUTHENTICATION_MODE				0x0511
122
#define	OID_802_11_INFRASTRUCTURE_MODE				0x0512
123
#define	RT_OID_802_11_RESET_COUNTERS				0x0513
124
#define	OID_802_11_RTS_THRESHOLD					0x0514
125
#define	OID_802_11_FRAGMENTATION_THRESHOLD			0x0515
126
#define	OID_802_11_POWER_MODE						0x0516
127
#define	OID_802_11_TX_POWER_LEVEL					0x0517
128
#define	RT_OID_802_11_ADD_WPA						0x0518
129
#define	OID_802_11_REMOVE_KEY						0x0519
130
#define	OID_802_11_ADD_KEY							0x0520
131
#define	OID_802_11_CONFIGURATION					0x0521
132
#define	OID_802_11_TX_PACKET_BURST					0x0522
133
#define	RT_OID_802_11_QUERY_NOISE_LEVEL				0x0523
134
#define	RT_OID_802_11_EXTRA_INFO					0x0524
135
#ifdef	DBG
136
#define	RT_OID_802_11_HARDWARE_REGISTER				0x0525
137
#endif
138
#define OID_802_11_ENCRYPTION_STATUS            OID_802_11_WEP_STATUS
139
#define OID_802_11_DEAUTHENTICATION                 0x0526
140
#define OID_802_11_DROP_UNENCRYPTED                 0x0527
141
#define OID_802_11_MIC_FAILURE_REPORT_FRAME         0x0528
142
143
// For 802.1x daemin using to require current driver configuration
144
#define OID_802_11_RADIUS_QUERY_SETTING				0x0540
145
101
146
#define	RT_OID_DEVICE_NAME							0x0607
102
#define	RT_OID_DEVICE_NAME							0x0607
147
#define	RT_OID_VERSION_INFO							0x0608
103
#define	RT_OID_VERSION_INFO							0x0608
148
#define	OID_802_11_BSSID_LIST						0x0609
149
#define	OID_802_3_CURRENT_ADDRESS					0x060A
150
#define	OID_GEN_MEDIA_CONNECT_STATUS				0x060B
104
#define	OID_GEN_MEDIA_CONNECT_STATUS				0x060B
151
#define	RT_OID_802_11_QUERY_LINK_STATUS				0x060C
152
#define	OID_802_11_RSSI								0x060D
153
#define	OID_802_11_STATISTICS						0x060E
154
#define	OID_GEN_RCV_OK								0x060F
105
#define	OID_GEN_RCV_OK								0x060F
155
#define	OID_GEN_RCV_NO_BUFFER						0x0610
106
#define	OID_GEN_RCV_NO_BUFFER						0x0610
156
#define	RT_OID_802_11_QUERY_EEPROM_VERSION			0x0611
157
#define	RT_OID_802_11_QUERY_FIRMWARE_VERSION		0x0612
158
#define	RT_OID_802_11_QUERY_LAST_RX_RATE			0x0613
159
#define	RT_OID_802_11_TX_POWER_LEVEL_1				0x0614
160
#define	RT_OID_802_11_QUERY_PIDVID					0x0615
161
107
162
#define OID_SET_COUNTERMEASURES                     0x0616
108
#define OID_SET_COUNTERMEASURES                     0x0616
163
#define OID_802_11_SET_IEEE8021X                    0x0617
164
#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY        0x0618
165
#define OID_802_11_PMKID                            0x0620
166
#define RT_OID_WPA_SUPPLICANT_SUPPORT               0x0621
109
#define RT_OID_WPA_SUPPLICANT_SUPPORT               0x0621
167
#define RT_OID_WE_VERSION_COMPILED                  0x0622
110
#define RT_OID_WE_VERSION_COMPILED                  0x0622
168
#define RT_OID_NEW_DRIVER                           0x0623
111
#define RT_OID_NEW_DRIVER                           0x0623
169
112
170
171
//rt2860 , kathy
113
//rt2860 , kathy
172
#define	RT_OID_802_11_SNR_0							0x0630
173
#define	RT_OID_802_11_SNR_1							0x0631
174
#define	RT_OID_802_11_QUERY_LAST_TX_RATE			0x0632
175
#define	RT_OID_802_11_QUERY_HT_PHYMODE				0x0633
176
#define	RT_OID_802_11_SET_HT_PHYMODE				0x0634
177
#define	OID_802_11_RELOAD_DEFAULTS					0x0635
178
#define	RT_OID_802_11_QUERY_APSD_SETTING			0x0636
179
#define	RT_OID_802_11_SET_APSD_SETTING				0x0637
180
#define	RT_OID_802_11_QUERY_APSD_PSM				0x0638
181
#define	RT_OID_802_11_SET_APSD_PSM					0x0639
182
#define	RT_OID_802_11_QUERY_DLS						0x063A
183
#define	RT_OID_802_11_SET_DLS						0x063B
184
#define	RT_OID_802_11_QUERY_DLS_PARAM				0x063C
185
#define	RT_OID_802_11_SET_DLS_PARAM					0x063D
186
#define RT_OID_802_11_QUERY_WMM              		0x063E
187
#define RT_OID_802_11_SET_WMM      					0x063F
188
#define RT_OID_802_11_QUERY_IMME_BA_CAP				0x0640
189
#define RT_OID_802_11_SET_IMME_BA_CAP				0x0641
190
#define RT_OID_802_11_QUERY_BATABLE					0x0642
191
#define RT_OID_802_11_ADD_IMME_BA					0x0643
192
#define RT_OID_802_11_TEAR_IMME_BA					0x0644
193
#define RT_OID_DRIVER_DEVICE_NAME                   0x0645
114
#define RT_OID_DRIVER_DEVICE_NAME                   0x0645
194
#define RT_OID_802_11_QUERY_DAT_HT_PHYMODE          0x0646
195
#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT          0x0647
115
#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT          0x0647
196
116
197
// Ralink defined OIDs
117
// Ralink defined OIDs
198
// Dennis Lee move to platform specific
118
// Dennis Lee move to platform specific
199
119
200
#define	RT_OID_802_11_BSSID					  (OID_GET_SET_TOGGLE |	OID_802_11_BSSID)
201
#define	RT_OID_802_11_SSID					  (OID_GET_SET_TOGGLE |	OID_802_11_SSID)
202
#define	RT_OID_802_11_INFRASTRUCTURE_MODE	  (OID_GET_SET_TOGGLE |	OID_802_11_INFRASTRUCTURE_MODE)
203
#define	RT_OID_802_11_ADD_WEP				  (OID_GET_SET_TOGGLE |	OID_802_11_ADD_WEP)
204
#define	RT_OID_802_11_ADD_KEY				  (OID_GET_SET_TOGGLE |	OID_802_11_ADD_KEY)
205
#define	RT_OID_802_11_REMOVE_WEP			  (OID_GET_SET_TOGGLE |	OID_802_11_REMOVE_WEP)
206
#define	RT_OID_802_11_REMOVE_KEY			  (OID_GET_SET_TOGGLE |	OID_802_11_REMOVE_KEY)
207
#define	RT_OID_802_11_DISASSOCIATE			  (OID_GET_SET_TOGGLE |	OID_802_11_DISASSOCIATE)
208
#define	RT_OID_802_11_AUTHENTICATION_MODE	  (OID_GET_SET_TOGGLE |	OID_802_11_AUTHENTICATION_MODE)
209
#define	RT_OID_802_11_PRIVACY_FILTER		  (OID_GET_SET_TOGGLE |	OID_802_11_PRIVACY_FILTER)
210
#define	RT_OID_802_11_BSSID_LIST_SCAN		  (OID_GET_SET_TOGGLE |	OID_802_11_BSSID_LIST_SCAN)
211
#define	RT_OID_802_11_WEP_STATUS			  (OID_GET_SET_TOGGLE |	OID_802_11_WEP_STATUS)
212
#define	RT_OID_802_11_RELOAD_DEFAULTS		  (OID_GET_SET_TOGGLE |	OID_802_11_RELOAD_DEFAULTS)
213
#define	RT_OID_802_11_NETWORK_TYPE_IN_USE	  (OID_GET_SET_TOGGLE |	OID_802_11_NETWORK_TYPE_IN_USE)
214
#define	RT_OID_802_11_TX_POWER_LEVEL		  (OID_GET_SET_TOGGLE |	OID_802_11_TX_POWER_LEVEL)
215
#define	RT_OID_802_11_RSSI_TRIGGER			  (OID_GET_SET_TOGGLE |	OID_802_11_RSSI_TRIGGER)
216
#define	RT_OID_802_11_FRAGMENTATION_THRESHOLD (OID_GET_SET_TOGGLE |	OID_802_11_FRAGMENTATION_THRESHOLD)
217
#define	RT_OID_802_11_RTS_THRESHOLD			  (OID_GET_SET_TOGGLE |	OID_802_11_RTS_THRESHOLD)
218
#define	RT_OID_802_11_RX_ANTENNA_SELECTED	  (OID_GET_SET_TOGGLE |	OID_802_11_RX_ANTENNA_SELECTED)
219
#define	RT_OID_802_11_TX_ANTENNA_SELECTED	  (OID_GET_SET_TOGGLE |	OID_802_11_TX_ANTENNA_SELECTED)
220
#define	RT_OID_802_11_SUPPORTED_RATES		  (OID_GET_SET_TOGGLE |	OID_802_11_SUPPORTED_RATES)
221
#define	RT_OID_802_11_DESIRED_RATES			  (OID_GET_SET_TOGGLE |	OID_802_11_DESIRED_RATES)
222
#define	RT_OID_802_11_CONFIGURATION			  (OID_GET_SET_TOGGLE |	OID_802_11_CONFIGURATION)
223
#define	RT_OID_802_11_POWER_MODE			  (OID_GET_SET_TOGGLE |	OID_802_11_POWER_MODE)
224
225
typedef enum _NDIS_802_11_STATUS_TYPE
120
typedef enum _NDIS_802_11_STATUS_TYPE
226
{
121
{
227
    Ndis802_11StatusType_Authentication,
122
    Ndis802_11StatusType_Authentication,
Lines 535-544 typedef enum _NDIS_802_11_WEP_STATUS Link Here
535
    Ndis802_11Encryption3KeyAbsent,
430
    Ndis802_11Encryption3KeyAbsent,
536
    Ndis802_11Encryption4Enabled,	// TKIP or AES mix
431
    Ndis802_11Encryption4Enabled,	// TKIP or AES mix
537
    Ndis802_11Encryption4KeyAbsent,
432
    Ndis802_11Encryption4KeyAbsent,
538
#ifndef RT30xx
539
    Ndis802_11GroupWEP40Enabled,
433
    Ndis802_11GroupWEP40Enabled,
540
	Ndis802_11GroupWEP104Enabled,
434
	Ndis802_11GroupWEP104Enabled,
541
#endif
542
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
435
} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
543
  NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
436
  NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
544
437
Lines 626-652 typedef struct _NDIS_802_11_CAPABILITY Link Here
626
     NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];
519
     NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];
627
} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;
520
} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;
628
521
629
#if WIRELESS_EXT <= 11
630
#ifndef SIOCDEVPRIVATE
631
#define SIOCDEVPRIVATE                              0x8BE0
632
#endif
633
#define SIOCIWFIRSTPRIV								SIOCDEVPRIVATE
634
#endif
635
636
#ifdef RT30xx
637
#define RT_PRIV_IOCTL_EXT							(SIOCIWFIRSTPRIV + 0x01) // Sync. with AP for wsc upnp daemon
522
#define RT_PRIV_IOCTL_EXT							(SIOCIWFIRSTPRIV + 0x01) // Sync. with AP for wsc upnp daemon
638
#endif
639
#define RTPRIV_IOCTL_SET							(SIOCIWFIRSTPRIV + 0x02)
523
#define RTPRIV_IOCTL_SET							(SIOCIWFIRSTPRIV + 0x02)
640
524
641
#ifdef DBG
642
#define RTPRIV_IOCTL_BBP                            (SIOCIWFIRSTPRIV + 0x03)
643
#define RTPRIV_IOCTL_MAC                            (SIOCIWFIRSTPRIV + 0x05)
644
#ifdef RT30xx
645
#define RTPRIV_IOCTL_RF                             (SIOCIWFIRSTPRIV + 0x13)
646
#endif
647
#define RTPRIV_IOCTL_E2P                            (SIOCIWFIRSTPRIV + 0x07)
648
#endif
649
650
#define RTPRIV_IOCTL_STATISTICS                     (SIOCIWFIRSTPRIV + 0x09)
525
#define RTPRIV_IOCTL_STATISTICS                     (SIOCIWFIRSTPRIV + 0x09)
651
#define RTPRIV_IOCTL_ADD_PMKID_CACHE                (SIOCIWFIRSTPRIV + 0x0A)
526
#define RTPRIV_IOCTL_ADD_PMKID_CACHE                (SIOCIWFIRSTPRIV + 0x0A)
652
#define RTPRIV_IOCTL_RADIUS_DATA                    (SIOCIWFIRSTPRIV + 0x0C)
527
#define RTPRIV_IOCTL_RADIUS_DATA                    (SIOCIWFIRSTPRIV + 0x0C)
Lines 667-708 enum { Link Here
667
    RAIO_OFF = 10,
542
    RAIO_OFF = 10,
668
    RAIO_ON = 11,
543
    RAIO_ON = 11,
669
	SHOW_CFG_VALUE = 20,
544
	SHOW_CFG_VALUE = 20,
670
#if !defined(RT2860) && !defined(RT30xx)
545
#if !defined(RT2860)
671
	SHOW_ADHOC_ENTRY_INFO = 21,
546
	SHOW_ADHOC_ENTRY_INFO = 21,
672
#endif
547
#endif
673
};
548
};
674
549
675
#define OID_802_11_BUILD_CHANNEL_EX				0x0714
676
#define OID_802_11_GET_CH_LIST					0x0715
677
#define OID_802_11_GET_COUNTRY_CODE				0x0716
678
#define OID_802_11_GET_CHANNEL_GEOGRAPHY		0x0717
679
680
#ifdef RT30xx
681
#define RT_OID_WSC_SET_PASSPHRASE                   0x0740 // passphrase for wpa(2)-psk
682
#define RT_OID_WSC_DRIVER_AUTO_CONNECT              0x0741
683
#define RT_OID_WSC_QUERY_DEFAULT_PROFILE            0x0742
684
#define RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX        0x0743
685
#define RT_OID_WSC_SET_ACTION                       0x0744
686
#define RT_OID_WSC_SET_SSID                         0x0745
687
#define RT_OID_WSC_SET_PIN_CODE                     0x0746
688
#define RT_OID_WSC_SET_MODE                         0x0747 // PIN or PBC
689
#define RT_OID_WSC_SET_CONF_MODE                    0x0748 // Enrollee or Registrar
690
#define RT_OID_WSC_SET_PROFILE                      0x0749
691
692
#define RT_OID_802_11_WSC_QUERY_PROFILE				0x0750
693
// for consistency with RT61
694
#define RT_OID_WSC_QUERY_STATUS						0x0751
695
#define RT_OID_WSC_PIN_CODE							0x0752
696
#define RT_OID_WSC_UUID								0x0753
697
#define RT_OID_WSC_SET_SELECTED_REGISTRAR			0x0754
698
#define RT_OID_WSC_EAPMSG							0x0755
699
#define RT_OID_WSC_MANUFACTURER						0x0756
700
#define RT_OID_WSC_MODEL_NAME						0x0757
701
#define RT_OID_WSC_MODEL_NO							0x0758
702
#define RT_OID_WSC_SERIAL_NO						0x0759
703
#define RT_OID_WSC_MAC_ADDRESS						0x0760
704
#endif
705
706
#ifdef LLTD_SUPPORT
550
#ifdef LLTD_SUPPORT
707
// for consistency with RT61
551
// for consistency with RT61
708
#define RT_OID_GET_PHY_MODE                         0x761
552
#define RT_OID_GET_PHY_MODE                         0x761
(-)a/drivers/staging/rt2860/rt2860.h (+2 lines)
Lines 292-297 rt2860_interrupt(int irq, void *dev_instance); Link Here
292
#define VEN_AWT_PCIe_DEVICE_ID	0x1059
292
#define VEN_AWT_PCIe_DEVICE_ID	0x1059
293
#define VEN_AWT_PCI_VENDOR_ID	0x1A3B
293
#define VEN_AWT_PCI_VENDOR_ID	0x1A3B
294
294
295
#define EDIMAX_PCI_VENDOR_ID	0x1432
296
295
// For RTMPPCIePowerLinkCtrlRestore () function
297
// For RTMPPCIePowerLinkCtrlRestore () function
296
#define RESTORE_HALT		    1
298
#define RESTORE_HALT		    1
297
#define RESTORE_WAKEUP		    2
299
#define RESTORE_WAKEUP		    2
(-)a/drivers/staging/rt2860/rt28xx.h (-20 / +2 lines)
Lines 47-60 Link Here
47
#define PCI_EECTRL			0x0004
47
#define PCI_EECTRL			0x0004
48
#define PCI_MCUCTRL			0x0008
48
#define PCI_MCUCTRL			0x0008
49
49
50
#ifdef RT30xx
50
typedef int NTSTATUS;
51
#define	OPT_14			0x114
52
51
53
typedef int				NTSTATUS;
52
#define	OPT_14			0x114
54
#define	RETRY_LIMIT             10
55
#define STATUS_SUCCESS				0x00
56
#define STATUS_UNSUCCESSFUL 		0x01
57
#endif
58
53
59
//
54
//
60
// SCH/DMA registers - base address 0x0200
55
// SCH/DMA registers - base address 0x0200
Lines 291-297 typedef union _USB_DMA_CFG_STRUC { Link Here
291
#define 	PBF_DBG 	 	 0x043c
286
#define 	PBF_DBG 	 	 0x043c
292
#define     PBF_CAP_CTRL     0x0440
287
#define     PBF_CAP_CTRL     0x0440
293
288
294
#ifdef RT30xx
295
// eFuse registers
289
// eFuse registers
296
#define EFUSE_CTRL              0x0580
290
#define EFUSE_CTRL              0x0580
297
#define EFUSE_DATA0             0x0590
291
#define EFUSE_DATA0             0x0590
Lines 319-325 typedef union _EFUSE_CTRL_STRUC { Link Here
319
313
320
#define LDO_CFG0 				0x05d4
314
#define LDO_CFG0 				0x05d4
321
#define GPIO_SWITCH				0x05dc
315
#define GPIO_SWITCH				0x05dc
322
#endif /* RT30xx */
323
316
324
//
317
//
325
//  4  MAC  registers
318
//  4  MAC  registers
Lines 1136-1144 typedef struct _HW_WCID_ENTRY { // 8-byte per entry Link Here
1136
#define BBP_R22                     22
1129
#define BBP_R22                     22
1137
#define BBP_R24                     24
1130
#define BBP_R24                     24
1138
#define BBP_R25                     25
1131
#define BBP_R25                     25
1139
#ifdef RT30xx
1140
#define BBP_R31                     31
1132
#define BBP_R31                     31
1141
#endif
1142
#define BBP_R49                     49 //TSSI
1133
#define BBP_R49                     49 //TSSI
1143
#define BBP_R50                     50
1134
#define BBP_R50                     50
1144
#define BBP_R51                     51
1135
#define BBP_R51                     51
Lines 1156-1165 typedef struct _HW_WCID_ENTRY { // 8-byte per entry Link Here
1156
#define BBP_R73                     73
1147
#define BBP_R73                     73
1157
#define BBP_R75						75
1148
#define BBP_R75						75
1158
#define BBP_R77                     77
1149
#define BBP_R77                     77
1159
#ifdef RT30xx
1160
#define BBP_R79                     79
1150
#define BBP_R79                     79
1161
#define BBP_R80                     80
1151
#define BBP_R80                     80
1162
#endif
1163
#define BBP_R81                     81
1152
#define BBP_R81                     81
1164
#define BBP_R82                     82
1153
#define BBP_R82                     82
1165
#define BBP_R83                     83
1154
#define BBP_R83                     83
Lines 1181-1189 typedef struct _HW_WCID_ENTRY { // 8-byte per entry Link Here
1181
#define BBP_R121                    121
1170
#define BBP_R121                    121
1182
#define BBP_R122                    122
1171
#define BBP_R122                    122
1183
#define BBP_R123                    123
1172
#define BBP_R123                    123
1184
#ifdef RT30xx
1185
#define BBP_R138                    138 // add by johnli, RF power sequence setup, ADC dynamic on/off control
1173
#define BBP_R138                    138 // add by johnli, RF power sequence setup, ADC dynamic on/off control
1186
#endif // RT30xx //
1187
1174
1188
1175
1189
#define BBPR94_DEFAULT              0x06 // Add 1 value will gain 1db
1176
#define BBPR94_DEFAULT              0x06 // Add 1 value will gain 1db
Lines 1607-1621 typedef union _EEPROM_NIC_CINFIG2_STRUC { Link Here
1607
		USHORT		EnableWPSPBC:1;                 // WPS PBC Control bit
1594
		USHORT		EnableWPSPBC:1;                 // WPS PBC Control bit
1608
		USHORT		BW40MAvailForG:1;			// 0:enable, 1:disable
1595
		USHORT		BW40MAvailForG:1;			// 0:enable, 1:disable
1609
		USHORT		BW40MAvailForA:1;			// 0:enable, 1:disable
1596
		USHORT		BW40MAvailForA:1;			// 0:enable, 1:disable
1610
#ifndef RT30xx
1611
		USHORT		Rsv2:6;                 // must be 0
1612
#endif
1613
#ifdef RT30xx
1614
		USHORT		Rsv1:1;					// must be 0
1597
		USHORT		Rsv1:1;					// must be 0
1615
		USHORT		AntDiversity:1;			// Antenna diversity
1598
		USHORT		AntDiversity:1;			// Antenna diversity
1616
		USHORT		Rsv2:3;					// must be 0
1599
		USHORT		Rsv2:3;					// must be 0
1617
		USHORT		DACTestBit:1;			// control if driver should patch the DAC issue
1600
		USHORT		DACTestBit:1;			// control if driver should patch the DAC issue
1618
#endif
1619
	}	field;
1601
	}	field;
1620
	USHORT			word;
1602
	USHORT			word;
1621
}	EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC;
1603
}	EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC;
(-)a/drivers/staging/rt2860/rt_config.h (-4 lines)
Lines 68-76 Link Here
68
#include "igmp_snoop.h"
68
#include "igmp_snoop.h"
69
#endif // IGMP_SNOOP_SUPPORT //
69
#endif // IGMP_SNOOP_SUPPORT //
70
70
71
#ifdef IKANOS_VX_1X0
72
#include	"vr_ikans.h"
73
#endif // IKANOS_VX_1X0 //
74
75
#endif	// __RT_CONFIG_H__
71
#endif	// __RT_CONFIG_H__
76
72
(-)a/drivers/staging/rt2860/rt_linux.c (-16 / +4 lines)
Lines 25-30 Link Here
25
 *************************************************************************
25
 *************************************************************************
26
 */
26
 */
27
27
28
#include <linux/sched.h>
28
#include "rt_config.h"
29
#include "rt_config.h"
29
30
30
ULONG	RTDebugLevel = RT_DEBUG_ERROR;
31
ULONG	RTDebugLevel = RT_DEBUG_ERROR;
Lines 537-545 PNDIS_PACKET duplicate_pkt( Link Here
537
	if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
538
	if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
538
	{
539
	{
539
		skb_reserve(skb, 2);
540
		skb_reserve(skb, 2);
540
		NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
541
		NdisMoveMemory(skb_tail_pointer(skb), pHeader802_3, HdrLen);
541
		skb_put(skb, HdrLen);
542
		skb_put(skb, HdrLen);
542
		NdisMoveMemory(skb->tail, pData, DataSize);
543
		NdisMoveMemory(skb_tail_pointer(skb), pData, DataSize);
543
		skb_put(skb, DataSize);
544
		skb_put(skb, DataSize);
544
		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
545
		skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
545
		pPacket = OSPKT_TO_RTPKT(skb);
546
		pPacket = OSPKT_TO_RTPKT(skb);
Lines 662-674 void announce_802_3_packet( Link Here
662
	pRxPkt = RTPKT_TO_OSPKT(pPacket);
663
	pRxPkt = RTPKT_TO_OSPKT(pPacket);
663
664
664
    /* Push up the protocol stack */
665
    /* Push up the protocol stack */
665
#ifdef IKANOS_VX_1X0
666
	IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
667
#else
668
	pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
666
	pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
669
667
670
	netif_rx(pRxPkt);
668
	netif_rx(pRxPkt);
671
#endif // IKANOS_VX_1X0 //
672
}
669
}
673
670
674
671
Lines 728-734 VOID RTMPSendWirelessEvent( Link Here
728
	IN	UCHAR			BssIdx,
725
	IN	UCHAR			BssIdx,
729
	IN	CHAR			Rssi)
726
	IN	CHAR			Rssi)
730
{
727
{
731
#if WIRELESS_EXT >= 15
732
728
733
	union 	iwreq_data      wrqu;
729
	union 	iwreq_data      wrqu;
734
	PUCHAR 	pBuf = NULL, pBufPtr = NULL;
730
	PUCHAR 	pBuf = NULL, pBufPtr = NULL;
Lines 776-782 VOID RTMPSendWirelessEvent( Link Here
776
		if (pAddr)
772
		if (pAddr)
777
			pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
773
			pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
778
		else if (BssIdx < MAX_MBSSID_NUM)
774
		else if (BssIdx < MAX_MBSSID_NUM)
779
			pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
775
			pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(wlan%d) ", BssIdx);
780
		else
776
		else
781
			pBufPtr += sprintf(pBufPtr, "(RT2860) ");
777
			pBufPtr += sprintf(pBufPtr, "(RT2860) ");
782
778
Lines 805-813 VOID RTMPSendWirelessEvent( Link Here
805
	}
801
	}
806
	else
802
	else
807
		DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
803
		DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
808
#else
809
	DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
810
#endif  /* WIRELESS_EXT >= 15 */
811
}
804
}
812
805
813
void send_monitor_packets(
806
void send_monitor_packets(
Lines 834-845 void send_monitor_packets( Link Here
834
827
835
    if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
828
    if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
836
    {
829
    {
837
#ifndef RT30xx
838
        DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
830
        DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
839
#endif
840
#ifdef RT30xx
841
        DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
842
#endif
843
		goto err_free_sk_buff;
831
		goto err_free_sk_buff;
844
    }
832
    }
845
833
(-)a/drivers/staging/rt2860/rt_linux.h (-101 / +17 lines)
Lines 63-72 Link Here
63
#include <linux/ctype.h>
63
#include <linux/ctype.h>
64
#include <linux/vmalloc.h>
64
#include <linux/vmalloc.h>
65
65
66
67
#ifdef RT30xx
68
#include <linux/wireless.h>
69
#endif
70
#include <net/iw_handler.h>
66
#include <net/iw_handler.h>
71
67
72
// load firmware
68
// load firmware
Lines 90-111 typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_ Link Here
90
86
91
// add by kathy
87
// add by kathy
92
88
93
#ifdef RT2860
89
/* order of "if defined()" is important, because for 3070 driver
94
#define STA_PROFILE_PATH			"/etc/Wireless/RT2860STA/RT2860STA.dat"
90
   both RT2870 and RT3070 are defined */
95
#define STA_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860STA/RT2860STA.bin"
91
#if defined(RT2860)
96
#define STA_NIC_DEVICE_NAME			"RT2860STA"
92
 #define STA_PROFILE_PATH			"/etc/Wireless/RT2860STA/RT2860STA.dat"
97
#define STA_DRIVER_VERSION			"1.8.1.1"
93
 #define STA_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860STA/RT2860STA.bin"
98
#endif
94
 #define STA_NIC_DEVICE_NAME			"RT2860STA"
99
#ifdef RT2870
95
 #define STA_DRIVER_VERSION			"1.8.1.1"
100
#define STA_PROFILE_PATH			"/etc/Wireless/RT2870STA/RT2870STA.dat"
96
#elif defined(RT3070)
101
#define STA_RT2870_IMAGE_FILE_NAME  "/etc/Wireless/RT2870STA/rt2870.bin"
97
 #define STA_PROFILE_PATH			"/etc/Wireless/RT3070STA/RT3070STA.dat"
102
#define STA_NIC_DEVICE_NAME			"RT2870STA"
98
 #define STA_RT2870_IMAGE_FILE_NAME  "/etc/Wireless/RT3070STA/rt2870.bin"
103
#ifndef RT30xx
99
 #define STA_NIC_DEVICE_NAME			"RT3070STA"
104
#define STA_DRIVER_VERSION			"1.4.0.0"
100
 #define STA_DRIVER_VERSION			"2.0.1.0"
105
#endif
101
#elif defined(RT2870)
106
#ifdef RT30xx
102
 #define STA_PROFILE_PATH			"/etc/Wireless/RT2870STA/RT2870STA.dat"
107
#define STA_DRIVER_VERSION			"2.0.1.0"
103
 #define STA_RT2870_IMAGE_FILE_NAME  "/etc/Wireless/RT2870STA/rt2870.bin"
108
#endif
104
 #define STA_NIC_DEVICE_NAME			"RT2870STA"
105
 #define STA_DRIVER_VERSION			"1.4.0.0"
109
#endif
106
#endif
110
107
111
#ifdef RT2860
108
#ifdef RT2860
Lines 161-175 typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_ Link Here
161
#define NDIS_PACKET_TYPE_BROADCAST		2
158
#define NDIS_PACKET_TYPE_BROADCAST		2
162
#define NDIS_PACKET_TYPE_ALL_MULTICAST	3
159
#define NDIS_PACKET_TYPE_ALL_MULTICAST	3
163
160
164
#ifndef RT30xx
165
typedef	struct pid *	THREAD_PID;
166
#define	THREAD_PID_INIT_VALUE	NULL
167
#define	GET_PID(_v)	find_get_pid(_v)
168
#define	GET_PID_NUMBER(_v)	pid_nr(_v)
169
#define CHECK_PID_LEGALITY(_pid)	if (pid_nr(_pid) >= 0)
170
#define KILL_THREAD_PID(_A, _B, _C)	kill_pid(_A, _B, _C)
171
#endif
172
173
struct os_lock  {
161
struct os_lock  {
174
	spinlock_t		lock;
162
	spinlock_t		lock;
175
	unsigned long  	flags;
163
	unsigned long  	flags;
Lines 185-200 struct os_cookie { Link Here
185
#ifdef RT2870
173
#ifdef RT2870
186
	struct usb_device		*pUsb_Dev;
174
	struct usb_device		*pUsb_Dev;
187
175
188
#ifndef RT30xx
189
	THREAD_PID				MLMEThr_pid;
190
	THREAD_PID				RTUSBCmdThr_pid;
191
	THREAD_PID				TimerQThr_pid;
192
#endif
193
#ifdef RT30xx
194
	struct pid	*MLMEThr_pid;
176
	struct pid	*MLMEThr_pid;
195
	struct pid	*RTUSBCmdThr_pid;
177
	struct pid	*RTUSBCmdThr_pid;
196
	struct pid	*TimerQThr_pid;
178
	struct pid	*TimerQThr_pid;
197
#endif
198
#endif // RT2870 //
179
#endif // RT2870 //
199
180
200
	struct tasklet_struct 	rx_done_task;
181
	struct tasklet_struct 	rx_done_task;
Lines 219-230 struct os_cookie { Link Here
219
	INT 					ioctl_if;
200
	INT 					ioctl_if;
220
};
201
};
221
202
222
typedef struct _VIRTUAL_ADAPTER
223
{
224
	struct net_device		*RtmpDev;
225
	struct net_device		*VirtualDev;
226
} VIRTUAL_ADAPTER, PVIRTUAL_ADAPTER;
227
228
#undef  ASSERT
203
#undef  ASSERT
229
#define ASSERT(x)
204
#define ASSERT(x)
230
205
Lines 444-494 extern ULONG RTDebugLevel; Link Here
444
}
419
}
445
420
446
#ifdef RT2860
421
#ifdef RT2860
447
#if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(IKANOS_VX_1X0)
448
//Patch for ASIC turst read/write bug, needs to remove after metel fix
449
#define RTMP_IO_READ32(_A, _R, _pV)									\
450
{																	\
451
    if ((_A)->bPCIclkOff == FALSE)                                      \
452
    {                                                                   \
453
	(*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)));		\
454
	(*_pV = readl((void *)((_A)->CSRBaseAddress + (_R))));			\
455
	(*_pV = SWAP32(*((UINT32 *)(_pV))));                           \
456
    }                                                                   \
457
}
458
#define RTMP_IO_FORCE_READ32(_A, _R, _pV)							\
459
{																	\
460
	(*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)));		\
461
	(*_pV = readl((void *)((_A)->CSRBaseAddress + (_R))));			\
462
	(*_pV = SWAP32(*((UINT32 *)(_pV))));                           \
463
}
464
#define RTMP_IO_READ8(_A, _R, _pV)									\
465
{																	\
466
	(*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)));		\
467
	(*_pV = readb((void *)((_A)->CSRBaseAddress + (_R))));			\
468
}
469
#define RTMP_IO_WRITE32(_A, _R, _V)									\
470
{																	\
471
    if ((_A)->bPCIclkOff == FALSE)                                      \
472
    {                                                                   \
473
	UINT32	_Val;													\
474
	_Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));		\
475
	_Val = SWAP32(_V);												\
476
	writel(_Val, (void *)((_A)->CSRBaseAddress + (_R)));			\
477
    }                                                                   \
478
}
479
#define RTMP_IO_WRITE8(_A, _R, _V)									\
480
{																	\
481
	UINT	Val;													\
482
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));		\
483
	writeb((_V), (PUCHAR)((_A)->CSRBaseAddress + (_R)));			\
484
}
485
#define RTMP_IO_WRITE16(_A, _R, _V)									\
486
{																	\
487
	UINT	Val;													\
488
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));		\
489
	writew(SWAP16((_V)), (PUSHORT)((_A)->CSRBaseAddress + (_R)));	\
490
}
491
#else
492
//Patch for ASIC turst read/write bug, needs to remove after metel fix
422
//Patch for ASIC turst read/write bug, needs to remove after metel fix
493
#define RTMP_IO_READ32(_A, _R, _pV)								\
423
#define RTMP_IO_READ32(_A, _R, _pV)								\
494
{																\
424
{																\
Lines 519-550 extern ULONG RTDebugLevel; Link Here
519
	writel(_V, (void *)((_A)->CSRBaseAddress + (_R)));								\
449
	writel(_V, (void *)((_A)->CSRBaseAddress + (_R)));								\
520
    }                                                               \
450
    }                                                               \
521
}
451
}
522
#if defined(BRCM_6358)
523
#define RTMP_IO_WRITE8(_A, _R, _V)            \
524
{                    \
525
	ULONG Val;                \
526
	UCHAR _i;                \
527
	_i = (_R & 0x3);             \
528
	Val = readl((void *)((_A)->CSRBaseAddress + (_R - _i)));   \
529
	Val = Val & (~(0x000000ff << ((_i)*8)));         \
530
	Val = Val | ((ULONG)_V << ((_i)*8));         \
531
	writel((Val), (void *)((_A)->CSRBaseAddress + (_R - _i)));    \
532
}
533
#else
534
#define RTMP_IO_WRITE8(_A, _R, _V)												\
452
#define RTMP_IO_WRITE8(_A, _R, _V)												\
535
{																				\
453
{																				\
536
	UINT	Val;																\
454
	UINT	Val;																\
537
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));			\
455
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));			\
538
	writeb((_V), (PUCHAR)((_A)->CSRBaseAddress + (_R)));		\
456
	writeb((_V), (PUCHAR)((_A)->CSRBaseAddress + (_R)));		\
539
}
457
}
540
#endif
541
#define RTMP_IO_WRITE16(_A, _R, _V)												\
458
#define RTMP_IO_WRITE16(_A, _R, _V)												\
542
{																				\
459
{																				\
543
	UINT	Val;																\
460
	UINT	Val;																\
544
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));			\
461
	Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0));			\
545
	writew((_V), (PUSHORT)((_A)->CSRBaseAddress + (_R)));	\
462
	writew((_V), (PUSHORT)((_A)->CSRBaseAddress + (_R)));	\
546
}
463
}
547
#endif
548
#endif /* RT2860 */
464
#endif /* RT2860 */
549
#ifdef RT2870
465
#ifdef RT2870
550
//Patch for ASIC turst read/write bug, needs to remove after metel fix
466
//Patch for ASIC turst read/write bug, needs to remove after metel fix
(-)a/drivers/staging/rt2860/rt_main_dev.c (-52 / +7 lines)
Lines 74-84 static void CfgInitHook(PRTMP_ADAPTER pAd); Link Here
74
74
75
extern	const struct iw_handler_def rt28xx_iw_handler_def;
75
extern	const struct iw_handler_def rt28xx_iw_handler_def;
76
76
77
#if WIRELESS_EXT >= 12
78
// This function will be called when query /proc
77
// This function will be called when query /proc
79
struct iw_statistics *rt28xx_get_wireless_stats(
78
struct iw_statistics *rt28xx_get_wireless_stats(
80
    IN struct net_device *net_dev);
79
    IN struct net_device *net_dev);
81
#endif
82
80
83
struct net_device_stats *RT28xx_get_ether_stats(
81
struct net_device_stats *RT28xx_get_ether_stats(
84
    IN  struct net_device *net_dev);
82
    IN  struct net_device *net_dev);
Lines 190-196 int rt28xx_close(IN PNET_DEV dev) Link Here
190
	BOOLEAN 		Cancelled = FALSE;
188
	BOOLEAN 		Cancelled = FALSE;
191
	UINT32			i = 0;
189
	UINT32			i = 0;
192
#ifdef RT2870
190
#ifdef RT2870
193
	DECLARE_WAIT_QUEUE_HEAD(unlink_wakeup);
191
	DECLARE_WAIT_QUEUE_HEAD_ONSTACK(unlink_wakeup);
194
	DECLARE_WAITQUEUE(wait, current);
192
	DECLARE_WAITQUEUE(wait, current);
195
193
196
	//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
194
	//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
Lines 517-525 static int rt28xx_init(IN struct net_device *net_dev) Link Here
517
	NICInitRT30xxRFRegisters(pAd);
515
	NICInitRT30xxRFRegisters(pAd);
518
#endif // RT2870 //
516
#endif // RT2870 //
519
517
520
#ifdef IKANOS_VX_1X0
521
	VR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress);
522
#endif // IKANOS_VX_1X0 //
523
518
524
		//
519
		//
525
	// Initialize RF register to default value
520
	// Initialize RF register to default value
Lines 527-533 static int rt28xx_init(IN struct net_device *net_dev) Link Here
527
	AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
522
	AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
528
	AsicLockChannel(pAd, pAd->CommonCfg.Channel);
523
	AsicLockChannel(pAd, pAd->CommonCfg.Channel);
529
524
530
#ifndef RT30xx
525
#ifndef RT2870
531
	// 8051 firmware require the signal during booting time.
526
	// 8051 firmware require the signal during booting time.
532
	AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00);
527
	AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00);
533
#endif
528
#endif
Lines 675-690 err: Link Here
675
static const struct net_device_ops rt2860_netdev_ops = {
670
static const struct net_device_ops rt2860_netdev_ops = {
676
	.ndo_open		= MainVirtualIF_open,
671
	.ndo_open		= MainVirtualIF_open,
677
	.ndo_stop		= MainVirtualIF_close,
672
	.ndo_stop		= MainVirtualIF_close,
678
	.ndo_do_ioctl		= rt28xx_ioctl,
673
	.ndo_do_ioctl		= rt28xx_sta_ioctl,
679
	.ndo_get_stats		= RT28xx_get_ether_stats,
674
	.ndo_get_stats		= RT28xx_get_ether_stats,
680
	.ndo_validate_addr	= NULL,
675
	.ndo_validate_addr	= NULL,
681
	.ndo_set_mac_address	= eth_mac_addr,
676
	.ndo_set_mac_address	= eth_mac_addr,
682
	.ndo_change_mtu		= eth_change_mtu,
677
	.ndo_change_mtu		= eth_change_mtu,
683
#ifdef IKANOS_VX_1X0
684
	.ndo_start_xmit		= IKANOS_DataFramesTx,
685
#else
686
	.ndo_start_xmit		= rt28xx_send_packets,
678
	.ndo_start_xmit		= rt28xx_send_packets,
687
#endif
688
};
679
};
689
680
690
/* Must not be called for mdev and apdev */
681
/* Must not be called for mdev and apdev */
Lines 695-716 static NDIS_STATUS rt_ieee80211_if_setup(struct net_device *dev, PRTMP_ADAPTER p Link Here
695
	CHAR    slot_name[IFNAMSIZ];
686
	CHAR    slot_name[IFNAMSIZ];
696
	struct net_device   *device;
687
	struct net_device   *device;
697
688
698
#if WIRELESS_EXT >= 12
699
	if (pAd->OpMode == OPMODE_STA)
689
	if (pAd->OpMode == OPMODE_STA)
700
	{
690
	{
701
		dev->wireless_handlers = &rt28xx_iw_handler_def;
691
		dev->wireless_handlers = &rt28xx_iw_handler_def;
702
	}
692
	}
703
#endif //WIRELESS_EXT >= 12
704
693
705
#if WIRELESS_EXT < 21
706
		dev->get_wireless_stats = rt28xx_get_wireless_stats;
707
#endif
708
	dev->priv_flags = INT_MAIN;
694
	dev->priv_flags = INT_MAIN;
709
	dev->netdev_ops = &rt2860_netdev_ops;
695
	dev->netdev_ops = &rt2860_netdev_ops;
710
	// find available device name
696
	// find available device name
711
	for (i = 0; i < 8; i++)
697
	for (i = 0; i < 8; i++)
712
	{
698
	{
713
		sprintf(slot_name, "ra%d", i);
699
		sprintf(slot_name, "wlan%d", i);
714
700
715
		device = dev_get_by_name(dev_net(dev), slot_name);
701
		device = dev_get_by_name(dev_net(dev), slot_name);
716
		if (device != NULL)
702
		if (device != NULL)
Lines 727-733 static NDIS_STATUS rt_ieee80211_if_setup(struct net_device *dev, PRTMP_ADAPTER p Link Here
727
	}
713
	}
728
	else
714
	else
729
	{
715
	{
730
		sprintf(dev->name, "ra%d", i);
716
		sprintf(dev->name, "wlan%d", i);
731
		Status = NDIS_STATUS_SUCCESS;
717
		Status = NDIS_STATUS_SUCCESS;
732
	}
718
	}
733
719
Lines 791-796 INT __devinit rt28xx_probe( Link Here
791
777
792
	// Allocate RTMP_ADAPTER miniport adapter structure
778
	// Allocate RTMP_ADAPTER miniport adapter structure
793
	handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
779
	handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
780
	if (handle == NULL)
781
		goto err_out_free_netdev;;
794
	RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p);
782
	RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p);
795
783
796
	status = RTMPAllocAdapterBlock(handle, &pAd);
784
	status = RTMPAllocAdapterBlock(handle, &pAd);
Lines 942-948 void CfgInitHook(PRTMP_ADAPTER pAd) Link Here
942
} /* End of CfgInitHook */
930
} /* End of CfgInitHook */
943
931
944
932
945
#if WIRELESS_EXT >= 12
946
// This function will be called when query /proc
933
// This function will be called when query /proc
947
struct iw_statistics *rt28xx_get_wireless_stats(
934
struct iw_statistics *rt28xx_get_wireless_stats(
948
    IN struct net_device *net_dev)
935
    IN struct net_device *net_dev)
Lines 976-982 struct iw_statistics *rt28xx_get_wireless_stats( Link Here
976
	DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n"));
963
	DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n"));
977
	return &pAd->iw_stats;
964
	return &pAd->iw_stats;
978
} /* End of rt28xx_get_wireless_stats */
965
} /* End of rt28xx_get_wireless_stats */
979
#endif // WIRELESS_EXT //
980
966
981
967
982
968
Lines 986-1022 void tbtt_tasklet(unsigned long data) Link Here
986
972
987
}
973
}
988
974
989
INT rt28xx_ioctl(
990
	IN	struct net_device	*net_dev,
991
	IN	OUT	struct ifreq	*rq,
992
	IN	INT					cmd)
993
{
994
	VIRTUAL_ADAPTER	*pVirtualAd = NULL;
995
	RTMP_ADAPTER	*pAd = NULL;
996
	INT				ret = 0;
997
998
	if (net_dev->priv_flags == INT_MAIN)
999
	{
1000
		pAd = net_dev->ml_priv;
1001
	}
1002
	else
1003
	{
1004
		pVirtualAd = net_dev->ml_priv;
1005
		pAd = pVirtualAd->RtmpDev->ml_priv;
1006
	}
1007
1008
	if (pAd == NULL)
1009
	{
1010
		/* if 1st open fail, pAd will be free;
1011
		   So the net_dev->ml_priv will be NULL in 2rd open */
1012
		return -ENETDOWN;
1013
	}
1014
1015
	ret = rt28xx_sta_ioctl(net_dev, rq, cmd);
1016
1017
	return ret;
1018
}
1019
1020
/*
975
/*
1021
    ========================================================================
976
    ========================================================================
1022
977
(-)a/drivers/staging/rt2860/rt_profile.c (-40 / +4 lines)
Lines 710-716 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffe Link Here
710
				CipherAlg = CIPHER_WEP128;
710
				CipherAlg = CIPHER_WEP128;
711
			pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
711
			pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
712
712
713
			DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
713
			DBGPRINT(RT_DEBUG_TRACE, ("I/F(wlan%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
714
			return 1;
714
			return 1;
715
		}
715
		}
716
		else
716
		else
Lines 731-742 static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN char *buffe Link Here
731
				CipherAlg = CIPHER_WEP128;
731
				CipherAlg = CIPHER_WEP128;
732
			pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
732
			pAd->SharedKey[i][idx].CipherAlg = CipherAlg;
733
733
734
			DBGPRINT(RT_DEBUG_TRACE, ("I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
734
			DBGPRINT(RT_DEBUG_TRACE, ("I/F(wlan%d) Key%dStr=%s and type=%s\n", i, idx+1, keybuff, (KeyType == 0) ? "Hex":"Ascii"));
735
			return 1;
735
			return 1;
736
		}
736
		}
737
		else
737
		else
738
		{//Invalid key length
738
		{//Invalid key length
739
			DBGPRINT(RT_DEBUG_ERROR, ("I/F(ra%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
739
			DBGPRINT(RT_DEBUG_ERROR, ("I/F(wlan%d) Key%dStr is Invalid key length! KeyLen = %ld!\n", i, idx+1, KeyLen));
740
			return 0;
740
			return 0;
741
		}
741
		}
742
	}
742
	}
Lines 860-866 NDIS_STATUS RTMPReadParametersHook( Link Here
860
{
860
{
861
	PUCHAR					src = NULL;
861
	PUCHAR					src = NULL;
862
	struct file				*srcf;
862
	struct file				*srcf;
863
	INT 					retval, orgfsuid, orgfsgid;
863
	INT 					retval;
864
   	mm_segment_t			orgfs;
864
   	mm_segment_t			orgfs;
865
	CHAR					*buffer;
865
	CHAR					*buffer;
866
	CHAR					*tmpbuf;
866
	CHAR					*tmpbuf;
Lines 884-898 NDIS_STATUS RTMPReadParametersHook( Link Here
884
884
885
	src = STA_PROFILE_PATH;
885
	src = STA_PROFILE_PATH;
886
886
887
	// Save uid and gid used for filesystem access.
888
	// Set user and group to 0 (root)
889
#ifndef RT30xx
890
	orgfsuid = current_fsuid();
891
	orgfsgid = current_fsgid();
892
	/* Hm, can't really do this nicely anymore, so rely on these files
893
	 * being set to the proper permission to read them... */
894
	/* current->cred->fsuid = current->cred->fsgid = 0; */
895
#endif
896
    orgfs = get_fs();
887
    orgfs = get_fs();
897
    set_fs(KERNEL_DS);
888
    set_fs(KERNEL_DS);
898
889
Lines 1230-1243 NDIS_STATUS RTMPReadParametersHook( Link Here
1230
					//WirelessEvent
1221
					//WirelessEvent
1231
					if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1222
					if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, buffer))
1232
					{
1223
					{
1233
#if WIRELESS_EXT >= 15
1234
					    if(simple_strtol(tmpbuf, 0, 10) != 0)
1224
					    if(simple_strtol(tmpbuf, 0, 10) != 0)
1235
							pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1225
							pAd->CommonCfg.bWirelessEvent = simple_strtol(tmpbuf, 0, 10);
1236
						else
1226
						else
1237
							pAd->CommonCfg.bWirelessEvent = 0;	// disable
1227
							pAd->CommonCfg.bWirelessEvent = 0;	// disable
1238
#else
1239
						pAd->CommonCfg.bWirelessEvent = 0;	// disable
1240
#endif
1241
   						DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1228
   						DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent));
1242
					}
1229
					}
1243
					if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
1230
					if(RTMPGetKeyParameter("WiFiTest", tmpbuf, 10, buffer))
Lines 1442-1464 NDIS_STATUS RTMPReadParametersHook( Link Here
1442
								DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1429
								DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest));
1443
						}
1430
						}
1444
					}
1431
					}
1445
1446
#ifdef RT30xx
1447
						{
1448
							if(RTMPGetKeyParameter("AntDiversity", tmpbuf, 10, buffer))
1449
							{
1450
								for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
1451
								{
1452
									if(simple_strtol(macptr, 0, 10) != 0)  //Enable
1453
										pAd->CommonCfg.bRxAntDiversity = TRUE;
1454
									else //Disable
1455
										pAd->CommonCfg.bRxAntDiversity = FALSE;
1456
1457
									DBGPRINT(RT_DEBUG_ERROR, ("AntDiversity=%d\n", pAd->CommonCfg.bRxAntDiversity));
1458
								}
1459
							}
1460
						}
1461
#endif // RT30xx //
1462
				}
1432
				}
1463
			}
1433
			}
1464
			else
1434
			else
Lines 1571-1591 static void HTParametersHook( Link Here
1571
        if (Value == 0)
1541
        if (Value == 0)
1572
        {
1542
        {
1573
            pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1543
            pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
1574
#ifdef RT30xx
1575
	    pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1544
	    pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
1576
#endif
1577
        }
1545
        }
1578
        else
1546
        else
1579
        {
1547
        {
1580
            pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1548
            pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
1581
#ifdef RT30xx
1582
	    pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1549
	    pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
1583
#endif
1584
        }
1550
        }
1585
        pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1551
        pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;
1586
#ifdef RT30xx
1587
	pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1552
	pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;
1588
#endif
1589
        DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA  = %s\n", (Value==0) ? "Disable" : "Enable"));
1553
        DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA  = %s\n", (Value==0) ? "Disable" : "Enable"));
1590
    }
1554
    }
1591
1555
(-)a/drivers/staging/rt2860/rtmp.h (-711 / +10 lines)
Lines 40-52 Link Here
40
#ifndef __RTMP_H__
40
#ifndef __RTMP_H__
41
#define __RTMP_H__
41
#define __RTMP_H__
42
42
43
#include "link_list.h"
44
#include "spectrum_def.h"
43
#include "spectrum_def.h"
45
44
46
#include "aironet.h"
45
#include "aironet.h"
47
46
48
//#define DBG_DIAGNOSE		1
49
50
#define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++)
47
#define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++)
51
#define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--)
48
#define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--)
52
#define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt)
49
#define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt)
Lines 234-248 extern UCHAR WpaIe; Link Here
234
extern UCHAR  Wpa2Ie;
231
extern UCHAR  Wpa2Ie;
235
extern UCHAR  IbssIe;
232
extern UCHAR  IbssIe;
236
extern UCHAR  Ccx2Ie;
233
extern UCHAR  Ccx2Ie;
237
#ifdef RT30xx
238
extern UCHAR  WapiIe;
239
#endif
240
234
241
extern UCHAR  WPA_OUI[];
235
extern UCHAR  WPA_OUI[];
242
extern UCHAR  RSN_OUI[];
236
extern UCHAR  RSN_OUI[];
243
#ifdef RT30xx
244
extern UCHAR  WAPI_OUI[];
245
#endif
246
extern UCHAR  WME_INFO_ELEM[];
237
extern UCHAR  WME_INFO_ELEM[];
247
extern UCHAR  WME_PARM_ELEM[];
238
extern UCHAR  WME_PARM_ELEM[];
248
extern UCHAR  Ccx2QosInfo[];
239
extern UCHAR  Ccx2QosInfo[];
Lines 400-414 typedef struct _QUEUE_HEADER { Link Here
400
    (_idx) = (_idx+1) % (_RingSize);       \
391
    (_idx) = (_idx+1) % (_RingSize);       \
401
}
392
}
402
393
403
#ifdef RT30xx
394
#ifdef RT2870
404
// We will have a cost down version which mac version is 0x3090xxxx
395
// We will have a cost down version which mac version is 0x3090xxxx
405
#define IS_RT3090(_pAd)				((((_pAd)->MACVersion & 0xffff0000) == 0x30710000) || (((_pAd)->MACVersion & 0xffff0000) == 0x30900000))
396
#define IS_RT3090(_pAd)				((((_pAd)->MACVersion & 0xffff0000) == 0x30710000) || (((_pAd)->MACVersion & 0xffff0000) == 0x30900000))
397
#else
398
#define IS_RT3090(_pAd)				0
406
#endif
399
#endif
407
#define IS_RT3070(_pAd)				(((_pAd)->MACVersion & 0xffff0000) == 0x30700000)
400
#define IS_RT3070(_pAd)				(((_pAd)->MACVersion & 0xffff0000) == 0x30700000)
408
#ifdef RT30xx
401
#ifdef RT2870
409
#define IS_RT3071(_pAd)				(((_pAd)->MACVersion & 0xffff0000) == 0x30710000)
402
#define IS_RT3071(_pAd)				(((_pAd)->MACVersion & 0xffff0000) == 0x30710000)
410
#define IS_RT2070(_pAd)				(((_pAd)->RfIcType == RFIC_2020) || ((_pAd)->EFuseTag == 0x27))
411
412
#define IS_RT30xx(_pAd)				(((_pAd)->MACVersion & 0xfff00000) == 0x30700000)
403
#define IS_RT30xx(_pAd)				(((_pAd)->MACVersion & 0xfff00000) == 0x30700000)
413
#endif
404
#endif
414
405
Lines 664-674 typedef struct _QUEUE_HEADER { Link Here
664
#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)   		RTUSBReadBBPRegister(_A, _I, _pV)
655
#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV)   		RTUSBReadBBPRegister(_A, _I, _pV)
665
#endif // RT2870 //
656
#endif // RT2870 //
666
657
667
#ifdef RT30xx
668
#define RTMP_RF_IO_READ8_BY_REG_ID(_A, _I, _pV)    RT30xxReadRFRegister(_A, _I, _pV)
669
#define RTMP_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V)    RT30xxWriteRFRegister(_A, _I, _V)
670
#endif // RT30xx //
671
672
#define     MAP_CHANNEL_ID_TO_KHZ(ch, khz)  {               \
658
#define     MAP_CHANNEL_ID_TO_KHZ(ch, khz)  {               \
673
                switch (ch)                                 \
659
                switch (ch)                                 \
674
                {                                           \
660
                {                                           \
Lines 935-941 typedef struct _RTMP_SCATTER_GATHER_LIST { Link Here
935
}
921
}
936
#endif // RT2870 //
922
#endif // RT2870 //
937
923
938
#ifdef RT30xx
939
//Need to collect each ant's rssi concurrently
924
//Need to collect each ant's rssi concurrently
940
//rssi1 is report to pair2 Ant and rss2 is reprot to pair1 Ant when 4 Ant
925
//rssi1 is report to pair2 Ant and rss2 is reprot to pair1 Ant when 4 Ant
941
#define COLLECT_RX_ANTENNA_AVERAGE_RSSI(_pAd, _rssi1, _rssi2)					\
926
#define COLLECT_RX_ANTENNA_AVERAGE_RSSI(_pAd, _rssi1, _rssi2)					\
Lines 967-974 typedef struct _RTMP_SCATTER_GATHER_LIST { Link Here
967
		_pAd->RxAnt.RcvPktNumWhenEvaluate++;								\
952
		_pAd->RxAnt.RcvPktNumWhenEvaluate++;								\
968
	}																		\
953
	}																		\
969
}
954
}
970
#endif // RT30xx //
971
972
955
973
#define NDIS_QUERY_BUFFER(_NdisBuf, _ppVA, _pBufLen)                    \
956
#define NDIS_QUERY_BUFFER(_NdisBuf, _ppVA, _pBufLen)                    \
974
    NdisQueryBuffer(_NdisBuf, _ppVA, _pBufLen)
957
    NdisQueryBuffer(_NdisBuf, _ppVA, _pBufLen)
Lines 1312-1318 typedef struct _BBP_TUNING_STRUCT { Link Here
1312
1295
1313
typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT {
1296
typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT {
1314
	UCHAR     EvaluatePeriod;		 // 0:not evalute status, 1: evaluate status, 2: switching status
1297
	UCHAR     EvaluatePeriod;		 // 0:not evalute status, 1: evaluate status, 2: switching status
1315
#ifdef RT30xx
1298
#ifdef RT2870
1316
	UCHAR     EvaluateStableCnt;
1299
	UCHAR     EvaluateStableCnt;
1317
#endif
1300
#endif
1318
	UCHAR     Pair1PrimaryRxAnt;     // 0:Ant-E1, 1:Ant-E2
1301
	UCHAR     Pair1PrimaryRxAnt;     // 0:Ant-E1, 1:Ant-E2
Lines 1916-1924 typedef struct _COMMON_CONFIG { Link Here
1916
1899
1917
	BOOLEAN				NdisRadioStateOff; //For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff.
1900
	BOOLEAN				NdisRadioStateOff; //For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff.
1918
	ABGBAND_STATE		BandState;		// For setting BBP used on B/G or A mode.
1901
	ABGBAND_STATE		BandState;		// For setting BBP used on B/G or A mode.
1919
#ifdef RT30xx
1920
	BOOLEAN				bRxAntDiversity; // 0:disable, 1:enable Software Rx Antenna Diversity.
1921
#endif
1922
1902
1923
	// IEEE802.11H--DFS.
1903
	// IEEE802.11H--DFS.
1924
	RADAR_DETECT_STRUCT	RadarDetect;
1904
	RADAR_DETECT_STRUCT	RadarDetect;
Lines 2080-2086 typedef struct _STA_ADMIN_CONFIG { Link Here
2080
    BOOLEAN		AdhocBGJoined;		// Indicate Adhoc B/G Join.
2060
    BOOLEAN		AdhocBGJoined;		// Indicate Adhoc B/G Join.
2081
    BOOLEAN		Adhoc20NJoined;		// Indicate Adhoc 20MHz N Join.
2061
    BOOLEAN		Adhoc20NJoined;		// Indicate Adhoc 20MHz N Join.
2082
#endif
2062
#endif
2083
	// New for WPA, windows want us to to keep association information and
2063
	// New for WPA, windows want us to keep association information and
2084
	// Fixed IEs from last association response
2064
	// Fixed IEs from last association response
2085
	NDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;
2065
	NDIS_802_11_ASSOCIATION_INFORMATION     AssocInfo;
2086
	USHORT       ReqVarIELen;                // Length of next VIE include EID & Length
2066
	USHORT       ReqVarIELen;                // Length of next VIE include EID & Length
Lines 2532-2574 typedef struct _INF_USB_CONFIG Link Here
2532
2512
2533
}INF_USB_CONFIG;
2513
}INF_USB_CONFIG;
2534
2514
2535
#ifdef IKANOS_VX_1X0
2536
	typedef void (*IkanosWlanTxCbFuncP)(void *, void *);
2537
2538
	struct IKANOS_TX_INFO
2539
	{
2540
		struct net_device *netdev;
2541
		IkanosWlanTxCbFuncP *fp;
2542
	};
2543
#endif // IKANOS_VX_1X0 //
2544
2545
#ifdef DBG_DIAGNOSE
2546
#define DIAGNOSE_TIME	10   // 10 sec
2547
typedef struct _RtmpDiagStrcut_
2548
{	// Diagnosis Related element
2549
	unsigned char		inited;
2550
	unsigned char 	qIdx;
2551
	unsigned char 	ArrayStartIdx;
2552
	unsigned char		ArrayCurIdx;
2553
	// Tx Related Count
2554
	USHORT			TxDataCnt[DIAGNOSE_TIME];
2555
	USHORT			TxFailCnt[DIAGNOSE_TIME];
2556
	USHORT			TxDescCnt[DIAGNOSE_TIME][24]; // 3*3	// TxDesc queue length in scale of 0~14, >=15
2557
	USHORT			TxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2558
	USHORT			TxSWQueCnt[DIAGNOSE_TIME][9];		// TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8
2559
2560
	USHORT			TxAggCnt[DIAGNOSE_TIME];
2561
	USHORT			TxNonAggCnt[DIAGNOSE_TIME];
2562
	USHORT			TxAMPDUCnt[DIAGNOSE_TIME][24]; // 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1.
2563
	USHORT			TxRalinkCnt[DIAGNOSE_TIME];			// TxRalink Aggregation Count in 1 sec scale.
2564
	USHORT			TxAMSDUCnt[DIAGNOSE_TIME];			// TxAMSUD Aggregation Count in 1 sec scale.
2565
2566
	// Rx Related Count
2567
	USHORT			RxDataCnt[DIAGNOSE_TIME];			// Rx Total Data count.
2568
	USHORT			RxCrcErrCnt[DIAGNOSE_TIME];
2569
	USHORT			RxMcsCnt[DIAGNOSE_TIME][24]; // 3*3
2570
}RtmpDiagStruct;
2571
#endif // DBG_DIAGNOSE //
2572
2515
2573
2516
2574
//
2517
//
Lines 2721-2729 typedef struct _RTMP_ADAPTER Link Here
2721
	ULONG                   EepromVersion;          // byte 0: version, byte 1: revision, byte 2~3: unused
2664
	ULONG                   EepromVersion;          // byte 0: version, byte 1: revision, byte 2~3: unused
2722
	UCHAR                   EEPROMAddressNum;       // 93c46=6  93c66=8
2665
	UCHAR                   EEPROMAddressNum;       // 93c46=6  93c66=8
2723
	USHORT                  EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
2666
	USHORT                  EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS];
2724
#ifdef RT30xx
2667
#ifdef RT2870
2725
	BOOLEAN                 EepromAccess;
2668
	BOOLEAN                 EepromAccess;
2726
	UCHAR                   EFuseTag;
2727
#endif
2669
#endif
2728
	ULONG                   FirmwareVersion;        // byte 0: Minor version, byte 1: Major version, otherwise unused.
2670
	ULONG                   FirmwareVersion;        // byte 0: Minor version, byte 1: Major version, otherwise unused.
2729
2671
Lines 2972-2980 typedef struct _RTMP_ADAPTER Link Here
2972
2914
2973
	ULONG					OneSecondnonBEpackets;		// record non BE packets per second
2915
	ULONG					OneSecondnonBEpackets;		// record non BE packets per second
2974
2916
2975
#if WIRELESS_EXT >= 12
2976
    struct iw_statistics    iw_stats;
2917
    struct iw_statistics    iw_stats;
2977
#endif
2978
2918
2979
	struct net_device_stats	stats;
2919
	struct net_device_stats	stats;
2980
2920
Lines 2991-3015 typedef struct _RTMP_ADAPTER Link Here
2991
	UCHAR					flg_be_adjust;
2931
	UCHAR					flg_be_adjust;
2992
	ULONG					be_adjust_last_time;
2932
	ULONG					be_adjust_last_time;
2993
2933
2994
#ifdef IKANOS_VX_1X0
2995
	struct IKANOS_TX_INFO	IkanosTxInfo;
2996
	struct IKANOS_TX_INFO	IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM];
2997
#endif // IKANOS_VX_1X0 //
2998
2999
3000
#ifdef DBG_DIAGNOSE
3001
	RtmpDiagStruct	DiagStruct;
3002
#endif // DBG_DIAGNOSE //
3003
2934
3004
2935
3005
	UINT8					PM_FlgSuspend;
2936
	UINT8					PM_FlgSuspend;
3006
2937
3007
#ifdef RT30xx
2938
#ifdef RT2870
3008
//======efuse
3009
	BOOLEAN		bUseEfuse;
2939
	BOOLEAN		bUseEfuse;
3010
	BOOLEAN		bEEPROMFile;
2940
#endif
3011
#endif // RT30xx //
3012
3013
} RTMP_ADAPTER, *PRTMP_ADAPTER;
2941
} RTMP_ADAPTER, *PRTMP_ADAPTER;
3014
2942
3015
//
2943
//
Lines 3235-3248 static inline VOID ConvertMulticastIP2MAC( Link Here
3235
}
3163
}
3236
#endif /* RT2860 */
3164
#endif /* RT2860 */
3237
3165
3238
BOOLEAN RTMPCheckForHang(
3239
	IN  NDIS_HANDLE MiniportAdapterContext
3240
	);
3241
3242
VOID  RTMPHalt(
3243
	IN  NDIS_HANDLE MiniportAdapterContext
3244
	);
3245
3246
//
3166
//
3247
//  Private routines in rtmp_init.c
3167
//  Private routines in rtmp_init.c
3248
//
3168
//
Lines 3255-3265 NDIS_STATUS RTMPAllocTxRxRingMemory( Link Here
3255
	IN  PRTMP_ADAPTER   pAd
3175
	IN  PRTMP_ADAPTER   pAd
3256
	);
3176
	);
3257
3177
3258
NDIS_STATUS RTMPFindAdapter(
3259
	IN  PRTMP_ADAPTER   pAd,
3260
	IN  NDIS_HANDLE     WrapperConfigurationContext
3261
	);
3262
3263
NDIS_STATUS	RTMPReadParametersHook(
3178
NDIS_STATUS	RTMPReadParametersHook(
3264
	IN	PRTMP_ADAPTER pAd
3179
	IN	PRTMP_ADAPTER pAd
3265
	);
3180
	);
Lines 3306-3318 VOID RTMPRingCleanUp( Link Here
3306
	IN  PRTMP_ADAPTER   pAd,
3221
	IN  PRTMP_ADAPTER   pAd,
3307
	IN  UCHAR           RingType);
3222
	IN  UCHAR           RingType);
3308
3223
3309
VOID RxTest(
3310
	IN  PRTMP_ADAPTER   pAd);
3311
3312
NDIS_STATUS DbgSendPacket(
3313
	IN  PRTMP_ADAPTER   pAd,
3314
	IN  PNDIS_PACKET    pPacket);
3315
3316
VOID UserCfgInit(
3224
VOID UserCfgInit(
3317
	IN  PRTMP_ADAPTER   pAd);
3225
	IN  PRTMP_ADAPTER   pAd);
3318
3226
Lines 3366-3391 UCHAR BtoH( Link Here
3366
VOID RTMPPatchMacBbpBug(
3274
VOID RTMPPatchMacBbpBug(
3367
	IN  PRTMP_ADAPTER   pAd);
3275
	IN  PRTMP_ADAPTER   pAd);
3368
3276
3369
VOID RTMPPatchCardBus(
3370
	IN	PRTMP_ADAPTER	pAdapter);
3371
3372
VOID RTMPPatchRalinkCardBus(
3373
	IN	PRTMP_ADAPTER	pAdapter,
3374
	IN	ULONG			Bus);
3375
3376
ULONG RTMPReadCBConfig(
3377
	IN	ULONG	Bus,
3378
	IN	ULONG	Slot,
3379
	IN	ULONG	Func,
3380
	IN	ULONG	Offset);
3381
3382
VOID RTMPWriteCBConfig(
3383
	IN	ULONG	Bus,
3384
	IN	ULONG	Slot,
3385
	IN	ULONG	Func,
3386
	IN	ULONG	Offset,
3387
	IN	ULONG	Value);
3388
3389
VOID RTMPInitTimer(
3277
VOID RTMPInitTimer(
3390
	IN  PRTMP_ADAPTER           pAd,
3278
	IN  PRTMP_ADAPTER           pAd,
3391
	IN  PRALINK_TIMER_STRUCT    pTimer,
3279
	IN  PRALINK_TIMER_STRUCT    pTimer,
Lines 3474-3487 VOID PeerPublicAction( Link Here
3474
	IN PRTMP_ADAPTER pAd,
3362
	IN PRTMP_ADAPTER pAd,
3475
	IN MLME_QUEUE_ELEM *Elem);
3363
	IN MLME_QUEUE_ELEM *Elem);
3476
3364
3477
VOID StaPublicAction(
3478
	IN PRTMP_ADAPTER pAd,
3479
	IN UCHAR Bss2040Coexist);
3480
3481
VOID PeerBSSTranAction(
3482
	IN PRTMP_ADAPTER pAd,
3483
	IN MLME_QUEUE_ELEM *Elem);
3484
3485
VOID PeerHTAction(
3365
VOID PeerHTAction(
3486
	IN PRTMP_ADAPTER pAd,
3366
	IN PRTMP_ADAPTER pAd,
3487
	IN MLME_QUEUE_ELEM *Elem);
3367
	IN MLME_QUEUE_ELEM *Elem);
Lines 3523-3561 VOID InsertActField( Link Here
3523
	IN UINT8 Category,
3403
	IN UINT8 Category,
3524
	IN UINT8 ActCode);
3404
	IN UINT8 ActCode);
3525
3405
3526
BOOLEAN QosBADataParse(
3527
	IN PRTMP_ADAPTER	pAd,
3528
	IN BOOLEAN bAMSDU,
3529
	IN PUCHAR p8023Header,
3530
	IN UCHAR	WCID,
3531
	IN UCHAR	TID,
3532
	IN USHORT Sequence,
3533
	IN UCHAR DataOffset,
3534
	IN USHORT Datasize,
3535
	IN UINT   CurRxIndex);
3536
3537
BOOLEAN CntlEnqueueForRecv(
3406
BOOLEAN CntlEnqueueForRecv(
3538
    IN	PRTMP_ADAPTER	pAd,
3407
    IN	PRTMP_ADAPTER	pAd,
3539
	IN ULONG Wcid,
3408
	IN ULONG Wcid,
3540
    IN ULONG MsgLen,
3409
    IN ULONG MsgLen,
3541
	IN PFRAME_BA_REQ pMsg);
3410
	IN PFRAME_BA_REQ pMsg);
3542
3411
3543
VOID BaAutoManSwitch(
3544
	IN	PRTMP_ADAPTER	pAd);
3545
3546
VOID HTIOTCheck(
3547
	IN	PRTMP_ADAPTER	pAd,
3548
	IN    UCHAR     BatRecIdx);
3549
3550
//
3412
//
3551
// Private routines in rtmp_data.c
3413
// Private routines in rtmp_data.c
3552
//
3414
//
3553
BOOLEAN RTMPHandleRxDoneInterrupt(
3415
BOOLEAN RTMPHandleRxDoneInterrupt(
3554
	IN  PRTMP_ADAPTER   pAd);
3416
	IN  PRTMP_ADAPTER   pAd);
3555
3417
3556
VOID RTMPHandleTxDoneInterrupt(
3557
	IN  PRTMP_ADAPTER   pAd);
3558
3559
BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(
3418
BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(
3560
	IN  PRTMP_ADAPTER   pAd,
3419
	IN  PRTMP_ADAPTER   pAd,
3561
	IN  INT_SOURCE_CSR_STRUC TxRingBitmap);
3420
	IN  INT_SOURCE_CSR_STRUC TxRingBitmap);
Lines 3697-3709 NDIS_STATUS MiniportMMRequest( Link Here
3697
	IN	UCHAR			QueIdx,
3556
	IN	UCHAR			QueIdx,
3698
	IN	PUCHAR			pData,
3557
	IN	PUCHAR			pData,
3699
	IN  UINT            Length);
3558
	IN  UINT            Length);
3700
#ifdef RT2870
3559
3701
NDIS_STATUS MiniportDataMMRequest(
3702
	 IN  PRTMP_ADAPTER   pAd,
3703
	 IN  UCHAR           QueIdx,
3704
	 IN  PUCHAR          pData,
3705
	 IN  UINT            Length);
3706
#endif
3707
VOID RTMPSendNullFrame(
3560
VOID RTMPSendNullFrame(
3708
	IN  PRTMP_ADAPTER   pAd,
3561
	IN  PRTMP_ADAPTER   pAd,
3709
	IN  UCHAR           TxRate,
3562
	IN  UCHAR           TxRate,
Lines 3722-3733 VOID RTMPSendRTSFrame( Link Here
3722
	IN  UCHAR           QueIdx,
3575
	IN  UCHAR           QueIdx,
3723
	IN  UCHAR			FrameGap);
3576
	IN  UCHAR			FrameGap);
3724
3577
3725
3726
NDIS_STATUS RTMPApplyPacketFilter(
3727
	IN  PRTMP_ADAPTER   pAd,
3728
	IN  PRT28XX_RXD_STRUC      pRxD,
3729
	IN  PHEADER_802_11  pHeader);
3730
3731
PQUEUE_HEADER   RTMPCheckTxSwQueue(
3578
PQUEUE_HEADER   RTMPCheckTxSwQueue(
3732
	IN  PRTMP_ADAPTER   pAd,
3579
	IN  PRTMP_ADAPTER   pAd,
3733
	OUT UCHAR           *QueIdx);
3580
	OUT UCHAR           *QueIdx);
Lines 3778-3787 BOOLEAN RTMPCheckEtherType( Link Here
3778
	IN	PNDIS_PACKET	pPacket);
3625
	IN	PNDIS_PACKET	pPacket);
3779
3626
3780
3627
3781
VOID RTMPCckBbpTuning(
3782
	IN	PRTMP_ADAPTER	pAd,
3783
	IN	UINT			TxRate);
3784
3785
//
3628
//
3786
// Private routines in rtmp_wep.c
3629
// Private routines in rtmp_wep.c
3787
//
3630
//
Lines 3798-3809 VOID RTMPEncryptData( Link Here
3798
	IN  PUCHAR          pDest,
3641
	IN  PUCHAR          pDest,
3799
	IN  UINT            Len);
3642
	IN  UINT            Len);
3800
3643
3801
BOOLEAN	RTMPDecryptData(
3802
	IN	PRTMP_ADAPTER	pAdapter,
3803
	IN	PUCHAR			pSrc,
3804
	IN	UINT			Len,
3805
	IN	UINT			idx);
3806
3807
BOOLEAN	RTMPSoftDecryptWEP(
3644
BOOLEAN	RTMPSoftDecryptWEP(
3808
	IN PRTMP_ADAPTER 	pAd,
3645
	IN PRTMP_ADAPTER 	pAd,
3809
	IN PUCHAR			pData,
3646
	IN PUCHAR			pData,
Lines 3870-3883 VOID AsicLockChannel( Link Here
3870
	IN PRTMP_ADAPTER pAd,
3707
	IN PRTMP_ADAPTER pAd,
3871
	IN UCHAR Channel) ;
3708
	IN UCHAR Channel) ;
3872
3709
3873
VOID AsicAntennaSelect(
3874
	IN  PRTMP_ADAPTER   pAd,
3875
	IN  UCHAR           Channel);
3876
3877
VOID AsicAntennaSetting(
3878
	IN	PRTMP_ADAPTER	pAd,
3879
	IN	ABGBAND_STATE	BandState);
3880
3881
VOID AsicRfTuningExec(
3710
VOID AsicRfTuningExec(
3882
	IN PVOID SystemSpecific1,
3711
	IN PVOID SystemSpecific1,
3883
	IN PVOID FunctionContext,
3712
	IN PVOID FunctionContext,
Lines 4051-4073 VOID BATableDeleteORIEntry( Link Here
4051
	IN OUT	PRTMP_ADAPTER pAd,
3880
	IN OUT	PRTMP_ADAPTER pAd,
4052
	IN		BA_ORI_ENTRY	*pBAORIEntry);
3881
	IN		BA_ORI_ENTRY	*pBAORIEntry);
4053
3882
4054
VOID BATableDeleteRECEntry(
4055
	IN OUT	PRTMP_ADAPTER pAd,
4056
	IN		BA_REC_ENTRY	*pBARECEntry);
4057
4058
VOID BATableTearORIEntry(
4059
	IN OUT	PRTMP_ADAPTER pAd,
4060
	IN		UCHAR TID,
4061
	IN		UCHAR Wcid,
4062
	IN		BOOLEAN bForceDelete,
4063
	IN		BOOLEAN ALL);
4064
4065
VOID BATableTearRECEntry(
4066
	IN OUT	PRTMP_ADAPTER pAd,
4067
	IN		UCHAR TID,
4068
	IN		UCHAR WCID,
4069
	IN		BOOLEAN ALL);
4070
4071
VOID  BssEntrySet(
3883
VOID  BssEntrySet(
4072
	IN  PRTMP_ADAPTER   pAd,
3884
	IN  PRTMP_ADAPTER   pAd,
4073
	OUT PBSS_ENTRY pBss,
3885
	OUT PBSS_ENTRY pBss,
Lines 4243-4252 VOID DisassocTimeout( Link Here
4243
	IN PVOID SystemSpecific3);
4055
	IN PVOID SystemSpecific3);
4244
4056
4245
//----------------------------------------------
4057
//----------------------------------------------
4246
VOID MlmeDisassocReqAction(
4247
	IN  PRTMP_ADAPTER   pAd,
4248
	IN  MLME_QUEUE_ELEM *Elem);
4249
4250
VOID MlmeAssocReqAction(
4058
VOID MlmeAssocReqAction(
4251
	IN  PRTMP_ADAPTER   pAd,
4059
	IN  PRTMP_ADAPTER   pAd,
4252
	IN  MLME_QUEUE_ELEM *Elem);
4060
	IN  MLME_QUEUE_ELEM *Elem);
Lines 4410-4419 VOID ScanTimeout( Link Here
4410
	IN PVOID SystemSpecific2,
4218
	IN PVOID SystemSpecific2,
4411
	IN PVOID SystemSpecific3);
4219
	IN PVOID SystemSpecific3);
4412
4220
4413
VOID MlmeScanReqAction(
4414
	IN  PRTMP_ADAPTER   pAd,
4415
	IN  MLME_QUEUE_ELEM *Elem);
4416
4417
VOID InvalidStateWhenScan(
4221
VOID InvalidStateWhenScan(
4418
	IN  PRTMP_ADAPTER   pAd,
4222
	IN  PRTMP_ADAPTER   pAd,
4419
	IN  MLME_QUEUE_ELEM *Elem);
4223
	IN  MLME_QUEUE_ELEM *Elem);
Lines 4426-4435 VOID InvalidStateWhenStart( Link Here
4426
	IN  PRTMP_ADAPTER   pAd,
4230
	IN  PRTMP_ADAPTER   pAd,
4427
	IN  MLME_QUEUE_ELEM *Elem);
4231
	IN  MLME_QUEUE_ELEM *Elem);
4428
4232
4429
VOID PeerBeacon(
4430
	IN  PRTMP_ADAPTER   pAd,
4431
	IN  MLME_QUEUE_ELEM *Elem);
4432
4433
VOID EnqueueProbeRequest(
4233
VOID EnqueueProbeRequest(
4434
	IN PRTMP_ADAPTER pAd);
4234
	IN PRTMP_ADAPTER pAd);
4435
4235
Lines 4727-4739 BOOLEAN PeerDisassocSanity( Link Here
4727
	OUT PUCHAR pAddr2,
4527
	OUT PUCHAR pAddr2,
4728
	OUT USHORT *Reason);
4528
	OUT USHORT *Reason);
4729
4529
4730
BOOLEAN PeerWpaMessageSanity(
4731
    IN 	PRTMP_ADAPTER 		pAd,
4732
    IN 	PEAPOL_PACKET 		pMsg,
4733
    IN 	ULONG 				MsgLen,
4734
    IN 	UCHAR				MsgType,
4735
    IN 	MAC_TABLE_ENTRY  	*pEntry);
4736
4737
BOOLEAN PeerDeauthSanity(
4530
BOOLEAN PeerDeauthSanity(
4738
	IN  PRTMP_ADAPTER   pAd,
4531
	IN  PRTMP_ADAPTER   pAd,
4739
	IN  VOID *Msg,
4532
	IN  VOID *Msg,
Lines 4803-4814 VOID LinkDownExec( Link Here
4803
	IN PVOID SystemSpecific2,
4596
	IN PVOID SystemSpecific2,
4804
	IN PVOID SystemSpecific3);
4597
	IN PVOID SystemSpecific3);
4805
4598
4806
VOID LinkUpExec(
4807
	IN PVOID SystemSpecific1,
4808
	IN PVOID FunctionContext,
4809
	IN PVOID SystemSpecific2,
4810
	IN PVOID SystemSpecific3);
4811
4812
VOID STAMlmePeriodicExec(
4599
VOID STAMlmePeriodicExec(
4813
	PRTMP_ADAPTER pAd);
4600
	PRTMP_ADAPTER pAd);
4814
4601
Lines 4895-4906 VOID StaQuickResponeForRateUpExec( Link Here
4895
	IN PVOID SystemSpecific2,
4682
	IN PVOID SystemSpecific2,
4896
	IN PVOID SystemSpecific3);
4683
	IN PVOID SystemSpecific3);
4897
4684
4898
VOID AsicBbpTuning1(
4899
	IN PRTMP_ADAPTER pAd);
4900
4901
VOID AsicBbpTuning2(
4902
	IN PRTMP_ADAPTER pAd);
4903
4904
VOID RTMPUpdateMlmeRate(
4685
VOID RTMPUpdateMlmeRate(
4905
	IN PRTMP_ADAPTER	pAd);
4686
	IN PRTMP_ADAPTER	pAd);
4906
4687
Lines 4910-4920 CHAR RTMPMaxRssi( Link Here
4910
	IN CHAR				Rssi1,
4691
	IN CHAR				Rssi1,
4911
	IN CHAR				Rssi2);
4692
	IN CHAR				Rssi2);
4912
4693
4913
#ifdef RT30xx
4914
VOID AsicSetRxAnt(
4694
VOID AsicSetRxAnt(
4915
	IN PRTMP_ADAPTER	pAd,
4695
	IN PRTMP_ADAPTER	pAd,
4916
	IN UCHAR			Ant);
4696
	IN UCHAR			Ant);
4917
#endif
4918
4697
4919
VOID AsicEvaluateRxAnt(
4698
VOID AsicEvaluateRxAnt(
4920
	IN PRTMP_ADAPTER	pAd);
4699
	IN PRTMP_ADAPTER	pAd);
Lines 4972-5002 VOID ChangeToCellPowerLimit( Link Here
4972
	IN PRTMP_ADAPTER pAd,
4751
	IN PRTMP_ADAPTER pAd,
4973
	IN UCHAR         AironetCellPowerLimit);
4752
	IN UCHAR         AironetCellPowerLimit);
4974
4753
4975
VOID RaiseClock(
4976
	IN  PRTMP_ADAPTER   pAd,
4977
	IN  UINT32 *x);
4978
4979
VOID LowerClock(
4980
	IN  PRTMP_ADAPTER   pAd,
4981
	IN  UINT32 *x);
4982
4983
USHORT ShiftInBits(
4984
	IN  PRTMP_ADAPTER   pAd);
4985
4986
VOID ShiftOutBits(
4987
	IN  PRTMP_ADAPTER   pAd,
4988
	IN  USHORT data,
4989
	IN  USHORT count);
4990
4991
VOID EEpromCleanup(
4992
	IN  PRTMP_ADAPTER   pAd);
4993
4994
VOID EWDS(
4995
	IN  PRTMP_ADAPTER   pAd);
4996
4997
VOID EWEN(
4998
	IN  PRTMP_ADAPTER   pAd);
4999
5000
USHORT RTMP_EEPROM_READ16(
4754
USHORT RTMP_EEPROM_READ16(
5001
	IN  PRTMP_ADAPTER   pAd,
4755
	IN  PRTMP_ADAPTER   pAd,
5002
	IN  USHORT Offset);
4756
	IN  USHORT Offset);
Lines 5122-5133 VOID RTMPIoctlGetMacTable( Link Here
5122
	IN PRTMP_ADAPTER pAd,
4876
	IN PRTMP_ADAPTER pAd,
5123
	IN struct iwreq *wrq);
4877
	IN struct iwreq *wrq);
5124
4878
5125
VOID RTMPIndicateWPA2Status(
5126
	IN  PRTMP_ADAPTER  pAdapter);
5127
5128
VOID	RTMPOPModeSwitching(
5129
	IN	PRTMP_ADAPTER	pAd);
5130
5131
VOID    RTMPAddBSSIDCipher(
4879
VOID    RTMPAddBSSIDCipher(
5132
    IN  PRTMP_ADAPTER   pAd,
4880
    IN  PRTMP_ADAPTER   pAd,
5133
	IN	UCHAR	Aid,
4881
	IN	UCHAR	Aid,
Lines 5149-5159 VOID RTMPSendWirelessEvent( Link Here
5149
	IN  UCHAR			BssIdx,
4897
	IN  UCHAR			BssIdx,
5150
	IN	CHAR			Rssi);
4898
	IN	CHAR			Rssi);
5151
4899
5152
VOID	NICUpdateCntlCounters(
5153
	IN	PRTMP_ADAPTER	pAd,
5154
	IN	PHEADER_802_11	pHeader,
5155
	IN    UCHAR			SubType,
5156
	IN	PRXWI_STRUC 	pRxWI);
5157
//
4900
//
5158
// prototype in wpa.c
4901
// prototype in wpa.c
5159
//
4902
//
Lines 5305-5329 VOID AironetAddBeaconReport( Link Here
5305
VOID    AironetCreateBeaconReportFromBssTable(
5048
VOID    AironetCreateBeaconReportFromBssTable(
5306
	IN  PRTMP_ADAPTER       pAd);
5049
	IN  PRTMP_ADAPTER       pAd);
5307
5050
5308
VOID    DBGPRINT_TX_RING(
5309
	IN PRTMP_ADAPTER  pAd,
5310
	IN UCHAR          QueIdx);
5311
5312
VOID DBGPRINT_RX_RING(
5313
	IN PRTMP_ADAPTER  pAd);
5314
5315
CHAR    ConvertToRssi(
5051
CHAR    ConvertToRssi(
5316
	IN PRTMP_ADAPTER  pAd,
5052
	IN PRTMP_ADAPTER  pAd,
5317
	IN CHAR				Rssi,
5053
	IN CHAR				Rssi,
5318
	IN UCHAR    RssiNumber);
5054
	IN UCHAR    RssiNumber);
5319
5055
5320
VOID APAsicEvaluateRxAnt(
5321
	IN PRTMP_ADAPTER	pAd);
5322
5323
5324
VOID APAsicRxAntEvalTimeout(
5325
	IN PRTMP_ADAPTER	pAd);
5326
5327
//
5056
//
5328
// function prototype in cmm_wpa.c
5057
// function prototype in cmm_wpa.c
5329
//
5058
//
Lines 5340-5403 VOID AES_GTK_KEY_UNWRAP( Link Here
5340
	IN	UCHAR	c_len,
5069
	IN	UCHAR	c_len,
5341
	IN  UCHAR   *ciphertext);
5070
	IN  UCHAR   *ciphertext);
5342
5071
5343
BOOLEAN RTMPCheckRSNIE(
5344
	IN  PRTMP_ADAPTER   pAd,
5345
	IN  PUCHAR          pData,
5346
	IN  UCHAR           DataLen,
5347
	IN  MAC_TABLE_ENTRY *pEntry,
5348
	OUT	UCHAR			*Offset);
5349
5350
BOOLEAN RTMPParseEapolKeyData(
5351
	IN  PRTMP_ADAPTER   pAd,
5352
	IN  PUCHAR          pKeyData,
5353
	IN  UCHAR           KeyDataLen,
5354
	IN	UCHAR			GroupKeyIndex,
5355
	IN	UCHAR			MsgType,
5356
	IN	BOOLEAN			bWPA2,
5357
	IN  MAC_TABLE_ENTRY *pEntry);
5358
5359
VOID	ConstructEapolMsg(
5360
	IN 	PRTMP_ADAPTER    	pAd,
5361
    IN 	UCHAR				PeerAuthMode,
5362
    IN 	UCHAR				PeerWepStatus,
5363
    IN 	UCHAR				MyGroupKeyWepStatus,
5364
    IN 	UCHAR				MsgType,
5365
    IN	UCHAR				DefaultKeyIdx,
5366
    IN 	UCHAR				*ReplayCounter,
5367
	IN 	UCHAR				*KeyNonce,
5368
	IN	UCHAR				*TxRSC,
5369
	IN	UCHAR				*PTK,
5370
	IN	UCHAR				*GTK,
5371
	IN	UCHAR				*RSNIE,
5372
	IN	UCHAR				RSNIE_Len,
5373
    OUT PEAPOL_PACKET       pMsg);
5374
5375
VOID	CalculateMIC(
5376
	IN	PRTMP_ADAPTER	pAd,
5377
	IN	UCHAR			PeerWepStatus,
5378
	IN	UCHAR			*PTK,
5379
	OUT PEAPOL_PACKET   pMsg);
5380
5381
NDIS_STATUS	RTMPSoftDecryptBroadCastData(
5382
	IN	PRTMP_ADAPTER					pAd,
5383
	IN	RX_BLK							*pRxBlk,
5384
	IN  NDIS_802_11_ENCRYPTION_STATUS 	GroupCipher,
5385
	IN  PCIPHER_KEY						pShard_key);
5386
5387
VOID	ConstructEapolKeyData(
5388
	IN	PRTMP_ADAPTER	pAd,
5389
	IN	UCHAR			PeerAuthMode,
5390
	IN	UCHAR			PeerWepStatus,
5391
	IN	UCHAR			GroupKeyWepStatus,
5392
	IN 	UCHAR			MsgType,
5393
	IN	UCHAR			DefaultKeyIdx,
5394
	IN	BOOLEAN			bWPA2Capable,
5395
	IN	UCHAR			*PTK,
5396
	IN	UCHAR			*GTK,
5397
	IN	UCHAR			*RSNIE,
5398
	IN	UCHAR			RSNIE_LEN,
5399
	OUT PEAPOL_PACKET   pMsg);
5400
5401
VOID RTMPMakeRSNIE(
5072
VOID RTMPMakeRSNIE(
5402
	IN  PRTMP_ADAPTER   pAd,
5073
	IN  PRTMP_ADAPTER   pAd,
5403
	IN  UINT            AuthMode,
5074
	IN  UINT            AuthMode,
Lines 5408-5599 VOID RTMPMakeRSNIE( Link Here
5408
// function prototype in ap_wpa.c
5079
// function prototype in ap_wpa.c
5409
//
5080
//
5410
5081
5411
BOOLEAN APWpaMsgTypeSubst(
5412
	IN UCHAR    EAPType,
5413
	OUT INT *MsgType) ;
5414
5415
MAC_TABLE_ENTRY *PACInquiry(
5416
	IN  PRTMP_ADAPTER   pAd,
5417
	IN  ULONG           Wcid);
5418
5419
BOOLEAN RTMPCheckMcast(
5420
	IN PRTMP_ADAPTER pAd,
5421
	IN PEID_STRUCT      eid_ptr,
5422
	IN MAC_TABLE_ENTRY  *pEntry);
5423
5424
BOOLEAN RTMPCheckUcast(
5425
	IN PRTMP_ADAPTER pAd,
5426
	IN PEID_STRUCT      eid_ptr,
5427
	IN MAC_TABLE_ENTRY  *pEntry);
5428
5429
BOOLEAN RTMPCheckAUTH(
5430
	IN PRTMP_ADAPTER pAd,
5431
	IN PEID_STRUCT      eid_ptr,
5432
	IN MAC_TABLE_ENTRY  *pEntry);
5433
5434
VOID WPAStart4WayHS(
5435
	IN  PRTMP_ADAPTER   pAd,
5436
	IN  MAC_TABLE_ENTRY *pEntry,
5437
	IN	ULONG			TimeInterval);
5438
5439
VOID WPAStart2WayGroupHS(
5440
	IN  PRTMP_ADAPTER   pAd,
5441
	IN  MAC_TABLE_ENTRY *pEntry);
5442
5443
VOID APWpaEAPPacketAction(
5444
	IN PRTMP_ADAPTER pAd,
5445
	IN MLME_QUEUE_ELEM *Elem);
5446
5447
VOID APWpaEAPOLStartAction(
5448
	IN PRTMP_ADAPTER pAd,
5449
	IN MLME_QUEUE_ELEM *Elem);
5450
5451
VOID APWpaEAPOLLogoffAction(
5452
	IN PRTMP_ADAPTER pAd,
5453
	IN MLME_QUEUE_ELEM *Elem);
5454
5455
VOID APWpaEAPOLKeyAction(
5456
	IN PRTMP_ADAPTER pAd,
5457
	IN MLME_QUEUE_ELEM *Elem);
5458
5459
VOID APWpaEAPOLASFAlertAction(
5460
	IN  PRTMP_ADAPTER    pAd,
5461
	IN  MLME_QUEUE_ELEM  *Elem);
5462
5463
VOID HandleCounterMeasure(
5082
VOID HandleCounterMeasure(
5464
	IN PRTMP_ADAPTER pAd,
5083
	IN PRTMP_ADAPTER pAd,
5465
	IN MAC_TABLE_ENTRY  *pEntry);
5084
	IN MAC_TABLE_ENTRY  *pEntry);
5466
5085
5467
VOID PeerPairMsg2Action(
5468
	IN PRTMP_ADAPTER pAd,
5469
	IN MAC_TABLE_ENTRY  *pEntry,
5470
	IN MLME_QUEUE_ELEM *Elem);
5471
5472
VOID PeerPairMsg4Action(
5473
	IN PRTMP_ADAPTER pAd,
5474
	IN MAC_TABLE_ENTRY  *pEntry,
5475
	IN MLME_QUEUE_ELEM *Elem);
5476
5477
VOID CMTimerExec(
5478
	IN PVOID SystemSpecific1,
5479
	IN PVOID FunctionContext,
5480
	IN PVOID SystemSpecific2,
5481
	IN PVOID SystemSpecific3);
5482
5483
VOID WPARetryExec(
5484
	IN PVOID SystemSpecific1,
5485
	IN PVOID FunctionContext,
5486
	IN PVOID SystemSpecific2,
5487
	IN PVOID SystemSpecific3);
5488
5489
VOID EnqueueStartForPSKExec(
5490
    IN PVOID SystemSpecific1,
5491
    IN PVOID FunctionContext,
5492
    IN PVOID SystemSpecific2,
5493
    IN PVOID SystemSpecific3);
5494
5495
VOID RTMPHandleSTAKey(
5496
    IN PRTMP_ADAPTER    pAdapter,
5497
    IN MAC_TABLE_ENTRY  *pEntry,
5498
    IN MLME_QUEUE_ELEM  *Elem);
5499
5500
VOID PeerGroupMsg2Action(
5501
	IN  PRTMP_ADAPTER    pAd,
5502
	IN  PMAC_TABLE_ENTRY pEntry,
5503
	IN  VOID             *Msg,
5504
	IN  UINT             MsgLen);
5505
5506
VOID PairDisAssocAction(
5507
	IN  PRTMP_ADAPTER    pAd,
5508
	IN  PMAC_TABLE_ENTRY pEntry,
5509
	IN  USHORT           Reason);
5510
5511
VOID MlmeDeAuthAction(
5512
	IN  PRTMP_ADAPTER    pAd,
5513
	IN  PMAC_TABLE_ENTRY pEntry,
5514
	IN  USHORT           Reason);
5515
5516
VOID GREKEYPeriodicExec(
5517
	IN  PVOID   SystemSpecific1,
5518
	IN  PVOID   FunctionContext,
5519
	IN  PVOID   SystemSpecific2,
5520
	IN  PVOID   SystemSpecific3);
5521
5522
VOID CountGTK(
5523
	IN  UCHAR   *PMK,
5524
	IN  UCHAR   *GNonce,
5525
	IN  UCHAR   *AA,
5526
	OUT UCHAR   *output,
5527
	IN  UINT    len);
5528
5529
VOID    GetSmall(
5530
	IN  PVOID   pSrc1,
5531
	IN  PVOID   pSrc2,
5532
	OUT PUCHAR  out,
5533
	IN  ULONG   Length);
5534
5535
VOID    GetLarge(
5536
	IN  PVOID   pSrc1,
5537
	IN  PVOID   pSrc2,
5538
	OUT PUCHAR  out,
5539
	IN  ULONG   Length);
5540
5541
VOID APGenRandom(
5542
	IN PRTMP_ADAPTER pAd,
5543
	OUT UCHAR       *random);
5544
5545
VOID AES_GTK_KEY_WRAP(
5546
	IN UCHAR *key,
5547
	IN UCHAR *plaintext,
5548
	IN UCHAR p_len,
5549
	OUT UCHAR *ciphertext);
5550
5551
VOID    WpaSend(
5552
    IN  PRTMP_ADAPTER   pAdapter,
5553
    IN  PUCHAR          pPacket,
5554
    IN  ULONG           Len);
5555
5556
VOID    APToWirelessSta(
5557
	IN  PRTMP_ADAPTER   pAd,
5558
	IN  MAC_TABLE_ENTRY *pEntry,
5559
	IN  PUCHAR          pHeader802_3,
5560
	IN  UINT            HdrLen,
5561
	IN  PUCHAR          pData,
5562
	IN  UINT            DataLen,
5563
    IN	BOOLEAN			bClearFrame);
5564
5565
VOID RTMPAddPMKIDCache(
5566
	IN  PRTMP_ADAPTER   		pAd,
5567
	IN	INT						apidx,
5568
	IN	PUCHAR				pAddr,
5569
	IN	UCHAR					*PMKID,
5570
	IN	UCHAR					*PMK);
5571
5572
INT RTMPSearchPMKIDCache(
5573
	IN  PRTMP_ADAPTER   pAd,
5574
	IN	INT				apidx,
5575
	IN	PUCHAR		pAddr);
5576
5577
VOID RTMPDeletePMKIDCache(
5578
	IN  PRTMP_ADAPTER   pAd,
5579
	IN	INT				apidx,
5580
	IN  INT				idx);
5581
5582
VOID RTMPMaintainPMKIDCache(
5583
	IN  PRTMP_ADAPTER   pAd);
5584
5585
VOID	RTMPSendTriggerFrame(
5586
	IN	PRTMP_ADAPTER	pAd,
5587
	IN	PVOID			pBuffer,
5588
	IN	ULONG			Length,
5589
	IN  UCHAR           TxRate,
5590
	IN	BOOLEAN			bQosNull);
5591
5592
#ifdef RT30xx
5593
VOID RTMPFilterCalibration(
5594
	IN PRTMP_ADAPTER pAd);
5595
#endif // RT30xx //
5596
5597
/* timeout -- ms */
5086
/* timeout -- ms */
5598
VOID RTMP_SetPeriodicTimer(
5087
VOID RTMP_SetPeriodicTimer(
5599
	IN	NDIS_MINIPORT_TIMER *pTimer,
5088
	IN	NDIS_MINIPORT_TIMER *pTimer,
Lines 5728-5750 UINT BA_Reorder_AMSDU_Annnounce( Link Here
5728
	IN	PRTMP_ADAPTER	pAd,
5217
	IN	PRTMP_ADAPTER	pAd,
5729
	IN	PNDIS_PACKET	pPacket);
5218
	IN	PNDIS_PACKET	pPacket);
5730
5219
5731
5732
UINT Handle_AMSDU_Packet(
5733
	IN	PRTMP_ADAPTER	pAd,
5734
	IN	PUCHAR			pData,
5735
	IN	ULONG			DataSize,
5736
	IN  UCHAR			FromWhichBSSID);
5737
5738
5739
void convert_802_11_to_802_3_packet(
5740
	IN	PRTMP_ADAPTER	pAd,
5741
	IN	PNDIS_PACKET	pPacket,
5742
	IN	PUCHAR			p8023hdr,
5743
	IN	PUCHAR			pData,
5744
	IN	ULONG			DataSize,
5745
	IN  UCHAR			FromWhichBSSID);
5746
5747
5748
PNET_DEV get_netdev_from_bssid(
5220
PNET_DEV get_netdev_from_bssid(
5749
	IN	PRTMP_ADAPTER	pAd,
5221
	IN	PRTMP_ADAPTER	pAd,
5750
	IN	UCHAR			FromWhichBSSID);
5222
	IN	UCHAR			FromWhichBSSID);
Lines 5763-5789 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( Link Here
5763
	IN	PRTMP_ADAPTER	pAd,
5235
	IN	PRTMP_ADAPTER	pAd,
5764
	IN	PNDIS_PACKET	pOldPkt);
5236
	IN	PNDIS_PACKET	pOldPkt);
5765
5237
5766
PNDIS_PACKET duplicate_pkt_with_VLAN(
5767
	IN	PRTMP_ADAPTER	pAd,
5768
	IN	PUCHAR			pHeader802_3,
5769
    IN  UINT            HdrLen,
5770
	IN	PUCHAR			pData,
5771
	IN	ULONG			DataSize,
5772
	IN	UCHAR			FromWhichBSSID);
5773
5774
PNDIS_PACKET duplicate_pkt_with_WPI(
5775
	IN	PRTMP_ADAPTER	pAd,
5776
	IN	PNDIS_PACKET	pPacket,
5777
	IN	UINT32			ext_head_len,
5778
	IN	UINT32			ext_tail_len);
5779
5780
UCHAR VLAN_8023_Header_Copy(
5781
	IN	PRTMP_ADAPTER	pAd,
5782
	IN	PUCHAR			pHeader802_3,
5783
	IN	UINT            HdrLen,
5784
	OUT PUCHAR			pData,
5785
	IN	UCHAR			FromWhichBSSID);
5786
5787
void ba_flush_reordering_timeout_mpdus(
5238
void ba_flush_reordering_timeout_mpdus(
5788
	IN PRTMP_ADAPTER	pAd,
5239
	IN PRTMP_ADAPTER	pAd,
5789
	IN PBA_REC_ENTRY	pBAEntry,
5240
	IN PBA_REC_ENTRY	pBAEntry,
Lines 5828-5856 VOID BARecSessionTearDown( Link Here
5828
BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
5279
BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
5829
void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
5280
void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
5830
5281
5831
ULONG AutoChBssInsertEntry(
5832
	IN PRTMP_ADAPTER pAd,
5833
	IN PUCHAR pBssid,
5834
	IN CHAR Ssid[],
5835
	IN UCHAR SsidLen,
5836
	IN UCHAR ChannelNo,
5837
	IN CHAR Rssi);
5838
5839
void AutoChBssTableInit(
5840
	IN PRTMP_ADAPTER pAd);
5841
5842
void ChannelInfoInit(
5843
	IN PRTMP_ADAPTER pAd);
5844
5845
void AutoChBssTableDestroy(
5846
	IN PRTMP_ADAPTER pAd);
5847
5848
void ChannelInfoDestroy(
5849
	IN PRTMP_ADAPTER pAd);
5850
5851
UCHAR New_ApAutoSelectChannel(
5852
	IN PRTMP_ADAPTER pAd);
5853
5854
BOOLEAN rtstrmactohex(
5282
BOOLEAN rtstrmactohex(
5855
	IN char *s1,
5283
	IN char *s1,
5856
	IN char *s2);
5284
	IN char *s2);
Lines 6049-6064 INT Set_HtTxBASize_Proc( Link Here
6049
	IN	PRTMP_ADAPTER	pAd,
5477
	IN	PRTMP_ADAPTER	pAd,
6050
	IN	PUCHAR			arg);
5478
	IN	PUCHAR			arg);
6051
5479
6052
//Dls ,	kathy
6053
VOID RTMPSendDLSTearDownFrame(
6054
	IN	PRTMP_ADAPTER	pAd,
6055
	IN	PUCHAR			pDA);
6056
6057
//Block ACK
6058
VOID QueryBATABLE(
6059
	IN  PRTMP_ADAPTER pAd,
6060
	OUT PQUERYBA_TABLE pBAT);
6061
6062
INT	    WpaCheckEapCode(
5480
INT	    WpaCheckEapCode(
6063
	IN  PRTMP_ADAPTER   	pAd,
5481
	IN  PRTMP_ADAPTER   	pAd,
6064
	IN  PUCHAR				pFrame,
5482
	IN  PUCHAR				pFrame,
Lines 6069-6090 VOID WpaSendMicFailureToWpaSupplicant( Link Here
6069
    IN  PRTMP_ADAPTER       pAd,
5487
    IN  PRTMP_ADAPTER       pAd,
6070
    IN  BOOLEAN             bUnicast);
5488
    IN  BOOLEAN             bUnicast);
6071
5489
6072
VOID    SendAssocIEsToWpaSupplicant(
6073
    IN  PRTMP_ADAPTER       pAd);
6074
6075
int wext_notify_event_assoc(
5490
int wext_notify_event_assoc(
6076
	IN  RTMP_ADAPTER *pAd);
5491
	IN  RTMP_ADAPTER *pAd);
6077
5492
6078
VOID Handle_BSS_Width_Trigger_Events(
6079
	IN PRTMP_ADAPTER pAd);
6080
6081
void build_ext_channel_switch_ie(
6082
	IN PRTMP_ADAPTER pAd,
6083
	IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);
6084
6085
BOOLEAN APRxDoneInterruptHandle(
6086
	IN	PRTMP_ADAPTER	pAd);
6087
6088
BOOLEAN STARxDoneInterruptHandle(
5493
BOOLEAN STARxDoneInterruptHandle(
6089
	IN	PRTMP_ADAPTER	pAd,
5494
	IN	PRTMP_ADAPTER	pAd,
6090
	IN	BOOLEAN			argc);
5495
	IN	BOOLEAN			argc);
Lines 6160-6175 UINT deaggregate_AMSDU_announce( Link Here
6160
		_pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
5565
		_pRxBlk->DataSize, _pRemovedLLCSNAP);                                   \
6161
}
5566
}
6162
5567
6163
BOOLEAN APFowardWirelessStaToWirelessSta(
6164
	IN	PRTMP_ADAPTER	pAd,
6165
	IN	PNDIS_PACKET	pPacket,
6166
	IN	ULONG			FromWhichBSSID);
6167
6168
VOID Announce_or_Forward_802_3_Packet(
6169
	IN	PRTMP_ADAPTER	pAd,
6170
	IN	PNDIS_PACKET	pPacket,
6171
	IN	UCHAR			FromWhichBSSID);
6172
6173
VOID Sta_Announce_or_Forward_802_3_Packet(
5568
VOID Sta_Announce_or_Forward_802_3_Packet(
6174
	IN	PRTMP_ADAPTER	pAd,
5569
	IN	PRTMP_ADAPTER	pAd,
6175
	IN	PNDIS_PACKET	pPacket,
5570
	IN	PNDIS_PACKET	pPacket,
Lines 6209-6220 VOID Update_Rssi_Sample( Link Here
6209
	IN RSSI_SAMPLE		*pRssi,
5604
	IN RSSI_SAMPLE		*pRssi,
6210
	IN PRXWI_STRUC		pRxWI);
5605
	IN PRXWI_STRUC		pRxWI);
6211
5606
6212
PNDIS_PACKET GetPacketFromRxRing(
6213
	IN		PRTMP_ADAPTER	pAd,
6214
	OUT		PRT28XX_RXD_STRUC		pSaveRxD,
6215
	OUT		BOOLEAN			*pbReschedule,
6216
	IN OUT	UINT32			*pRxPending);
6217
6218
PNDIS_PACKET RTMPDeFragmentDataFrame(
5607
PNDIS_PACKET RTMPDeFragmentDataFrame(
6219
	IN	PRTMP_ADAPTER	pAd,
5608
	IN	PRTMP_ADAPTER	pAd,
6220
	IN	RX_BLK			*pRxBlk);
5609
	IN	RX_BLK			*pRxBlk);
Lines 6323-6333 void send_monitor_packets( Link Here
6323
	IN	PRTMP_ADAPTER	pAd,
5712
	IN	PRTMP_ADAPTER	pAd,
6324
	IN	RX_BLK			*pRxBlk);
5713
	IN	RX_BLK			*pRxBlk);
6325
5714
6326
#if WIRELESS_EXT >= 12
6327
// This function will be called when query /proc
5715
// This function will be called when query /proc
6328
struct iw_statistics *rt28xx_get_wireless_stats(
5716
struct iw_statistics *rt28xx_get_wireless_stats(
6329
    IN struct net_device *net_dev);
5717
    IN struct net_device *net_dev);
6330
#endif
6331
5718
6332
VOID    RTMPSetDesiredRates(
5719
VOID    RTMPSetDesiredRates(
6333
    IN  PRTMP_ADAPTER   pAdapter,
5720
    IN  PRTMP_ADAPTER   pAdapter,
Lines 6404-6425 VOID RT28xx_UpdateBeaconToAsic( Link Here
6404
	IN ULONG BeaconLen,
5791
	IN ULONG BeaconLen,
6405
	IN ULONG UpdatePos);
5792
	IN ULONG UpdatePos);
6406
5793
6407
INT rt28xx_ioctl(
6408
	IN	struct net_device	*net_dev,
6409
	IN	OUT	struct ifreq	*rq,
6410
	IN	INT			cmd);
6411
6412
INT rt28xx_sta_ioctl(
5794
INT rt28xx_sta_ioctl(
6413
	IN	struct net_device	*net_dev,
5795
	IN	struct net_device	*net_dev,
6414
	IN	OUT	struct ifreq	*rq,
5796
	IN	OUT	struct ifreq	*rq,
6415
	IN	INT			cmd);
5797
	IN	INT			cmd);
6416
5798
6417
BOOLEAN RT28XXSecurityKeyAdd(
6418
	IN		PRTMP_ADAPTER		pAd,
6419
	IN		ULONG				apidx,
6420
	IN		ULONG				KeyIdx,
6421
	IN		MAC_TABLE_ENTRY 	*pEntry);
6422
6423
////////////////////////////////////////
5799
////////////////////////////////////////
6424
PNDIS_PACKET GetPacketFromRxRing(
5800
PNDIS_PACKET GetPacketFromRxRing(
6425
	IN		PRTMP_ADAPTER	pAd,
5801
	IN		PRTMP_ADAPTER	pAd,
Lines 6555-6561 VOID AsicTurnOnRFClk( Link Here
6555
	IN PRTMP_ADAPTER 	pAd,
5931
	IN PRTMP_ADAPTER 	pAd,
6556
	IN	UCHAR			Channel);
5932
	IN	UCHAR			Channel);
6557
5933
6558
#ifdef RT30xx
6559
NTSTATUS RT30xxWriteRFRegister(
5934
NTSTATUS RT30xxWriteRFRegister(
6560
	IN	PRTMP_ADAPTER	pAd,
5935
	IN	PRTMP_ADAPTER	pAd,
6561
	IN	UCHAR			RegID,
5936
	IN	UCHAR			RegID,
Lines 6566-6572 NTSTATUS RT30xxReadRFRegister( Link Here
6566
	IN	UCHAR			RegID,
5941
	IN	UCHAR			RegID,
6567
	IN	PUCHAR			pValue);
5942
	IN	PUCHAR			pValue);
6568
5943
6569
//2008/09/11:KH add to support efuse<--
6570
UCHAR eFuseReadRegisters(
5944
UCHAR eFuseReadRegisters(
6571
	IN	PRTMP_ADAPTER	pAd,
5945
	IN	PRTMP_ADAPTER	pAd,
6572
	IN	USHORT Offset,
5946
	IN	USHORT Offset,
Lines 6637-6652 VOID eFusePhysicalReadRegisters( Link Here
6637
	IN	USHORT Length,
6011
	IN	USHORT Length,
6638
	OUT	USHORT* pData);
6012
	OUT	USHORT* pData);
6639
6013
6640
NDIS_STATUS NICLoadEEPROM(
6641
	IN PRTMP_ADAPTER pAd);
6642
6643
BOOLEAN bNeedLoadEEPROM(
6644
	IN	PRTMP_ADAPTER	pAd);
6645
//2008/09/11:KH add to support efuse-->
6646
#endif // RT30xx //
6647
6648
#ifdef RT30xx
6649
// add by johnli, RF power sequence setup
6650
VOID RT30xxLoadRFNormalModeSetup(
6014
VOID RT30xxLoadRFNormalModeSetup(
6651
	IN PRTMP_ADAPTER 	pAd);
6015
	IN PRTMP_ADAPTER 	pAd);
6652
6016
Lines 6655-6662 VOID RT30xxLoadRFSleepModeSetup( Link Here
6655
6019
6656
VOID RT30xxReverseRFSleepModeSetup(
6020
VOID RT30xxReverseRFSleepModeSetup(
6657
	IN PRTMP_ADAPTER 	pAd);
6021
	IN PRTMP_ADAPTER 	pAd);
6658
// end johnli
6659
#endif // RT30xx //
6660
6022
6661
#ifdef RT2870
6023
#ifdef RT2870
6662
//
6024
//
Lines 6675-6684 VOID RTUSBInitHTTxDesc( Link Here
6675
	IN	ULONG			BulkOutSize,
6037
	IN	ULONG			BulkOutSize,
6676
	IN	usb_complete_t	Func);
6038
	IN	usb_complete_t	Func);
6677
6039
6678
VOID	RTUSBInitRxDesc(
6679
	IN	PRTMP_ADAPTER	pAd,
6680
	IN	PRX_CONTEXT		pRxContext);
6681
6682
VOID RTUSBCleanUpDataBulkOutQueue(
6040
VOID RTUSBCleanUpDataBulkOutQueue(
6683
	IN	PRTMP_ADAPTER	pAd);
6041
	IN	PRTMP_ADAPTER	pAd);
6684
6042
Lines 6725-6733 VOID RTUSBInitRxDesc( Link Here
6725
	IN	PRTMP_ADAPTER	pAd,
6083
	IN	PRTMP_ADAPTER	pAd,
6726
	IN  PRX_CONTEXT		pRxContext);
6084
	IN  PRX_CONTEXT		pRxContext);
6727
6085
6728
VOID RTUSBBulkRxHandle(
6729
	IN unsigned long data);
6730
6731
//
6086
//
6732
// Function Prototype in rtusb_io.c
6087
// Function Prototype in rtusb_io.c
6733
//
6088
//
Lines 6762-6779 NTSTATUS RTUSBWriteRFRegister( Link Here
6762
	IN	PRTMP_ADAPTER	pAd,
6117
	IN	PRTMP_ADAPTER	pAd,
6763
	IN	UINT32			Value);
6118
	IN	UINT32			Value);
6764
6119
6765
#ifndef RT30xx
6766
NTSTATUS	RT30xxWriteRFRegister(
6767
	IN	PRTMP_ADAPTER	pAd,
6768
	IN	UCHAR			RegID,
6769
	IN	UCHAR			Value);
6770
6771
NTSTATUS	RT30xxReadRFRegister(
6772
	IN	PRTMP_ADAPTER	pAd,
6773
	IN	UCHAR			RegID,
6774
	IN	PUCHAR			pValue);
6775
#endif
6776
6777
NTSTATUS RTUSB_VendorRequest(
6120
NTSTATUS RTUSB_VendorRequest(
6778
	IN	PRTMP_ADAPTER	pAd,
6121
	IN	PRTMP_ADAPTER	pAd,
6779
	IN	UINT32			TransferFlags,
6122
	IN	UINT32			TransferFlags,
Lines 6887-6900 NTSTATUS RTUSBFirmwareOpmode( Link Here
6887
NTSTATUS	RTUSBVenderReset(
6230
NTSTATUS	RTUSBVenderReset(
6888
	IN	PRTMP_ADAPTER	pAd);
6231
	IN	PRTMP_ADAPTER	pAd);
6889
6232
6890
NDIS_STATUS RTUSBSetHardWareRegister(
6891
	IN	PRTMP_ADAPTER	pAdapter,
6892
	IN	PVOID			pBuf);
6893
6894
NDIS_STATUS RTUSBQueryHardWareRegister(
6895
	IN	PRTMP_ADAPTER	pAdapter,
6896
	IN	PVOID			pBuf);
6897
6898
VOID CMDHandler(
6233
VOID CMDHandler(
6899
    IN PRTMP_ADAPTER pAd);
6234
    IN PRTMP_ADAPTER pAd);
6900
6235
Lines 6917-6947 NDIS_STATUS RTMPWPAAddKeyProc( Link Here
6917
VOID AsicRxAntEvalAction(
6252
VOID AsicRxAntEvalAction(
6918
	IN PRTMP_ADAPTER pAd);
6253
	IN PRTMP_ADAPTER pAd);
6919
6254
6920
void append_pkt(
6921
	IN	PRTMP_ADAPTER	pAd,
6922
	IN	PUCHAR			pHeader802_3,
6923
    IN  UINT            HdrLen,
6924
	IN	PUCHAR			pData,
6925
	IN	ULONG			DataSize,
6926
	OUT  PNDIS_PACKET	*ppPacket);
6927
6928
UINT deaggregate_AMSDU_announce(
6929
	IN	PRTMP_ADAPTER	pAd,
6930
	PNDIS_PACKET		pPacket,
6931
	IN	PUCHAR			pData,
6932
	IN	ULONG			DataSize);
6933
6934
NDIS_STATUS	RTMPCheckRxError(
6255
NDIS_STATUS	RTMPCheckRxError(
6935
	IN	PRTMP_ADAPTER	pAd,
6256
	IN	PRTMP_ADAPTER	pAd,
6936
	IN	PHEADER_802_11	pHeader,
6257
	IN	PHEADER_802_11	pHeader,
6937
	IN	PRXWI_STRUC	pRxWI,
6258
	IN	PRXWI_STRUC	pRxWI,
6938
	IN	PRT28XX_RXD_STRUC	pRxINFO);
6259
	IN	PRT28XX_RXD_STRUC	pRxINFO);
6939
6260
6940
6941
VOID RTUSBMlmeHardTransmit(
6942
	IN	PRTMP_ADAPTER	pAd,
6943
	IN	PMGMT_STRUC		pMgmt);
6944
6945
INT MlmeThread(
6261
INT MlmeThread(
6946
	IN PVOID Context);
6262
	IN PVOID Context);
6947
6263
Lines 7043-7061 VOID RT28xxUsbMlmeRadioOFF( Link Here
7043
	IN PRTMP_ADAPTER pAd);
6359
	IN PRTMP_ADAPTER pAd);
7044
#endif // RT2870 //
6360
#endif // RT2870 //
7045
6361
7046
////////////////////////////////////////
7047
7048
VOID QBSS_LoadInit(
7049
 	IN		RTMP_ADAPTER	*pAd);
7050
7051
UINT32 QBSS_LoadElementAppend(
7052
 	IN		RTMP_ADAPTER	*pAd,
7053
	OUT		UINT8			*buf_p);
7054
7055
VOID QBSS_LoadUpdate(
7056
 	IN		RTMP_ADAPTER	*pAd);
7057
7058
///////////////////////////////////////
7059
INT RTMPShowCfgValue(
6362
INT RTMPShowCfgValue(
7060
	IN	PRTMP_ADAPTER	pAd,
6363
	IN	PRTMP_ADAPTER	pAd,
7061
	IN	PUCHAR			pName,
6364
	IN	PUCHAR			pName,
Lines 7066-7072 PCHAR RTMPGetRalinkAuthModeStr( Link Here
7066
6369
7067
PCHAR   RTMPGetRalinkEncryModeStr(
6370
PCHAR   RTMPGetRalinkEncryModeStr(
7068
    IN  USHORT encryMode);
6371
    IN  USHORT encryMode);
7069
//////////////////////////////////////
7070
6372
7071
VOID AsicStaBbpTuning(
6373
VOID AsicStaBbpTuning(
7072
	IN PRTMP_ADAPTER pAd);
6374
	IN PRTMP_ADAPTER pAd);
Lines 7109-7117 int rt28xx_open(IN PNET_DEV dev); Link Here
7109
6411
7110
__inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
6412
__inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
7111
{
6413
{
7112
extern VOID MeshMakeBeacon(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
7113
extern VOID MeshUpdateBeaconFrame(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
7114
7115
	if (VIRTUAL_IF_NUM(pAd) == 0)
6414
	if (VIRTUAL_IF_NUM(pAd) == 0)
7116
	{
6415
	{
7117
		if (rt28xx_open(pAd->net_dev) != 0)
6416
		if (rt28xx_open(pAd->net_dev) != 0)
(-)a/drivers/staging/rt2860/rtmp_ckipmic.h (-35 lines)
Lines 46-69 typedef struct _MIC_CONTEXT { Link Here
46
	UCHAR		part[4];			/* for conversion of message to u32 for mmh   */
46
	UCHAR		part[4];			/* for conversion of message to u32 for mmh   */
47
}	MIC_CONTEXT, *PMIC_CONTEXT;
47
}	MIC_CONTEXT, *PMIC_CONTEXT;
48
48
49
VOID	CKIP_key_permute(
50
	OUT	UCHAR	*PK,			/* output permuted key */
51
	IN	UCHAR	*CK,			/* input CKIP key */
52
	IN	UCHAR	toDsFromDs,		/* input toDs/FromDs bits */
53
	IN	UCHAR	*piv);			/* input pointer to IV */
54
55
VOID	RTMPCkipMicInit(
56
	IN	PMIC_CONTEXT		pContext,
57
	IN	PUCHAR				CK);
58
59
VOID RTMPMicUpdate(
60
    IN  PMIC_CONTEXT        pContext,
61
    IN  PUCHAR              pOctets,
62
    IN  INT                 len);
63
64
ULONG RTMPMicGetCoefficient(
65
    IN  PMIC_CONTEXT         pContext);
66
67
VOID xor_128(
49
VOID xor_128(
68
    IN  PUCHAR              a,
50
    IN  PUCHAR              a,
69
    IN  PUCHAR              b,
51
    IN  PUCHAR              b,
Lines 93-113 VOID mix_column( Link Here
93
    IN  PUCHAR              in,
75
    IN  PUCHAR              in,
94
    OUT PUCHAR              out);
76
    OUT PUCHAR              out);
95
77
96
VOID RTMPAesEncrypt(
97
    IN  PUCHAR              key,
98
    IN  PUCHAR              data,
99
    IN  PUCHAR              ciphertext);
100
101
VOID RTMPMicFinal(
102
    IN  PMIC_CONTEXT        pContext,
103
    OUT UCHAR               digest[4]);
104
105
VOID RTMPCkipInsertCMIC(
106
    IN  PRTMP_ADAPTER   pAd,
107
    OUT PUCHAR          pMIC,
108
    IN  PUCHAR          p80211hdr,
109
    IN  PNDIS_PACKET    pPacket,
110
    IN  PCIPHER_KEY     pKey,
111
    IN  PUCHAR          mic_snap);
112
113
#endif //__RTMP_CKIPMIC_H__
78
#endif //__RTMP_CKIPMIC_H__
(-)a/drivers/staging/rt2860/rtmp_def.h (-14 lines)
Lines 148-158 Link Here
148
#define MAX_PACKETS_IN_PS_QUEUE				128	//32
148
#define MAX_PACKETS_IN_PS_QUEUE				128	//32
149
#define WMM_NUM_OF_AC                       4  /* AC0, AC1, AC2, and AC3 */
149
#define WMM_NUM_OF_AC                       4  /* AC0, AC1, AC2, and AC3 */
150
150
151
#ifdef RT30xx
152
//2008/09/11:KH add to support efuse<--
153
#define MAX_EEPROM_BIN_FILE_SIZE					1024
151
#define MAX_EEPROM_BIN_FILE_SIZE					1024
154
//2008/09/11:KH add to support efuse-->
155
#endif
156
152
157
// RxFilter
153
// RxFilter
158
#define STANORMAL	 0x17f97
154
#define STANORMAL	 0x17f97
Lines 573-581 Link Here
573
// For 802.11n D3.03
569
// For 802.11n D3.03
574
//#define IE_NEW_EXT_CHA_OFFSET             62    // 802.11n d1. New extension channel offset elemet
570
//#define IE_NEW_EXT_CHA_OFFSET             62    // 802.11n d1. New extension channel offset elemet
575
#define IE_SECONDARY_CH_OFFSET		62	// 802.11n D3.03	Secondary Channel Offset element
571
#define IE_SECONDARY_CH_OFFSET		62	// 802.11n D3.03	Secondary Channel Offset element
576
#ifdef RT2870
577
#define IE_WAPI							68		// WAPI information element
578
#endif
579
#define IE_2040_BSS_COEXIST               72    // 802.11n D3.0.3
572
#define IE_2040_BSS_COEXIST               72    // 802.11n D3.0.3
580
#define IE_2040_BSS_INTOLERANT_REPORT     73    // 802.11n D3.03
573
#define IE_2040_BSS_INTOLERANT_REPORT     73    // 802.11n D3.03
581
#define IE_OVERLAPBSS_SCAN_PARM           74    // 802.11n D3.03
574
#define IE_OVERLAPBSS_SCAN_PARM           74    // 802.11n D3.03
Lines 624-634 Link Here
624
#define AP_CNTL_STATE_MACHINE           15
617
#define AP_CNTL_STATE_MACHINE           15
625
#define AP_WPA_STATE_MACHINE            16
618
#define AP_WPA_STATE_MACHINE            16
626
619
627
#ifdef RT30xx
628
#define WSC_STATE_MACHINE            17
629
#define WSC_UPNP_STATE_MACHINE		    18
630
#endif
631
632
//
620
//
633
// STA's CONTROL/CONNECT state machine: states, events, total function #
621
// STA's CONTROL/CONNECT state machine: states, events, total function #
634
//
622
//
Lines 1215-1224 Link Here
1215
#define RFIC_2750                   4       // 2.4G/5G 1T2R
1203
#define RFIC_2750                   4       // 2.4G/5G 1T2R
1216
#define RFIC_3020                   5       // 2.4G 1T1R
1204
#define RFIC_3020                   5       // 2.4G 1T1R
1217
#define RFIC_2020                   6       // 2.4G B/G
1205
#define RFIC_2020                   6       // 2.4G B/G
1218
#ifdef RT30xx
1219
#define RFIC_3021                   7       // 2.4G 1T2R
1206
#define RFIC_3021                   7       // 2.4G 1T2R
1220
#define RFIC_3022                   8       // 2.4G 2T2R
1207
#define RFIC_3022                   8       // 2.4G 2T2R
1221
#endif
1222
1208
1223
// LED Status.
1209
// LED Status.
1224
#define LED_LINK_DOWN               0
1210
#define LED_LINK_DOWN               0
(-)a/drivers/staging/rt2860/sta/assoc.c (-26 lines)
Lines 454-464 VOID MlmeAssocReqAction( Link Here
454
				RSNIe = IE_WPA2;
454
				RSNIe = IE_WPA2;
455
			}
455
			}
456
456
457
#ifdef RT30xx
458
#ifdef SIOCSIWGENIE
459
			if (pAd->StaCfg.WpaSupplicantUP != 1)
457
			if (pAd->StaCfg.WpaSupplicantUP != 1)
460
#endif // SIOCSIWGENIE //
461
#endif
462
            RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
458
            RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
463
459
464
            // Check for WPA PMK cache list
460
            // Check for WPA PMK cache list
Lines 485-492 VOID MlmeAssocReqAction( Link Here
485
				}
481
				}
486
			}
482
			}
487
483
488
#ifdef RT30xx
489
#ifdef SIOCSIWGENIE
490
			if (pAd->StaCfg.WpaSupplicantUP == 1)
484
			if (pAd->StaCfg.WpaSupplicantUP == 1)
491
			{
485
			{
492
				MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,
486
				MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,
Lines 494-501 VOID MlmeAssocReqAction( Link Here
494
		                        	END_OF_ARGS);
488
		                        	END_OF_ARGS);
495
			}
489
			}
496
			else
490
			else
497
#endif
498
#endif
499
			{
491
			{
500
				MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,
492
				MakeOutgoingFrame(pOutBuffer + FrameLen,    		&tmp,
501
				              		1,                              &RSNIe,
493
				              		1,                              &RSNIe,
Lines 506-516 VOID MlmeAssocReqAction( Link Here
506
498
507
			FrameLen += tmp;
499
			FrameLen += tmp;
508
500
509
#ifdef RT30xx
510
#ifdef SIOCSIWGENIE
511
			if (pAd->StaCfg.WpaSupplicantUP != 1)
501
			if (pAd->StaCfg.WpaSupplicantUP != 1)
512
#endif
513
#endif
514
			{
502
			{
515
	            // Append Variable IE
503
	            // Append Variable IE
516
	            NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);
504
	            NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);
Lines 1503-1509 int wext_notify_event_assoc( Link Here
1503
    union iwreq_data    wrqu;
1491
    union iwreq_data    wrqu;
1504
    char custom[IW_CUSTOM_MAX] = {0};
1492
    char custom[IW_CUSTOM_MAX] = {0};
1505
1493
1506
#if WIRELESS_EXT > 17
1507
    if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX)
1494
    if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX)
1508
    {
1495
    {
1509
        wrqu.data.length = pAd->StaCfg.ReqVarIELen;
1496
        wrqu.data.length = pAd->StaCfg.ReqVarIELen;
Lines 1512-1530 int wext_notify_event_assoc( Link Here
1512
    }
1499
    }
1513
    else
1500
    else
1514
        DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n"));
1501
        DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n"));
1515
#else
1516
    if (((pAd->StaCfg.ReqVarIELen*2) + 17) <= IW_CUSTOM_MAX)
1517
    {
1518
        UCHAR   idx;
1519
        wrqu.data.length = (pAd->StaCfg.ReqVarIELen*2) + 17;
1520
        sprintf(custom, "ASSOCINFO(ReqIEs=");
1521
        for (idx=0; idx<pAd->StaCfg.ReqVarIELen; idx++)
1522
                sprintf(custom + strlen(custom), "%02x", pAd->StaCfg.ReqVarIEs[idx]);
1523
        wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, custom);
1524
    }
1525
    else
1526
        DBGPRINT(RT_DEBUG_TRACE, ("(pAd->StaCfg.ReqVarIELen*2) + 17 > MAX_CUSTOM_LEN\n"));
1527
#endif
1528
1502
1529
	return 0;
1503
	return 0;
1530
1504
(-)a/drivers/staging/rt2860/sta/connect.c (-13 / +2 lines)
Lines 1171-1177 VOID LinkUp( Link Here
1171
		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1171
		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1172
		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1172
		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1173
1173
1174
#ifdef RT30xx
1175
		if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) &&
1174
		if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) &&
1176
			(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE))
1175
			(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE))
1177
		{
1176
		{
Lines 1183-1189 VOID LinkUp( Link Here
1183
		{
1182
		{
1184
			pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;
1183
			pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;
1185
		}
1184
		}
1186
#endif
1187
#ifdef RT2870
1185
#ifdef RT2870
1188
		if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1186
		if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1189
			AdhocTurnOnQos(pAd);
1187
			AdhocTurnOnQos(pAd);
Lines 1585-1593 VOID LinkUp( Link Here
1585
		pAd->MacTab.Size = 1;	// infra mode always set MACtab size =1.
1583
		pAd->MacTab.Size = 1;	// infra mode always set MACtab size =1.
1586
		pAd->MacTab.Content[BSSID_WCID].Sst = SST_ASSOC;
1584
		pAd->MacTab.Content[BSSID_WCID].Sst = SST_ASSOC;
1587
		pAd->MacTab.Content[BSSID_WCID].AuthState = SST_ASSOC;
1585
		pAd->MacTab.Content[BSSID_WCID].AuthState = SST_ASSOC;
1588
#ifdef RT30xx
1589
		pAd->MacTab.Content[BSSID_WCID].AuthMode = pAd->StaCfg.AuthMode;
1586
		pAd->MacTab.Content[BSSID_WCID].AuthMode = pAd->StaCfg.AuthMode;
1590
#endif
1591
		pAd->MacTab.Content[BSSID_WCID].WepStatus = pAd->StaCfg.WepStatus;
1587
		pAd->MacTab.Content[BSSID_WCID].WepStatus = pAd->StaCfg.WepStatus;
1592
        NdisReleaseSpinLock(&pAd->MacTabLock);
1588
        NdisReleaseSpinLock(&pAd->MacTabLock);
1593
1589
Lines 1711-1725 VOID LinkUp( Link Here
1711
	// Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable
1707
	// Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable
1712
	//
1708
	//
1713
	// if 1. Legacy AP WMM on,  or 2. 11n AP, AMPDU disable.  Force turn off burst no matter what bEnableTxBurst is.
1709
	// if 1. Legacy AP WMM on,  or 2. 11n AP, AMPDU disable.  Force turn off burst no matter what bEnableTxBurst is.
1714
#ifdef RT30xx
1710
	if (
1715
	if (!((pAd->CommonCfg.RxStream == 1)&&(pAd->CommonCfg.TxStream == 1)) &&
1711
		!(pAd->CommonCfg.RxStream == 1 && pAd->CommonCfg.TxStream == 1) &&
1716
		(((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1712
		(((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1717
		|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))))
1713
		|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))))
1718
#endif
1719
#ifndef RT30xx
1720
	if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))
1721
		|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))
1722
#endif
1723
	{
1714
	{
1724
		RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1715
		RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1725
		Data  &= 0xFFFFFF00;
1716
		Data  &= 0xFFFFFF00;
Lines 2101-2107 VOID LinkDown( Link Here
2101
		wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
2092
		wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
2102
	}
2093
	}
2103
2094
2104
#ifdef RT30xx
2105
	if (IS_RT3090(pAd))
2095
	if (IS_RT3090(pAd))
2106
	{
2096
	{
2107
		UINT32				macdata;
2097
		UINT32				macdata;
Lines 2115-2121 VOID LinkDown( Link Here
2115
		macdata &= ~(0x09);	//bit 0, 3
2105
		macdata &= ~(0x09);	//bit 0, 3
2116
		RTMP_IO_WRITE32(pAd, 0x1210, macdata);
2106
		RTMP_IO_WRITE32(pAd, 0x1210, macdata);
2117
	}
2107
	}
2118
#endif // RT30xx //
2119
}
2108
}
2120
2109
2121
/*
2110
/*
(-)a/drivers/staging/rt2860/sta/rtmp_data.c (-10 / +5 lines)
Lines 575-595 VOID STAHandleRxMgmtFrame( Link Here
575
	{
575
	{
576
576
577
		// We should collect RSSI not only U2M data but also my beacon
577
		// We should collect RSSI not only U2M data but also my beacon
578
#ifdef RT30xx
578
		if (pAd->RxAnt.EvaluatePeriod == 0 &&
579
		if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))
579
		    pHeader->FC.SubType == SUBTYPE_BEACON &&
580
			&& (pAd->RxAnt.EvaluatePeriod == 0))
580
		    MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)) {
581
#endif
582
#ifndef RT30xx
583
		if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)))
584
#endif
585
		{
586
			Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
581
			Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
587
582
588
			pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0);
583
			pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0);
589
			pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1);
584
			pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1);
590
		}
585
		}
591
586
592
#ifdef RT30xx
587
#ifdef RT2870
593
		// collect rssi information for antenna diversity
588
		// collect rssi information for antenna diversity
594
		if (pAd->NicConfig2.field.AntDiversity)
589
		if (pAd->NicConfig2.field.AntDiversity)
595
		{
590
		{
Lines 599-605 VOID STAHandleRxMgmtFrame( Link Here
599
					pAd->StaCfg.NumOfAvgRssiSample ++;
594
					pAd->StaCfg.NumOfAvgRssiSample ++;
600
			}
595
			}
601
		}
596
		}
602
#endif // RT30xx //
597
#endif
603
598
604
		// First check the size, it MUST not exceed the mlme queue size
599
		// First check the size, it MUST not exceed the mlme queue size
605
		if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE)
600
		if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE)
(-)a/drivers/staging/rt2860/sta/sync.c (-2 lines)
Lines 1116-1125 VOID PeerBeacon( Link Here
1116
			// Add the safeguard against the mismatch of adhoc wep status
1116
			// Add the safeguard against the mismatch of adhoc wep status
1117
			if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus)
1117
			if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus)
1118
			{
1118
			{
1119
#ifdef RT30xx
1120
				DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->ScanTab.BssEntry[Bssidx].WepStatus));
1119
				DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->ScanTab.BssEntry[Bssidx].WepStatus));
1121
				DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->ScanTab.BssEntry[Bssidx].Bssid));
1120
				DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->ScanTab.BssEntry[Bssidx].Bssid));
1122
#endif
1123
				return;
1121
				return;
1124
			}
1122
			}
1125
1123
(-)a/drivers/staging/rt2860/sta/wpa.c (-9 lines)
Lines 1384-1395 VOID WpaGroupMsg1Action( Link Here
1384
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1384
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1385
		else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1385
		else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1386
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1386
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1387
#ifndef RT30xx
1388
		else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1387
		else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1389
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1388
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1390
		else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1389
		else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1391
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1390
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1392
#endif
1393
1391
1394
    	//hex_dump("Group Key :", pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, LEN_TKIP_EK);
1392
    	//hex_dump("Group Key :", pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, LEN_TKIP_EK);
1395
	}
1393
	}
Lines 1766-1777 BOOLEAN ParseKeyData( Link Here
1766
	// Get GTK length - refer to IEEE 802.11i-2004 p.82
1764
	// Get GTK length - refer to IEEE 802.11i-2004 p.82
1767
	GTKLEN = pKDE->Len -6;
1765
	GTKLEN = pKDE->Len -6;
1768
1766
1769
#ifdef RT30xx
1770
	if (GTKLEN < LEN_AES_KEY)
1767
	if (GTKLEN < LEN_AES_KEY)
1771
#endif
1772
#ifndef RT30xx
1773
	if (GTKLEN < MIN_LEN_OF_GTK)
1774
#endif
1775
	{
1768
	{
1776
		DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN));
1769
		DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN));
1777
        return FALSE;
1770
        return FALSE;
Lines 1797-1808 BOOLEAN ParseKeyData( Link Here
1797
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1790
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1798
	else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1791
	else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1799
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1792
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1800
#ifndef RT30xx
1801
	else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1793
	else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1802
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1794
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1803
	else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1795
	else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1804
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1796
		pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1805
#endif
1806
1797
1807
	return TRUE;
1798
	return TRUE;
1808
1799
(-)a/drivers/staging/rt2860/sta_ioctl.c (-3146 / +28 lines)
Lines 87-115 struct iw_priv_args privtab[] = { Link Here
87
	  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_on" },
87
	  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_on" },
88
	{ SHOW_CFG_VALUE,
88
	{ SHOW_CFG_VALUE,
89
	  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "show" },
89
	  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "show" },
90
#if !defined(RT2860) && !defined(RT30xx)
91
	{ SHOW_ADHOC_ENTRY_INFO,
92
	  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "adhocEntry" },
93
#endif
94
/* --- sub-ioctls relations --- */
90
/* --- sub-ioctls relations --- */
95
91
96
#ifdef DBG
97
{ RTPRIV_IOCTL_BBP,
98
  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
99
  "bbp"},
100
{ RTPRIV_IOCTL_MAC,
101
  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
102
  "mac"},
103
#ifdef RT30xx
104
{ RTPRIV_IOCTL_RF,
105
  IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
106
  "rf"},
107
#endif // RT30xx //
108
{ RTPRIV_IOCTL_E2P,
109
  IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024,
110
  "e2p"},
111
#endif  /* DBG */
112
113
{ RTPRIV_IOCTL_STATISTICS,
92
{ RTPRIV_IOCTL_STATISTICS,
114
  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
93
  0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK,
115
  "stat"},
94
  "stat"},
Lines 173-201 INT Set_Wpa_Support( Link Here
173
    IN	PRTMP_ADAPTER	pAd,
152
    IN	PRTMP_ADAPTER	pAd,
174
	IN	PUCHAR			arg);
153
	IN	PUCHAR			arg);
175
154
176
#ifdef DBG
177
#if !defined(RT2860) && !defined(RT30xx)
178
VOID RTMPIoctlBBP(
179
	IN	PRTMP_ADAPTER	pAdapter,
180
	IN	struct iwreq	*wrq);
181
#endif
182
183
VOID RTMPIoctlMAC(
184
	IN	PRTMP_ADAPTER	pAdapter,
185
	IN	struct iwreq	*wrq);
186
187
VOID RTMPIoctlE2PROM(
188
    IN  PRTMP_ADAPTER   pAdapter,
189
    IN  struct iwreq    *wrq);
190
191
#ifdef RT30xx
192
VOID RTMPIoctlRF(
193
    IN  PRTMP_ADAPTER   pAdapter,
194
    IN  struct iwreq    *wrq);
195
#endif // RT30xx //
196
#endif // DBG //
197
198
199
NDIS_STATUS RTMPWPANoneAddKeyProc(
155
NDIS_STATUS RTMPWPANoneAddKeyProc(
200
    IN  PRTMP_ADAPTER   pAd,
156
    IN  PRTMP_ADAPTER   pAd,
201
    IN	PVOID			pBuf);
157
    IN	PVOID			pBuf);
Lines 216-227 INT Set_ShortRetryLimit_Proc( Link Here
216
	IN	PRTMP_ADAPTER	pAdapter,
172
	IN	PRTMP_ADAPTER	pAdapter,
217
	IN	PUCHAR			arg);
173
	IN	PUCHAR			arg);
218
174
219
#if !defined(RT2860) && !defined(RT30xx)
220
INT	Show_Adhoc_MacTable_Proc(
221
	IN	PRTMP_ADAPTER	pAd,
222
	IN	PCHAR			extra);
223
#endif
224
225
static struct {
175
static struct {
226
	CHAR *name;
176
	CHAR *name;
227
	INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);
177
	INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);
Lines 279-291 static struct { Link Here
279
    {"ForceGF",		        		Set_ForceGF_Proc},
229
    {"ForceGF",		        		Set_ForceGF_Proc},
280
	{"LongRetry",	        		Set_LongRetryLimit_Proc},
230
	{"LongRetry",	        		Set_LongRetryLimit_Proc},
281
	{"ShortRetry",	        		Set_ShortRetryLimit_Proc},
231
	{"ShortRetry",	        		Set_ShortRetryLimit_Proc},
282
//2008/09/11:KH add to support efuse<--
232
#ifdef RT2870
283
#ifdef RT30xx
284
	{"efuseFreeNumber",				set_eFuseGetFreeBlockCount_Proc},
233
	{"efuseFreeNumber",				set_eFuseGetFreeBlockCount_Proc},
285
	{"efuseDump",					set_eFusedump_Proc},
234
	{"efuseDump",					set_eFusedump_Proc},
286
	{"efuseLoadFromBin",				set_eFuseLoadFromBin_Proc},
235
	{"efuseLoadFromBin",				set_eFuseLoadFromBin_Proc},
287
#endif // RT30xx //
236
#endif
288
//2008/09/11:KH add to support efuse-->
289
	{NULL,}
237
	{NULL,}
290
};
238
};
291
239
Lines 531-542 rt_ioctl_giwname(struct net_device *dev, Link Here
531
		   char *name, char *extra)
479
		   char *name, char *extra)
532
{
480
{
533
//	PRTMP_ADAPTER pAdapter = dev->ml_priv;
481
//	PRTMP_ADAPTER pAdapter = dev->ml_priv;
534
#ifdef RT2860
482
	strncpy(name, RT28xx_CHIP_NAME " Wireless", IFNAMSIZ);
535
    strncpy(name, "RT2860 Wireless", IFNAMSIZ);
536
#endif
537
#ifdef RT2870
538
	strncpy(name, "RT2870 Wireless", IFNAMSIZ);
539
#endif // RT2870 //
540
	return 0;
483
	return 0;
541
}
484
}
542
485
Lines 577-614 int rt_ioctl_giwfreq(struct net_device *dev, Link Here
577
		   struct iw_request_info *info,
520
		   struct iw_request_info *info,
578
		   struct iw_freq *freq, char *extra)
521
		   struct iw_freq *freq, char *extra)
579
{
522
{
580
    VIRTUAL_ADAPTER *pVirtualAd = NULL;
523
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
581
#ifndef RT30xx
524
	UCHAR ch = pAdapter->CommonCfg.Channel;
582
	PRTMP_ADAPTER pAdapter = NULL;
583
#endif
584
#ifdef RT30xx
585
	PRTMP_ADAPTER pAdapter;
586
#endif
587
	UCHAR ch;
588
	ULONG	m;
525
	ULONG	m;
589
526
590
	if (dev->priv_flags == INT_MAIN)
591
	{
592
		pAdapter = dev->ml_priv;
593
	}
594
	else
595
	{
596
		pVirtualAd = dev->ml_priv;
597
#ifndef RT30xx
598
		if (pVirtualAd && pVirtualAd->RtmpDev)
599
#endif
600
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
601
	}
602
603
	if (pAdapter == NULL)
604
	{
605
		/* if 1st open fail, pAd will be free;
606
		   So the net_dev->ml_priv will be NULL in 2rd open */
607
		return -ENETDOWN;
608
	}
609
610
		ch = pAdapter->CommonCfg.Channel;
611
612
	DBGPRINT(RT_DEBUG_TRACE,("==>rt_ioctl_giwfreq  %d\n", ch));
527
	DBGPRINT(RT_DEBUG_TRACE,("==>rt_ioctl_giwfreq  %d\n", ch));
613
528
614
    MAP_CHANNEL_ID_TO_KHZ(ch, m);
529
    MAP_CHANNEL_ID_TO_KHZ(ch, m);
Lines 656-686 int rt_ioctl_giwmode(struct net_device *dev, Link Here
656
		   struct iw_request_info *info,
571
		   struct iw_request_info *info,
657
		   __u32 *mode, char *extra)
572
		   __u32 *mode, char *extra)
658
{
573
{
659
#ifndef RT30xx
660
	PRTMP_ADAPTER 	pAdapter = NULL;
661
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
662
663
	if (dev->priv_flags == INT_MAIN)
664
	{
665
		pAdapter = dev->ml_priv;
666
	}
667
	else
668
	{
669
		pVirtualAd = dev->ml_priv;
670
		if (pVirtualAd && pVirtualAd->RtmpDev)
671
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
672
	}
673
674
	if (pAdapter == NULL)
675
	{
676
		/* if 1st open fail, pAd will be free;
677
		   So the net_dev->ml_priv will be NULL in 2rd open */
678
		return -ENETDOWN;
679
	}
680
#endif
681
#ifdef RT30xx
682
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
574
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
683
#endif
684
575
685
	if (ADHOC_ON(pAdapter))
576
	if (ADHOC_ON(pAdapter))
686
		*mode = IW_MODE_ADHOC;
577
		*mode = IW_MODE_ADHOC;
Lines 724-760 int rt_ioctl_giwrange(struct net_device *dev, Link Here
724
		   struct iw_request_info *info,
615
		   struct iw_request_info *info,
725
		   struct iw_point *data, char *extra)
616
		   struct iw_point *data, char *extra)
726
{
617
{
727
#ifndef RT30xx
728
	PRTMP_ADAPTER 	pAdapter = NULL;
729
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
730
#endif
731
#ifdef RT30xx
732
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
618
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
733
#endif
734
	struct iw_range *range = (struct iw_range *) extra;
619
	struct iw_range *range = (struct iw_range *) extra;
735
	u16 val;
620
	u16 val;
736
	int i;
621
	int i;
737
622
738
#ifndef RT30xx
739
	if (dev->priv_flags == INT_MAIN)
740
	{
741
		pAdapter = dev->ml_priv;
742
	}
743
	else
744
	{
745
		pVirtualAd = dev->ml_priv;
746
		if (pVirtualAd && pVirtualAd->RtmpDev)
747
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
748
	}
749
750
	if (pAdapter == NULL)
751
	{
752
		/* if 1st open fail, pAd will be free;
753
		   So the net_dev->ml_priv will be NULL in 2rd open */
754
		return -ENETDOWN;
755
	}
756
#endif
757
758
	DBGPRINT(RT_DEBUG_TRACE ,("===>rt_ioctl_giwrange\n"));
623
	DBGPRINT(RT_DEBUG_TRACE ,("===>rt_ioctl_giwrange\n"));
759
	data->length = sizeof(struct iw_range);
624
	data->length = sizeof(struct iw_range);
760
	memset(range, 0, sizeof(struct iw_range));
625
	memset(range, 0, sizeof(struct iw_range));
Lines 820-830 int rt_ioctl_giwrange(struct net_device *dev, Link Here
820
	range->min_frag = 256;
685
	range->min_frag = 256;
821
	range->max_frag = 2346;
686
	range->max_frag = 2346;
822
687
823
#if WIRELESS_EXT > 17
824
	/* IW_ENC_CAPA_* bit field */
688
	/* IW_ENC_CAPA_* bit field */
825
	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
689
	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
826
					IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
690
					IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
827
#endif
828
691
829
	return 0;
692
	return 0;
830
}
693
}
Lines 873-903 int rt_ioctl_giwap(struct net_device *dev, Link Here
873
		      struct iw_request_info *info,
736
		      struct iw_request_info *info,
874
		      struct sockaddr *ap_addr, char *extra)
737
		      struct sockaddr *ap_addr, char *extra)
875
{
738
{
876
#ifndef RT30xx
877
	PRTMP_ADAPTER 	pAdapter = NULL;
878
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
879
880
	if (dev->priv_flags == INT_MAIN)
881
	{
882
		pAdapter = dev->ml_priv;
883
	}
884
	else
885
	{
886
		pVirtualAd = dev->ml_priv;
887
		if (pVirtualAd && pVirtualAd->RtmpDev)
888
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
889
	}
890
891
	if (pAdapter == NULL)
892
	{
893
		/* if 1st open fail, pAd will be free;
894
		   So the net_dev->ml_priv will be NULL in 2rd open */
895
		return -ENETDOWN;
896
	}
897
#endif
898
#ifdef RT30xx
899
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
739
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
900
#endif
901
740
902
	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
741
	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
903
	{
742
	{
Lines 994-1000 int rt_ioctl_iwaplist(struct net_device *dev, Link Here
994
	return 0;
833
	return 0;
995
}
834
}
996
835
997
#ifdef SIOCGIWSCAN
998
int rt_ioctl_siwscan(struct net_device *dev,
836
int rt_ioctl_siwscan(struct net_device *dev,
999
			struct iw_request_info *info,
837
			struct iw_request_info *info,
1000
			struct iw_point *data, char *extra)
838
			struct iw_point *data, char *extra)
Lines 1091-1099 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1091
	char *current_ev = extra, *previous_ev = extra;
929
	char *current_ev = extra, *previous_ev = extra;
1092
	char *end_buf;
930
	char *end_buf;
1093
	char *current_val, custom[MAX_CUSTOM_LEN] = {0};
931
	char *current_val, custom[MAX_CUSTOM_LEN] = {0};
1094
#ifndef IWEVGENIE
1095
	char idx;
1096
#endif // IWEVGENIE //
1097
	struct iw_event iwe;
932
	struct iw_event iwe;
1098
933
1099
	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
934
	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
Lines 1115-1139 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1115
		return 0;
950
		return 0;
1116
	}
951
	}
1117
952
1118
#if WIRELESS_EXT >= 17
1119
    if (data->length > 0)
953
    if (data->length > 0)
1120
        end_buf = extra + data->length;
954
        end_buf = extra + data->length;
1121
    else
955
    else
1122
        end_buf = extra + IW_SCAN_MAX_DATA;
956
        end_buf = extra + IW_SCAN_MAX_DATA;
1123
#else
1124
    end_buf = extra + IW_SCAN_MAX_DATA;
1125
#endif
1126
957
1127
	for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
958
	for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
1128
	{
959
	{
1129
		if (current_ev >= end_buf)
960
		if (current_ev >= end_buf)
1130
        {
961
			return -E2BIG;
1131
#if WIRELESS_EXT >= 17
1132
            return -E2BIG;
1133
#else
1134
			break;
1135
#endif
1136
        }
1137
962
1138
		//MAC address
963
		//MAC address
1139
		//================================
964
		//================================
Lines 1144-1156 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1144
969
1145
        previous_ev = current_ev;
970
        previous_ev = current_ev;
1146
		current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);
971
		current_ev = iwe_stream_add_event(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);
1147
#ifdef RT30xx
1148
        if (current_ev == previous_ev)
972
        if (current_ev == previous_ev)
1149
#if WIRELESS_EXT >= 17
973
		return -E2BIG;
1150
            return -E2BIG;
1151
#else
1152
			break;
1153
#endif
1154
974
1155
		/*
975
		/*
1156
		Protocol:
976
		Protocol:
Lines 1224-1236 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1224
1044
1225
		previous_ev = current_ev;
1045
		previous_ev = current_ev;
1226
		current_ev	 = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
1046
		current_ev	 = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_ADDR_LEN);
1227
#endif /* RT30xx */
1228
        if (current_ev == previous_ev)
1047
        if (current_ev == previous_ev)
1229
#if WIRELESS_EXT >= 17
1048
		return -E2BIG;
1230
            return -E2BIG;
1231
#else
1232
			break;
1233
#endif
1234
1049
1235
		//ESSID
1050
		//ESSID
1236
		//================================
1051
		//================================
Lines 1242-1252 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1242
        previous_ev = current_ev;
1057
        previous_ev = current_ev;
1243
		current_ev = iwe_stream_add_point(info, current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid);
1058
		current_ev = iwe_stream_add_point(info, current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid);
1244
        if (current_ev == previous_ev)
1059
        if (current_ev == previous_ev)
1245
#if WIRELESS_EXT >= 17
1060
		return -E2BIG;
1246
            return -E2BIG;
1247
#else
1248
			break;
1249
#endif
1250
1061
1251
		//Network Type
1062
		//Network Type
1252
		//================================
1063
		//================================
Lines 1269-1279 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1269
        previous_ev = current_ev;
1080
        previous_ev = current_ev;
1270
		current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,  IW_EV_UINT_LEN);
1081
		current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe,  IW_EV_UINT_LEN);
1271
        if (current_ev == previous_ev)
1082
        if (current_ev == previous_ev)
1272
#if WIRELESS_EXT >= 17
1083
		return -E2BIG;
1273
            return -E2BIG;
1274
#else
1275
			break;
1276
#endif
1277
1084
1278
		//Channel and Frequency
1085
		//Channel and Frequency
1279
		//================================
1086
		//================================
Lines 1289-1299 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1289
		previous_ev = current_ev;
1096
		previous_ev = current_ev;
1290
		current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
1097
		current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
1291
        if (current_ev == previous_ev)
1098
        if (current_ev == previous_ev)
1292
#if WIRELESS_EXT >= 17
1099
		return -E2BIG;
1293
            return -E2BIG;
1294
#else
1295
			break;
1296
#endif
1297
1100
1298
        //Add quality statistics
1101
        //Add quality statistics
1299
        //================================
1102
        //================================
Lines 1304-1314 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1304
        set_quality(pAdapter, &iwe.u.qual, pAdapter->ScanTab.BssEntry[i].Rssi);
1107
        set_quality(pAdapter, &iwe.u.qual, pAdapter->ScanTab.BssEntry[i].Rssi);
1305
    	current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
1108
    	current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
1306
        if (current_ev == previous_ev)
1109
        if (current_ev == previous_ev)
1307
#if WIRELESS_EXT >= 17
1110
		return -E2BIG;
1308
            return -E2BIG;
1309
#else
1310
			break;
1311
#endif
1312
1111
1313
		//Encyption key
1112
		//Encyption key
1314
		//================================
1113
		//================================
Lines 1322-1332 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1322
        previous_ev = current_ev;
1121
        previous_ev = current_ev;
1323
        current_ev = iwe_stream_add_point(info, current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[BSS0][(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key);
1122
        current_ev = iwe_stream_add_point(info, current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[BSS0][(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key);
1324
        if (current_ev == previous_ev)
1123
        if (current_ev == previous_ev)
1325
#if WIRELESS_EXT >= 17
1124
		return -E2BIG;
1326
            return -E2BIG;
1327
#else
1328
			break;
1329
#endif
1330
1125
1331
		//Bit Rate
1126
		//Bit Rate
1332
		//================================
1127
		//================================
Lines 1355-1368 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1355
        	if((current_val-current_ev)>IW_EV_LCP_LEN)
1150
        	if((current_val-current_ev)>IW_EV_LCP_LEN)
1356
            	current_ev = current_val;
1151
            	current_ev = current_val;
1357
        	else
1152
        	else
1358
#if WIRELESS_EXT >= 17
1153
			return -E2BIG;
1359
                return -E2BIG;
1360
#else
1361
			    break;
1362
#endif
1363
        }
1154
        }
1364
1155
1365
#ifdef IWEVGENIE
1366
		//WPA IE
1156
		//WPA IE
1367
		if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0)
1157
		if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0)
1368
		{
1158
		{
Lines 1374-1384 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1374
			iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].WpaIE.IELen;
1164
			iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].WpaIE.IELen;
1375
			current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom);
1165
			current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom);
1376
			if (current_ev == previous_ev)
1166
			if (current_ev == previous_ev)
1377
#if WIRELESS_EXT >= 17
1167
				return -E2BIG;
1378
                return -E2BIG;
1379
#else
1380
			    break;
1381
#endif
1382
		}
1168
		}
1383
1169
1384
		//WPA2 IE
1170
		//WPA2 IE
Lines 1392-1445 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1392
			iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].RsnIE.IELen;
1178
			iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].RsnIE.IELen;
1393
			current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom);
1179
			current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, custom);
1394
			if (current_ev == previous_ev)
1180
			if (current_ev == previous_ev)
1395
#if WIRELESS_EXT >= 17
1181
				return -E2BIG;
1396
                return -E2BIG;
1397
#else
1398
			    break;
1399
#endif
1400
        }
1401
#else
1402
        //WPA IE
1403
		//================================
1404
        if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0)
1405
        {
1406
    		NdisZeroMemory(&iwe, sizeof(iwe));
1407
			memset(&custom[0], 0, MAX_CUSTOM_LEN);
1408
    		iwe.cmd = IWEVCUSTOM;
1409
            iwe.u.data.length = (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen * 2) + 7;
1410
            NdisMoveMemory(custom, "wpa_ie=", 7);
1411
            for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].WpaIE.IELen; idx++)
1412
                sprintf(custom + strlen(custom), "%02x", pAdapter->ScanTab.BssEntry[i].WpaIE.IE[idx]);
1413
            previous_ev = current_ev;
1414
    		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,  custom);
1415
            if (current_ev == previous_ev)
1416
#if WIRELESS_EXT >= 17
1417
                return -E2BIG;
1418
#else
1419
			    break;
1420
#endif
1421
        }
1422
1423
        //WPA2 IE
1424
        if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0)
1425
        {
1426
    		NdisZeroMemory(&iwe, sizeof(iwe));
1427
			memset(&custom[0], 0, MAX_CUSTOM_LEN);
1428
    		iwe.cmd = IWEVCUSTOM;
1429
            iwe.u.data.length = (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen * 2) + 7;
1430
            NdisMoveMemory(custom, "rsn_ie=", 7);
1431
			for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].RsnIE.IELen; idx++)
1432
                sprintf(custom + strlen(custom), "%02x", pAdapter->ScanTab.BssEntry[i].RsnIE.IE[idx]);
1433
            previous_ev = current_ev;
1434
    		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,  custom);
1435
            if (current_ev == previous_ev)
1436
#if WIRELESS_EXT >= 17
1437
                return -E2BIG;
1438
#else
1439
			    break;
1440
#endif
1441
        }
1182
        }
1442
#endif // IWEVGENIE //
1443
	}
1183
	}
1444
1184
1445
	data->length = current_ev - extra;
1185
	data->length = current_ev - extra;
Lines 1447-1453 int rt_ioctl_giwscan(struct net_device *dev, Link Here
1447
	DBGPRINT(RT_DEBUG_ERROR ,("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",i , pAdapter->ScanTab.BssNr, data->length));
1187
	DBGPRINT(RT_DEBUG_ERROR ,("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",i , pAdapter->ScanTab.BssNr, data->length));
1448
	return 0;
1188
	return 0;
1449
}
1189
}
1450
#endif
1451
1190
1452
int rt_ioctl_siwessid(struct net_device *dev,
1191
int rt_ioctl_siwessid(struct net_device *dev,
1453
			 struct iw_request_info *info,
1192
			 struct iw_request_info *info,
Lines 1494-1524 int rt_ioctl_giwessid(struct net_device *dev, Link Here
1494
			 struct iw_request_info *info,
1233
			 struct iw_request_info *info,
1495
			 struct iw_point *data, char *essid)
1234
			 struct iw_point *data, char *essid)
1496
{
1235
{
1497
#ifndef RT30xx
1498
	PRTMP_ADAPTER 	pAdapter = NULL;
1499
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
1500
1501
	if (dev->priv_flags == INT_MAIN)
1502
	{
1503
		pAdapter = dev->ml_priv;
1504
	}
1505
	else
1506
	{
1507
		pVirtualAd = dev->ml_priv;
1508
		if (pVirtualAd && pVirtualAd->RtmpDev)
1509
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
1510
	}
1511
1512
	if (pAdapter == NULL)
1513
	{
1514
		/* if 1st open fail, pAd will be free;
1515
		   So the net_dev->ml_priv will be NULL in 2rd open */
1516
		return -ENETDOWN;
1517
	}
1518
#endif
1519
#ifdef RT30xx
1520
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1236
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1521
#endif
1522
1237
1523
	data->flags = 1;
1238
	data->flags = 1;
1524
    if (MONITOR_ON(pAdapter))
1239
    if (MONITOR_ON(pAdapter))
Lines 1578-1608 int rt_ioctl_giwnickn(struct net_device *dev, Link Here
1578
			 struct iw_request_info *info,
1293
			 struct iw_request_info *info,
1579
			 struct iw_point *data, char *nickname)
1294
			 struct iw_point *data, char *nickname)
1580
{
1295
{
1581
#ifndef RT30xx
1582
	PRTMP_ADAPTER 	pAdapter = NULL;
1583
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
1584
1585
	if (dev->priv_flags == INT_MAIN)
1586
	{
1587
		pAdapter = dev->ml_priv;
1588
	}
1589
	else
1590
	{
1591
		pVirtualAd = dev->ml_priv;
1592
		if (pVirtualAd && pVirtualAd->RtmpDev)
1593
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
1594
	}
1595
1596
	if (pAdapter == NULL)
1597
	{
1598
		/* if 1st open fail, pAd will be free;
1599
		   So the net_dev->ml_priv will be NULL in 2rd open */
1600
		return -ENETDOWN;
1601
	}
1602
#endif
1603
#ifdef RT30xx
1604
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1296
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1605
#endif
1606
1297
1607
	if (data->length > strlen(pAdapter->nickname) + 1)
1298
	if (data->length > strlen(pAdapter->nickname) + 1)
1608
		data->length = strlen(pAdapter->nickname) + 1;
1299
		data->length = strlen(pAdapter->nickname) + 1;
Lines 1646-1676 int rt_ioctl_giwrts(struct net_device *dev, Link Here
1646
		       struct iw_request_info *info,
1337
		       struct iw_request_info *info,
1647
		       struct iw_param *rts, char *extra)
1338
		       struct iw_param *rts, char *extra)
1648
{
1339
{
1649
#ifndef RT30xx
1650
	PRTMP_ADAPTER 	pAdapter = NULL;
1651
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
1652
1653
	if (dev->priv_flags == INT_MAIN)
1654
	{
1655
		pAdapter = dev->ml_priv;
1656
	}
1657
	else
1658
	{
1659
		pVirtualAd = dev->ml_priv;
1660
		if (pVirtualAd && pVirtualAd->RtmpDev)
1661
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
1662
	}
1663
1664
	if (pAdapter == NULL)
1665
	{
1666
		/* if 1st open fail, pAd will be free;
1667
		   So the net_dev->ml_priv will be NULL in 2rd open */
1668
		return -ENETDOWN;
1669
	}
1670
#endif
1671
#ifdef RT30xx
1672
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1340
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1673
#endif
1674
1341
1675
	//check if the interface is down
1342
	//check if the interface is down
1676
    	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
1343
    	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
Lines 1702-1709 int rt_ioctl_siwfrag(struct net_device *dev, Link Here
1702
1369
1703
	if (frag->disabled)
1370
	if (frag->disabled)
1704
		val = MAX_FRAG_THRESHOLD;
1371
		val = MAX_FRAG_THRESHOLD;
1705
	else if (frag->value >= MIN_FRAG_THRESHOLD || frag->value <= MAX_FRAG_THRESHOLD)
1372
	else if (frag->value >= MIN_FRAG_THRESHOLD && frag->value <= MAX_FRAG_THRESHOLD)
1706
        val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */
1373
		val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */
1707
	else if (frag->value == 0)
1374
	else if (frag->value == 0)
1708
	    val = MAX_FRAG_THRESHOLD;
1375
	    val = MAX_FRAG_THRESHOLD;
1709
	else
1376
	else
Lines 1717-1747 int rt_ioctl_giwfrag(struct net_device *dev, Link Here
1717
			struct iw_request_info *info,
1384
			struct iw_request_info *info,
1718
			struct iw_param *frag, char *extra)
1385
			struct iw_param *frag, char *extra)
1719
{
1386
{
1720
#ifndef RT30xx
1721
	PRTMP_ADAPTER 	pAdapter = NULL;
1722
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
1723
1724
	if (dev->priv_flags == INT_MAIN)
1725
	{
1726
		pAdapter = dev->ml_priv;
1727
	}
1728
	else
1729
	{
1730
		pVirtualAd = dev->ml_priv;
1731
		if (pVirtualAd && pVirtualAd->RtmpDev)
1732
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
1733
	}
1734
1735
	if (pAdapter == NULL)
1736
	{
1737
		/* if 1st open fail, pAd will be free;
1738
		   So the net_dev->ml_priv will be NULL in 2rd open */
1739
		return -ENETDOWN;
1740
	}
1741
#endif
1742
#ifdef RT30xx
1743
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1387
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1744
#endif
1745
1388
1746
	//check if the interface is down
1389
	//check if the interface is down
1747
    	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
1390
    	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
Lines 1781-1795 int rt_ioctl_siwencode(struct net_device *dev, Link Here
1781
        pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
1424
        pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
1782
        pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1425
        pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1783
        goto done;
1426
        goto done;
1784
	}
1427
	} else if (
1785
#ifndef RT30xx
1428
		 (erq->flags & IW_ENCODE_RESTRICTED || erq->flags & IW_ENCODE_OPEN)) {
1786
	else if ((erq->length == 0) &&
1787
             (erq->flags & IW_ENCODE_RESTRICTED || erq->flags & IW_ENCODE_OPEN))
1788
#endif
1789
#ifdef RT30xx
1790
	else if (erq->flags & IW_ENCODE_RESTRICTED || erq->flags & IW_ENCODE_OPEN)
1791
#endif
1792
	{
1793
		STA_PORT_SECURED(pAdapter);
1429
		STA_PORT_SECURED(pAdapter);
1794
		pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
1430
		pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
1795
		pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
1431
		pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
Lines 1799-1807 int rt_ioctl_siwencode(struct net_device *dev, Link Here
1799
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1435
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
1800
    	else
1436
    	else
1801
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1437
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
1802
#ifndef RT30xx
1803
        goto done;
1804
#endif
1805
	}
1438
	}
1806
1439
1807
    if (erq->length > 0)
1440
    if (erq->length > 0)
Lines 1820-1831 int rt_ioctl_siwencode(struct net_device *dev, Link Here
1820
            //Using default key
1453
            //Using default key
1821
			keyIdx = pAdapter->StaCfg.DefaultKeyId;
1454
			keyIdx = pAdapter->StaCfg.DefaultKeyId;
1822
        }
1455
        }
1823
#ifdef RT30xx
1824
		else
1456
		else
1825
		{
1826
			pAdapter->StaCfg.DefaultKeyId=keyIdx;
1457
			pAdapter->StaCfg.DefaultKeyId=keyIdx;
1827
		}
1828
#endif
1829
1458
1830
        NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,  16);
1459
        NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,  16);
1831
1460
Lines 1877-1908 rt_ioctl_giwencode(struct net_device *dev, Link Here
1877
			  struct iw_request_info *info,
1506
			  struct iw_request_info *info,
1878
			  struct iw_point *erq, char *key)
1507
			  struct iw_point *erq, char *key)
1879
{
1508
{
1880
#ifdef RT30xx
1881
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1509
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1882
#endif
1883
	int kid;
1510
	int kid;
1884
#ifndef RT30xx
1885
	PRTMP_ADAPTER 	pAdapter = NULL;
1886
	VIRTUAL_ADAPTER *pVirtualAd = NULL;
1887
1888
	if (dev->priv_flags == INT_MAIN)
1889
	{
1890
		pAdapter = dev->ml_priv;
1891
	}
1892
	else
1893
	{
1894
		pVirtualAd = dev->ml_priv;
1895
		if (pVirtualAd && pVirtualAd->RtmpDev)
1896
			pAdapter = pVirtualAd->RtmpDev->ml_priv;
1897
	}
1898
1899
	if (pAdapter == NULL)
1900
	{
1901
		/* if 1st open fail, pAd will be free;
1902
		   So the net_dev->ml_priv will be NULL in 2rd open */
1903
		return -ENETDOWN;
1904
	}
1905
#endif
1906
1511
1907
	//check if the interface is down
1512
	//check if the interface is down
1908
	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
1513
	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
Lines 1959-1989 static int Link Here
1959
rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,
1564
rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,
1960
			 void *w, char *extra)
1565
			 void *w, char *extra)
1961
{
1566
{
1962
    VIRTUAL_ADAPTER	*pVirtualAd = NULL;
1567
	PRTMP_ADAPTER pAdapter = dev->ml_priv;
1963
	PRTMP_ADAPTER pAdapter;
1568
	POS_COOKIE pObj = (POS_COOKIE)pAdapter->OS_Cookie;
1964
	POS_COOKIE pObj;
1965
	char *this_char = extra;
1569
	char *this_char = extra;
1966
	char *value;
1570
	char *value;
1967
	int  Status=0;
1571
	int  Status=0;
1968
1572
1969
	if (dev->priv_flags == INT_MAIN)
1970
	{
1971
		pAdapter = dev->ml_priv;
1972
	}
1973
	else
1974
	{
1975
		pVirtualAd = dev->ml_priv;
1976
		pAdapter = pVirtualAd->RtmpDev->ml_priv;
1977
	}
1978
	pObj = (POS_COOKIE) pAdapter->OS_Cookie;
1979
1980
	if (pAdapter == NULL)
1981
	{
1982
		/* if 1st open fail, pAd will be free;
1983
		   So the net_dev->ml_priv will be NULL in 2rd open */
1984
		return -ENETDOWN;
1985
	}
1986
1987
	{
1573
	{
1988
		pObj->ioctl_if_type = INT_MAIN;
1574
		pObj->ioctl_if_type = INT_MAIN;
1989
        pObj->ioctl_if = MAIN_MBSSID;
1575
        pObj->ioctl_if = MAIN_MBSSID;
Lines 2127-2153 rt_private_show(struct net_device *dev, struct iw_request_info *info, Link Here
2127
		struct iw_point *wrq, char *extra)
1713
		struct iw_point *wrq, char *extra)
2128
{
1714
{
2129
    INT				Status = 0;
1715
    INT				Status = 0;
2130
    VIRTUAL_ADAPTER	*pVirtualAd = NULL;
1716
    PRTMP_ADAPTER pAd = dev->ml_priv;
2131
    PRTMP_ADAPTER   pAd;
1717
    POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
2132
	POS_COOKIE		pObj;
2133
    u32             subcmd = wrq->flags;
1718
    u32             subcmd = wrq->flags;
2134
1719
2135
	if (dev->priv_flags == INT_MAIN)
2136
		pAd = dev->ml_priv;
2137
	else
2138
	{
2139
		pVirtualAd = dev->ml_priv;
2140
		pAd = pVirtualAd->RtmpDev->ml_priv;
2141
	}
2142
	pObj = (POS_COOKIE) pAd->OS_Cookie;
2143
2144
	if (pAd == NULL)
2145
	{
2146
		/* if 1st open fail, pAd will be free;
2147
		   So the net_dev->ml_priv will be NULL in 2rd open */
2148
		return -ENETDOWN;
2149
	}
2150
2151
    if (extra == NULL)
1720
    if (extra == NULL)
2152
    {
1721
    {
2153
        wrq->length = 0;
1722
        wrq->length = 0;
Lines 2265-2276 rt_private_show(struct net_device *dev, struct iw_request_info *info, Link Here
2265
					wrq->length = strlen(extra) + 1; // 1: size of '\0'
1834
					wrq->length = strlen(extra) + 1; // 1: size of '\0'
2266
			}
1835
			}
2267
			break;
1836
			break;
2268
#if !defined(RT2860) && !defined(RT30xx)
2269
		case SHOW_ADHOC_ENTRY_INFO:
2270
			Show_Adhoc_MacTable_Proc(pAd, extra);
2271
			wrq->length = strlen(extra) + 1; // 1: size of '\0'
2272
			break;
2273
#endif
2274
        default:
1837
        default:
2275
            DBGPRINT(RT_DEBUG_TRACE, ("%s - unknow subcmd = %d\n", __func__, subcmd));
1838
            DBGPRINT(RT_DEBUG_TRACE, ("%s - unknow subcmd = %d\n", __func__, subcmd));
2276
            break;
1839
            break;
Lines 2279-2285 rt_private_show(struct net_device *dev, struct iw_request_info *info, Link Here
2279
    return Status;
1842
    return Status;
2280
}
1843
}
2281
1844
2282
#ifdef SIOCSIWMLME
2283
int rt_ioctl_siwmlme(struct net_device *dev,
1845
int rt_ioctl_siwmlme(struct net_device *dev,
2284
			   struct iw_request_info *info,
1846
			   struct iw_request_info *info,
2285
			   union iwreq_data *wrqu,
1847
			   union iwreq_data *wrqu,
Lines 2335-2343 int rt_ioctl_siwmlme(struct net_device *dev, Link Here
2335
1897
2336
	return 0;
1898
	return 0;
2337
}
1899
}
2338
#endif // SIOCSIWMLME //
2339
1900
2340
#if WIRELESS_EXT > 17
2341
int rt_ioctl_siwauth(struct net_device *dev,
1901
int rt_ioctl_siwauth(struct net_device *dev,
2342
			  struct iw_request_info *info,
1902
			  struct iw_request_info *info,
2343
			  union iwreq_data *wrqu, char *extra)
1903
			  union iwreq_data *wrqu, char *extra)
Lines 2626-2632 int rt_ioctl_siwencodeext(struct net_device *dev, Link Here
2626
2186
2627
                NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,  16);
2187
                NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,  16);
2628
			    NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len);
2188
			    NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len);
2629
#ifndef RT30xx
2630
				if (pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled ||
2189
				if (pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled ||
2631
					pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
2190
					pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
2632
				{
2191
				{
Lines 2641-2647 int rt_ioctl_siwencodeext(struct net_device *dev, Link Here
2641
    				// Indicate Connected for GUI
2200
    				// Indicate Connected for GUI
2642
    				pAdapter->IndicateMediaState = NdisMediaStateConnected;
2201
    				pAdapter->IndicateMediaState = NdisMediaStateConnected;
2643
				}
2202
				}
2644
#endif
2645
    			break;
2203
    			break;
2646
            case IW_ENCODE_ALG_TKIP:
2204
            case IW_ENCODE_ALG_TKIP:
2647
                DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __func__, keyIdx, ext->key_len));
2205
                DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __func__, keyIdx, ext->key_len));
Lines 2773-2779 rt_ioctl_giwencodeext(struct net_device *dev, Link Here
2773
	return 0;
2331
	return 0;
2774
}
2332
}
2775
2333
2776
#ifdef SIOCSIWGENIE
2777
int rt_ioctl_siwgenie(struct net_device *dev,
2334
int rt_ioctl_siwgenie(struct net_device *dev,
2778
			  struct iw_request_info *info,
2335
			  struct iw_request_info *info,
2779
			  union iwreq_data *wrqu, char *extra)
2336
			  union iwreq_data *wrqu, char *extra)
Lines 2797-2803 int rt_ioctl_siwgenie(struct net_device *dev, Link Here
2797
2354
2798
	return 0;
2355
	return 0;
2799
}
2356
}
2800
#endif // SIOCSIWGENIE //
2801
2357
2802
int rt_ioctl_giwgenie(struct net_device *dev,
2358
int rt_ioctl_giwgenie(struct net_device *dev,
2803
			       struct iw_request_info *info,
2359
			       struct iw_request_info *info,
Lines 2812-2818 int rt_ioctl_giwgenie(struct net_device *dev, Link Here
2812
		return 0;
2368
		return 0;
2813
	}
2369
	}
2814
2370
2815
#ifdef SIOCSIWGENIE
2816
	if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
2371
	if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
2817
	{
2372
	{
2818
	if (wrqu->data.length < pAd->StaCfg.RSNIE_Len)
2373
	if (wrqu->data.length < pAd->StaCfg.RSNIE_Len)
Lines 2822-2828 int rt_ioctl_giwgenie(struct net_device *dev, Link Here
2822
	memcpy(extra, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len);
2377
	memcpy(extra, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len);
2823
	}
2378
	}
2824
	else
2379
	else
2825
#endif // SIOCSIWGENIE //
2826
	{
2380
	{
2827
		UCHAR RSNIe = IE_WPA;
2381
		UCHAR RSNIe = IE_WPA;
2828
2382
Lines 2916-3054 int rt_ioctl_siwpmksa(struct net_device *dev, Link Here
2916
2470
2917
	return 0;
2471
	return 0;
2918
}
2472
}
2919
#endif // #if WIRELESS_EXT > 17
2920
2921
#ifdef DBG
2922
static int
2923
rt_private_ioctl_bbp(struct net_device *dev, struct iw_request_info *info,
2924
		struct iw_point *wrq, char *extra)
2925
			{
2926
	CHAR				*this_char;
2927
	CHAR				*value = NULL;
2928
	UCHAR				regBBP = 0;
2929
	UINT32				bbpId;
2930
	UINT32				bbpValue;
2931
	BOOLEAN				bIsPrintAllBBP = FALSE;
2932
	INT					Status = 0;
2933
    PRTMP_ADAPTER       pAdapter = dev->ml_priv;
2934
2935
2936
	memset(extra, 0x00, IW_PRIV_SIZE_MASK);
2937
2938
	if (wrq->length > 1) //No parameters.
2939
				{
2940
		sprintf(extra, "\n");
2941
2942
		//Parsing Read or Write
2943
		this_char = wrq->pointer;
2944
		DBGPRINT(RT_DEBUG_TRACE, ("this_char=%s\n", this_char));
2945
		if (!*this_char)
2946
			goto next;
2947
2948
		if ((value = rtstrchr(this_char, '=')) != NULL)
2949
			*value++ = 0;
2950
2951
		if (!value || !*value)
2952
		{ //Read
2953
			DBGPRINT(RT_DEBUG_TRACE, ("this_char=%s, value=%s\n", this_char, value));
2954
			if (sscanf(this_char, "%d", &(bbpId)) == 1)
2955
			{
2956
#ifndef RT30xx
2957
				if (bbpId <= 136)
2958
#endif // RT30xx //
2959
#ifdef RT30xx
2960
				if (bbpId <= 138)  // edit by johnli, RF power sequence setup, add BBP R138 for ADC dynamic on/off control
2961
#endif // RT30xx //
2962
				{
2963
					{
2964
					RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
2965
					}
2966
					sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X\n", bbpId, bbpId*2, regBBP);
2967
                    wrq->length = strlen(extra) + 1; // 1: size of '\0'
2968
					DBGPRINT(RT_DEBUG_TRACE, ("msg=%s\n", extra));
2969
				}
2970
				else
2971
				{//Invalid parametes, so default printk all bbp
2972
					bIsPrintAllBBP = TRUE;
2973
					goto next;
2974
				}
2975
			}
2976
			else
2977
			{ //Invalid parametes, so default printk all bbp
2978
				bIsPrintAllBBP = TRUE;
2979
				goto next;
2980
			}
2981
		}
2982
		else
2983
		{ //Write
2984
			if ((sscanf(this_char, "%d", &(bbpId)) == 1) && (sscanf(value, "%x", &(bbpValue)) == 1))
2985
			{
2986
#ifndef RT30xx
2987
				if (bbpId <= 136)
2988
#endif // RT30xx //
2989
#ifdef RT30xx
2990
				if (bbpId <= 138)  // edit by johnli, RF power sequence setup, add BBP R138 for ADC dynamic on/off control
2991
#endif // RT30xx //
2992
				{
2993
					{
2994
					    RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, bbpId, bbpValue);
2995
    					//Read it back for showing
2996
    					RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
2997
			}
2998
					sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X\n", bbpId, bbpId*2, regBBP);
2999
                    wrq->length = strlen(extra) + 1; // 1: size of '\0'
3000
					DBGPRINT(RT_DEBUG_TRACE, ("msg=%s\n", extra));
3001
				}
3002
				else
3003
				{//Invalid parametes, so default printk all bbp
3004
					bIsPrintAllBBP = TRUE;
3005
					goto next;
3006
				}
3007
			}
3008
			else
3009
			{ //Invalid parametes, so default printk all bbp
3010
				bIsPrintAllBBP = TRUE;
3011
				goto next;
3012
			}
3013
		}
3014
		}
3015
	else
3016
		bIsPrintAllBBP = TRUE;
3017
3018
next:
3019
	if (bIsPrintAllBBP)
3020
	{
3021
		memset(extra, 0x00, IW_PRIV_SIZE_MASK);
3022
		sprintf(extra, "\n");
3023
#ifndef RT30xx
3024
		for (bbpId = 0; bbpId <= 136; bbpId++)
3025
#endif // RT30xx //
3026
#ifdef RT30xx
3027
		for (bbpId = 0; bbpId <= 138; bbpId++)  // edit by johnli, RF power sequence setup, add BBP R138 for ADC dynamic on/off control
3028
#endif // RT30xx //
3029
		{
3030
		    if (strlen(extra) >= (IW_PRIV_SIZE_MASK - 10))
3031
                break;
3032
			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
3033
#ifndef RT30xx
3034
			sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X    ", bbpId, bbpId*2, regBBP);
3035
			if (bbpId%5 == 4)
3036
				sprintf(extra+strlen(extra), "\n");
3037
#endif
3038
#ifdef RT30xx
3039
			sprintf(extra+strlen(extra), "%03d = %02X\n", bbpId, regBBP);  // edit by johnli, change display format
3040
#endif
3041
		}
3042
3043
        wrq->length = strlen(extra) + 1; // 1: size of '\0'
3044
        DBGPRINT(RT_DEBUG_TRACE, ("wrq->length = %d\n", wrq->length));
3045
	}
3046
3047
	DBGPRINT(RT_DEBUG_TRACE, ("<==rt_private_ioctl_bbp\n\n"));
3048
3049
    return Status;
3050
}
3051
#endif // DBG //
3052
2473
3053
int rt_ioctl_siwrate(struct net_device *dev,
2474
int rt_ioctl_siwrate(struct net_device *dev,
3054
			struct iw_request_info *info,
2475
			struct iw_request_info *info,
Lines 3184-3202 static const iw_handler rt_handler[] = Link Here
3184
	(iw_handler) NULL,				        /* SIOCGIWTHRSPY */
2605
	(iw_handler) NULL,				        /* SIOCGIWTHRSPY */
3185
	(iw_handler) rt_ioctl_siwap,            /* SIOCSIWAP     */
2606
	(iw_handler) rt_ioctl_siwap,            /* SIOCSIWAP     */
3186
	(iw_handler) rt_ioctl_giwap,		    /* SIOCGIWAP     */
2607
	(iw_handler) rt_ioctl_giwap,		    /* SIOCGIWAP     */
3187
#ifdef SIOCSIWMLME
3188
	(iw_handler) rt_ioctl_siwmlme,	        /* SIOCSIWMLME   */
2608
	(iw_handler) rt_ioctl_siwmlme,	        /* SIOCSIWMLME   */
3189
#else
3190
	(iw_handler) NULL,				        /* SIOCSIWMLME */
3191
#endif // SIOCSIWMLME //
3192
	(iw_handler) rt_ioctl_iwaplist,		    /* SIOCGIWAPLIST */
2609
	(iw_handler) rt_ioctl_iwaplist,		    /* SIOCGIWAPLIST */
3193
#ifdef SIOCGIWSCAN
3194
	(iw_handler) rt_ioctl_siwscan,		    /* SIOCSIWSCAN   */
2610
	(iw_handler) rt_ioctl_siwscan,		    /* SIOCSIWSCAN   */
3195
	(iw_handler) rt_ioctl_giwscan,		    /* SIOCGIWSCAN   */
2611
	(iw_handler) rt_ioctl_giwscan,		    /* SIOCGIWSCAN   */
3196
#else
3197
	(iw_handler) NULL,				        /* SIOCSIWSCAN   */
3198
	(iw_handler) NULL,				        /* SIOCGIWSCAN   */
3199
#endif /* SIOCGIWSCAN */
3200
	(iw_handler) rt_ioctl_siwessid,		    /* SIOCSIWESSID  */
2612
	(iw_handler) rt_ioctl_siwessid,		    /* SIOCSIWESSID  */
3201
	(iw_handler) rt_ioctl_giwessid,		    /* SIOCGIWESSID  */
2613
	(iw_handler) rt_ioctl_giwessid,		    /* SIOCGIWESSID  */
3202
	(iw_handler) rt_ioctl_siwnickn,		    /* SIOCSIWNICKN  */
2614
	(iw_handler) rt_ioctl_siwnickn,		    /* SIOCSIWNICKN  */
Lines 3219-3225 static const iw_handler rt_handler[] = Link Here
3219
	(iw_handler) NULL,		                /* SIOCGIWPOWER  */
2631
	(iw_handler) NULL,		                /* SIOCGIWPOWER  */
3220
	(iw_handler) NULL,						/* -- hole -- */
2632
	(iw_handler) NULL,						/* -- hole -- */
3221
	(iw_handler) NULL,						/* -- hole -- */
2633
	(iw_handler) NULL,						/* -- hole -- */
3222
#if WIRELESS_EXT > 17
3223
    (iw_handler) rt_ioctl_siwgenie,         /* SIOCSIWGENIE  */
2634
    (iw_handler) rt_ioctl_siwgenie,         /* SIOCSIWGENIE  */
3224
	(iw_handler) rt_ioctl_giwgenie,         /* SIOCGIWGENIE  */
2635
	(iw_handler) rt_ioctl_giwgenie,         /* SIOCGIWGENIE  */
3225
	(iw_handler) rt_ioctl_siwauth,		    /* SIOCSIWAUTH   */
2636
	(iw_handler) rt_ioctl_siwauth,		    /* SIOCSIWAUTH   */
Lines 3227-3244 static const iw_handler rt_handler[] = Link Here
3227
	(iw_handler) rt_ioctl_siwencodeext,	    /* SIOCSIWENCODEEXT */
2638
	(iw_handler) rt_ioctl_siwencodeext,	    /* SIOCSIWENCODEEXT */
3228
	(iw_handler) rt_ioctl_giwencodeext,		/* SIOCGIWENCODEEXT */
2639
	(iw_handler) rt_ioctl_giwencodeext,		/* SIOCGIWENCODEEXT */
3229
	(iw_handler) rt_ioctl_siwpmksa,         /* SIOCSIWPMKSA  */
2640
	(iw_handler) rt_ioctl_siwpmksa,         /* SIOCSIWPMKSA  */
3230
#endif
3231
};
2641
};
3232
2642
3233
static const iw_handler rt_priv_handlers[] = {
2643
static const iw_handler rt_priv_handlers[] = {
3234
	(iw_handler) NULL, /* + 0x00 */
2644
	(iw_handler) NULL, /* + 0x00 */
3235
	(iw_handler) NULL, /* + 0x01 */
2645
	(iw_handler) NULL, /* + 0x01 */
3236
	(iw_handler) rt_ioctl_setparam, /* + 0x02 */
2646
	(iw_handler) rt_ioctl_setparam, /* + 0x02 */
3237
#ifdef DBG
3238
	(iw_handler) rt_private_ioctl_bbp, /* + 0x03 */
3239
#else
3240
	(iw_handler) NULL, /* + 0x03 */
2647
	(iw_handler) NULL, /* + 0x03 */
3241
#endif
3242
	(iw_handler) NULL, /* + 0x04 */
2648
	(iw_handler) NULL, /* + 0x04 */
3243
	(iw_handler) NULL, /* + 0x05 */
2649
	(iw_handler) NULL, /* + 0x05 */
3244
	(iw_handler) NULL, /* + 0x06 */
2650
	(iw_handler) NULL, /* + 0x06 */
Lines 3274-5161 const struct iw_handler_def rt28xx_iw_handler_def = Link Here
3274
#endif
2680
#endif
3275
};
2681
};
3276
2682
3277
INT RTMPSetInformation(
3278
    IN  PRTMP_ADAPTER pAdapter,
3279
    IN  OUT struct ifreq    *rq,
3280
    IN  INT                 cmd)
3281
{
3282
    struct iwreq                        *wrq = (struct iwreq *) rq;
3283
    NDIS_802_11_SSID                    Ssid;
3284
    NDIS_802_11_MAC_ADDRESS             Bssid;
3285
    RT_802_11_PHY_MODE                  PhyMode;
3286
    RT_802_11_STA_CONFIG                StaConfig;
3287
    NDIS_802_11_RATES                   aryRates;
3288
    RT_802_11_PREAMBLE                  Preamble;
3289
    NDIS_802_11_WEP_STATUS              WepStatus;
3290
    NDIS_802_11_AUTHENTICATION_MODE     AuthMode = Ndis802_11AuthModeMax;
3291
    NDIS_802_11_NETWORK_INFRASTRUCTURE  BssType;
3292
    NDIS_802_11_RTS_THRESHOLD           RtsThresh;
3293
    NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
3294
    NDIS_802_11_POWER_MODE              PowerMode;
3295
    PNDIS_802_11_KEY                    pKey = NULL;
3296
    PNDIS_802_11_WEP			        pWepKey =NULL;
3297
    PNDIS_802_11_REMOVE_KEY             pRemoveKey = NULL;
3298
    NDIS_802_11_CONFIGURATION           Config, *pConfig = NULL;
3299
    NDIS_802_11_NETWORK_TYPE            NetType;
3300
    ULONG                               Now;
3301
    UINT                                KeyIdx = 0;
3302
    INT                                 Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G;
3303
    ULONG                               PowerTemp;
3304
    BOOLEAN                             RadioState;
3305
    BOOLEAN                             StateMachineTouched = FALSE;
3306
	OID_SET_HT_PHYMODE					HT_PhyMode;	//11n ,kathy
3307
    PNDIS_802_11_PMKID                  pPmkId = NULL;
3308
    BOOLEAN				                IEEE8021xState = FALSE;
3309
    BOOLEAN				                IEEE8021x_required_keys = FALSE;
3310
    UCHAR                               wpa_supplicant_enable = 0;
3311
3312
	MaxPhyMode = PHY_11N_5G;
3313
3314
	DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPSetInformation(),	0x%08x\n", cmd&0x7FFF));
3315
    switch(cmd & 0x7FFF) {
3316
        case RT_OID_802_11_COUNTRY_REGION:
3317
            if (wrq->u.data.length < sizeof(UCHAR))
3318
                Status = -EINVAL;
3319
			// Only avaliable when EEPROM not programming
3320
            else if (!(pAdapter->CommonCfg.CountryRegion & 0x80) && !(pAdapter->CommonCfg.CountryRegionForABand & 0x80))
3321
            {
3322
                ULONG   Country;
3323
                UCHAR	TmpPhy;
3324
3325
				Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length);
3326
				pAdapter->CommonCfg.CountryRegion = (UCHAR)(Country & 0x000000FF);
3327
				pAdapter->CommonCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF);
3328
                TmpPhy = pAdapter->CommonCfg.PhyMode;
3329
				pAdapter->CommonCfg.PhyMode = 0xff;
3330
				// Build all corresponding channel information
3331
				RTMPSetPhyMode(pAdapter, TmpPhy);
3332
				SetCommonHT(pAdapter);
3333
				DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_COUNTRY_REGION (A:%d  B/G:%d)\n", pAdapter->CommonCfg.CountryRegionForABand,
3334
				    pAdapter->CommonCfg.CountryRegion));
3335
            }
3336
            break;
3337
        case OID_802_11_BSSID_LIST_SCAN:
3338
            Now = jiffies;
3339
			DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAdapter->RalinkCounters.LastOneSecTotalTxCount));
3340
3341
            if (MONITOR_ON(pAdapter))
3342
            {
3343
                DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n"));
3344
                break;
3345
            }
3346
3347
			//Benson add 20080527, when radio off, sta don't need to scan
3348
			if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF))
3349
				break;
3350
3351
			if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
3352
			{
3353
                DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is scanning now !!!\n"));
3354
				pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
3355
				Status = NDIS_STATUS_SUCCESS;
3356
                break;
3357
            }
3358
3359
			if (pAdapter->RalinkCounters.LastOneSecTotalTxCount > 100)
3360
            {
3361
                DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
3362
				Status = NDIS_STATUS_SUCCESS;
3363
				pAdapter->StaCfg.ScanCnt = 99;		// Prevent auto scan triggered by this OID
3364
				break;
3365
            }
3366
3367
            if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&
3368
				((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
3369
				(pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
3370
				(pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
3371
				(pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) &&
3372
                (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
3373
            {
3374
                DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
3375
				Status = NDIS_STATUS_SUCCESS;
3376
				pAdapter->StaCfg.ScanCnt = 99;		// Prevent auto scan triggered by this OID
3377
				break;
3378
            }
3379
3380
3381
            if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3382
            {
3383
                RT28XX_MLME_RESET_STATE_MACHINE(pAdapter);
3384
                DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3385
            }
3386
3387
            // tell CNTL state machine to call NdisMSetInformationComplete() after completing
3388
            // this request, because this request is initiated by NDIS.
3389
            pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
3390
            // Reset allowed scan retries
3391
            pAdapter->StaCfg.ScanCnt = 0;
3392
            pAdapter->StaCfg.LastScanTime = Now;
3393
3394
			pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
3395
            RTMP_SET_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
3396
            MlmeEnqueue(pAdapter,
3397
                        MLME_CNTL_STATE_MACHINE,
3398
                        OID_802_11_BSSID_LIST_SCAN,
3399
                        0,
3400
                        NULL);
3401
3402
            Status = NDIS_STATUS_SUCCESS;
3403
            StateMachineTouched = TRUE;
3404
            break;
3405
        case OID_802_11_SSID:
3406
            if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))
3407
                Status = -EINVAL;
3408
            else
3409
            {
3410
            	PCHAR pSsidString = NULL;
3411
                Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);
3412
3413
				DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid));
3414
                if (Ssid.SsidLength > MAX_LEN_OF_SSID)
3415
                    Status = -EINVAL;
3416
                else
3417
                {
3418
                	if (Ssid.SsidLength == 0)
3419
                	{
3420
                		Set_SSID_Proc(pAdapter, "");
3421
                	}
3422
					else
3423
                	{
3424
	                	pSsidString = (CHAR *) kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG);
3425
						if (pSsidString)
3426
						{
3427
							NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);
3428
							NdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);
3429
	                		Set_SSID_Proc(pAdapter, pSsidString);
3430
							kfree(pSsidString);
3431
						}
3432
						else
3433
							Status = -ENOMEM;
3434
                	}
3435
                }
3436
            }
3437
            break;
3438
        case OID_802_11_BSSID:
3439
            if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS))
3440
                Status  = -EINVAL;
3441
            else
3442
            {
3443
                Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length);
3444
3445
                // tell CNTL state machine to call NdisMSetInformationComplete() after completing
3446
                // this request, because this request is initiated by NDIS.
3447
                pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
3448
3449
				// Prevent to connect AP again in STAMlmePeriodicExec
3450
				pAdapter->MlmeAux.AutoReconnectSsidLen= 32;
3451
3452
                // Reset allowed scan retries
3453
				pAdapter->StaCfg.ScanCnt = 0;
3454
3455
                if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3456
                {
3457
                    RT28XX_MLME_RESET_STATE_MACHINE(pAdapter);
3458
                    DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3459
                }
3460
                MlmeEnqueue(pAdapter,
3461
                            MLME_CNTL_STATE_MACHINE,
3462
                            OID_802_11_BSSID,
3463
                            sizeof(NDIS_802_11_MAC_ADDRESS),
3464
                            (VOID *)&Bssid);
3465
                Status = NDIS_STATUS_SUCCESS;
3466
                StateMachineTouched = TRUE;
3467
3468
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n",
3469
                                        Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));
3470
            }
3471
            break;
3472
        case RT_OID_802_11_RADIO:
3473
            if (wrq->u.data.length != sizeof(BOOLEAN))
3474
                Status  = -EINVAL;
3475
            else
3476
            {
3477
                Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length);
3478
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RADIO (=%d)\n", RadioState));
3479
                if (pAdapter->StaCfg.bSwRadio != RadioState)
3480
                {
3481
                    pAdapter->StaCfg.bSwRadio = RadioState;
3482
                    if (pAdapter->StaCfg.bRadio != (pAdapter->StaCfg.bHwRadio && pAdapter->StaCfg.bSwRadio))
3483
                    {
3484
                        pAdapter->StaCfg.bRadio = (pAdapter->StaCfg.bHwRadio && pAdapter->StaCfg.bSwRadio);
3485
                        if (pAdapter->StaCfg.bRadio == TRUE)
3486
                        {
3487
                            MlmeRadioOn(pAdapter);
3488
                            // Update extra information
3489
							pAdapter->ExtraInfo = EXTRA_INFO_CLEAR;
3490
                        }
3491
                        else
3492
                        {
3493
                            MlmeRadioOff(pAdapter);
3494
                            // Update extra information
3495
							pAdapter->ExtraInfo = SW_RADIO_OFF;
3496
                        }
3497
                    }
3498
                }
3499
            }
3500
            break;
3501
        case RT_OID_802_11_PHY_MODE:
3502
            if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE))
3503
                Status  = -EINVAL;
3504
            else
3505
            {
3506
                Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);
3507
				if (PhyMode <= MaxPhyMode)
3508
				{
3509
                	RTMPSetPhyMode(pAdapter, PhyMode);
3510
					SetCommonHT(pAdapter);
3511
				}
3512
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode));
3513
            }
3514
            break;
3515
        case RT_OID_802_11_STA_CONFIG:
3516
            if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG))
3517
                Status  = -EINVAL;
3518
            else
3519
            {
3520
                Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length);
3521
                pAdapter->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst;
3522
                pAdapter->CommonCfg.UseBGProtection = StaConfig.UseBGProtection;
3523
                pAdapter->CommonCfg.bUseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable
3524
                if ((pAdapter->CommonCfg.PhyMode != StaConfig.AdhocMode) &&
3525
					(StaConfig.AdhocMode <= MaxPhyMode))
3526
                {
3527
                    // allow dynamic change of "USE OFDM rate or not" in ADHOC mode
3528
                    // if setting changed, need to reset current TX rate as well as BEACON frame format
3529
#ifdef RT30xx
3530
                    pAdapter->CommonCfg.PhyMode = StaConfig.AdhocMode;
3531
#endif
3532
                    if (pAdapter->StaCfg.BssType == BSS_ADHOC)
3533
                    {
3534
#ifndef RT30xx
3535
						pAdapter->CommonCfg.PhyMode = StaConfig.AdhocMode;
3536
#endif
3537
                    	RTMPSetPhyMode(pAdapter, PhyMode);
3538
                        MlmeUpdateTxRates(pAdapter, FALSE, 0);
3539
                        MakeIbssBeacon(pAdapter);           // re-build BEACON frame
3540
                        AsicEnableIbssSync(pAdapter);   // copy to on-chip memory
3541
                    }
3542
                }
3543
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\n",
3544
                                        pAdapter->CommonCfg.bEnableTxBurst,
3545
                                        pAdapter->CommonCfg.UseBGProtection,
3546
                                        pAdapter->CommonCfg.bUseShortSlotTime));
3547
            }
3548
            break;
3549
        case OID_802_11_DESIRED_RATES:
3550
            if (wrq->u.data.length != sizeof(NDIS_802_11_RATES))
3551
                Status  = -EINVAL;
3552
            else
3553
            {
3554
                Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length);
3555
                NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
3556
                NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
3557
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
3558
                    pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],
3559
                    pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],
3560
                    pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],
3561
                    pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));
3562
                // Changing DesiredRate may affect the MAX TX rate we used to TX frames out
3563
                MlmeUpdateTxRates(pAdapter, FALSE, 0);
3564
            }
3565
            break;
3566
        case RT_OID_802_11_PREAMBLE:
3567
            if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE))
3568
                Status  = -EINVAL;
3569
            else
3570
            {
3571
                Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length);
3572
                if (Preamble == Rt802_11PreambleShort)
3573
                {
3574
                    pAdapter->CommonCfg.TxPreamble = Preamble;
3575
                    MlmeSetTxPreamble(pAdapter, Rt802_11PreambleShort);
3576
                }
3577
                else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))
3578
                {
3579
                    // if user wants AUTO, initialize to LONG here, then change according to AP's
3580
                    // capability upon association.
3581
                    pAdapter->CommonCfg.TxPreamble = Preamble;
3582
                    MlmeSetTxPreamble(pAdapter, Rt802_11PreambleLong);
3583
                }
3584
                else
3585
                {
3586
                    Status = -EINVAL;
3587
                    break;
3588
                }
3589
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PREAMBLE (=%d)\n", Preamble));
3590
            }
3591
            break;
3592
        case OID_802_11_WEP_STATUS:
3593
            if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS))
3594
                Status  = -EINVAL;
3595
            else
3596
            {
3597
                Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);
3598
                // Since TKIP, AES, WEP are all supported. It should not have any invalid setting
3599
                if (WepStatus <= Ndis802_11Encryption3KeyAbsent)
3600
                {
3601
                    if (pAdapter->StaCfg.WepStatus != WepStatus)
3602
                    {
3603
                        // Config has changed
3604
                        pAdapter->bConfigChanged = TRUE;
3605
                    }
3606
                    pAdapter->StaCfg.WepStatus     = WepStatus;
3607
                    pAdapter->StaCfg.OrigWepStatus = WepStatus;
3608
                    pAdapter->StaCfg.PairCipher    = WepStatus;
3609
                	pAdapter->StaCfg.GroupCipher   = WepStatus;
3610
                }
3611
                else
3612
                {
3613
                    Status  = -EINVAL;
3614
                    break;
3615
                }
3616
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus));
3617
            }
3618
            break;
3619
        case OID_802_11_AUTHENTICATION_MODE:
3620
            if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE))
3621
                Status  = -EINVAL;
3622
            else
3623
            {
3624
                Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);
3625
                if (AuthMode > Ndis802_11AuthModeMax)
3626
                {
3627
                    Status  = -EINVAL;
3628
                    break;
3629
                }
3630
                else
3631
                {
3632
                    if (pAdapter->StaCfg.AuthMode != AuthMode)
3633
                    {
3634
                        // Config has changed
3635
                        pAdapter->bConfigChanged = TRUE;
3636
                    }
3637
                    pAdapter->StaCfg.AuthMode = AuthMode;
3638
                }
3639
                pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3640
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n",pAdapter->StaCfg.AuthMode));
3641
            }
3642
            break;
3643
        case OID_802_11_INFRASTRUCTURE_MODE:
3644
            if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE))
3645
                Status  = -EINVAL;
3646
            else
3647
            {
3648
                Status = copy_from_user(&BssType, wrq->u.data.pointer, wrq->u.data.length);
3649
3650
				if (BssType == Ndis802_11IBSS)
3651
					Set_NetworkType_Proc(pAdapter, "Adhoc");
3652
				else if (BssType == Ndis802_11Infrastructure)
3653
					Set_NetworkType_Proc(pAdapter, "Infra");
3654
				else if (BssType == Ndis802_11Monitor)
3655
					Set_NetworkType_Proc(pAdapter, "Monitor");
3656
				else
3657
				{
3658
					Status  = -EINVAL;
3659
					DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_INFRASTRUCTURE_MODE (unknown)\n"));
3660
				}
3661
			}
3662
			break;
3663
	 case OID_802_11_REMOVE_WEP:
3664
            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_WEP\n"));
3665
            if (wrq->u.data.length != sizeof(NDIS_802_11_KEY_INDEX))
3666
            {
3667
				Status = -EINVAL;
3668
            }
3669
            else
3670
            {
3671
				KeyIdx = *(NDIS_802_11_KEY_INDEX *) wrq->u.data.pointer;
3672
3673
				if (KeyIdx & 0x80000000)
3674
				{
3675
					// Should never set default bit when remove key
3676
					Status = -EINVAL;
3677
				}
3678
				else
3679
				{
3680
					KeyIdx = KeyIdx & 0x0fffffff;
3681
					if (KeyIdx >= 4){
3682
						Status = -EINVAL;
3683
					}
3684
					else
3685
					{
3686
						pAdapter->SharedKey[BSS0][KeyIdx].KeyLen = 0;
3687
						pAdapter->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
3688
						AsicRemoveSharedKeyEntry(pAdapter, 0, (UCHAR)KeyIdx);
3689
					}
3690
				}
3691
            }
3692
            break;
3693
        case RT_OID_802_11_RESET_COUNTERS:
3694
            NdisZeroMemory(&pAdapter->WlanCounters, sizeof(COUNTER_802_11));
3695
            NdisZeroMemory(&pAdapter->Counters8023, sizeof(COUNTER_802_3));
3696
            NdisZeroMemory(&pAdapter->RalinkCounters, sizeof(COUNTER_RALINK));
3697
            pAdapter->Counters8023.RxNoBuffer   = 0;
3698
			pAdapter->Counters8023.GoodReceives = 0;
3699
			pAdapter->Counters8023.RxNoBuffer   = 0;
3700
#ifdef RT2870
3701
			pAdapter->BulkOutComplete	= 0;
3702
			pAdapter->BulkOutCompleteOther= 0;
3703
			pAdapter->BulkOutCompleteCancel = 0;
3704
			pAdapter->BulkOutReq = 0;
3705
			pAdapter->BulkInReq= 0;
3706
			pAdapter->BulkInComplete = 0;
3707
			pAdapter->BulkInCompleteFail = 0;
3708
#endif // RT2870 //
3709
            DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RESET_COUNTERS \n"));
3710
            break;
3711
        case OID_802_11_RTS_THRESHOLD:
3712
            if (wrq->u.data.length != sizeof(NDIS_802_11_RTS_THRESHOLD))
3713
                Status  = -EINVAL;
3714
            else
3715
            {
3716
                Status = copy_from_user(&RtsThresh, wrq->u.data.pointer, wrq->u.data.length);
3717
                if (RtsThresh > MAX_RTS_THRESHOLD)
3718
                    Status  = -EINVAL;
3719
                else
3720
                    pAdapter->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
3721
            }
3722
            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_RTS_THRESHOLD (=%ld)\n",RtsThresh));
3723
            break;
3724
        case OID_802_11_FRAGMENTATION_THRESHOLD:
3725
            if (wrq->u.data.length != sizeof(NDIS_802_11_FRAGMENTATION_THRESHOLD))
3726
                Status  = -EINVAL;
3727
            else
3728
            {
3729
                Status = copy_from_user(&FragThresh, wrq->u.data.pointer, wrq->u.data.length);
3730
                pAdapter->CommonCfg.bUseZeroToDisableFragment = FALSE;
3731
                if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
3732
                {
3733
                    if (FragThresh == 0)
3734
                    {
3735
                        pAdapter->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
3736
                        pAdapter->CommonCfg.bUseZeroToDisableFragment = TRUE;
3737
                    }
3738
                    else
3739
                        Status  = -EINVAL;
3740
                }
3741
                else
3742
                    pAdapter->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
3743
            }
3744
            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_FRAGMENTATION_THRESHOLD (=%ld) \n",FragThresh));
3745
            break;
3746
        case OID_802_11_POWER_MODE:
3747
            if (wrq->u.data.length != sizeof(NDIS_802_11_POWER_MODE))
3748
                Status = -EINVAL;
3749
            else
3750
            {
3751
                Status = copy_from_user(&PowerMode, wrq->u.data.pointer, wrq->u.data.length);
3752
                if (PowerMode == Ndis802_11PowerModeCAM)
3753
                	Set_PSMode_Proc(pAdapter, "CAM");
3754
                else if (PowerMode == Ndis802_11PowerModeMAX_PSP)
3755
                	Set_PSMode_Proc(pAdapter, "Max_PSP");
3756
                else if (PowerMode == Ndis802_11PowerModeFast_PSP)
3757
					Set_PSMode_Proc(pAdapter, "Fast_PSP");
3758
                else if (PowerMode == Ndis802_11PowerModeLegacy_PSP)
3759
					Set_PSMode_Proc(pAdapter, "Legacy_PSP");
3760
                else
3761
                    Status = -EINVAL;
3762
            }
3763
            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_POWER_MODE (=%d)\n",PowerMode));
3764
            break;
3765
         case RT_OID_802_11_TX_POWER_LEVEL_1:
3766
			if (wrq->u.data.length  < sizeof(ULONG))
3767
				Status = -EINVAL;
3768
			else
3769
			{
3770
				Status = copy_from_user(&PowerTemp, wrq->u.data.pointer, wrq->u.data.length);
3771
				if (PowerTemp > 100)
3772
					PowerTemp = 0xffffffff;  // AUTO
3773
				pAdapter->CommonCfg.TxPowerDefault = PowerTemp; //keep current setting.
3774
					pAdapter->CommonCfg.TxPowerPercentage = pAdapter->CommonCfg.TxPowerDefault;
3775
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAdapter->CommonCfg.TxPowerPercentage));
3776
			}
3777
	        break;
3778
		case OID_802_11_NETWORK_TYPE_IN_USE:
3779
			if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_TYPE))
3780
				Status = -EINVAL;
3781
			else
3782
			{
3783
				Status = copy_from_user(&NetType, wrq->u.data.pointer, wrq->u.data.length);
3784
3785
				if (NetType == Ndis802_11DS)
3786
					RTMPSetPhyMode(pAdapter, PHY_11B);
3787
				else if (NetType == Ndis802_11OFDM24)
3788
					RTMPSetPhyMode(pAdapter, PHY_11BG_MIXED);
3789
				else if (NetType == Ndis802_11OFDM5)
3790
					RTMPSetPhyMode(pAdapter, PHY_11A);
3791
				else
3792
					Status = -EINVAL;
3793
3794
				if (Status == NDIS_STATUS_SUCCESS)
3795
					SetCommonHT(pAdapter);
3796
3797
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType));
3798
		    }
3799
			break;
3800
        // For WPA PSK PMK key
3801
        case RT_OID_802_11_ADD_WPA:
3802
            pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3803
            if(pKey == NULL)
3804
            {
3805
                Status = -ENOMEM;
3806
                break;
3807
            }
3808
3809
            Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
3810
            if (pKey->Length != wrq->u.data.length)
3811
            {
3812
                Status  = -EINVAL;
3813
                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!!\n"));
3814
            }
3815
            else
3816
            {
3817
                if ((pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
3818
				    (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
3819
				    (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) )
3820
                {
3821
                    Status = -EOPNOTSUPP;
3822
                    DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\n"));
3823
                }
3824
                else if ((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
3825
						 (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
3826
						 (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) )     // Only for WPA PSK mode
3827
				{
3828
                    NdisMoveMemory(pAdapter->StaCfg.PMK, &pKey->KeyMaterial, pKey->KeyLength);
3829
                    // Use RaConfig as PSK agent.
3830
                    // Start STA supplicant state machine
3831
                    if (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
3832
                        pAdapter->StaCfg.WpaState = SS_START;
3833
3834
                    DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3835
                }
3836
                else
3837
                {
3838
                    pAdapter->StaCfg.WpaState = SS_NOTUSE;
3839
                    DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3840
                }
3841
            }
3842
            kfree(pKey);
3843
            break;
3844
        case OID_802_11_REMOVE_KEY:
3845
            pRemoveKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3846
            if(pRemoveKey == NULL)
3847
            {
3848
                Status = -ENOMEM;
3849
                break;
3850
            }
3851
3852
            Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);
3853
            if (pRemoveKey->Length != wrq->u.data.length)
3854
            {
3855
                Status  = -EINVAL;
3856
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!\n"));
3857
            }
3858
            else
3859
            {
3860
                if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
3861
                {
3862
                    RTMPWPARemoveKeyProc(pAdapter, pRemoveKey);
3863
                    DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\n"));
3864
                }
3865
                else
3866
                {
3867
                    KeyIdx = pRemoveKey->KeyIndex;
3868
3869
                    if (KeyIdx & 0x80000000)
3870
                    {
3871
                        // Should never set default bit when remove key
3872
                        Status  = -EINVAL;
3873
                        DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\n"));
3874
                    }
3875
                    else
3876
                    {
3877
                        KeyIdx = KeyIdx & 0x0fffffff;
3878
                        if (KeyIdx > 3)
3879
                        {
3880
                            Status  = -EINVAL;
3881
                            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\n", KeyIdx));
3882
                        }
3883
                        else
3884
                        {
3885
                            pAdapter->SharedKey[BSS0][KeyIdx].KeyLen = 0;
3886
                            pAdapter->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
3887
                            AsicRemoveSharedKeyEntry(pAdapter, 0, (UCHAR)KeyIdx);
3888
                            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length));
3889
                        }
3890
                    }
3891
                }
3892
            }
3893
            kfree(pRemoveKey);
3894
            break;
3895
        // New for WPA
3896
        case OID_802_11_ADD_KEY:
3897
            pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3898
            if(pKey == NULL)
3899
            {
3900
                Status = -ENOMEM;
3901
                break;
3902
            }
3903
            Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
3904
            if (pKey->Length != wrq->u.data.length)
3905
            {
3906
                Status  = -EINVAL;
3907
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY, Failed!!\n"));
3908
            }
3909
            else
3910
            {
3911
                RTMPAddKey(pAdapter, pKey);
3912
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3913
            }
3914
            kfree(pKey);
3915
            break;
3916
        case OID_802_11_CONFIGURATION:
3917
            if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION))
3918
                Status  = -EINVAL;
3919
            else
3920
            {
3921
                Status = copy_from_user(&Config, wrq->u.data.pointer, wrq->u.data.length);
3922
                pConfig = &Config;
3923
3924
                if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400))
3925
                     pAdapter->CommonCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod;
3926
3927
                pAdapter->StaActive.AtimWin = (USHORT) pConfig->ATIMWindow;
3928
                MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAdapter->CommonCfg.Channel);
3929
                //
3930
				// Save the channel on MlmeAux for CntlOidRTBssidProc used.
3931
				//
3932
				pAdapter->MlmeAux.Channel = pAdapter->CommonCfg.Channel;
3933
3934
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CONFIGURATION (BeacnPeriod=%ld,AtimW=%ld,Ch=%d)\n",
3935
                    pConfig->BeaconPeriod, pConfig->ATIMWindow, pAdapter->CommonCfg.Channel));
3936
                // Config has changed
3937
                pAdapter->bConfigChanged = TRUE;
3938
            }
3939
            break;
3940
		case RT_OID_802_11_SET_HT_PHYMODE:
3941
			if (wrq->u.data.length	!= sizeof(OID_SET_HT_PHYMODE))
3942
				Status = -EINVAL;
3943
			else
3944
			{
3945
			    POID_SET_HT_PHYMODE	pHTPhyMode = &HT_PhyMode;
3946
3947
				Status = copy_from_user(&HT_PhyMode, wrq->u.data.pointer, wrq->u.data.length);
3948
				DBGPRINT(RT_DEBUG_TRACE, ("Set::pHTPhyMode	(PhyMode = %d,TransmitNo = %d, HtMode =	%d,	ExtOffset =	%d , MCS = %d, BW =	%d,	STBC = %d, SHORTGI = %d) \n",
3949
				pHTPhyMode->PhyMode, pHTPhyMode->TransmitNo,pHTPhyMode->HtMode,pHTPhyMode->ExtOffset,
3950
				pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC,	pHTPhyMode->SHORTGI));
3951
				if (pAdapter->CommonCfg.PhyMode	>= PHY_11ABGN_MIXED)
3952
					RTMPSetHT(pAdapter,	pHTPhyMode);
3953
			}
3954
			DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_HT_PHYMODE(MCS=%d,BW=%d,SGI=%d,STBC=%d)\n",
3955
				pAdapter->StaCfg.HTPhyMode.field.MCS, pAdapter->StaCfg.HTPhyMode.field.BW, pAdapter->StaCfg.HTPhyMode.field.ShortGI,
3956
				pAdapter->StaCfg.HTPhyMode.field.STBC));
3957
			break;
3958
		case RT_OID_802_11_SET_APSD_SETTING:
3959
			if (wrq->u.data.length != sizeof(ULONG))
3960
				Status = -EINVAL;
3961
			else
3962
			{
3963
				ULONG apsd ;
3964
				Status = copy_from_user(&apsd, wrq->u.data.pointer,	wrq->u.data.length);
3965
3966
				/*-------------------------------------------------------------------
3967
				|B31~B7	|	B6~B5	 |	 B4	 |	 B3	 |	B2	 |	B1	 |	   B0		|
3968
				---------------------------------------------------------------------
3969
				| Rsvd	| Max SP Len | AC_VO | AC_VI | AC_BK | AC_BE | APSD	Capable	|
3970
				---------------------------------------------------------------------*/
3971
				pAdapter->CommonCfg.bAPSDCapable = (apsd & 0x00000001) ? TRUE :	FALSE;
3972
				pAdapter->CommonCfg.bAPSDAC_BE = ((apsd	& 0x00000002) >> 1)	? TRUE : FALSE;
3973
				pAdapter->CommonCfg.bAPSDAC_BK = ((apsd	& 0x00000004) >> 2)	? TRUE : FALSE;
3974
				pAdapter->CommonCfg.bAPSDAC_VI = ((apsd	& 0x00000008) >> 3)	? TRUE : FALSE;
3975
				pAdapter->CommonCfg.bAPSDAC_VO = ((apsd	& 0x00000010) >> 4)	? TRUE : FALSE;
3976
				pAdapter->CommonCfg.MaxSPLength	= (UCHAR)((apsd	& 0x00000060) >> 5);
3977
3978
				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, pAdapter->CommonCfg.bAPSDCapable,
3979
					pAdapter->CommonCfg.bAPSDAC_BE,	pAdapter->CommonCfg.bAPSDAC_BK,	pAdapter->CommonCfg.bAPSDAC_VI,	pAdapter->CommonCfg.bAPSDAC_VO,	pAdapter->CommonCfg.MaxSPLength));
3980
			}
3981
			break;
3982
3983
		case RT_OID_802_11_SET_APSD_PSM:
3984
			if (wrq->u.data.length	!= sizeof(ULONG))
3985
				Status = -EINVAL;
3986
			else
3987
			{
3988
				// Driver needs	to notify AP when PSM changes
3989
				Status = copy_from_user(&pAdapter->CommonCfg.bAPSDForcePowerSave, wrq->u.data.pointer, wrq->u.data.length);
3990
				if (pAdapter->CommonCfg.bAPSDForcePowerSave	!= pAdapter->StaCfg.Psm)
3991
				{
3992
					MlmeSetPsmBit(pAdapter,	pAdapter->CommonCfg.bAPSDForcePowerSave);
3993
					RTMPSendNullFrame(pAdapter,	pAdapter->CommonCfg.TxRate,	TRUE);
3994
				}
3995
				DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_PSM (bAPSDForcePowerSave:%d)\n",	pAdapter->CommonCfg.bAPSDForcePowerSave));
3996
			}
3997
			break;
3998
3999
		case RT_OID_802_11_SET_WMM:
4000
			if (wrq->u.data.length	!= sizeof(BOOLEAN))
4001
				Status = -EINVAL;
4002
			else
4003
			{
4004
				Status = copy_from_user(&pAdapter->CommonCfg.bWmmCapable, wrq->u.data.pointer, wrq->u.data.length);
4005
				DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_WMM (=%d)	\n", pAdapter->CommonCfg.bWmmCapable));
4006
			}
4007
			break;
4008
4009
		case OID_802_11_DISASSOCIATE:
4010
			//
4011
			// Set NdisRadioStateOff to	TRUE, instead of called	MlmeRadioOff.
4012
			// Later on, NDIS_802_11_BSSID_LIST_EX->NumberOfItems should be	0
4013
			// when	query OID_802_11_BSSID_LIST.
4014
			//
4015
			// TRUE:  NumberOfItems	will set to	0.
4016
			// FALSE: NumberOfItems	no change.
4017
			//
4018
			pAdapter->CommonCfg.NdisRadioStateOff =	TRUE;
4019
			// Set to immediately send the media disconnect	event
4020
			pAdapter->MlmeAux.CurrReqIsFromNdis	= TRUE;
4021
			DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DISASSOCIATE	\n"));
4022
4023
			if (INFRA_ON(pAdapter))
4024
			{
4025
				if (pAdapter->Mlme.CntlMachine.CurrState !=	CNTL_IDLE)
4026
				{
4027
					RT28XX_MLME_RESET_STATE_MACHINE(pAdapter);
4028
					DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME	busy, reset	MLME state machine !!!\n"));
4029
				}
4030
4031
				MlmeEnqueue(pAdapter,
4032
					MLME_CNTL_STATE_MACHINE,
4033
					OID_802_11_DISASSOCIATE,
4034
					0,
4035
					NULL);
4036
4037
				StateMachineTouched	= TRUE;
4038
			}
4039
			break;
4040
		case RT_OID_802_11_SET_IMME_BA_CAP:
4041
				if (wrq->u.data.length != sizeof(OID_BACAP_STRUC))
4042
					Status = -EINVAL;
4043
				else
4044
				{
4045
					OID_BACAP_STRUC Orde ;
4046
					Status = copy_from_user(&Orde, wrq->u.data.pointer, wrq->u.data.length);
4047
					if (Orde.Policy > BA_NOTUSE)
4048
					{
4049
						Status = NDIS_STATUS_INVALID_DATA;
4050
					}
4051
					else if (Orde.Policy == BA_NOTUSE)
4052
					{
4053
						pAdapter->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
4054
						pAdapter->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;
4055
						pAdapter->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;
4056
						pAdapter->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;
4057
						pAdapter->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;
4058
						pAdapter->CommonCfg.DesiredHtPhy.MimoPs= Orde.MMPSmode;
4059
						pAdapter->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;
4060
						// UPdata to HT IE
4061
						pAdapter->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;
4062
						pAdapter->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;
4063
						pAdapter->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;
4064
					}
4065
					else
4066
					{
4067
                        pAdapter->CommonCfg.BACapability.field.AutoBA = Orde.AutoBA;
4068
						pAdapter->CommonCfg.BACapability.field.Policy = IMMED_BA; // we only support immediate BA.
4069
						pAdapter->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;
4070
						pAdapter->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;
4071
						pAdapter->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;
4072
						pAdapter->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;
4073
						pAdapter->CommonCfg.DesiredHtPhy.MimoPs = Orde.MMPSmode;
4074
						pAdapter->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;
4075
4076
						// UPdata to HT IE
4077
						pAdapter->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;
4078
						pAdapter->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;
4079
						pAdapter->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;
4080
4081
						if (pAdapter->CommonCfg.BACapability.field.RxBAWinLimit > MAX_RX_REORDERBUF)
4082
							pAdapter->CommonCfg.BACapability.field.RxBAWinLimit = MAX_RX_REORDERBUF;
4083
4084
					}
4085
4086
					pAdapter->CommonCfg.REGBACapability.word = pAdapter->CommonCfg.BACapability.word;
4087
					DBGPRINT(RT_DEBUG_TRACE, ("Set::(Orde.AutoBA = %d) (Policy=%d)(ReBAWinLimit=%d)(TxBAWinLimit=%d)(AutoMode=%d)\n",Orde.AutoBA, pAdapter->CommonCfg.BACapability.field.Policy,
4088
						pAdapter->CommonCfg.BACapability.field.RxBAWinLimit,pAdapter->CommonCfg.BACapability.field.TxBAWinLimit, pAdapter->CommonCfg.BACapability.field.AutoBA));
4089
					DBGPRINT(RT_DEBUG_TRACE, ("Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\n",pAdapter->CommonCfg.DesiredHtPhy.MimoPs, pAdapter->CommonCfg.DesiredHtPhy.AmsduEnable,
4090
						pAdapter->CommonCfg.DesiredHtPhy.AmsduSize, pAdapter->CommonCfg.DesiredHtPhy.MpduDensity));
4091
				}
4092
4093
				break;
4094
		case RT_OID_802_11_ADD_IMME_BA:
4095
			DBGPRINT(RT_DEBUG_TRACE, (" Set :: RT_OID_802_11_ADD_IMME_BA \n"));
4096
			if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))
4097
					Status = -EINVAL;
4098
			else
4099
			{
4100
				UCHAR		        index;
4101
				OID_ADD_BA_ENTRY    BA;
4102
				MAC_TABLE_ENTRY     *pEntry;
4103
4104
				Status = copy_from_user(&BA, wrq->u.data.pointer, wrq->u.data.length);
4105
				if (BA.TID > 15)
4106
				{
4107
					Status = NDIS_STATUS_INVALID_DATA;
4108
					break;
4109
				}
4110
				else
4111
				{
4112
					//BATableInsertEntry
4113
					//As ad-hoc mode, BA pair is not limited to only BSSID. so add via OID.
4114
					index = BA.TID;
4115
					// in ad hoc mode, when adding BA pair, we should insert this entry into MACEntry too
4116
					pEntry = MacTableLookup(pAdapter, BA.MACAddr);
4117
					if (!pEntry)
4118
					{
4119
						DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_802_11_ADD_IMME_BA. break on no connection.----:%x:%x\n", BA.MACAddr[4], BA.MACAddr[5]));
4120
						break;
4121
					}
4122
					if (BA.IsRecipient == FALSE)
4123
					{
4124
					    if (pEntry->bIAmBadAtheros == TRUE)
4125
							pAdapter->CommonCfg.BACapability.field.RxBAWinLimit = 0x10;
4126
4127
						BAOriSessionSetUp(pAdapter, pEntry, index, 0, 100, TRUE);
4128
					}
4129
					else
4130
					{
4131
						//BATableInsertEntry(pAdapter, pEntry->Aid, BA.MACAddr, 0, 0xffff, BA.TID, BA.nMSDU, BA.IsRecipient);
4132
					}
4133
4134
					DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_IMME_BA. Rec = %d. Mac = %x:%x:%x:%x:%x:%x . \n",
4135
						BA.IsRecipient, BA.MACAddr[0], BA.MACAddr[1], BA.MACAddr[2], BA.MACAddr[2]
4136
						, BA.MACAddr[4], BA.MACAddr[5]));
4137
				}
4138
			}
4139
			break;
4140
4141
		case RT_OID_802_11_TEAR_IMME_BA:
4142
			DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA \n"));
4143
			if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))
4144
					Status = -EINVAL;
4145
			else
4146
			{
4147
				POID_ADD_BA_ENTRY	pBA;
4148
				MAC_TABLE_ENTRY *pEntry;
4149
4150
				pBA = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4151
4152
				if (pBA == NULL)
4153
				{
4154
					DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA kmalloc() can't allocate enough memory\n"));
4155
					Status = NDIS_STATUS_FAILURE;
4156
				}
4157
				else
4158
				{
4159
					Status = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length);
4160
					DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\n", pBA->TID, pBA->bAllTid));
4161
4162
					if (!pBA->bAllTid && (pBA->TID > NUM_OF_TID))
4163
					{
4164
						Status = NDIS_STATUS_INVALID_DATA;
4165
						break;
4166
					}
4167
4168
					if (pBA->IsRecipient == FALSE)
4169
					{
4170
						pEntry = MacTableLookup(pAdapter, pBA->MACAddr);
4171
						DBGPRINT(RT_DEBUG_TRACE, (" pBA->IsRecipient == FALSE\n"));
4172
						if (pEntry)
4173
						{
4174
							DBGPRINT(RT_DEBUG_TRACE, (" pBA->pEntry\n"));
4175
							BAOriSessionTearDown(pAdapter, pEntry->Aid, pBA->TID, FALSE, TRUE);
4176
						}
4177
						else
4178
							DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n"));
4179
					}
4180
					else
4181
					{
4182
						pEntry = MacTableLookup(pAdapter, pBA->MACAddr);
4183
						if (pEntry)
4184
						{
4185
							BARecSessionTearDown( pAdapter, (UCHAR)pEntry->Aid, pBA->TID, TRUE);
4186
						}
4187
						else
4188
							DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n"));
4189
					}
4190
					kfree(pBA);
4191
				}
4192
            }
4193
            break;
4194
        // For WPA_SUPPLICANT to set static wep key
4195
    	case OID_802_11_ADD_WEP:
4196
    	    pWepKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4197
4198
    	    if(pWepKey == NULL)
4199
            {
4200
                Status = -ENOMEM;
4201
				DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed!!\n"));
4202
                break;
4203
            }
4204
            Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length);
4205
            if (Status)
4206
            {
4207
                Status  = -EINVAL;
4208
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\n"));
4209
            }
4210
            else
4211
            {
4212
		        KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
4213
                // KeyIdx must be 0 ~ 3
4214
                if (KeyIdx > 4)
4215
    			{
4216
                    Status  = -EINVAL;
4217
                    DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\n"));
4218
                }
4219
                else
4220
                {
4221
                    UCHAR CipherAlg = 0;
4222
                    PUCHAR Key;
4223
4224
                    // set key material and key length
4225
                    NdisZeroMemory(pAdapter->SharedKey[BSS0][KeyIdx].Key, 16);
4226
                    pAdapter->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
4227
                    NdisMoveMemory(pAdapter->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
4228
4229
                    switch(pWepKey->KeyLength)
4230
                    {
4231
                        case 5:
4232
                            CipherAlg = CIPHER_WEP64;
4233
                            break;
4234
                        case 13:
4235
                            CipherAlg = CIPHER_WEP128;
4236
                            break;
4237
                        default:
4238
                            DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\n"));
4239
                            Status = -EINVAL;
4240
                            break;
4241
                    }
4242
                    pAdapter->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg;
4243
4244
                    // Default key for tx (shared key)
4245
                    if (pWepKey->KeyIndex & 0x80000000)
4246
                    {
4247
                        // set key material and key length
4248
                        NdisZeroMemory(pAdapter->StaCfg.DesireSharedKey[KeyIdx].Key, 16);
4249
                        pAdapter->StaCfg.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
4250
                        NdisMoveMemory(pAdapter->StaCfg.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
4251
                        pAdapter->StaCfg.DesireSharedKeyId = KeyIdx;
4252
                        pAdapter->StaCfg.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg;
4253
                        pAdapter->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;
4254
                    }
4255
#ifndef RT30xx
4256
#ifdef RT2860
4257
					if ((pAdapter->StaCfg.WpaSupplicantUP != 0) &&
4258
#endif
4259
#ifdef RT2870
4260
					if ((pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&
4261
#endif
4262
						(pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))
4263
					{
4264
						Key = pWepKey->KeyMaterial;
4265
4266
						// Set Group key material to Asic
4267
    					AsicAddSharedKeyEntry(pAdapter, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL);
4268
4269
						// Update WCID attribute table and IVEIV table for this group key table
4270
						RTMPAddWcidAttributeEntry(pAdapter, BSS0, KeyIdx, CipherAlg, NULL);
4271
4272
						STA_PORT_SECURED(pAdapter);
4273
4274
        				// Indicate Connected for GUI
4275
        				pAdapter->IndicateMediaState = NdisMediaStateConnected;
4276
					}
4277
                    else if (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)
4278
#endif
4279
#ifdef RT30xx
4280
                    if (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)
4281
#endif
4282
                    {
4283
                        Key = pAdapter->SharedKey[BSS0][KeyIdx].Key;
4284
4285
                        // Set key material and cipherAlg to Asic
4286
        				AsicAddSharedKeyEntry(pAdapter, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL);
4287
4288
                        if (pWepKey->KeyIndex & 0x80000000)
4289
                        {
4290
                            PMAC_TABLE_ENTRY pEntry = &pAdapter->MacTab.Content[BSSID_WCID];
4291
                            // Assign group key info
4292
    						RTMPAddWcidAttributeEntry(pAdapter, BSS0, KeyIdx, CipherAlg, NULL);
4293
    						// Assign pairwise key info
4294
    						RTMPAddWcidAttributeEntry(pAdapter, BSS0, KeyIdx, CipherAlg, pEntry);
4295
                        }
4296
                    }
4297
					DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\n", pWepKey->KeyIndex, pWepKey->KeyLength, (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) ? "Port Secured":"Port NOT Secured"));
4298
				}
4299
            }
4300
            kfree(pWepKey);
4301
            break;
4302
	    case OID_SET_COUNTERMEASURES:
4303
            if (wrq->u.data.length != sizeof(int))
4304
                Status  = -EINVAL;
4305
            else
4306
            {
4307
                int enabled = 0;
4308
                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
4309
                if (enabled == 1)
4310
                    pAdapter->StaCfg.bBlockAssoc = TRUE;
4311
                else
4312
                    // WPA MIC error should block association attempt for 60 seconds
4313
                    pAdapter->StaCfg.bBlockAssoc = FALSE;
4314
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_SET_COUNTERMEASURES bBlockAssoc=%s\n", pAdapter->StaCfg.bBlockAssoc ? "TRUE":"FALSE"));
4315
            }
4316
	        break;
4317
        case RT_OID_WPA_SUPPLICANT_SUPPORT:
4318
			if (wrq->u.data.length != sizeof(UCHAR))
4319
                Status  = -EINVAL;
4320
            else
4321
            {
4322
                Status = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length);
4323
    			pAdapter->StaCfg.WpaSupplicantUP = wpa_supplicant_enable;
4324
    			DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAdapter->StaCfg.WpaSupplicantUP));
4325
			}
4326
            break;
4327
        case OID_802_11_DEAUTHENTICATION:
4328
            if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))
4329
                Status  = -EINVAL;
4330
            else
4331
            {
4332
                MLME_DEAUTH_REQ_STRUCT      *pInfo;
4333
				MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
4334
4335
                pInfo = (MLME_DEAUTH_REQ_STRUCT *) MsgElem->Msg;
4336
                Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);
4337
                MlmeDeauthReqAction(pAdapter, MsgElem);
4338
				kfree(MsgElem);
4339
4340
                if (INFRA_ON(pAdapter))
4341
                {
4342
                    LinkDown(pAdapter, FALSE);
4343
                    pAdapter->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
4344
                }
4345
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", pInfo->Reason));
4346
            }
4347
            break;
4348
        case OID_802_11_DROP_UNENCRYPTED:
4349
            if (wrq->u.data.length != sizeof(int))
4350
                Status  = -EINVAL;
4351
            else
4352
            {
4353
                int enabled = 0;
4354
                Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
4355
                if (enabled == 1)
4356
                    pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
4357
                else
4358
                    pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
4359
				NdisAcquireSpinLock(&pAdapter->MacTabLock);
4360
				pAdapter->MacTab.Content[BSSID_WCID].PortSecured = pAdapter->StaCfg.PortSecured;
4361
				NdisReleaseSpinLock(&pAdapter->MacTabLock);
4362
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DROP_UNENCRYPTED (=%d)\n", enabled));
4363
            }
4364
            break;
4365
        case OID_802_11_SET_IEEE8021X:
4366
            if (wrq->u.data.length != sizeof(BOOLEAN))
4367
                Status  = -EINVAL;
4368
            else
4369
            {
4370
                Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length);
4371
		        pAdapter->StaCfg.IEEE8021X = IEEE8021xState;
4372
                DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X (=%d)\n", IEEE8021xState));
4373
            }
4374
            break;
4375
        case OID_802_11_SET_IEEE8021X_REQUIRE_KEY:
4376
			if (wrq->u.data.length != sizeof(BOOLEAN))
4377
				 Status  = -EINVAL;
4378
            else
4379
            {
4380
                Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length);
4381
				pAdapter->StaCfg.IEEE8021x_required_keys = IEEE8021x_required_keys;
4382
				DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\n", IEEE8021x_required_keys));
4383
			}
4384
			break;
4385
        case OID_802_11_PMKID:
4386
	        pPmkId = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4387
4388
	        if(pPmkId == NULL) {
4389
                Status = -ENOMEM;
4390
                break;
4391
            }
4392
            Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length);
4393
4394
	        // check the PMKID information
4395
	        if (pPmkId->BSSIDInfoCount == 0)
4396
                NdisZeroMemory(pAdapter->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);
4397
	        else
4398
	        {
4399
		        PBSSID_INFO	pBssIdInfo;
4400
		        UINT		BssIdx;
4401
		        UINT		CachedIdx;
4402
4403
		        for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++)
4404
		        {
4405
			        // point to the indexed BSSID_INFO structure
4406
			        pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO));
4407
			        // Find the entry in the saved data base.
4408
			        for (CachedIdx = 0; CachedIdx < pAdapter->StaCfg.SavedPMKNum; CachedIdx++)
4409
			        {
4410
				        // compare the BSSID
4411
				        if (NdisEqualMemory(pBssIdInfo->BSSID, pAdapter->StaCfg.SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS)))
4412
					        break;
4413
			        }
4414
4415
			        // Found, replace it
4416
			        if (CachedIdx < PMKID_NO)
4417
			        {
4418
				        DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
4419
				        NdisMoveMemory(&pAdapter->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
4420
				        pAdapter->StaCfg.SavedPMKNum++;
4421
			        }
4422
			        // Not found, replace the last one
4423
			        else
4424
			        {
4425
				        // Randomly replace one
4426
				        CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO);
4427
				        DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
4428
				        NdisMoveMemory(&pAdapter->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
4429
			        }
4430
		        }
4431
			}
4432
			if(pPmkId)
4433
				kfree(pPmkId);
4434
	        break;
4435
        default:
4436
            DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd));
4437
            Status = -EOPNOTSUPP;
4438
            break;
4439
    }
4440
4441
4442
    return Status;
4443
}
4444
4445
INT RTMPQueryInformation(
4446
    IN  PRTMP_ADAPTER pAdapter,
4447
    IN  OUT struct ifreq    *rq,
4448
    IN  INT                 cmd)
4449
{
4450
    struct iwreq                        *wrq = (struct iwreq *) rq;
4451
    NDIS_802_11_BSSID_LIST_EX           *pBssidList = NULL;
4452
    PNDIS_WLAN_BSSID_EX                 pBss;
4453
    NDIS_802_11_SSID                    Ssid;
4454
    NDIS_802_11_CONFIGURATION           *pConfiguration = NULL;
4455
    RT_802_11_LINK_STATUS               *pLinkStatus = NULL;
4456
    RT_802_11_STA_CONFIG                *pStaConfig = NULL;
4457
    NDIS_802_11_STATISTICS              *pStatistics = NULL;
4458
    NDIS_802_11_RTS_THRESHOLD           RtsThresh;
4459
    NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
4460
    NDIS_802_11_POWER_MODE              PowerMode;
4461
    NDIS_802_11_NETWORK_INFRASTRUCTURE  BssType;
4462
    RT_802_11_PREAMBLE                  PreamType;
4463
    NDIS_802_11_AUTHENTICATION_MODE     AuthMode;
4464
    NDIS_802_11_WEP_STATUS              WepStatus;
4465
    NDIS_MEDIA_STATE                    MediaState;
4466
    ULONG                               BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0;
4467
    USHORT                              BssLen = 0;
4468
    PUCHAR                              pBuf = NULL, pPtr;
4469
    INT                                 Status = NDIS_STATUS_SUCCESS;
4470
    UINT                                we_version_compiled;
4471
    UCHAR                               i, Padding = 0;
4472
    BOOLEAN                             RadioState;
4473
	UCHAR	driverVersion[8];
4474
    OID_SET_HT_PHYMODE			        *pHTPhyMode = NULL;
4475
4476
    switch(cmd)
4477
    {
4478
        case RT_OID_DEVICE_NAME:
4479
            wrq->u.data.length = sizeof(STA_NIC_DEVICE_NAME);
4480
            Status = copy_to_user(wrq->u.data.pointer, STA_NIC_DEVICE_NAME, wrq->u.data.length);
4481
            break;
4482
        case RT_OID_VERSION_INFO:
4483
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n"));
4484
			wrq->u.data.length = 8*sizeof(UCHAR);
4485
			sprintf(&driverVersion[0], "%s", STA_DRIVER_VERSION);
4486
			driverVersion[7] = '\0';
4487
			if (copy_to_user(wrq->u.data.pointer, &driverVersion, wrq->u.data.length))
4488
            {
4489
				Status = -EFAULT;
4490
            }
4491
            break;
4492
        case OID_802_11_BSSID_LIST:
4493
            if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
4494
            {
4495
            	/*
4496
            	 * Still scanning, indicate the caller should try again.
4497
            	 */
4498
            	DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n"));
4499
				return -EAGAIN;
4500
            }
4501
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAdapter->ScanTab.BssNr));
4502
			pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
4503
            // Claculate total buffer size required
4504
            BssBufSize = sizeof(ULONG);
4505
4506
            for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
4507
            {
4508
                // Align pointer to 4 bytes boundary.
4509
                //Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003);
4510
                //if (Padding == 4)
4511
                //    Padding = 0;
4512
                BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen + Padding);
4513
            }
4514
4515
            // For safety issue, we add 256 bytes just in case
4516
            BssBufSize += 256;
4517
            // Allocate the same size as passed from higher layer
4518
            pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG);
4519
            if(pBuf == NULL)
4520
            {
4521
                Status = -ENOMEM;
4522
                break;
4523
            }
4524
            // Init 802_11_BSSID_LIST_EX structure
4525
            NdisZeroMemory(pBuf, BssBufSize);
4526
            pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;
4527
            pBssidList->NumberOfItems = pAdapter->ScanTab.BssNr;
4528
4529
            // Calculate total buffer length
4530
            BssLen = 4; // Consist of NumberOfItems
4531
            // Point to start of NDIS_WLAN_BSSID_EX
4532
            // pPtr = pBuf + sizeof(ULONG);
4533
            pPtr = (PUCHAR) &pBssidList->Bssid[0];
4534
            for (i = 0; i < pAdapter->ScanTab.BssNr; i++)
4535
            {
4536
                pBss = (PNDIS_WLAN_BSSID_EX) pPtr;
4537
                NdisMoveMemory(&pBss->MacAddress, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);
4538
                if ((pAdapter->ScanTab.BssEntry[i].Hidden == 1) && (pAdapter->StaCfg.bShowHiddenSSID == FALSE))
4539
                {
4540
                    //
4541
					// We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation
4542
					// and then failed to send EAPOl farame.
4543
					//
4544
					if ((pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAdapter->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED))
4545
					{
4546
						pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
4547
						NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
4548
					}
4549
					else
4550
                    	pBss->Ssid.SsidLength = 0;
4551
                }
4552
                else
4553
                {
4554
                    pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
4555
                    NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
4556
                }
4557
                pBss->Privacy = pAdapter->ScanTab.BssEntry[i].Privacy;
4558
                pBss->Rssi = pAdapter->ScanTab.BssEntry[i].Rssi - pAdapter->BbpRssiToDbmDelta;
4559
                pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAdapter->ScanTab.BssEntry[i]);
4560
                pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
4561
                pBss->Configuration.BeaconPeriod = pAdapter->ScanTab.BssEntry[i].BeaconPeriod;
4562
                pBss->Configuration.ATIMWindow = pAdapter->ScanTab.BssEntry[i].AtimWin;
4563
4564
                MAP_CHANNEL_ID_TO_KHZ(pAdapter->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);
4565
4566
                if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_INFRA)
4567
                    pBss->InfrastructureMode = Ndis802_11Infrastructure;
4568
                else
4569
                    pBss->InfrastructureMode = Ndis802_11IBSS;
4570
4571
                NdisMoveMemory(pBss->SupportedRates, pAdapter->ScanTab.BssEntry[i].SupRate, pAdapter->ScanTab.BssEntry[i].SupRateLen);
4572
                NdisMoveMemory(pBss->SupportedRates + pAdapter->ScanTab.BssEntry[i].SupRateLen,
4573
                               pAdapter->ScanTab.BssEntry[i].ExtRate,
4574
                               pAdapter->ScanTab.BssEntry[i].ExtRateLen);
4575
4576
                if (pAdapter->ScanTab.BssEntry[i].VarIELen == 0)
4577
                {
4578
                    pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
4579
                    NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
4580
                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
4581
                }
4582
                else
4583
                {
4584
                    pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen);
4585
                    pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
4586
                    NdisMoveMemory(pBss->IEs, &pAdapter->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
4587
                    NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAdapter->ScanTab.BssEntry[i].VarIEs, pAdapter->ScanTab.BssEntry[i].VarIELen);
4588
                    pPtr += pAdapter->ScanTab.BssEntry[i].VarIELen;
4589
                }
4590
                pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAdapter->ScanTab.BssEntry[i].VarIELen + Padding);
4591
4592
#if WIRELESS_EXT < 17
4593
                if ((BssLen + pBss->Length) < wrq->u.data.length)
4594
                BssLen += pBss->Length;
4595
                else
4596
                {
4597
                    pBssidList->NumberOfItems = i;
4598
                    break;
4599
                }
4600
#else
4601
                BssLen += pBss->Length;
4602
#endif
4603
            }
4604
4605
#if WIRELESS_EXT < 17
4606
            wrq->u.data.length = BssLen;
4607
#else
4608
            if (BssLen > wrq->u.data.length)
4609
            {
4610
                kfree(pBssidList);
4611
                return -E2BIG;
4612
            }
4613
            else
4614
                wrq->u.data.length = BssLen;
4615
#endif
4616
            Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);
4617
            kfree(pBssidList);
4618
            break;
4619
        case OID_802_3_CURRENT_ADDRESS:
4620
            wrq->u.data.length = MAC_ADDR_LEN;
4621
            Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
4622
            break;
4623
        case OID_GEN_MEDIA_CONNECT_STATUS:
4624
            if (pAdapter->IndicateMediaState == NdisMediaStateConnected)
4625
                MediaState = NdisMediaStateConnected;
4626
            else
4627
                MediaState = NdisMediaStateDisconnected;
4628
4629
            wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);
4630
            Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);
4631
            break;
4632
        case OID_802_11_BSSID:
4633
            if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
4634
            {
4635
                Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS));
4636
4637
            }
4638
            else
4639
            {
4640
                DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n"));
4641
                Status = -ENOTCONN;
4642
            }
4643
            break;
4644
        case OID_802_11_SSID:
4645
			NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
4646
			NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);
4647
            Ssid.SsidLength = pAdapter->CommonCfg.SsidLen;
4648
			memcpy(Ssid.Ssid, pAdapter->CommonCfg.Ssid,	Ssid.SsidLength);
4649
            wrq->u.data.length = sizeof(NDIS_802_11_SSID);
4650
            Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);
4651
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid));
4652
            break;
4653
        case RT_OID_802_11_QUERY_LINK_STATUS:
4654
            pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG);
4655
            if (pLinkStatus)
4656
            {
4657
                pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAdapter->CommonCfg.TxRate];   // unit : 500 kbps
4658
                pLinkStatus->ChannelQuality = pAdapter->Mlme.ChannelQuality;
4659
                pLinkStatus->RxByteCount = pAdapter->RalinkCounters.ReceivedByteCount;
4660
                pLinkStatus->TxByteCount = pAdapter->RalinkCounters.TransmittedByteCount;
4661
        		pLinkStatus->CentralChannel = pAdapter->CommonCfg.CentralChannel;
4662
                wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS);
4663
                Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length);
4664
                kfree(pLinkStatus);
4665
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS\n"));
4666
            }
4667
            else
4668
            {
4669
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\n"));
4670
                Status = -EFAULT;
4671
            }
4672
            break;
4673
        case OID_802_11_CONFIGURATION:
4674
            pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG);
4675
            if (pConfiguration)
4676
            {
4677
                pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION);
4678
                pConfiguration->BeaconPeriod = pAdapter->CommonCfg.BeaconPeriod;
4679
                pConfiguration->ATIMWindow = pAdapter->StaActive.AtimWin;
4680
                MAP_CHANNEL_ID_TO_KHZ(pAdapter->CommonCfg.Channel, pConfiguration->DSConfig);
4681
                wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);
4682
                Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length);
4683
                DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n",
4684
                                        pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAdapter->CommonCfg.Channel));
4685
				kfree(pConfiguration);
4686
            }
4687
            else
4688
            {
4689
                DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(kmalloc failed)\n"));
4690
                Status = -EFAULT;
4691
            }
4692
            break;
4693
		case RT_OID_802_11_SNR_0:
4694
			if ((pAdapter->StaCfg.LastSNR0 > 0))
4695
			{
4696
				ulInfo = ((0xeb	- pAdapter->StaCfg.LastSNR0) * 3) /	16 ;
4697
				wrq->u.data.length = sizeof(ulInfo);
4698
				Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4699
				DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo));
4700
			}
4701
            else
4702
			    Status = -EFAULT;
4703
			break;
4704
		case RT_OID_802_11_SNR_1:
4705
			if ((pAdapter->Antenna.field.RxPath	> 1) &&
4706
                (pAdapter->StaCfg.LastSNR1 > 0))
4707
			{
4708
				ulInfo = ((0xeb	- pAdapter->StaCfg.LastSNR1) * 3) /	16 ;
4709
				wrq->u.data.length = sizeof(ulInfo);
4710
				Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4711
				DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(0x=%lx)\n",ulInfo));
4712
			}
4713
			else
4714
				Status = -EFAULT;
4715
            DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(pAdapter->StaCfg.LastSNR1=%d)\n",pAdapter->StaCfg.LastSNR1));
4716
			break;
4717
        case OID_802_11_RSSI_TRIGGER:
4718
            ulInfo = pAdapter->StaCfg.RssiSample.LastRssi0 - pAdapter->BbpRssiToDbmDelta;
4719
            wrq->u.data.length = sizeof(ulInfo);
4720
            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4721
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RSSI_TRIGGER(=%ld)\n", ulInfo));
4722
            break;
4723
		case OID_802_11_RSSI:
4724
        case RT_OID_802_11_RSSI:
4725
			ulInfo = pAdapter->StaCfg.RssiSample.LastRssi0;
4726
			wrq->u.data.length = sizeof(ulInfo);
4727
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4728
			break;
4729
		case RT_OID_802_11_RSSI_1:
4730
            ulInfo = pAdapter->StaCfg.RssiSample.LastRssi1;
4731
			wrq->u.data.length = sizeof(ulInfo);
4732
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4733
			break;
4734
        case RT_OID_802_11_RSSI_2:
4735
            ulInfo = pAdapter->StaCfg.RssiSample.LastRssi2;
4736
			wrq->u.data.length = sizeof(ulInfo);
4737
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4738
			break;
4739
        case OID_802_11_STATISTICS:
4740
            pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG);
4741
            if (pStatistics)
4742
            {
4743
                DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n"));
4744
                // add the most up-to-date h/w raw counters into software counters
4745
			    NICUpdateRawCounters(pAdapter);
4746
4747
                // Sanity check for calculation of sucessful count
4748
                if (pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart < pAdapter->WlanCounters.RetryCount.QuadPart)
4749
                    pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart = pAdapter->WlanCounters.RetryCount.QuadPart;
4750
4751
                pStatistics->TransmittedFragmentCount.QuadPart = pAdapter->WlanCounters.TransmittedFragmentCount.QuadPart;
4752
                pStatistics->MulticastTransmittedFrameCount.QuadPart = pAdapter->WlanCounters.MulticastTransmittedFrameCount.QuadPart;
4753
                pStatistics->FailedCount.QuadPart = pAdapter->WlanCounters.FailedCount.QuadPart;
4754
                pStatistics->RetryCount.QuadPart = pAdapter->WlanCounters.RetryCount.QuadPart;
4755
                pStatistics->MultipleRetryCount.QuadPart = pAdapter->WlanCounters.MultipleRetryCount.QuadPart;
4756
                pStatistics->RTSSuccessCount.QuadPart = pAdapter->WlanCounters.RTSSuccessCount.QuadPart;
4757
                pStatistics->RTSFailureCount.QuadPart = pAdapter->WlanCounters.RTSFailureCount.QuadPart;
4758
                pStatistics->ACKFailureCount.QuadPart = pAdapter->WlanCounters.ACKFailureCount.QuadPart;
4759
                pStatistics->FrameDuplicateCount.QuadPart = pAdapter->WlanCounters.FrameDuplicateCount.QuadPart;
4760
                pStatistics->ReceivedFragmentCount.QuadPart = pAdapter->WlanCounters.ReceivedFragmentCount.QuadPart;
4761
                pStatistics->MulticastReceivedFrameCount.QuadPart = pAdapter->WlanCounters.MulticastReceivedFrameCount.QuadPart;
4762
#ifdef DBG
4763
                pStatistics->FCSErrorCount = pAdapter->RalinkCounters.RealFcsErrCount;
4764
#else
4765
                pStatistics->FCSErrorCount.QuadPart = pAdapter->WlanCounters.FCSErrorCount.QuadPart;
4766
                pStatistics->FrameDuplicateCount.u.LowPart = pAdapter->WlanCounters.FrameDuplicateCount.u.LowPart / 100;
4767
#endif
4768
                wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);
4769
                Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);
4770
                kfree(pStatistics);
4771
            }
4772
            else
4773
            {
4774
                DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(kmalloc failed)\n"));
4775
                Status = -EFAULT;
4776
            }
4777
            break;
4778
        case OID_GEN_RCV_OK:
4779
            ulInfo = pAdapter->Counters8023.GoodReceives;
4780
            wrq->u.data.length = sizeof(ulInfo);
4781
            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4782
            break;
4783
        case OID_GEN_RCV_NO_BUFFER:
4784
            ulInfo = pAdapter->Counters8023.RxNoBuffer;
4785
            wrq->u.data.length = sizeof(ulInfo);
4786
            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4787
            break;
4788
        case RT_OID_802_11_PHY_MODE:
4789
            ulInfo = (ULONG)pAdapter->CommonCfg.PhyMode;
4790
            wrq->u.data.length = sizeof(ulInfo);
4791
            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4792
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PHY_MODE (=%ld)\n", ulInfo));
4793
            break;
4794
        case RT_OID_802_11_STA_CONFIG:
4795
            pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG);
4796
            if (pStaConfig)
4797
            {
4798
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG\n"));
4799
                pStaConfig->EnableTxBurst = pAdapter->CommonCfg.bEnableTxBurst;
4800
                pStaConfig->EnableTurboRate = 0;
4801
                pStaConfig->UseBGProtection = pAdapter->CommonCfg.UseBGProtection;
4802
                pStaConfig->UseShortSlotTime = pAdapter->CommonCfg.bUseShortSlotTime;
4803
                //pStaConfig->AdhocMode = pAdapter->StaCfg.AdhocMode;
4804
                pStaConfig->HwRadioStatus = (pAdapter->StaCfg.bHwRadio == TRUE) ? 1 : 0;
4805
                pStaConfig->Rsv1 = 0;
4806
                pStaConfig->SystemErrorBitmap = pAdapter->SystemErrorBitmap;
4807
                wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG);
4808
                Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length);
4809
                kfree(pStaConfig);
4810
            }
4811
            else
4812
            {
4813
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
4814
                Status = -EFAULT;
4815
            }
4816
            break;
4817
        case OID_802_11_RTS_THRESHOLD:
4818
            RtsThresh = pAdapter->CommonCfg.RtsThreshold;
4819
            wrq->u.data.length = sizeof(RtsThresh);
4820
            Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length);
4821
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RTS_THRESHOLD(=%ld)\n", RtsThresh));
4822
            break;
4823
        case OID_802_11_FRAGMENTATION_THRESHOLD:
4824
            FragThresh = pAdapter->CommonCfg.FragmentThreshold;
4825
            if (pAdapter->CommonCfg.bUseZeroToDisableFragment == TRUE)
4826
                FragThresh = 0;
4827
            wrq->u.data.length = sizeof(FragThresh);
4828
            Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length);
4829
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\n", FragThresh));
4830
            break;
4831
        case OID_802_11_POWER_MODE:
4832
            PowerMode = pAdapter->StaCfg.WindowsPowerMode;
4833
            wrq->u.data.length = sizeof(PowerMode);
4834
            Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length);
4835
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_POWER_MODE(=%d)\n", PowerMode));
4836
            break;
4837
        case RT_OID_802_11_RADIO:
4838
            RadioState = (BOOLEAN) pAdapter->StaCfg.bSwRadio;
4839
            wrq->u.data.length = sizeof(RadioState);
4840
            Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length);
4841
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_RADIO (=%d)\n", RadioState));
4842
            break;
4843
        case OID_802_11_INFRASTRUCTURE_MODE:
4844
            if (pAdapter->StaCfg.BssType == BSS_ADHOC)
4845
                BssType = Ndis802_11IBSS;
4846
            else if (pAdapter->StaCfg.BssType == BSS_INFRA)
4847
                BssType = Ndis802_11Infrastructure;
4848
            else if (pAdapter->StaCfg.BssType == BSS_MONITOR)
4849
                BssType = Ndis802_11Monitor;
4850
            else
4851
                BssType = Ndis802_11AutoUnknown;
4852
4853
            wrq->u.data.length = sizeof(BssType);
4854
            Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length);
4855
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\n", BssType));
4856
            break;
4857
        case RT_OID_802_11_PREAMBLE:
4858
            PreamType = pAdapter->CommonCfg.TxPreamble;
4859
            wrq->u.data.length = sizeof(PreamType);
4860
            Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length);
4861
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PREAMBLE(=%d)\n", PreamType));
4862
            break;
4863
        case OID_802_11_AUTHENTICATION_MODE:
4864
            AuthMode = pAdapter->StaCfg.AuthMode;
4865
            wrq->u.data.length = sizeof(AuthMode);
4866
            Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);
4867
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE(=%d)\n", AuthMode));
4868
            break;
4869
        case OID_802_11_WEP_STATUS:
4870
            WepStatus = pAdapter->StaCfg.WepStatus;
4871
            wrq->u.data.length = sizeof(WepStatus);
4872
            Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length);
4873
            DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEP_STATUS(=%d)\n", WepStatus));
4874
            break;
4875
        case OID_802_11_TX_POWER_LEVEL:
4876
			wrq->u.data.length = sizeof(ULONG);
4877
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.TxPower, wrq->u.data.length);
4878
			DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_TX_POWER_LEVEL %x\n",pAdapter->CommonCfg.TxPower));
4879
			break;
4880
        case RT_OID_802_11_TX_POWER_LEVEL_1:
4881
            wrq->u.data.length = sizeof(ULONG);
4882
            Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.TxPowerPercentage, wrq->u.data.length);
4883
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAdapter->CommonCfg.TxPowerPercentage));
4884
			break;
4885
        case OID_802_11_NETWORK_TYPES_SUPPORTED:
4886
			if ((pAdapter->RfIcType	== RFIC_2850) || (pAdapter->RfIcType ==	RFIC_2750))
4887
			{
4888
				NetworkTypeList[0] = 3;                 // NumberOfItems = 3
4889
				NetworkTypeList[1] = Ndis802_11DS;      // NetworkType[1] = 11b
4890
				NetworkTypeList[2] = Ndis802_11OFDM24;  // NetworkType[2] = 11g
4891
				NetworkTypeList[3] = Ndis802_11OFDM5;   // NetworkType[3] = 11a
4892
                wrq->u.data.length = 16;
4893
				Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
4894
			}
4895
			else
4896
			{
4897
				NetworkTypeList[0] = 2;                 // NumberOfItems = 2
4898
				NetworkTypeList[1] = Ndis802_11DS;      // NetworkType[1] = 11b
4899
				NetworkTypeList[2] = Ndis802_11OFDM24;  // NetworkType[2] = 11g
4900
			    wrq->u.data.length = 12;
4901
				Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
4902
			}
4903
			DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n"));
4904
				break;
4905
	    case OID_802_11_NETWORK_TYPE_IN_USE:
4906
            wrq->u.data.length = sizeof(ULONG);
4907
			if (pAdapter->CommonCfg.PhyMode == PHY_11A)
4908
				ulInfo = Ndis802_11OFDM5;
4909
			else if ((pAdapter->CommonCfg.PhyMode == PHY_11BG_MIXED) || (pAdapter->CommonCfg.PhyMode == PHY_11G))
4910
				ulInfo = Ndis802_11OFDM24;
4911
			else
4912
				ulInfo = Ndis802_11DS;
4913
            Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4914
			break;
4915
        case RT_OID_802_11_QUERY_LAST_RX_RATE:
4916
            ulInfo = (ULONG)pAdapter->LastRxRate;
4917
            wrq->u.data.length = sizeof(ulInfo);
4918
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4919
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", ulInfo));
4920
			break;
4921
		case RT_OID_802_11_QUERY_LAST_TX_RATE:
4922
			//ulInfo = (ULONG)pAdapter->LastTxRate;
4923
			ulInfo = (ULONG)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word;
4924
			wrq->u.data.length = sizeof(ulInfo);
4925
			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
4926
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\n", ulInfo));
4927
			break;
4928
        case RT_OID_802_11_QUERY_EEPROM_VERSION:
4929
            wrq->u.data.length = sizeof(ULONG);
4930
            Status = copy_to_user(wrq->u.data.pointer, &pAdapter->EepromVersion, wrq->u.data.length);
4931
            break;
4932
        case RT_OID_802_11_QUERY_FIRMWARE_VERSION:
4933
            wrq->u.data.length = sizeof(ULONG);
4934
            Status = copy_to_user(wrq->u.data.pointer, &pAdapter->FirmwareVersion, wrq->u.data.length);
4935
			break;
4936
	    case RT_OID_802_11_QUERY_NOISE_LEVEL:
4937
			wrq->u.data.length = sizeof(UCHAR);
4938
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->BbpWriteLatch[66], wrq->u.data.length);
4939
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\n", pAdapter->BbpWriteLatch[66]));
4940
			break;
4941
	    case RT_OID_802_11_EXTRA_INFO:
4942
			wrq->u.data.length = sizeof(ULONG);
4943
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->ExtraInfo, wrq->u.data.length);
4944
	        DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_EXTRA_INFO (=%ld)\n", pAdapter->ExtraInfo));
4945
	        break;
4946
	    case RT_OID_WE_VERSION_COMPILED:
4947
	        wrq->u.data.length = sizeof(UINT);
4948
	        we_version_compiled = WIRELESS_EXT;
4949
	        Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);
4950
	        break;
4951
		case RT_OID_802_11_QUERY_APSD_SETTING:
4952
			apsd = (pAdapter->CommonCfg.bAPSDCapable | (pAdapter->CommonCfg.bAPSDAC_BE << 1) | (pAdapter->CommonCfg.bAPSDAC_BK << 2)
4953
				| (pAdapter->CommonCfg.bAPSDAC_VI << 3)	| (pAdapter->CommonCfg.bAPSDAC_VO << 4)	| (pAdapter->CommonCfg.MaxSPLength << 5));
4954
4955
			wrq->u.data.length = sizeof(ULONG);
4956
			Status = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length);
4957
			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",
4958
				apsd,pAdapter->CommonCfg.bAPSDCapable,pAdapter->CommonCfg.bAPSDAC_BE,pAdapter->CommonCfg.bAPSDAC_BK,pAdapter->CommonCfg.bAPSDAC_VI,pAdapter->CommonCfg.bAPSDAC_VO,pAdapter->CommonCfg.MaxSPLength));
4959
			break;
4960
		case RT_OID_802_11_QUERY_APSD_PSM:
4961
			wrq->u.data.length = sizeof(ULONG);
4962
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length);
4963
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\n", pAdapter->CommonCfg.bAPSDForcePowerSave));
4964
			break;
4965
		case RT_OID_802_11_QUERY_WMM:
4966
			wrq->u.data.length = sizeof(BOOLEAN);
4967
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.bWmmCapable, wrq->u.data.length);
4968
			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n",	pAdapter->CommonCfg.bWmmCapable));
4969
			break;
4970
        case RT_OID_NEW_DRIVER:
4971
            {
4972
                UCHAR enabled = 1;
4973
    	        wrq->u.data.length = sizeof(UCHAR);
4974
    	        Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);
4975
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NEW_DRIVER (=%d)\n", enabled));
4976
            }
4977
	        break;
4978
        case RT_OID_WPA_SUPPLICANT_SUPPORT:
4979
	        wrq->u.data.length = sizeof(UCHAR);
4980
	        Status = copy_to_user(wrq->u.data.pointer, &pAdapter->StaCfg.WpaSupplicantUP, wrq->u.data.length);
4981
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAdapter->StaCfg.WpaSupplicantUP));
4982
	        break;
4983
        case RT_OID_DRIVER_DEVICE_NAME:
4984
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_DRIVER_DEVICE_NAME \n"));
4985
			wrq->u.data.length = 16;
4986
			if (copy_to_user(wrq->u.data.pointer, pAdapter->StaCfg.dev_name, wrq->u.data.length))
4987
			{
4988
				Status = -EFAULT;
4989
			}
4990
            break;
4991
        case RT_OID_802_11_QUERY_HT_PHYMODE:
4992
            pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
4993
            if (pHTPhyMode)
4994
            {
4995
                pHTPhyMode->PhyMode = pAdapter->CommonCfg.PhyMode;
4996
    			pHTPhyMode->HtMode = (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE;
4997
    			pHTPhyMode->BW = (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW;
4998
    			pHTPhyMode->MCS= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS;
4999
    			pHTPhyMode->SHORTGI= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI;
5000
    			pHTPhyMode->STBC= (UCHAR)pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC;
5001
5002
    			pHTPhyMode->ExtOffset = ((pAdapter->CommonCfg.CentralChannel < pAdapter->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE));
5003
                wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
5004
                if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
5005
    			{
5006
    				Status = -EFAULT;
5007
    			}
5008
    			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
5009
    				pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
5010
    			DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word));
5011
            }
5012
            else
5013
            {
5014
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
5015
                Status = -EFAULT;
5016
            }
5017
            break;
5018
        case RT_OID_802_11_COUNTRY_REGION:
5019
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_COUNTRY_REGION \n"));
5020
			wrq->u.data.length = sizeof(ulInfo);
5021
            ulInfo = pAdapter->CommonCfg.CountryRegionForABand;
5022
            ulInfo = (ulInfo << 8)|(pAdapter->CommonCfg.CountryRegion);
5023
			if (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length))
5024
            {
5025
				Status = -EFAULT;
5026
            }
5027
            break;
5028
        case RT_OID_802_11_QUERY_DAT_HT_PHYMODE:
5029
            pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
5030
            if (pHTPhyMode)
5031
            {
5032
                pHTPhyMode->PhyMode = pAdapter->CommonCfg.PhyMode;
5033
    			pHTPhyMode->HtMode = (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.HTMODE;
5034
    			pHTPhyMode->BW = (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.BW;
5035
    			pHTPhyMode->MCS= (UCHAR)pAdapter->StaCfg.DesiredTransmitSetting.field.MCS;
5036
    			pHTPhyMode->SHORTGI= (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.ShortGI;
5037
    			pHTPhyMode->STBC= (UCHAR)pAdapter->CommonCfg.RegTransmitSetting.field.STBC;
5038
5039
                wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
5040
                if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
5041
    			{
5042
    				Status = -EFAULT;
5043
    			}
5044
    			DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
5045
    				pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
5046
    			DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAdapter->MacTab.Content[BSSID_WCID].HTPhyMode.word));
5047
            }
5048
            else
5049
            {
5050
                DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
5051
                Status = -EFAULT;
5052
            }
5053
            break;
5054
        case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT:
5055
			wrq->u.data.length = sizeof(UCHAR);
5056
            i = 0;
5057
			if (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length))
5058
            {
5059
				Status = -EFAULT;
5060
            }
5061
            DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \n", i));
5062
            break;
5063
5064
		case OID_802_11_BUILD_CHANNEL_EX:
5065
			{
5066
				UCHAR value;
5067
				DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BUILD_CHANNEL_EX \n"));
5068
				wrq->u.data.length = sizeof(UCHAR);
5069
				DBGPRINT(RT_DEBUG_TRACE, ("Doesn't support EXT_BUILD_CHANNEL_LIST.\n"));
5070
				value = 0;
5071
				Status = copy_to_user(wrq->u.data.pointer, &value, 1);
5072
				DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5073
			}
5074
			break;
5075
5076
		case OID_802_11_GET_CH_LIST:
5077
			{
5078
				PRT_CHANNEL_LIST_INFO pChListBuf;
5079
5080
				DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CH_LIST \n"));
5081
				if (pAdapter->ChannelListNum == 0)
5082
				{
5083
					wrq->u.data.length = 0;
5084
					break;
5085
				}
5086
5087
				pChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG);
5088
				if (pChListBuf == NULL)
5089
				{
5090
					wrq->u.data.length = 0;
5091
					break;
5092
				}
5093
5094
				pChListBuf->ChannelListNum = pAdapter->ChannelListNum;
5095
				for (i = 0; i < pChListBuf->ChannelListNum; i++)
5096
					pChListBuf->ChannelList[i] = pAdapter->ChannelList[i].Channel;
5097
5098
				wrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO);
5099
				Status = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO));
5100
				DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5101
5102
				if (pChListBuf)
5103
					kfree(pChListBuf);
5104
			}
5105
			break;
5106
5107
		case OID_802_11_GET_COUNTRY_CODE:
5108
			DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_COUNTRY_CODE \n"));
5109
			wrq->u.data.length = 2;
5110
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.CountryCode, 2);
5111
			DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5112
			break;
5113
5114
		case OID_802_11_GET_CHANNEL_GEOGRAPHY:
5115
			DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \n"));
5116
			wrq->u.data.length = 1;
5117
			Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Geography, 1);
5118
			DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5119
			break;
5120
5121
        default:
5122
            DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd));
5123
            Status = -EOPNOTSUPP;
5124
            break;
5125
    }
5126
    return Status;
5127
}
5128
5129
INT rt28xx_sta_ioctl(
2683
INT rt28xx_sta_ioctl(
5130
	IN	struct net_device	*net_dev,
2684
	IN	struct net_device	*net_dev,
5131
	IN	OUT	struct ifreq	*rq,
2685
	IN	OUT	struct ifreq	*rq,
5132
	IN	INT					cmd)
2686
	IN	INT					cmd)
5133
{
2687
{
5134
	POS_COOKIE			pObj;
2688
	RTMP_ADAPTER *pAd = net_dev->ml_priv;
5135
	VIRTUAL_ADAPTER		*pVirtualAd = NULL;
2689
	POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
5136
	RTMP_ADAPTER        *pAd = NULL;
5137
	struct iwreq        *wrq = (struct iwreq *) rq;
2690
	struct iwreq        *wrq = (struct iwreq *) rq;
5138
	BOOLEAN				StateMachineTouched = FALSE;
2691
	BOOLEAN				StateMachineTouched = FALSE;
5139
	INT					Status = NDIS_STATUS_SUCCESS;
2692
	INT					Status = NDIS_STATUS_SUCCESS;
5140
	USHORT				subcmd;
5141
5142
	if (net_dev->priv_flags == INT_MAIN)
5143
	{
5144
		pAd = net_dev->ml_priv;
5145
	}
5146
	else
5147
	{
5148
		pVirtualAd = net_dev->ml_priv;
5149
		pAd = pVirtualAd->RtmpDev->ml_priv;
5150
	}
5151
	pObj = (POS_COOKIE) pAd->OS_Cookie;
5152
5153
	if (pAd == NULL)
5154
	{
5155
		/* if 1st open fail, pAd will be free;
5156
		   So the net_dev->ml_priv will be NULL in 2rd open */
5157
		return -ENETDOWN;
5158
	}
5159
2693
5160
    //check if the interface is down
2694
    //check if the interface is down
5161
    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
2695
    if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
Lines 5300-5316 INT rt28xx_sta_ioctl( Link Here
5300
		case SIOCGIWRANGE:	//Get range of parameters
2834
		case SIOCGIWRANGE:	//Get range of parameters
5301
		case SIOCGIWRETRY:	//get retry limits and lifetime
2835
		case SIOCGIWRETRY:	//get retry limits and lifetime
5302
		case SIOCSIWRETRY:	//set retry limits and lifetime
2836
		case SIOCSIWRETRY:	//set retry limits and lifetime
5303
			Status = -EOPNOTSUPP;
5304
			break;
5305
		case RT_PRIV_IOCTL:
2837
		case RT_PRIV_IOCTL:
5306
#ifdef RT30xx
2838
		case RT_PRIV_IOCTL_EXT:
5307
        case RT_PRIV_IOCTL_EXT:
2839
			Status = -EOPNOTSUPP;
5308
#endif
5309
			subcmd = wrq->u.data.flags;
5310
			if( subcmd & OID_GET_SET_TOGGLE)
5311
				Status = RTMPSetInformation(pAd, rq, subcmd);
5312
			else
5313
				Status = RTMPQueryInformation(pAd, rq, subcmd);
5314
			break;
2840
			break;
5315
		case SIOCGIWPRIV:
2841
		case SIOCGIWPRIV:
5316
			if (wrq->u.data.pointer)
2842
			if (wrq->u.data.pointer)
Lines 5330-5348 INT rt28xx_sta_ioctl( Link Here
5330
		case RTPRIV_IOCTL_GSITESURVEY:
2856
		case RTPRIV_IOCTL_GSITESURVEY:
5331
			RTMPIoctlGetSiteSurvey(pAd, wrq);
2857
			RTMPIoctlGetSiteSurvey(pAd, wrq);
5332
		    break;
2858
		    break;
5333
#ifdef DBG
5334
		case RTPRIV_IOCTL_MAC:
5335
			RTMPIoctlMAC(pAd, wrq);
5336
			break;
5337
		case RTPRIV_IOCTL_E2P:
5338
			RTMPIoctlE2PROM(pAd, wrq);
5339
			break;
5340
#ifdef RT30xx
5341
		case RTPRIV_IOCTL_RF:
5342
			RTMPIoctlRF(pAd, wrq);
5343
			break;
5344
#endif // RT30xx //
5345
#endif // DBG //
5346
        case SIOCETHTOOL:
2859
        case SIOCETHTOOL:
5347
                break;
2860
                break;
5348
		default:
2861
		default:
Lines 6241-6832 INT Set_Wpa_Support( Link Here
6241
    return TRUE;
3754
    return TRUE;
6242
}
3755
}
6243
3756
6244
#ifdef DBG
6245
/*
6246
    ==========================================================================
6247
    Description:
6248
        Read / Write MAC
6249
    Arguments:
6250
        pAdapter                    Pointer to our adapter
6251
        wrq                         Pointer to the ioctl argument
6252
6253
    Return Value:
6254
        None
6255
6256
    Note:
6257
        Usage:
6258
               1.) iwpriv ra0 mac 0        ==> read MAC where Addr=0x0
6259
               2.) iwpriv ra0 mac 0=12     ==> write MAC where Addr=0x0, value=12
6260
    ==========================================================================
6261
*/
6262
VOID RTMPIoctlMAC(
6263
	IN	PRTMP_ADAPTER	pAdapter,
6264
	IN	struct iwreq	*wrq)
6265
{
6266
	CHAR				*this_char;
6267
	CHAR				*value;
6268
	INT					j = 0, k = 0;
6269
	CHAR				msg[1024];
6270
	CHAR				arg[255];
6271
	ULONG				macAddr = 0;
6272
	UCHAR				temp[16], temp2[16];
6273
	UINT32				macValue = 0;
6274
	INT					Status;
6275
#ifdef RT30xx
6276
	BOOLEAN				bIsPrintAllMAC = FALSE;
6277
#endif
6278
6279
	memset(msg, 0x00, 1024);
6280
	if (wrq->u.data.length > 1) //No parameters.
6281
	{
6282
	    Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);
6283
		sprintf(msg, "\n");
6284
6285
		//Parsing Read or Write
6286
	    this_char = arg;
6287
		if (!*this_char)
6288
			goto next;
6289
6290
		if ((value = rtstrchr(this_char, '=')) != NULL)
6291
			*value++ = 0;
6292
6293
		if (!value || !*value)
6294
		{ //Read
6295
			// Sanity check
6296
			if(strlen(this_char) > 4)
6297
				goto next;
6298
6299
			j = strlen(this_char);
6300
			while(j-- > 0)
6301
			{
6302
				if(this_char[j] > 'f' || this_char[j] < '0')
6303
					return;
6304
			}
6305
6306
			// Mac Addr
6307
			k = j = strlen(this_char);
6308
			while(j-- > 0)
6309
			{
6310
				this_char[4-k+j] = this_char[j];
6311
			}
6312
6313
			while(k < 4)
6314
				this_char[3-k++]='0';
6315
			this_char[4]='\0';
6316
6317
			if(strlen(this_char) == 4)
6318
			{
6319
				AtoH(this_char, temp, 2);
6320
				macAddr = *temp*256 + temp[1];
6321
				if (macAddr < 0xFFFF)
6322
				{
6323
					RTMP_IO_READ32(pAdapter, macAddr, &macValue);
6324
					DBGPRINT(RT_DEBUG_TRACE, ("MacAddr=%lx, MacValue=%x\n", macAddr, macValue));
6325
					sprintf(msg+strlen(msg), "[0x%08lX]:%08X  ", macAddr , macValue);
6326
				}
6327
				else
6328
#ifndef RT30xx
6329
				{//Invalid parametes, so default printk all bbp
6330
#endif
6331
#ifdef RT30xx
6332
				{//Invalid parametes, so default printk all mac
6333
					bIsPrintAllMAC = TRUE;
6334
#endif
6335
					goto next;
6336
				}
6337
			}
6338
		}
6339
		else
6340
		{ //Write
6341
			memcpy(&temp2, value, strlen(value));
6342
			temp2[strlen(value)] = '\0';
6343
6344
			// Sanity check
6345
			if((strlen(this_char) > 4) || strlen(temp2) > 8)
6346
				goto next;
6347
6348
			j = strlen(this_char);
6349
			while(j-- > 0)
6350
			{
6351
				if(this_char[j] > 'f' || this_char[j] < '0')
6352
					return;
6353
			}
6354
6355
			j = strlen(temp2);
6356
			while(j-- > 0)
6357
			{
6358
				if(temp2[j] > 'f' || temp2[j] < '0')
6359
					return;
6360
			}
6361
6362
			//MAC Addr
6363
			k = j = strlen(this_char);
6364
			while(j-- > 0)
6365
			{
6366
				this_char[4-k+j] = this_char[j];
6367
			}
6368
6369
			while(k < 4)
6370
				this_char[3-k++]='0';
6371
			this_char[4]='\0';
6372
6373
			//MAC value
6374
			k = j = strlen(temp2);
6375
			while(j-- > 0)
6376
			{
6377
				temp2[8-k+j] = temp2[j];
6378
			}
6379
6380
			while(k < 8)
6381
				temp2[7-k++]='0';
6382
			temp2[8]='\0';
6383
6384
			{
6385
				AtoH(this_char, temp, 2);
6386
				macAddr = *temp*256 + temp[1];
6387
6388
				AtoH(temp2, temp, 4);
6389
				macValue = *temp*256*256*256 + temp[1]*256*256 + temp[2]*256 + temp[3];
6390
6391
				// debug mode
6392
				if (macAddr == (HW_DEBUG_SETTING_BASE + 4))
6393
				{
6394
					// 0x2bf4: byte0 non-zero: enable R17 tuning, 0: disable R17 tuning
6395
                    if (macValue & 0x000000ff)
6396
                    {
6397
                        pAdapter->BbpTuning.bEnable = TRUE;
6398
                        DBGPRINT(RT_DEBUG_TRACE,("turn on R17 tuning\n"));
6399
                    }
6400
                    else
6401
                    {
6402
                        UCHAR R66;
6403
                        pAdapter->BbpTuning.bEnable = FALSE;
6404
                        R66 = 0x26 + GET_LNA_GAIN(pAdapter);
6405
						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R66, (0x26 + GET_LNA_GAIN(pAdapter)));
6406
                        DBGPRINT(RT_DEBUG_TRACE,("turn off R17 tuning, restore to 0x%02x\n", R66));
6407
                    }
6408
					return;
6409
				}
6410
6411
				DBGPRINT(RT_DEBUG_TRACE, ("MacAddr=%02lx, MacValue=0x%x\n", macAddr, macValue));
6412
6413
				RTMP_IO_WRITE32(pAdapter, macAddr, macValue);
6414
				sprintf(msg+strlen(msg), "[0x%08lX]:%08X  ", macAddr, macValue);
6415
			}
6416
		}
6417
	}
6418
#ifdef RT30xx
6419
	else
6420
		bIsPrintAllMAC = TRUE;
6421
#endif
6422
next:
6423
#ifdef RT30xx
6424
	if (bIsPrintAllMAC)
6425
	{
6426
		struct file		*file_w;
6427
		PCHAR			fileName = "MacDump.txt";
6428
		mm_segment_t	orig_fs;
6429
6430
		orig_fs = get_fs();
6431
		set_fs(KERNEL_DS);
6432
6433
		// open file
6434
		file_w = filp_open(fileName, O_WRONLY|O_CREAT, 0);
6435
		if (IS_ERR(file_w))
6436
		{
6437
			DBGPRINT(RT_DEBUG_TRACE, ("-->2) %s: Error %ld opening %s\n", __func__, -PTR_ERR(file_w), fileName));
6438
		}
6439
		else
6440
		{
6441
			if (file_w->f_op && file_w->f_op->write)
6442
			{
6443
				file_w->f_pos = 0;
6444
				macAddr = 0x1000;
6445
6446
				while (macAddr <= 0x1800)
6447
				{
6448
					RTMP_IO_READ32(pAdapter, macAddr, &macValue);
6449
					sprintf(msg, "%08lx = %08X\n", macAddr, macValue);
6450
6451
					// write data to file
6452
					file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);
6453
6454
					printk("%s", msg);
6455
					macAddr += 4;
6456
				}
6457
				sprintf(msg, "\nDump all MAC values to %s\n", fileName);
6458
			}
6459
			filp_close(file_w, NULL);
6460
		}
6461
		set_fs(orig_fs);
6462
	}
6463
#endif /* RT30xx */
6464
	if(strlen(msg) == 1)
6465
		sprintf(msg+strlen(msg), "===>Error command format!");
6466
6467
	// Copy the information into the user buffer
6468
	wrq->u.data.length = strlen(msg);
6469
	Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
6470
6471
	DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlMAC\n\n"));
6472
}
6473
6474
/*
6475
    ==========================================================================
6476
    Description:
6477
        Read / Write E2PROM
6478
    Arguments:
6479
        pAdapter                    Pointer to our adapter
6480
        wrq                         Pointer to the ioctl argument
6481
6482
    Return Value:
6483
        None
6484
6485
    Note:
6486
        Usage:
6487
               1.) iwpriv ra0 e2p 0     	==> read E2PROM where Addr=0x0
6488
               2.) iwpriv ra0 e2p 0=1234    ==> write E2PROM where Addr=0x0, value=1234
6489
    ==========================================================================
6490
*/
6491
VOID RTMPIoctlE2PROM(
6492
	IN	PRTMP_ADAPTER	pAdapter,
6493
	IN	struct iwreq	*wrq)
6494
{
6495
	CHAR				*this_char;
6496
	CHAR				*value;
6497
	INT					j = 0, k = 0;
6498
	CHAR				msg[1024];
6499
	CHAR				arg[255];
6500
	USHORT				eepAddr = 0;
6501
	UCHAR				temp[16], temp2[16];
6502
	USHORT				eepValue;
6503
	int					Status;
6504
#ifdef RT30xx
6505
	BOOLEAN				bIsPrintAllE2P = FALSE;
6506
#endif
6507
6508
	memset(msg, 0x00, 1024);
6509
	if (wrq->u.data.length > 1) //No parameters.
6510
	{
6511
	    Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);
6512
		sprintf(msg, "\n");
6513
6514
	    //Parsing Read or Write
6515
		this_char = arg;
6516
6517
6518
		if (!*this_char)
6519
			goto next;
6520
6521
		if ((value = rtstrchr(this_char, '=')) != NULL)
6522
			*value++ = 0;
6523
6524
		if (!value || !*value)
6525
		{ //Read
6526
6527
			// Sanity check
6528
			if(strlen(this_char) > 4)
6529
				goto next;
6530
6531
			j = strlen(this_char);
6532
			while(j-- > 0)
6533
			{
6534
				if(this_char[j] > 'f' || this_char[j] < '0')
6535
					return;
6536
			}
6537
6538
			// E2PROM addr
6539
			k = j = strlen(this_char);
6540
			while(j-- > 0)
6541
			{
6542
				this_char[4-k+j] = this_char[j];
6543
			}
6544
6545
			while(k < 4)
6546
				this_char[3-k++]='0';
6547
			this_char[4]='\0';
6548
6549
			if(strlen(this_char) == 4)
6550
			{
6551
				AtoH(this_char, temp, 2);
6552
				eepAddr = *temp*256 + temp[1];
6553
				if (eepAddr < 0xFFFF)
6554
				{
6555
					RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
6556
					sprintf(msg+strlen(msg), "[0x%04X]:0x%04X  ", eepAddr , eepValue);
6557
				}
6558
				else
6559
				{//Invalid parametes, so default printk all bbp
6560
#ifdef RT30xx
6561
					bIsPrintAllE2P = TRUE;
6562
#endif
6563
					goto next;
6564
				}
6565
			}
6566
		}
6567
		else
6568
		{ //Write
6569
			memcpy(&temp2, value, strlen(value));
6570
			temp2[strlen(value)] = '\0';
6571
6572
			// Sanity check
6573
			if((strlen(this_char) > 4) || strlen(temp2) > 8)
6574
				goto next;
6575
6576
			j = strlen(this_char);
6577
			while(j-- > 0)
6578
			{
6579
				if(this_char[j] > 'f' || this_char[j] < '0')
6580
					return;
6581
			}
6582
			j = strlen(temp2);
6583
			while(j-- > 0)
6584
			{
6585
				if(temp2[j] > 'f' || temp2[j] < '0')
6586
					return;
6587
			}
6588
6589
			//MAC Addr
6590
			k = j = strlen(this_char);
6591
			while(j-- > 0)
6592
			{
6593
				this_char[4-k+j] = this_char[j];
6594
			}
6595
6596
			while(k < 4)
6597
				this_char[3-k++]='0';
6598
			this_char[4]='\0';
6599
6600
			//MAC value
6601
			k = j = strlen(temp2);
6602
			while(j-- > 0)
6603
			{
6604
				temp2[4-k+j] = temp2[j];
6605
			}
6606
6607
			while(k < 4)
6608
				temp2[3-k++]='0';
6609
			temp2[4]='\0';
6610
6611
			AtoH(this_char, temp, 2);
6612
			eepAddr = *temp*256 + temp[1];
6613
6614
			AtoH(temp2, temp, 2);
6615
			eepValue = *temp*256 + temp[1];
6616
6617
			RT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue);
6618
			sprintf(msg+strlen(msg), "[0x%02X]:%02X  ", eepAddr, eepValue);
6619
		}
6620
	}
6621
#ifdef RT30xx
6622
	else
6623
		bIsPrintAllE2P = TRUE;
6624
#endif
6625
next:
6626
#ifdef RT30xx
6627
	if (bIsPrintAllE2P)
6628
	{
6629
		struct file		*file_w;
6630
		PCHAR			fileName = "EEPROMDump.txt";
6631
		mm_segment_t	orig_fs;
6632
6633
		orig_fs = get_fs();
6634
		set_fs(KERNEL_DS);
6635
6636
		// open file
6637
		file_w = filp_open(fileName, O_WRONLY|O_CREAT, 0);
6638
		if (IS_ERR(file_w))
6639
		{
6640
			DBGPRINT(RT_DEBUG_TRACE, ("-->2) %s: Error %ld opening %s\n", __func__, -PTR_ERR(file_w), fileName));
6641
		}
6642
		else
6643
		{
6644
			if (file_w->f_op && file_w->f_op->write)
6645
			{
6646
				file_w->f_pos = 0;
6647
				eepAddr = 0x00;
6648
6649
				while (eepAddr <= 0xFE)
6650
				{
6651
					RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
6652
					sprintf(msg, "%08x = %04x\n", eepAddr , eepValue);
6653
6654
					// write data to file
6655
					file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos);
6656
6657
					printk("%s", msg);
6658
					eepAddr += 2;
6659
				}
6660
				sprintf(msg, "\nDump all EEPROM values to %s\n", fileName);
6661
			}
6662
			filp_close(file_w, NULL);
6663
		}
6664
		set_fs(orig_fs);
6665
	}
6666
#endif /* RT30xx */
6667
	if(strlen(msg) == 1)
6668
		sprintf(msg+strlen(msg), "===>Error command format!");
6669
6670
6671
	// Copy the information into the user buffer
6672
	wrq->u.data.length = strlen(msg);
6673
	Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
6674
6675
	DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlE2PROM\n"));
6676
}
6677
#ifdef RT30xx
6678
/*
6679
    ==========================================================================
6680
    Description:
6681
        Read / Write RF register
6682
Arguments:
6683
    pAdapter                    Pointer to our adapter
6684
    wrq                         Pointer to the ioctl argument
6685
6686
    Return Value:
6687
        None
6688
6689
    Note:
6690
        Usage:
6691
               1.) iwpriv ra0 rf                ==> read all RF registers
6692
               2.) iwpriv ra0 rf 1              ==> read RF where RegID=1
6693
               3.) iwpriv ra0 rf 1=10		    ==> write RF R1=0x10
6694
    ==========================================================================
6695
*/
6696
VOID RTMPIoctlRF(
6697
	IN	PRTMP_ADAPTER	pAdapter,
6698
	IN	struct iwreq	*wrq)
6699
{
6700
	CHAR				*this_char;
6701
	CHAR				*value;
6702
	UCHAR				regRF = 0;
6703
	CHAR				msg[2048];
6704
	CHAR				arg[255];
6705
	INT					rfId;
6706
	LONG				rfValue;
6707
	int					Status;
6708
	BOOLEAN				bIsPrintAllRF = FALSE;
6709
6710
6711
	memset(msg, 0x00, 2048);
6712
	if (wrq->u.data.length > 1) //No parameters.
6713
	{
6714
	    Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length);
6715
		sprintf(msg, "\n");
6716
6717
	    //Parsing Read or Write
6718
		this_char = arg;
6719
		if (!*this_char)
6720
			goto next;
6721
6722
		if ((value = strchr(this_char, '=')) != NULL)
6723
			*value++ = 0;
6724
6725
		if (!value || !*value)
6726
		{ //Read
6727
			if (sscanf(this_char, "%d", &(rfId)) == 1)
6728
			{
6729
				if (rfId <= 31)
6730
				{
6731
					// In RT2860 ATE mode, we do not load 8051 firmware.
6732
                                            //We must access RF directly.
6733
                    // For RT2870 ATE mode, ATE_RF_IO_WRITE8(/READ8)_BY_REG_ID are redefined.
6734
					// according to Andy, Gary, David require.
6735
					// the command rf shall read rf register directly for dubug.
6736
					// BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
6737
					RT30xxReadRFRegister(pAdapter, rfId, &regRF);
6738
6739
					sprintf(msg+strlen(msg), "R%02d[0x%02x]:%02X  ", rfId, rfId*2, regRF);
6740
				}
6741
				else
6742
				{//Invalid parametes, so default printk all RF
6743
					bIsPrintAllRF = TRUE;
6744
					goto next;
6745
				}
6746
			}
6747
			else
6748
			{ //Invalid parametes, so default printk all RF
6749
				bIsPrintAllRF = TRUE;
6750
				goto next;
6751
			}
6752
		}
6753
		else
6754
		{ //Write
6755
			if ((sscanf(this_char, "%d", &(rfId)) == 1) && (sscanf(value, "%lx", &(rfValue)) == 1))
6756
			{
6757
				if (rfId <= 31)
6758
				{
6759
					// In RT2860 ATE mode, we do not load 8051 firmware.
6760
					// We should access RF registers directly.
6761
                    // For RT2870 ATE mode, ATE_RF_IO_WRITE8/READ8_BY_REG_ID are redefined.
6762
						{
6763
							// according to Andy, Gary, David require.
6764
							// the command RF shall read/write RF register directly for dubug.
6765
							//BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
6766
					                //BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue);
6767
							RT30xxReadRFRegister(pAdapter, rfId, &regRF);
6768
							RT30xxWriteRFRegister(pAdapter, (UCHAR)rfId,(UCHAR) rfValue);
6769
					                //Read it back for showing
6770
							//BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, &regBBP);
6771
							RT30xxReadRFRegister(pAdapter, rfId, &regRF);
6772
					                sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X\n", rfId, rfId*2, regRF);
6773
				                }
6774
				}
6775
				else
6776
				{//Invalid parametes, so default printk all RF
6777
					bIsPrintAllRF = TRUE;
6778
				}
6779
			}
6780
			else
6781
			{ //Invalid parametes, so default printk all RF
6782
				bIsPrintAllRF = TRUE;
6783
			}
6784
		}
6785
	}
6786
	else
6787
		bIsPrintAllRF = TRUE;
6788
next:
6789
	if (bIsPrintAllRF)
6790
	{
6791
		memset(msg, 0x00, 2048);
6792
		sprintf(msg, "\n");
6793
		for (rfId = 0; rfId <= 31; rfId++)
6794
		{
6795
			// according to Andy, Gary, David require.
6796
			// the command RF shall read/write RF register directly for dubug.
6797
			RT30xxReadRFRegister(pAdapter, rfId, &regRF);
6798
			sprintf(msg+strlen(msg), "%03d = %02X\n", rfId, regRF);
6799
		}
6800
		// Copy the information into the user buffer
6801
		DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(msg)));
6802
		wrq->u.data.length = strlen(msg);
6803
		if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))
6804
		{
6805
			DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __func__));
6806
		}
6807
	}
6808
	else
6809
	{
6810
		if(strlen(msg) == 1)
6811
			sprintf(msg+strlen(msg), "===>Error command format!");
6812
6813
		DBGPRINT(RT_DEBUG_TRACE, ("copy to user [msg=%s]\n", msg));
6814
		// Copy the information into the user buffer
6815
		DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg) =%d\n", (UINT32)strlen(msg)));
6816
6817
		// Copy the information into the user buffer
6818
		wrq->u.data.length = strlen(msg);
6819
		Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
6820
	}
6821
6822
	DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n\n"));
6823
}
6824
#endif // RT30xx //
6825
#endif // DBG //
6826
6827
6828
6829
6830
INT Set_TGnWifiTest_Proc(
3757
INT Set_TGnWifiTest_Proc(
6831
    IN  PRTMP_ADAPTER   pAd,
3758
    IN  PRTMP_ADAPTER   pAd,
6832
    IN  PUCHAR          arg)
3759
    IN  PUCHAR          arg)
Lines 6867-6914 INT Set_ShortRetryLimit_Proc( Link Here
6867
	DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ShortRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word));
3794
	DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ShortRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word));
6868
	return TRUE;
3795
	return TRUE;
6869
}
3796
}
6870
6871
#if !defined(RT2860) && !defined(RT30xx)
6872
INT	Show_Adhoc_MacTable_Proc(
6873
	IN	PRTMP_ADAPTER	pAd,
6874
	IN	PCHAR			extra)
6875
{
6876
	INT i;
6877
6878
	sprintf(extra, "\n");
6879
6880
	sprintf(extra + strlen(extra), "HT Operating Mode : %d\n", pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode);
6881
6882
	sprintf(extra + strlen(extra), "\n%-19s%-4s%-4s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\n",
6883
			"MAC", "AID", "BSS", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC");
6884
6885
	for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
6886
	{
6887
		PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];
6888
6889
		if (strlen(extra) > (IW_PRIV_SIZE_MASK - 30))
6890
		    break;
6891
		if ((pEntry->ValidAsCLI || pEntry->ValidAsApCli) && (pEntry->Sst == SST_ASSOC))
6892
		{
6893
			sprintf(extra + strlen(extra), "%02X:%02X:%02X:%02X:%02X:%02X  ",
6894
				pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
6895
				pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);
6896
			sprintf(extra + strlen(extra), "%-4d", (int)pEntry->Aid);
6897
			sprintf(extra + strlen(extra), "%-4d", (int)pEntry->apidx);
6898
			sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi0);
6899
			sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi1);
6900
			sprintf(extra + strlen(extra), "%-7d", pEntry->RssiSample.AvgRssi2);
6901
			sprintf(extra + strlen(extra), "%-10s", GetPhyMode(pEntry->HTPhyMode.field.MODE));
6902
			sprintf(extra + strlen(extra), "%-6s", GetBW(pEntry->HTPhyMode.field.BW));
6903
			sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.MCS);
6904
			sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.ShortGI);
6905
			sprintf(extra + strlen(extra), "%-6d", pEntry->HTPhyMode.field.STBC);
6906
			sprintf(extra + strlen(extra), "%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, pEntry->DebugTxCount,
6907
						(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0);
6908
			sprintf(extra, "%s\n", extra);
6909
		}
6910
	}
6911
6912
	return TRUE;
6913
}
6914
#endif /* RT2870 */
(-)a/drivers/staging/rt2860/wpa.h (-3 lines)
Lines 90-98 Link Here
90
#define TKIP_AP_RXMICK_OFFSET		(TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK)
90
#define TKIP_AP_RXMICK_OFFSET		(TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK)
91
#define TKIP_GTK_LENGTH				((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
91
#define TKIP_GTK_LENGTH				((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
92
#define LEN_PTK						((LEN_EAP_KEY)+(LEN_TKIP_KEY))
92
#define LEN_PTK						((LEN_EAP_KEY)+(LEN_TKIP_KEY))
93
#ifndef RT30xx
94
#define MIN_LEN_OF_GTK				5
95
#endif
96
93
97
// RSN IE Length definition
94
// RSN IE Length definition
98
#define MAX_LEN_OF_RSNIE         	90
95
#define MAX_LEN_OF_RSNIE         	90

Return to bug 540589