2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25 *************************************************************************
28 #include "rt_config.h"
31 UCHAR TemplateFrame[24] = {0x08/* Data type */,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xAA,0xBB,0x12,0x34,0x56,0x00,0x11,0x22,0xAA,0xBB,0xCC,0x00,0x00}; // 802.11 MAC Header, Type:Data, Length:24bytes
32 extern RTMP_RF_REGS RF2850RegTable[];
33 extern UCHAR NUM_OF_2850_CHNL;
36 extern UCHAR EpToQueue[];
37 extern VOID RTUSBRejectPendingPackets( IN PRTMP_ADAPTER pAd);
40 static CHAR CCKRateTable[] = {0, 1, 2, 3, 8, 9, 10, 11, -1}; /* CCK Mode. */
41 static CHAR OFDMRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, -1}; /* OFDM Mode. */
42 static CHAR HTMIXRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}; /* HT Mix Mode. */
45 IN PRTMP_ADAPTER pAd);
48 IN PRTMP_ADAPTER pAd);
50 static VOID RtmpDmaEnable(
54 static VOID BbpSoftReset(
55 IN PRTMP_ADAPTER pAd);
57 static VOID RtmpRfIoWrite(
58 IN PRTMP_ADAPTER pAd);
60 static INT ATESetUpFrame(
64 static INT ATETxPwrHandler(
68 static INT ATECmdHandler(
72 static int CheckMCSValid(
78 static VOID ATEWriteTxInfo(
80 IN PTXINFO_STRUC pTxInfo,
81 IN USHORT USBDMApktLen,
87 static VOID ATEWriteTxWI(
91 IN BOOLEAN InsTimestamp,
94 IN BOOLEAN NSeq, // HW new a sequence.
102 IN HTTRANSMIT_SETTING Transmit);
106 static VOID SetJapanFilter(
107 IN PRTMP_ADAPTER pAd);
109 /*=========================end of prototype=========================*/
113 static INT TxDmaBusy(
114 IN PRTMP_ADAPTER pAd)
117 USB_DMA_CFG_STRUC UsbCfg;
119 RTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word); // disable DMA
120 if (UsbCfg.field.TxBusy)
128 static INT RxDmaBusy(
129 IN PRTMP_ADAPTER pAd)
132 USB_DMA_CFG_STRUC UsbCfg;
134 RTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word); // disable DMA
135 if (UsbCfg.field.RxBusy)
143 static VOID RtmpDmaEnable(
144 IN PRTMP_ADAPTER pAd,
149 USB_DMA_CFG_STRUC UsbCfg;
151 value = Enable > 0 ? 1 : 0;
153 // check DMA is in busy mode.
155 while (TxDmaBusy(pAd) || RxDmaBusy(pAd))
162 //Why not to clear USB DMA TX path first ???
163 RTMP_IO_READ32(pAd, USB_DMA_CFG, &UsbCfg.word); // disable DMA
164 UsbCfg.field.TxBulkEn = value;
165 UsbCfg.field.RxBulkEn = value;
166 RTMP_IO_WRITE32(pAd, USB_DMA_CFG, UsbCfg.word); // abort all TX rings
173 static VOID BbpSoftReset(
174 IN PRTMP_ADAPTER pAd)
178 // Soft reset, set BBP R21 bit0=1->0
179 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData);
180 BbpData |= 0x00000001; //set bit0=1
181 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData);
183 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData);
184 BbpData &= ~(0x00000001); //set bit0=0
185 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData);
190 static VOID RtmpRfIoWrite(
191 IN PRTMP_ADAPTER pAd)
193 // Set RF value 1's set R3[bit2] = [0]
194 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
195 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
196 RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
197 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
201 // Set RF value 2's set R3[bit2] = [1]
202 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
203 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
204 RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04));
205 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
209 // Set RF value 3's set R3[bit2] = [0]
210 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
211 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
212 RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
213 RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
218 static int CheckMCSValid(
228 pRateTab = CCKRateTable;
231 pRateTab = OFDMRateTable;
235 pRateTab = HTMIXRateTable;
238 ATEDBGPRINT(RT_DEBUG_ERROR, ("unrecognizable Tx Mode %d\n", Mode));
244 while(pRateTab[i] != -1)
246 if (pRateTab[i] == Mcs)
255 static INT ATETxPwrHandler(
256 IN PRTMP_ADAPTER pAd,
262 BOOLEAN bPowerReduce = FALSE;
264 #ifdef RALINK_28xx_QA
265 if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE))
267 /* When QA is used for Tx, pAd->ate.TxPower0/1 and real tx power
268 ** are not synchronized.
271 pAd->ate.TxPower0 = pAd->LatchRfRegs.xxx;
272 pAd->ate.TxPower1 = pAd->LatchRfRegs.xxx;
277 #endif // RALINK_28xx_QA //
279 TxPower = index == 0 ? pAd->ate.TxPower0 : pAd->ate.TxPower1;
281 if (pAd->ate.Channel <= 14)
286 // R3, R4 can't large than 31 (0x24), 31 ~ 36 used by BBP 94
290 Bbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31);
292 else if (TxPower < 0)
295 // R3, R4 can't less than 0, -1 ~ -6 used by BBP 94
299 Bbp94 = BBPR94_DEFAULT + TxPower;
305 Bbp94 = BBPR94_DEFAULT;
308 ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%ld, BBP_R94=%d)\n", __func__, TxPower, R, Bbp94));
315 // R3, R4 can't large than 15 (0x0F)
319 else if (TxPower < 0)
322 // R3, R4 can't less than 0
325 ASSERT((TxPower >= -7));
326 R = (ULONG)(TxPower + 7);
335 ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%lu)\n", __func__, TxPower, R));
338 if (pAd->ate.Channel <= 14)
342 R = R << 9; // shift TX power control to correct RF(R3) register bit position
343 R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);
344 pAd->LatchRfRegs.R3 = R;
348 R = R << 6; // shift TX power control to correct RF(R4) register bit position
349 R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);
350 pAd->LatchRfRegs.R4 = R;
355 if (bPowerReduce == FALSE)
359 R = (R << 10) | (1 << 9); // shift TX power control to correct RF(R3) register bit position
360 R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);
361 pAd->LatchRfRegs.R3 = R;
365 R = (R << 7) | (1 << 6); // shift TX power control to correct RF(R4) register bit position
366 R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);
367 pAd->LatchRfRegs.R4 = R;
374 R = (R << 10); // shift TX power control to correct RF(R3) register bit position
375 R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);
377 /* Clear bit 9 of R3 to reduce 7dB. */
378 pAd->LatchRfRegs.R3 = (R & (~(1 << 9)));
382 R = (R << 7); // shift TX power control to correct RF(R4) register bit position
383 R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);
385 /* Clear bit 6 of R4 to reduce 7dB. */
386 pAd->LatchRfRegs.R4 = (R & (~(1 << 6)));
397 static INT ATETxPwrHandler(
398 IN PRTMP_ADAPTER pAd,
405 #ifdef RALINK_28xx_QA
406 if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE))
408 // TODO: how to get current TxPower0/1 from pAd->LatchRfRegs ?
409 /* When QA is used for Tx, pAd->ate.TxPower0/1 and real tx power
410 ** are not synchronized.
413 pAd->ate.TxPower0 = pAd->LatchRfRegs.xxx;
414 pAd->ate.TxPower1 = pAd->LatchRfRegs.xxx;
419 #endif // RALINK_28xx_QA //
421 TxPower = index == 0 ? pAd->ate.TxPower0 : pAd->ate.TxPower1;
426 // R3, R4 can't large than 36 (0x24), 31 ~ 36 used by BBP 94
430 Bbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31);
432 else if (TxPower < 0)
435 // R3, R4 can't less than 0, -1 ~ -6 used by BBP 94
439 Bbp94 = BBPR94_DEFAULT + TxPower;
445 Bbp94 = BBPR94_DEFAULT;
448 ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R3=%ld, BBP_R94=%d)\n", __func__, TxPower, R, Bbp94));
450 if (pAd->ate.Channel <= 14)
454 R = R << 9; // shift TX power control to correct RF(R3) register bit position
455 R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);
456 pAd->LatchRfRegs.R3 = R;
460 R = R << 6; // shift TX power control to correct RF(R4) register bit position
461 R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);
462 pAd->LatchRfRegs.R4 = R;
469 R = (R << 10) | (1 << 9); // shift TX power control to correct RF(R3) register bit position
470 R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff);
471 pAd->LatchRfRegs.R3 = R;
475 R = (R << 7) | (1 << 6); // shift TX power control to correct RF(R4) register bit position
476 R |= (pAd->LatchRfRegs.R4 & 0xfffff83f);
477 pAd->LatchRfRegs.R4 = R;
488 ==========================================================================
490 Set ATE operation mode to
491 0. ATESTART = Start ATE Mode
492 1. ATESTOP = Stop ATE Mode
493 2. TXCONT = Continuous Transmit
494 3. TXCARR = Transmit Carrier
495 4. TXFRAME = Transmit Frames
496 5. RXFRAME = Receive Frames
497 #ifdef RALINK_28xx_QA
498 6. TXSTOP = Stop Any Type of Transmition
499 7. RXSTOP = Stop Receiving Frames
500 #endif // RALINK_28xx_QA //
502 TRUE if all parameters are OK, FALSE otherwise
503 ==========================================================================
507 /*=======================End of RT2860=======================*/
510 /*======================Start of RT2870======================*/
515 static INT ATECmdHandler(
516 IN PRTMP_ADAPTER pAd,
523 //NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
528 ATEDBGPRINT(RT_DEBUG_TRACE, ("===> ATECmdHandler()\n"));
529 ATEAsicSwitchChannel(pAd);
530 /* AsicLockChannel() is empty function so far in fact */
531 AsicLockChannel(pAd, pAd->ate.Channel);
535 // Default value in BBP R22 is 0x0.
538 /* Enter ATE mode and set Tx/Rx Idle */
539 if (!strcmp(arg, "ATESTART"))
541 #ifdef CONFIG_STA_SUPPORT
543 #endif // CONFIG_STA_SUPPORT //
544 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: ATESTART\n"));
546 netif_stop_queue(pAd->net_dev);
548 atemode = pAd->ate.Mode;
549 pAd->ate.Mode = ATE_START;
550 // pAd->ate.TxDoneCount = pAd->ate.TxCount;
552 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
554 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
556 // Disable auto responder
557 RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp);
558 temp = temp & 0xFFFFFFFE;
559 RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);
561 // read MAC_SYS_CTRL and backup MAC_SYS_CTRL value.
562 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
563 // clean bit4 to stop continuous Tx production test.
564 MacData &= 0xFFFFFFEF;
565 // Stop continuous TX production test.
566 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);//disable or cancel pending irp first ???
568 if (atemode & ATE_TXCARR)
570 // No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0
571 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
572 BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0]
573 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
575 else if (atemode & ATE_TXCARRSUPP)
577 // No Cont. TX set BBP R22 bit7=0
578 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
579 BbpData &= ~(1 << 7); //set bit7=0
580 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
582 // No Carrier Suppression set BBP R24 bit0=0
583 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &BbpData);
584 BbpData &= 0xFFFFFFFE; //clear bit0
585 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData);
587 // We should free some resource which allocate when ATE_TXFRAME , ATE_STOP, and ATE_TXCONT.
588 // TODO:Should we free some resource which was allocated when LoopBack and ATE_STOP ?
589 else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP))
591 if (atemode & ATE_TXCONT)
593 // Not Cont. TX anymore, so set BBP R22 bit7=0
594 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
595 BbpData &= ~(1 << 7); //set bit7=0
596 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
599 RtmpDmaEnable(pAd, 0);
602 // It seems nothing to free,
603 // because we didn't allocate any resource when we entered ATE_TXFRAME mode latestly.
607 RtmpDmaEnable(pAd, 1);
610 RTUSBRejectPendingPackets(pAd);
611 RTUSBCleanUpDataBulkOutQueue(pAd);
613 #ifdef CONFIG_STA_SUPPORT
615 // It will be called in MlmeSuspend().
617 // Cancel pending timers
618 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
619 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
620 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
621 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
622 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
623 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
624 #endif // CONFIG_STA_SUPPORT //
626 //RTUSBCleanUpMLMEWaitQueue(pAd); /* not used in RT28xx */
627 RTUSBCleanUpMLMEBulkOutQueue(pAd);
629 // Sometimes kernel will hang on, so we avoid calling MlmeSuspend().
630 // MlmeSuspend(pAd, TRUE);
631 //RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);
634 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
636 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
639 RtmpDmaEnable(pAd, 0);
642 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
644 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
646 // Make sure there are no pending bulk in/out IRPs before we go on.
647 /*=========================================================================*/
648 /* pAd->PendingRx is not of type atomic_t anymore in 28xx */
649 // while ((atomic_read(&pAd->PendingRx) > 0)) //pAd->BulkFlags != 0 wait bulk out finish
650 while ((pAd->PendingRx > 0)) //pAd->BulkFlags != 0 wait bulk out finish
653 ATE_RTUSBCancelPendingBulkInIRP(pAd);
655 NdisInterlockedDecrement(&pAd->PendingRx);
657 /* delay 0.5 seconds */
658 RTMPusecDelay(500000);
661 /* peter : why don't we have to get BulkOutLock first ? */
662 while (((pAd->BulkOutPending[0] == TRUE) ||
663 (pAd->BulkOutPending[1] == TRUE) ||
664 (pAd->BulkOutPending[2] == TRUE) ||
665 (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0)) //pAd->BulkFlags != 0 wait bulk out finish
669 /* pAd->BulkOutPending[y] will be set to FALSE in RTUSBCancelPendingBulkOutIRP(pAd) */
670 RTUSBCancelPendingBulkOutIRP(pAd);
673 /* we have enough time delay in RTUSBCancelPendingBulkOutIRP(pAd)
674 ** so this is not necessary
676 // RTMPusecDelay(500000);
679 /* pAd->PendingRx is not of type atomic_t anymore in 28xx */
680 // ASSERT(atomic_read(&pAd->PendingRx) == 0);
681 ASSERT(pAd->PendingRx == 0);
682 /*=========================================================================*/
684 // reset Rx statistics.
685 pAd->ate.LastSNR0 = 0;
686 pAd->ate.LastSNR1 = 0;
687 pAd->ate.LastRssi0 = 0;
688 pAd->ate.LastRssi1 = 0;
689 pAd->ate.LastRssi2 = 0;
690 pAd->ate.AvgRssi0 = 0;
691 pAd->ate.AvgRssi1 = 0;
692 pAd->ate.AvgRssi2 = 0;
693 pAd->ate.AvgRssi0X8 = 0;
694 pAd->ate.AvgRssi1X8 = 0;
695 pAd->ate.AvgRssi2X8 = 0;
696 pAd->ate.NumOfAvgRssiSample = 0;
698 #ifdef RALINK_28xx_QA
700 pAd->ate.bQATxStart = FALSE;
701 pAd->ate.bQARxStart = FALSE;
706 pAd->ate.OtherData = 0;
708 pAd->ate.OtherCount = 0;
722 pAd->ate.TxDoneCount = 0;
723 pAd->ate.TxStatus = 0; // task Tx status // 0 --> task is idle, 1 --> task is running
724 #endif // RALINK_28xx_QA //
730 #ifdef CONFIG_STA_SUPPORT
731 AsicDisableSync(pAd);
734 ** If we skip "LinkDown()", we should disable protection
735 ** to prevent from sending out RTS or CTS-to-self.
737 ATEDisableAsicProtect(pAd);
738 RTMPStationStop(pAd);
739 #endif // CONFIG_STA_SUPPORT //
741 // Default value in BBP R22 is 0x0.
743 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
745 // Clean bit4 to stop continuous Tx production test.
746 MacData &= 0xFFFFFFEF;
747 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
748 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
749 //Clean ATE Bulk in/out counter and continue setup
750 InterlockedExchange(&pAd->BulkOutRemained, 0);
752 /* NdisAcquireSpinLock()/NdisReleaseSpinLock() need only one argument in RT28xx */
753 NdisAcquireSpinLock(&pAd->GenericLock);
754 pAd->ContinBulkOut = FALSE;
755 pAd->ContinBulkIn = FALSE;
756 NdisReleaseSpinLock(&pAd->GenericLock);
758 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
760 else if (!strcmp(arg, "ATESTOP"))
762 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ATESTOP ===>\n"));
764 // Default value in BBP R22 is 0x0.
766 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);//0820
767 // Clean bit4 to stop continuous Tx production test.
768 MacData &= 0xFFFFFFEF;
769 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
770 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); // recover the MAC_SYS_CTRL register back.
773 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
775 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
779 ** Q : How to do the following I/O if Tx, Rx DMA is aborted ?
780 ** Ans : Bulk endpoints are aborted, while the control endpoint is not.
782 RtmpDmaEnable(pAd, 0);
785 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
787 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
789 /* Make sure there are no pending bulk in/out IRPs before we go on. */
790 /*=========================================================================*/
791 // while ((atomic_read(&pAd->PendingRx) > 0)) //pAd->BulkFlags != 0 wait bulk out finish
792 while (pAd->PendingRx > 0)
795 ATE_RTUSBCancelPendingBulkInIRP(pAd);
797 // NdisInterlockedDecrement(&pAd->PendingRx);
800 RTMPusecDelay(500000);
803 while (((pAd->BulkOutPending[0] == TRUE) ||
804 (pAd->BulkOutPending[1] == TRUE) ||
805 (pAd->BulkOutPending[2] == TRUE) ||
806 (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0)) //pAd->BulkFlags != 0 wait bulk out finish
810 RTUSBCancelPendingBulkOutIRP(pAd);
813 RTMPusecDelay(500000);
816 // ASSERT(atomic_read(&pAd->PendingRx) == 0);
817 ASSERT(pAd->PendingRx == 0);
818 /*=========================================================================*/
820 /*=========================================================================*/
821 // InterlockedExchange(&pAd->PendingRx, 0);
823 pAd->NextRxBulkInReadIndex = 0; // Next Rx Read index
824 pAd->NextRxBulkInIndex = RX_RING_SIZE - 1; // Rx Bulk pointer
825 pAd->NextRxBulkInPosition = 0;
826 for (i = 0; i < (RX_RING_SIZE); i++)
828 PRX_CONTEXT pRxContext = &(pAd->RxContext[i]);
829 NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);
830 /* peter : why don't we have to get BulkInLock first ? */
831 pRxContext->pAd = pAd;
832 pRxContext->pIrp = NULL;
834 pRxContext->BulkInOffset = 0;
835 pRxContext->bRxHandling = FALSE;
837 pRxContext->InUse = FALSE;
838 pRxContext->IRPPending = FALSE;
839 pRxContext->Readable = FALSE;
840 // pRxContext->ReorderInUse = FALSE;
841 // pRxContext->ReadPosOffset = 0;
844 /*=========================================================================*/
846 /*=========================================================================*/
849 RTUSBCancelPendingBulkOutIRP(pAd);
852 /*=========================================================================*/
853 // Enable auto responder.
854 RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp);
855 temp = temp | (0x01);
856 RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp);
858 /*================================================*/
859 AsicEnableBssSync(pAd);
862 /* In 2870 chipset, ATE_BBP_IO_READ8_BY_REG_ID() == RTMP_BBP_IO_READ8_BY_REG_ID() */
863 /* Both rt2870ap and rt2870sta use BbpSoftReset(pAd) to do BBP soft reset */
865 /*================================================*/
867 #ifdef CONFIG_STA_SUPPORT
868 // Set all state machines back IDLE
869 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
870 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
871 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
872 pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;
873 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
874 pAd->Mlme.ActMachine.CurrState = ACT_IDLE;
875 #endif // CONFIG_STA_SUPPORT //
878 // ===> refer to MlmeRestartStateMachine().
879 // When we entered ATE_START mode, PeriodicTimer was not cancelled.
880 // So we don't have to set it here.
882 //RTMPSetTimer(pAd, &pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);
884 ASSERT(pAd->CommonCfg.Channel != 0);
886 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
887 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
890 #ifdef CONFIG_STA_SUPPORT
891 RTMPStationStart(pAd);
892 #endif // CONFIG_STA_SUPPORT //
895 // These two steps have been done when entering ATE_STOP mode.
898 RTUSBWriteBBPRegister(pAd, BBP_R22, BbpData);
899 RTUSBWriteMACRegister(pAd, MAC_SYS_CTRL, MacData);
901 // Clean ATE Bulk in/out counter and continue setup.
902 InterlockedExchange(&pAd->BulkOutRemained, 0);
903 NdisAcquireSpinLock(&pAd->GenericLock);
904 pAd->ContinBulkOut = FALSE;
905 pAd->ContinBulkIn = FALSE;
906 NdisReleaseSpinLock(&pAd->GenericLock);
908 /* Wait 50ms to prevent next URB to bulkout during HW reset. */
909 /* todo : remove this if not necessary */
912 pAd->ate.Mode = ATE_STOP;
915 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
917 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
919 /*=========================================================================*/
920 /* restore RX_FILTR_CFG */
921 #ifdef CONFIG_STA_SUPPORT
922 /* restore RX_FILTR_CFG in order that QA maybe set it to 0x3 */
923 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL);
924 #endif // CONFIG_STA_SUPPORT //
925 /*=========================================================================*/
927 // Enable Tx, RX DMA.
928 RtmpDmaEnable(pAd, 1);
931 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
933 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
935 // Wait 10ms to wait all of the bulk-in URBs to complete.
936 /* todo : remove this if not necessary */
939 // Everything is ready to start normal Tx/Rx.
940 RTUSBBulkReceive(pAd);
941 netif_start_queue(pAd->net_dev);
943 ATEDBGPRINT(RT_DEBUG_TRACE, ("<=== ATE : ATESTOP \n"));
945 else if (!strcmp(arg, "TXCARR")) // Tx Carrier
947 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCARR\n"));
948 pAd->ate.Mode |= ATE_TXCARR;
951 // May be we need not to do this, because these have been done in ATE_START mode ???
952 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
954 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
956 // QA has done the following steps if it is used.
957 if (pAd->ate.bQATxStart == FALSE)
962 // Carrier Test set BBP R22 bit7=1, bit6=1, bit[5~0]=0x01
963 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
964 BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0]
965 BbpData |= 0x000000C1; //set bit7=1, bit6=1, bit[5~0]=0x01
966 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
968 // set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1
969 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
970 Value = Value | 0x00000010;
971 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
974 else if (!strcmp(arg, "TXCONT")) // Tx Continue
976 if (pAd->ate.bQATxStart == TRUE)
978 /* set MAC_SYS_CTRL(0x1004) bit4(Continuous Tx Production Test)
979 and bit2(MAC TX enable) back to zero. */
980 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
981 MacData &= 0xFFFFFFEB;
982 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
984 // set BBP R22 bit7=0
985 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
986 BbpData &= 0xFFFFFF7F; //set bit7=0
987 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
991 ** Step 1: Send 50 packets first then wait for a moment.
992 ** Step 2: Send more 50 packet then start continue mode.
994 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXCONT\n"));
995 // Step 1: send 50 packets first.
996 pAd->ate.Mode |= ATE_TXCONT;
997 pAd->ate.TxCount = 50;
998 pAd->ate.TxDoneCount = 0;
1003 // Abort Tx, RX DMA.
1004 RtmpDmaEnable(pAd, 0);
1007 /* Only needed if we have to send some normal frames. */
1008 SetJapanFilter(pAd);
1010 // Setup frame format.
1011 ATESetUpFrame(pAd, 0);
1014 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1016 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1019 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1021 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1023 // Start Tx, RX DMA.
1024 RtmpDmaEnable(pAd, 1);
1026 InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount);
1028 #ifdef RALINK_28xx_QA
1029 if (pAd->ate.bQATxStart == TRUE)
1031 pAd->ate.TxStatus = 1;
1032 //pAd->ate.Repeat = 0;
1034 #endif // RALINK_28xx_QA //
1036 NdisAcquireSpinLock(&pAd->GenericLock);//0820
1037 pAd->ContinBulkOut = FALSE;
1038 NdisReleaseSpinLock(&pAd->GenericLock);
1040 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
1043 RTUSBKickBulkOut(pAd);
1045 /* To make sure all the 50 frames have been bulk out before executing step 2 */
1046 while (atomic_read(&pAd->BulkOutRemained) > 0)
1048 RTMPusecDelay(5000);
1051 // Step 2: send more 50 packets then start continue mode.
1052 // Abort Tx, RX DMA.
1053 RtmpDmaEnable(pAd, 0);
1055 // Cont. TX set BBP R22 bit7=1
1056 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
1057 BbpData |= 0x00000080; //set bit7=1
1058 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1060 pAd->ate.TxCount = 50;
1061 pAd->ate.TxDoneCount = 0;
1063 SetJapanFilter(pAd);
1065 // Setup frame format.
1066 ATESetUpFrame(pAd, 0);
1069 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1071 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1074 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1077 // Start Tx, RX DMA.
1078 RtmpDmaEnable(pAd, 1);
1080 InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount);
1082 #ifdef RALINK_28xx_QA
1083 if (pAd->ate.bQATxStart == TRUE)
1085 pAd->ate.TxStatus = 1;
1086 //pAd->ate.Repeat = 0;
1088 #endif // RALINK_28xx_QA //
1090 NdisAcquireSpinLock(&pAd->GenericLock);//0820
1091 pAd->ContinBulkOut = FALSE;
1092 NdisReleaseSpinLock(&pAd->GenericLock);
1094 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
1096 RTUSBKickBulkOut(pAd);
1101 while (atomic_read(&pAd->BulkOutRemained) > 0)
1103 RTMPusecDelay(5000);
1107 // Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1.
1108 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
1109 MacData |= 0x00000010;
1110 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
1112 else if (!strcmp(arg, "TXFRAME")) // Tx Frames
1114 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXFRAME(Count=0x%08x)\n", pAd->ate.TxCount));
1115 pAd->ate.Mode |= ATE_TXFRAME;
1120 // Default value in BBP R22 is 0x0.
1123 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
1125 // Clean bit4 to stop continuous Tx production test.
1126 MacData &= 0xFFFFFFEF;
1128 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1129 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
1131 #ifdef RALINK_28xx_QA
1132 // add this for LoopBack mode
1133 if (pAd->ate.bQARxStart == FALSE)
1136 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1138 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1141 if (pAd->ate.bQATxStart == TRUE)
1143 pAd->ate.TxStatus = 1;
1144 //pAd->ate.Repeat = 0;
1148 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1150 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1151 #endif // RALINK_28xx_QA //
1154 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1156 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1158 SetJapanFilter(pAd);
1160 // Abort Tx, RX DMA.
1161 RtmpDmaEnable(pAd, 0);
1163 pAd->ate.TxDoneCount = 0;
1165 // Setup frame format
1166 ATESetUpFrame(pAd, 0);
1168 // Start Tx, RX DMA.
1169 RtmpDmaEnable(pAd, 1);
1171 // Check count is continuous or not yet.
1173 // Due to the type mismatch between "pAd->BulkOutRemained"(atomic_t) and "pAd->ate.TxCount"(UINT32)
1175 if (pAd->ate.TxCount == 0)
1177 InterlockedExchange(&pAd->BulkOutRemained, 0);
1181 InterlockedExchange(&pAd->BulkOutRemained, pAd->ate.TxCount);
1183 ATEDBGPRINT(RT_DEBUG_TRACE, ("bulk out count = %d\n", atomic_read(&pAd->BulkOutRemained)));
1184 ASSERT((atomic_read(&pAd->BulkOutRemained) >= 0));
1186 if (atomic_read(&pAd->BulkOutRemained) == 0)
1188 ATEDBGPRINT(RT_DEBUG_TRACE, ("Send packet countinuously\n"));
1190 /* In 28xx, NdisAcquireSpinLock() == spin_lock_bh() */
1191 /* NdisAcquireSpinLock only need one argument in 28xx. */
1192 NdisAcquireSpinLock(&pAd->GenericLock);
1193 pAd->ContinBulkOut = TRUE;
1194 NdisReleaseSpinLock(&pAd->GenericLock);
1196 /* In 28xx, BULK_OUT_LOCK() == spin_lock_irqsave() */
1197 BULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags);// peter : NdisAcquireSpinLock ==> BULK_OUT_LOCK
1198 pAd->BulkOutPending[0] = FALSE;
1199 BULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);// peter : NdisAcquireSpinLock ==> BULK_OUT_LOCK
1203 ATEDBGPRINT(RT_DEBUG_TRACE, ("Send packets depend on counter\n"));
1205 NdisAcquireSpinLock(&pAd->GenericLock);
1206 pAd->ContinBulkOut = FALSE;
1207 NdisReleaseSpinLock(&pAd->GenericLock);
1209 BULK_OUT_LOCK(&pAd->BulkOutLock[0], IrqFlags);
1210 pAd->BulkOutPending[0] = FALSE;
1211 BULK_OUT_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
1214 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
1217 RTUSBKickBulkOut(pAd);
1219 #ifdef RALINK_28xx_QA
1220 else if (!strcmp(arg, "TXSTOP")) //Enter ATE mode and set Tx/Rx Idle
1222 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: TXSTOP\n"));
1224 atemode = pAd->ate.Mode;
1225 pAd->ate.Mode &= ATE_TXSTOP;
1226 pAd->ate.bQATxStart = FALSE;
1227 // pAd->ate.TxDoneCount = pAd->ate.TxCount;
1229 /*=========================================================================*/
1230 if (atemode & ATE_TXCARR)
1232 // No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0
1233 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
1234 BbpData &= 0xFFFFFF00; //clear bit7, bit6, bit[5~0]
1235 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1237 else if (atemode & ATE_TXCARRSUPP)
1239 // No Cont. TX set BBP R22 bit7=0
1240 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
1241 BbpData &= ~(1 << 7); //set bit7=0
1242 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1244 // No Carrier Suppression set BBP R24 bit0=0
1245 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &BbpData);
1246 BbpData &= 0xFFFFFFFE; //clear bit0
1247 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData);
1249 else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP))
1251 if (atemode & ATE_TXCONT)
1253 // No Cont. TX set BBP R22 bit7=0
1254 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData);
1255 BbpData &= ~(1 << 7); //set bit7=0
1256 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1260 /*=========================================================================*/
1261 RTUSBRejectPendingPackets(pAd);
1262 RTUSBCleanUpDataBulkOutQueue(pAd);
1264 /* not used in RT28xx */
1265 //RTUSBCleanUpMLMEWaitQueue(pAd);
1266 /* empty function so far */
1267 RTUSBCleanUpMLMEBulkOutQueue(pAd);
1268 /*=========================================================================*/
1269 // Abort Tx, RX DMA.
1270 RtmpDmaEnable(pAd, 0);
1271 /*=========================================================================*/
1273 /* In 28xx, pAd->PendingRx is not of type atomic_t anymore */
1274 // while ((atomic_read(&pAd->PendingRx) > 0)) //pAd->BulkFlags != 0 wait bulk out finish
1275 /* peter todo : BulkInLock */
1276 while (pAd->PendingRx > 0)
1279 ATE_RTUSBCancelPendingBulkInIRP(pAd);
1281 // NdisInterlockedDecrement(&pAd->PendingRx);
1284 RTMPusecDelay(500000);
1287 while (((pAd->BulkOutPending[0] == TRUE) ||
1288 (pAd->BulkOutPending[1] == TRUE) ||
1289 (pAd->BulkOutPending[2] == TRUE) ||
1290 (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0)) //pAd->BulkFlags != 0 wait bulk out finish
1294 RTUSBCancelPendingBulkOutIRP(pAd);
1297 RTMPusecDelay(500000);
1300 ASSERT(pAd->PendingRx == 0);
1301 /*=========================================================================*/
1302 // Enable Tx, Rx DMA.
1303 RtmpDmaEnable(pAd, 1);
1305 /* task Tx status : 0 --> task is idle, 1 --> task is running */
1306 pAd->ate.TxStatus = 0;
1312 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
1313 MacData &= (0xfffffffb);
1314 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
1316 //Clean ATE Bulk in/out counter and continue setup
1317 InterlockedExchange(&pAd->BulkOutRemained, 0);
1319 pAd->ContinBulkOut = FALSE;
1321 else if (!strcmp(arg, "RXSTOP"))
1323 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: RXSTOP\n"));
1324 atemode = pAd->ate.Mode;
1327 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1329 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1331 pAd->ate.Mode &= ATE_RXSTOP;
1332 pAd->ate.bQARxStart = FALSE;
1333 // pAd->ate.TxDoneCount = pAd->ate.TxCount;
1335 /*=========================================================================*/
1336 RTUSBRejectPendingPackets(pAd);
1337 RTUSBCleanUpDataBulkOutQueue(pAd);
1339 /* not used in RT28xx */
1340 //RTUSBCleanUpMLMEWaitQueue(pAd);
1341 RTUSBCleanUpMLMEBulkOutQueue(pAd);
1342 /*=========================================================================*/
1344 // Abort Tx, RX DMA.
1345 RtmpDmaEnable(pAd, 0);
1346 /*=========================================================================*/
1347 // while ((atomic_read(&pAd->PendingRx) > 0))
1348 while (pAd->PendingRx > 0)
1351 ATE_RTUSBCancelPendingBulkInIRP(pAd);
1353 // NdisInterlockedDecrement(&pAd->PendingRx);
1356 RTMPusecDelay(500000);
1359 while (((pAd->BulkOutPending[0] == TRUE) ||
1360 (pAd->BulkOutPending[1] == TRUE) ||
1361 (pAd->BulkOutPending[2] == TRUE) ||
1362 (pAd->BulkOutPending[3] == TRUE)) && (pAd->BulkFlags != 0)) //pAd->BulkFlags != 0 wait bulk out finish
1366 RTUSBCancelPendingBulkOutIRP(pAd);
1369 RTMPusecDelay(500000);
1372 ASSERT(pAd->PendingRx == 0);
1373 /*=========================================================================*/
1377 pAd->ContinBulkIn = FALSE;
1379 #endif // RALINK_28xx_QA //
1380 else if (!strcmp(arg, "RXFRAME")) // Rx Frames
1382 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: RXFRAME\n"));
1384 // Disable Rx of MAC block
1385 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1387 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1389 // Default value in BBP R22 is 0x0.
1392 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData);
1393 // Clean bit4 to stop continuous Tx production test.
1394 MacData &= 0xFFFFFFEF;
1396 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData);
1397 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData);
1399 pAd->ate.Mode |= ATE_RXFRAME;
1401 // Abort Tx, RX DMA.
1402 RtmpDmaEnable(pAd, 0);
1404 // Disable TX of MAC block
1405 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1407 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1410 for ( i = 0; i < (RX_RING_SIZE); i++)
1412 PRX_CONTEXT pRxContext = &(pAd->RxContext[i]);
1414 pRxContext->InUse = FALSE;
1415 pRxContext->IRPPending = FALSE;
1416 pRxContext->Readable = FALSE;
1419 // Get the urb from kernel back to driver.
1421 RTUSB_UNLINK_URB(pRxContext->pUrb);
1423 /* Sleep 200 microsecs to give cancellation time to work. */
1427 // InterlockedExchange(&pAd->PendingRx, 0);
1429 pAd->NextRxBulkInReadIndex = 0; // Next Rx Read index
1430 pAd->NextRxBulkInIndex = RX_RING_SIZE - 1; // Rx Bulk pointer
1431 pAd->NextRxBulkInPosition = 0;
1434 // read to clear counters
1435 RTUSBReadMACRegister(pAd, RX_STA_CNT0, &temp); //RX PHY & RX CRC count
1436 RTUSBReadMACRegister(pAd, RX_STA_CNT1, &temp); //RX PLCP error count & CCA false alarm count
1437 RTUSBReadMACRegister(pAd, RX_STA_CNT2, &temp); //RX FIFO overflow frame count & RX duplicated filtered frame count
1439 pAd->ContinBulkIn = TRUE;
1441 // Enable Tx, RX DMA.
1442 RtmpDmaEnable(pAd, 1);
1444 // Enable RX of MAC block
1445 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
1447 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
1450 RTUSBBulkReceive(pAd);
1454 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE: Invalid arg!\n"));
1457 RTMPusecDelay(5000);
1459 ATEDBGPRINT(RT_DEBUG_TRACE, ("<=== ATECmdHandler()\n"));
1466 IN PRTMP_ADAPTER pAd,
1469 if (ATECmdHandler(pAd, arg))
1471 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Success\n"));
1478 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Failed\n"));
1484 ==========================================================================
1486 Set ATE ADDR1=DA for TxFrame(AP : To DS = 0 ; From DS = 1)
1488 Set ATE ADDR3=DA for TxFrame(STA : To DS = 1 ; From DS = 0)
1491 TRUE if all parameters are OK, FALSE otherwise
1492 ==========================================================================
1494 INT Set_ATE_DA_Proc(
1495 IN PRTMP_ADAPTER pAd,
1501 if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17
1504 for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":"))
1506 if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
1507 return FALSE; //Invalid
1510 #ifdef CONFIG_STA_SUPPORT
1511 AtoH(value, &pAd->ate.Addr3[i++], 1);
1512 #endif // CONFIG_STA_SUPPORT //
1516 return FALSE; //Invalid
1519 #ifdef CONFIG_STA_SUPPORT
1520 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_DA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr3[0],
1521 pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5]));
1522 #endif // CONFIG_STA_SUPPORT //
1524 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_DA_Proc Success\n"));
1530 ==========================================================================
1532 Set ATE ADDR3=SA for TxFrame(AP : To DS = 0 ; From DS = 1)
1534 Set ATE ADDR2=SA for TxFrame(STA : To DS = 1 ; From DS = 0)
1537 TRUE if all parameters are OK, FALSE otherwise
1538 ==========================================================================
1540 INT Set_ATE_SA_Proc(
1541 IN PRTMP_ADAPTER pAd,
1547 if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17
1550 for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":"))
1552 if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
1553 return FALSE; //Invalid
1556 #ifdef CONFIG_STA_SUPPORT
1557 AtoH(value, &pAd->ate.Addr2[i++], 1);
1558 #endif // CONFIG_STA_SUPPORT //
1562 return FALSE; //Invalid
1565 #ifdef CONFIG_STA_SUPPORT
1566 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_SA_Proc (SA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr2[0],
1567 pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5]));
1568 #endif // CONFIG_STA_SUPPORT //
1570 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_SA_Proc Success\n"));
1576 ==========================================================================
1578 Set ATE ADDR2=BSSID for TxFrame(AP : To DS = 0 ; From DS = 1)
1580 Set ATE ADDR1=BSSID for TxFrame(STA : To DS = 1 ; From DS = 0)
1583 TRUE if all parameters are OK, FALSE otherwise
1584 ==========================================================================
1586 INT Set_ATE_BSSID_Proc(
1587 IN PRTMP_ADAPTER pAd,
1593 if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17
1596 for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":"))
1598 if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
1599 return FALSE; //Invalid
1602 #ifdef CONFIG_STA_SUPPORT
1603 AtoH(value, &pAd->ate.Addr1[i++], 1);
1604 #endif // CONFIG_STA_SUPPORT //
1608 return FALSE; //Invalid
1611 #ifdef CONFIG_STA_SUPPORT
1612 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_BSSID_Proc (BSSID = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr1[0],
1613 pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5]));
1614 #endif // CONFIG_STA_SUPPORT //
1616 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_BSSID_Proc Success\n"));
1622 ==========================================================================
1627 TRUE if all parameters are OK, FALSE otherwise
1628 ==========================================================================
1630 INT Set_ATE_CHANNEL_Proc(
1631 IN PRTMP_ADAPTER pAd,
1636 channel = simple_strtol(arg, 0, 10);
1638 if ((channel < 1) || (channel > 216))// to allow A band channel : ((channel < 1) || (channel > 14))
1640 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_CHANNEL_Proc::Out of range, it should be in range of 1~14.\n"));
1643 pAd->ate.Channel = channel;
1645 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_CHANNEL_Proc (ATE Channel = %d)\n", pAd->ate.Channel));
1646 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_CHANNEL_Proc Success\n"));
1653 ==========================================================================
1658 TRUE if all parameters are OK, FALSE otherwise
1659 ==========================================================================
1661 INT Set_ATE_TX_POWER0_Proc(
1662 IN PRTMP_ADAPTER pAd,
1667 TxPower = simple_strtol(arg, 0, 10);
1669 if (pAd->ate.Channel <= 14)
1671 if ((TxPower > 31) || (TxPower < 0))
1673 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower));
1679 if ((TxPower > 15) || (TxPower < -7))
1681 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower));
1686 pAd->ate.TxPower0 = TxPower;
1687 ATETxPwrHandler(pAd, 0);
1688 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER0_Proc Success\n"));
1695 ==========================================================================
1700 TRUE if all parameters are OK, FALSE otherwise
1701 ==========================================================================
1703 INT Set_ATE_TX_POWER1_Proc(
1704 IN PRTMP_ADAPTER pAd,
1709 TxPower = simple_strtol(arg, 0, 10);
1711 if (pAd->ate.Channel <= 14)
1713 if ((TxPower > 31) || (TxPower < 0))
1715 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower));
1721 if ((TxPower > 15) || (TxPower < -7))
1723 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower));
1728 pAd->ate.TxPower1 = TxPower;
1729 ATETxPwrHandler(pAd, 1);
1730 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER1_Proc Success\n"));
1737 ==========================================================================
1742 TRUE if all parameters are OK, FALSE otherwise
1743 ==========================================================================
1745 INT Set_ATE_TX_Antenna_Proc(
1746 IN PRTMP_ADAPTER pAd,
1751 value = simple_strtol(arg, 0, 10);
1753 if ((value > 2) || (value < 0))
1755 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_Antenna_Proc::Out of range (Value=%d)\n", value));
1759 pAd->ate.TxAntennaSel = value;
1761 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_Antenna_Proc (Antenna = %d)\n", pAd->ate.TxAntennaSel));
1762 ATEDBGPRINT(RT_DEBUG_TRACE,("Ralink: Set_ATE_TX_Antenna_Proc Success\n"));
1769 ==========================================================================
1774 TRUE if all parameters are OK, FALSE otherwise
1775 ==========================================================================
1777 INT Set_ATE_RX_Antenna_Proc(
1778 IN PRTMP_ADAPTER pAd,
1783 value = simple_strtol(arg, 0, 10);
1785 if ((value > 3) || (value < 0))
1787 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_RX_Antenna_Proc::Out of range (Value=%d)\n", value));
1791 pAd->ate.RxAntennaSel = value;
1793 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_Antenna_Proc (Antenna = %d)\n", pAd->ate.RxAntennaSel));
1794 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_Antenna_Proc Success\n"));
1801 ==========================================================================
1803 Set ATE RF frequence offset
1806 TRUE if all parameters are OK, FALSE otherwise
1807 ==========================================================================
1809 INT Set_ATE_TX_FREQOFFSET_Proc(
1810 IN PRTMP_ADAPTER pAd,
1816 RFFreqOffset = simple_strtol(arg, 0, 10);
1818 if(RFFreqOffset >= 64)
1820 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_FREQOFFSET_Proc::Out of range, it should be in range of 0~63.\n"));
1824 pAd->ate.RFFreqOffset = RFFreqOffset;
1825 R4 = pAd->ate.RFFreqOffset << 15; // shift TX power control to correct RF register bit position
1826 R4 |= (pAd->LatchRfRegs.R4 & ((~0x001f8000)));
1827 pAd->LatchRfRegs.R4 = R4;
1831 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %d)\n", pAd->ate.RFFreqOffset));
1832 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\n"));
1839 ==========================================================================
1844 TRUE if all parameters are OK, FALSE otherwise
1845 ==========================================================================
1847 INT Set_ATE_TX_BW_Proc(
1848 IN PRTMP_ADAPTER pAd,
1855 BBPCurrentBW = simple_strtol(arg, 0, 10);
1857 if(BBPCurrentBW == 0)
1858 pAd->ate.TxWI.BW = BW_20;
1860 pAd->ate.TxWI.BW = BW_40;
1862 if(pAd->ate.TxWI.BW == BW_20)
1864 if(pAd->ate.Channel <= 14)
1868 if (pAd->Tx20MPwrCfgGBand[i] != 0xffffffff)
1870 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx20MPwrCfgGBand[i]);
1871 RTMPusecDelay(5000);
1879 if (pAd->Tx20MPwrCfgABand[i] != 0xffffffff)
1881 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx20MPwrCfgABand[i]);
1882 RTMPusecDelay(5000);
1887 //Set BBP R4 bit[4:3]=0:0
1888 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);
1890 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);
1894 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);
1896 //to improve Rx sensitivity.
1898 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);
1901 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);
1904 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);
1907 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);
1909 // If Channel=14, Bandwidth=20M and Mode=CCK, Set BBP R4 bit5=1
1910 // (Japan filter coefficients)
1911 // This segment of code will only works when ATETXMODE and ATECHANNEL
1912 // were set to MODE_CCK and 14 respectively before ATETXBW is set to 0.
1913 //=====================================================================
1914 if (pAd->ate.Channel == 14)
1916 int TxMode = pAd->ate.TxWI.PHYMODE;
1917 if (TxMode == MODE_CCK)
1919 // when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1
1920 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);
1921 value |= 0x20; //set bit5=1
1922 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);
1926 //=====================================================================
1927 // If bandwidth != 40M, RF Reg4 bit 21 = 0.
1928 pAd->LatchRfRegs.R4 &= ~0x00200000;
1931 else if(pAd->ate.TxWI.BW == BW_40)
1933 if(pAd->ate.Channel <= 14)
1937 if (pAd->Tx40MPwrCfgGBand[i] != 0xffffffff)
1939 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx40MPwrCfgGBand[i]);
1940 RTMPusecDelay(5000);
1948 if (pAd->Tx40MPwrCfgABand[i] != 0xffffffff)
1950 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx40MPwrCfgABand[i]);
1951 RTMPusecDelay(5000);
1954 #ifdef DOT11_N_SUPPORT
1955 if ((pAd->ate.TxWI.PHYMODE >= MODE_HTMIX) && (pAd->ate.TxWI.MCS == 7))
1958 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, value);
1960 #endif // DOT11_N_SUPPORT //
1963 //Set BBP R4 bit[4:3]=1:0
1964 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value);
1967 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value);
1971 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value);
1973 //to improve Rx sensitivity.
1975 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value);
1978 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value);
1981 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value);
1984 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value);
1986 // If bandwidth = 40M, set RF Reg4 bit 21 = 1.
1987 pAd->LatchRfRegs.R4 |= 0x00200000;
1991 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_BW_Proc (BBPCurrentBW = %d)\n", pAd->ate.TxWI.BW));
1992 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_BW_Proc Success\n"));
1999 ==========================================================================
2001 Set ATE Tx frame length
2004 TRUE if all parameters are OK, FALSE otherwise
2005 ==========================================================================
2007 INT Set_ATE_TX_LENGTH_Proc(
2008 IN PRTMP_ADAPTER pAd,
2011 pAd->ate.TxLength = simple_strtol(arg, 0, 10);
2013 if((pAd->ate.TxLength < 24) || (pAd->ate.TxLength > (MAX_FRAME_SIZE - 34/* == 2312 */)))
2015 pAd->ate.TxLength = (MAX_FRAME_SIZE - 34/* == 2312 */);
2016 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_LENGTH_Proc::Out of range, it should be in range of 24~%d.\n", (MAX_FRAME_SIZE - 34/* == 2312 */)));
2020 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_LENGTH_Proc (TxLength = %d)\n", pAd->ate.TxLength));
2021 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_LENGTH_Proc Success\n"));
2028 ==========================================================================
2030 Set ATE Tx frame count
2033 TRUE if all parameters are OK, FALSE otherwise
2034 ==========================================================================
2036 INT Set_ATE_TX_COUNT_Proc(
2037 IN PRTMP_ADAPTER pAd,
2040 pAd->ate.TxCount = simple_strtol(arg, 0, 10);
2042 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_COUNT_Proc (TxCount = %d)\n", pAd->ate.TxCount));
2043 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_COUNT_Proc Success\n"));
2050 ==========================================================================
2052 Set ATE Tx frame MCS
2055 TRUE if all parameters are OK, FALSE otherwise
2056 ==========================================================================
2058 INT Set_ATE_TX_MCS_Proc(
2059 IN PRTMP_ADAPTER pAd,
2065 MCS = simple_strtol(arg, 0, 10);
2066 result = CheckMCSValid(pAd->ate.TxWI.PHYMODE, MCS);
2070 pAd->ate.TxWI.MCS = (UCHAR)MCS;
2074 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_MCS_Proc::Out of range, refer to rate table.\n"));
2078 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_MCS_Proc (MCS = %d)\n", pAd->ate.TxWI.MCS));
2079 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_MCS_Proc Success\n"));
2086 ==========================================================================
2088 Set ATE Tx frame Mode
2092 3: MODE_HTGREENFIELD
2095 TRUE if all parameters are OK, FALSE otherwise
2096 ==========================================================================
2098 INT Set_ATE_TX_MODE_Proc(
2099 IN PRTMP_ADAPTER pAd,
2102 pAd->ate.TxWI.PHYMODE = simple_strtol(arg, 0, 10);
2104 if(pAd->ate.TxWI.PHYMODE > 3)
2106 pAd->ate.TxWI.PHYMODE = 0;
2107 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_MODE_Proc::Out of range. it should be in range of 0~3\n"));
2108 ATEDBGPRINT(RT_DEBUG_ERROR, ("0: CCK, 1: OFDM, 2: HT_MIX, 3: HT_GREEN_FIELD.\n"));
2112 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_MODE_Proc (TxMode = %d)\n", pAd->ate.TxWI.PHYMODE));
2113 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_MODE_Proc Success\n"));
2120 ==========================================================================
2125 TRUE if all parameters are OK, FALSE otherwise
2126 ==========================================================================
2128 INT Set_ATE_TX_GI_Proc(
2129 IN PRTMP_ADAPTER pAd,
2132 pAd->ate.TxWI.ShortGI = simple_strtol(arg, 0, 10);
2134 if(pAd->ate.TxWI.ShortGI > 1)
2136 pAd->ate.TxWI.ShortGI = 0;
2137 ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_GI_Proc::Out of range\n"));
2141 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_GI_Proc (GI = %d)\n", pAd->ate.TxWI.ShortGI));
2142 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_GI_Proc Success\n"));
2149 ==========================================================================
2151 ==========================================================================
2153 INT Set_ATE_RX_FER_Proc(
2154 IN PRTMP_ADAPTER pAd,
2157 pAd->ate.bRxFer = simple_strtol(arg, 0, 10);
2159 if (pAd->ate.bRxFer == 1)
2161 pAd->ate.RxCntPerSec = 0;
2162 pAd->ate.RxTotalCnt = 0;
2165 ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_FER_Proc (bRxFer = %d)\n", pAd->ate.bRxFer));
2166 ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_FER_Proc Success\n"));
2172 INT Set_ATE_Read_RF_Proc(
2173 IN PRTMP_ADAPTER pAd,
2176 ate_print(KERN_EMERG "R1 = %lx\n", pAd->LatchRfRegs.R1);
2177 ate_print(KERN_EMERG "R2 = %lx\n", pAd->LatchRfRegs.R2);
2178 ate_print(KERN_EMERG "R3 = %lx\n", pAd->LatchRfRegs.R3);
2179 ate_print(KERN_EMERG "R4 = %lx\n", pAd->LatchRfRegs.R4);
2184 INT Set_ATE_Write_RF1_Proc(
2185 IN PRTMP_ADAPTER pAd,
2188 UINT32 value = simple_strtol(arg, 0, 16);
2190 pAd->LatchRfRegs.R1 = value;
2196 INT Set_ATE_Write_RF2_Proc(
2197 IN PRTMP_ADAPTER pAd,
2200 UINT32 value = simple_strtol(arg, 0, 16);
2202 pAd->LatchRfRegs.R2 = value;
2208 INT Set_ATE_Write_RF3_Proc(
2209 IN PRTMP_ADAPTER pAd,
2212 UINT32 value = simple_strtol(arg, 0, 16);
2214 pAd->LatchRfRegs.R3 = value;
2220 INT Set_ATE_Write_RF4_Proc(
2221 IN PRTMP_ADAPTER pAd,
2224 UINT32 value = simple_strtol(arg, 0, 16);
2226 pAd->LatchRfRegs.R4 = value;
2233 ==========================================================================
2235 Load and Write EEPROM from a binary file prepared in advance.
2238 TRUE if all parameters are OK, FALSE otherwise
2239 ==========================================================================
2241 INT Set_ATE_Load_E2P_Proc(
2242 IN PRTMP_ADAPTER pAd,
2245 BOOLEAN ret = FALSE;
2246 PUCHAR src = EEPROM_BIN_FILE_NAME;
2248 INT32 retval, orgfsuid, orgfsgid;
2250 USHORT WriteEEPROM[(EEPROM_SIZE/2)];
2251 UINT32 FileLength = 0;
2252 UINT32 value = simple_strtol(arg, 0, 10);
2254 ATEDBGPRINT(RT_DEBUG_ERROR, ("===> %s (value=%d)\n\n", __func__, value));
2258 /* zero the e2p buffer */
2259 NdisZeroMemory((PUCHAR)WriteEEPROM, EEPROM_SIZE);
2261 /* save uid and gid used for filesystem access.
2262 ** set user and group to 0 (root)
2264 orgfsuid = current->fsuid;
2265 orgfsgid = current->fsgid;
2267 current->fsuid = current->fsgid = 0;
2273 /* open the bin file */
2274 srcf = filp_open(src, O_RDONLY, 0);
2278 ate_print("%s - Error %ld opening %s\n", __func__, -PTR_ERR(srcf), src);
2282 /* the object must have a read method */
2283 if ((srcf->f_op == NULL) || (srcf->f_op->read == NULL))
2285 ate_print("%s - %s does not have a read method\n", __func__, src);
2289 /* read the firmware from the file *.bin */
2290 FileLength = srcf->f_op->read(srcf,
2291 (PUCHAR)WriteEEPROM,
2295 if (FileLength != EEPROM_SIZE)
2297 ate_print("%s: error file length (=%d) in e2p.bin\n",
2298 __func__, FileLength);
2303 /* write the content of .bin file to EEPROM */
2304 rt_ee_write_all(pAd, WriteEEPROM);
2310 /* close firmware file */
2317 retval = filp_close(srcf, NULL);
2320 ATEDBGPRINT(RT_DEBUG_ERROR, ("--> Error %d closing %s\n", -retval, src));
2327 current->fsuid = orgfsuid;
2328 current->fsgid = orgfsgid;
2330 ATEDBGPRINT(RT_DEBUG_ERROR, ("<=== %s (ret=%d)\n", __func__, ret));
2336 INT Set_ATE_Read_E2P_Proc(
2337 IN PRTMP_ADAPTER pAd,
2340 USHORT buffer[EEPROM_SIZE/2];
2344 rt_ee_read_all(pAd, (USHORT *)buffer);
2346 for (i = 0; i < (EEPROM_SIZE/2); i++)
2348 ate_print("%4.4x ", *p);
2349 if (((i+1) % 16) == 0)
2356 INT Set_ATE_Show_Proc(
2357 IN PRTMP_ADAPTER pAd,
2360 ate_print("Mode=%d\n", pAd->ate.Mode);
2361 ate_print("TxPower0=%d\n", pAd->ate.TxPower0);
2362 ate_print("TxPower1=%d\n", pAd->ate.TxPower1);
2363 ate_print("TxAntennaSel=%d\n", pAd->ate.TxAntennaSel);
2364 ate_print("RxAntennaSel=%d\n", pAd->ate.RxAntennaSel);
2365 ate_print("BBPCurrentBW=%d\n", pAd->ate.TxWI.BW);
2366 ate_print("GI=%d\n", pAd->ate.TxWI.ShortGI);
2367 ate_print("MCS=%d\n", pAd->ate.TxWI.MCS);
2368 ate_print("TxMode=%d\n", pAd->ate.TxWI.PHYMODE);
2369 ate_print("Addr1=%02x:%02x:%02x:%02x:%02x:%02x\n",
2370 pAd->ate.Addr1[0], pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5]);
2371 ate_print("Addr2=%02x:%02x:%02x:%02x:%02x:%02x\n",
2372 pAd->ate.Addr2[0], pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5]);
2373 ate_print("Addr3=%02x:%02x:%02x:%02x:%02x:%02x\n",
2374 pAd->ate.Addr3[0], pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5]);
2375 ate_print("Channel=%d\n", pAd->ate.Channel);
2376 ate_print("TxLength=%d\n", pAd->ate.TxLength);
2377 ate_print("TxCount=%u\n", pAd->ate.TxCount);
2378 ate_print("RFFreqOffset=%d\n", pAd->ate.RFFreqOffset);
2379 ate_print(KERN_EMERG "Set_ATE_Show_Proc Success\n");
2383 INT Set_ATE_Help_Proc(
2384 IN PRTMP_ADAPTER pAd,
2387 ate_print("ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME\n");
2388 ate_print("ATEDA\n");
2389 ate_print("ATESA\n");
2390 ate_print("ATEBSSID\n");
2391 ate_print("ATECHANNEL, range:0~14(unless A band !)\n");
2392 ate_print("ATETXPOW0, set power level of antenna 1.\n");
2393 ate_print("ATETXPOW1, set power level of antenna 2.\n");
2394 ate_print("ATETXANT, set TX antenna. 0:all, 1:antenna one, 2:antenna two.\n");
2395 ate_print("ATERXANT, set RX antenna.0:all, 1:antenna one, 2:antenna two, 3:antenna three.\n");
2396 ate_print("ATETXFREQOFFSET, set frequency offset, range 0~63\n");
2397 ate_print("ATETXBW, set BandWidth, 0:20MHz, 1:40MHz.\n");
2398 ate_print("ATETXLEN, set Frame length, range 24~%d\n", (MAX_FRAME_SIZE - 34/* == 2312 */));
2399 ate_print("ATETXCNT, set how many frame going to transmit.\n");
2400 ate_print("ATETXMCS, set MCS, reference to rate table.\n");
2401 ate_print("ATETXMODE, set Mode 0:CCK, 1:OFDM, 2:HT-Mix, 3:GreenField, reference to rate table.\n");
2402 ate_print("ATETXGI, set GI interval, 0:Long, 1:Short\n");
2403 ate_print("ATERXFER, 0:disable Rx Frame error rate. 1:enable Rx Frame error rate.\n");
2404 ate_print("ATERRF, show all RF registers.\n");
2405 ate_print("ATEWRF1, set RF1 register.\n");
2406 ate_print("ATEWRF2, set RF2 register.\n");
2407 ate_print("ATEWRF3, set RF3 register.\n");
2408 ate_print("ATEWRF4, set RF4 register.\n");
2409 ate_print("ATELDE2P, load EEPROM from .bin file.\n");
2410 ate_print("ATERE2P, display all EEPROM content.\n");
2411 ate_print("ATESHOW, display all parameters of ATE.\n");
2412 ate_print("ATEHELP, online help.\n");
2418 ==========================================================================
2421 AsicSwitchChannel() dedicated for ATE.
2423 ==========================================================================
2425 VOID ATEAsicSwitchChannel(
2426 IN PRTMP_ADAPTER pAd)
2428 UINT32 R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0, Value = 0;
2429 CHAR TxPwer = 0, TxPwer2 = 0;
2430 UCHAR index, BbpValue = 0, R66 = 0x30;
2431 RTMP_RF_REGS *RFRegTable;
2434 #ifdef RALINK_28xx_QA
2435 if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE))
2437 if (pAd->ate.Channel != pAd->LatchRfRegs.Channel)
2439 pAd->ate.Channel = pAd->LatchRfRegs.Channel;
2444 #endif // RALINK_28xx_QA //
2445 Channel = pAd->ate.Channel;
2448 AsicAntennaSelect(pAd, Channel);
2450 // fill Tx power value
2451 TxPwer = pAd->ate.TxPower0;
2452 TxPwer2 = pAd->ate.TxPower1;
2454 RFRegTable = RF2850RegTable;
2456 switch (pAd->RfIcType)
2458 /* But only 2850 and 2750 support 5.5GHz band... */
2464 for (index = 0; index < NUM_OF_2850_CHNL; index++)
2466 if (Channel == RFRegTable[index].Channel)
2468 R2 = RFRegTable[index].R2;
2469 if (pAd->Antenna.field.TxPath == 1)
2471 R2 |= 0x4000; // If TXpath is 1, bit 14 = 1;
2474 if (pAd->Antenna.field.RxPath == 2)
2476 switch (pAd->ate.RxAntennaSel)
2480 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2483 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2487 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2490 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2494 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2496 /* Only enable two Antenna to receive. */
2498 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2502 else if (pAd->Antenna.field.RxPath == 1)
2504 R2 |= 0x20040; // write 1 to off RxPath
2507 if (pAd->Antenna.field.TxPath == 2)
2509 if (pAd->ate.TxAntennaSel == 1)
2511 R2 |= 0x4000; // If TX Antenna select is 1 , bit 14 = 1; Disable Ant 2
2512 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);
2513 BbpValue &= 0xE7; //11100111B
2514 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);
2516 else if (pAd->ate.TxAntennaSel == 2)
2518 R2 |= 0x8000; // If TX Antenna select is 2 , bit 15 = 1; Disable Ant 1
2519 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);
2522 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);
2526 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue);
2529 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue);
2532 if (pAd->Antenna.field.RxPath == 3)
2534 switch (pAd->ate.RxAntennaSel)
2538 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2541 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2545 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2548 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2552 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2555 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2558 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue);
2561 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue);
2568 // initialize R3, R4
2569 R3 = (RFRegTable[index].R3 & 0xffffc1ff);
2570 R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->ate.RFFreqOffset << 15);
2572 // According the Rory's suggestion to solve the middle range issue.
2573 // 5.5G band power range: 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" means the TX power reduce 7dB
2575 if ((TxPwer >= -7) && (TxPwer < 0))
2577 TxPwer = (7+TxPwer);
2578 TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer);
2579 R3 |= (TxPwer << 10);
2580 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATEAsicSwitchChannel: TxPwer=%d \n", TxPwer));
2584 TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer);
2585 R3 |= (TxPwer << 10) | (1 << 9);
2589 if ((TxPwer2 >= -7) && (TxPwer2 < 0))
2591 TxPwer2 = (7+TxPwer2);
2592 TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2);
2593 R4 |= (TxPwer2 << 7);
2594 ATEDBGPRINT(RT_DEBUG_TRACE, ("ATEAsicSwitchChannel: TxPwer2=%d \n", TxPwer2));
2598 TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2);
2599 R4 |= (TxPwer2 << 7) | (1 << 6);
2604 R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); // set TX power0
2605 R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->ate.RFFreqOffset << 15) | (TxPwer2 <<6);// Set freq offset & TxPwr1
2608 // Based on BBP current mode before changing RF channel.
2609 if (pAd->ate.TxWI.BW == BW_40)
2615 pAd->LatchRfRegs.Channel = Channel;
2616 pAd->LatchRfRegs.R1 = RFRegTable[index].R1;
2617 pAd->LatchRfRegs.R2 = R2;
2618 pAd->LatchRfRegs.R3 = R3;
2619 pAd->LatchRfRegs.R4 = R4;
2632 // Change BBP setting during switch from a->g, g->a
2635 ULONG TxPinCfg = 0x00050F0A;// 2007.10.09 by Brian : 0x0005050A ==> 0x00050F0A
2637 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));
2638 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));
2639 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));
2641 /* For 1T/2R chip only... */
2642 if (pAd->NicConfig2.field.ExternalLNAForG)
2644 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);
2648 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);
2651 // According the Rory's suggestion to solve the middle range issue.
2652 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R86, &BbpValue);
2653 ASSERT((BbpValue == 0x00));
2654 if ((BbpValue != 0x00))
2656 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x00);
2659 // 5.5GHz band selection PIN, bit1 and bit2 are complement
2660 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
2663 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
2665 // Turn off unused PA or LNA when only 1T or 1R.
2666 if (pAd->Antenna.field.TxPath == 1)
2668 TxPinCfg &= 0xFFFFFFF3;
2670 if (pAd->Antenna.field.RxPath == 1)
2672 TxPinCfg &= 0xFFFFF3FF;
2675 RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
2679 ULONG TxPinCfg = 0x00050F05;//2007.10.09 by Brian : 0x00050505 ==> 0x00050F05
2681 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd)));
2682 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd)));
2683 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd)));
2684 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);
2686 // According the Rory's suggestion to solve the middle range issue.
2687 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R86, &BbpValue);
2688 ASSERT((BbpValue == 0x00));
2689 if ((BbpValue != 0x00))
2691 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x00);
2693 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R91, &BbpValue);
2694 ASSERT((BbpValue == 0x04));
2696 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R92, &BbpValue);
2697 ASSERT((BbpValue == 0x00));
2699 // 5.5GHz band selection PIN, bit1 and bit2 are complement
2700 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
2703 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
2705 // Turn off unused PA or LNA when only 1T or 1R.
2706 if (pAd->Antenna.field.TxPath == 1)
2708 TxPinCfg &= 0xFFFFFFF3;
2710 if (pAd->Antenna.field.RxPath == 1)
2712 TxPinCfg &= 0xFFFFF3FF;
2715 RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
2718 // R66 should be set according to Channel and use 20MHz when scanning
2722 R66 = 0x2E + GET_LNA_GAIN(pAd);
2723 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
2728 if (pAd->ate.TxWI.BW == BW_20)
2730 R66 = (UCHAR)(0x32 + (GET_LNA_GAIN(pAd)*5)/3);
2731 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
2735 R66 = (UCHAR)(0x3A + (GET_LNA_GAIN(pAd)*5)/3);
2736 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
2741 // On 11A, We should delay and wait RF/BBP to be stable
2742 // and the appropriate time should be 1000 micro seconds
2743 // 2005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL.
2745 RTMPusecDelay(1000);
2749 // When 5.5GHz band the LSB of TxPwr will be used to reduced 7dB or not.
2750 ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n",
2753 pAd->Antenna.field.TxPath,
2754 pAd->LatchRfRegs.R1,
2755 pAd->LatchRfRegs.R2,
2756 pAd->LatchRfRegs.R3,
2757 pAd->LatchRfRegs.R4));
2761 ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%u, Pwr1=%u, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n",
2764 (R3 & 0x00003e00) >> 9,
2765 (R4 & 0x000007c0) >> 6,
2766 pAd->Antenna.field.TxPath,
2767 pAd->LatchRfRegs.R1,
2768 pAd->LatchRfRegs.R2,
2769 pAd->LatchRfRegs.R3,
2770 pAd->LatchRfRegs.R4));
2775 // In fact, no one will call this routine so far !
2778 ==========================================================================
2780 Gives CCK TX rate 2 more dB TX power.
2781 This routine works only in ATE mode.
2783 calculate desired Tx power in RF R3.Tx0~5, should consider -
2784 0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment)
2785 1. TxPowerPercentage
2786 2. auto calibration based on TSSI feedback
2787 3. extra 2 db for CCK
2788 4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP
2790 NOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment),
2791 it should be called AFTER MlmeDynamicTxRateSwitching()
2792 ==========================================================================
2794 VOID ATEAsicAdjustTxPower(
2795 IN PRTMP_ADAPTER pAd)
2799 BOOLEAN bAutoTxAgc = FALSE;
2800 UCHAR TssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep;
2801 UCHAR BbpR49 = 0, idx;
2802 PCHAR pTxAgcCompensate;
2806 /* no one calls this procedure so far */
2807 if (pAd->ate.TxWI.BW == BW_40)
2809 if (pAd->ate.Channel > 14)
2811 TxPwr[0] = pAd->Tx40MPwrCfgABand[0];
2812 TxPwr[1] = pAd->Tx40MPwrCfgABand[1];
2813 TxPwr[2] = pAd->Tx40MPwrCfgABand[2];
2814 TxPwr[3] = pAd->Tx40MPwrCfgABand[3];
2815 TxPwr[4] = pAd->Tx40MPwrCfgABand[4];
2819 TxPwr[0] = pAd->Tx40MPwrCfgGBand[0];
2820 TxPwr[1] = pAd->Tx40MPwrCfgGBand[1];
2821 TxPwr[2] = pAd->Tx40MPwrCfgGBand[2];
2822 TxPwr[3] = pAd->Tx40MPwrCfgGBand[3];
2823 TxPwr[4] = pAd->Tx40MPwrCfgGBand[4];
2828 if (pAd->ate.Channel > 14)
2830 TxPwr[0] = pAd->Tx20MPwrCfgABand[0];
2831 TxPwr[1] = pAd->Tx20MPwrCfgABand[1];
2832 TxPwr[2] = pAd->Tx20MPwrCfgABand[2];
2833 TxPwr[3] = pAd->Tx20MPwrCfgABand[3];
2834 TxPwr[4] = pAd->Tx20MPwrCfgABand[4];
2838 TxPwr[0] = pAd->Tx20MPwrCfgGBand[0];
2839 TxPwr[1] = pAd->Tx20MPwrCfgGBand[1];
2840 TxPwr[2] = pAd->Tx20MPwrCfgGBand[2];
2841 TxPwr[3] = pAd->Tx20MPwrCfgGBand[3];
2842 TxPwr[4] = pAd->Tx20MPwrCfgGBand[4];
2846 // TX power compensation for temperature variation based on TSSI.
2847 // Do it per 4 seconds.
2848 if (pAd->Mlme.OneSecPeriodicRound % 4 == 0)
2850 if (pAd->ate.Channel <= 14)
2853 bAutoTxAgc = pAd->bAutoTxAgcG;
2854 TssiRef = pAd->TssiRefG;
2855 pTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0];
2856 pTssiPlusBoundary = &pAd->TssiPlusBoundaryG[0];
2857 TxAgcStep = pAd->TxAgcStepG;
2858 pTxAgcCompensate = &pAd->TxAgcCompensateG;
2863 bAutoTxAgc = pAd->bAutoTxAgcA;
2864 TssiRef = pAd->TssiRefA;
2865 pTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0];
2866 pTssiPlusBoundary = &pAd->TssiPlusBoundaryA[0];
2867 TxAgcStep = pAd->TxAgcStepA;
2868 pTxAgcCompensate = &pAd->TxAgcCompensateA;
2873 /* BbpR49 is unsigned char */
2874 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49);
2876 /* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */
2877 /* compensate: +4 +3 +2 +1 0 -1 -2 -3 -4 * steps */
2878 /* step value is defined in pAd->TxAgcStepG for tx power value */
2880 /* [4]+1+[4] p4 p3 p2 p1 o1 m1 m2 m3 m4 */
2881 /* ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
2882 above value are examined in mass factory production */
2883 /* [4] [3] [2] [1] [0] [1] [2] [3] [4] */
2885 /* plus is 0x10 ~ 0x40, minus is 0x60 ~ 0x90 */
2886 /* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */
2887 /* if value is 0x65, tx power will be -= TxAgcStep*(2-1) */
2889 if (BbpR49 > pTssiMinusBoundary[1])
2891 // Reading is larger than the reference value.
2892 // Check for how large we need to decrease the Tx power.
2893 for (idx = 1; idx < 5; idx++)
2895 if (BbpR49 <= pTssiMinusBoundary[idx]) // Found the range
2898 // The index is the step we should decrease, idx = 0 means there is nothing to compensate
2899 // if (R3 > (ULONG) (TxAgcStep * (idx-1)))
2900 *pTxAgcCompensate = -(TxAgcStep * (idx-1));
2902 // *pTxAgcCompensate = -((UCHAR)R3);
2904 DeltaPwr += (*pTxAgcCompensate);
2905 ATEDBGPRINT(RT_DEBUG_TRACE, ("-- Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\n",
2906 BbpR49, TssiRef, TxAgcStep, idx-1));
2908 else if (BbpR49 < pTssiPlusBoundary[1])
2910 // Reading is smaller than the reference value
2911 // check for how large we need to increase the Tx power
2912 for (idx = 1; idx < 5; idx++)
2914 if (BbpR49 >= pTssiPlusBoundary[idx]) // Found the range
2917 // The index is the step we should increase, idx = 0 means there is nothing to compensate
2918 *pTxAgcCompensate = TxAgcStep * (idx-1);
2919 DeltaPwr += (*pTxAgcCompensate);
2920 ATEDBGPRINT(RT_DEBUG_TRACE, ("++ Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n",
2921 BbpR49, TssiRef, TxAgcStep, idx-1));
2925 *pTxAgcCompensate = 0;
2926 ATEDBGPRINT(RT_DEBUG_TRACE, (" Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n",
2927 BbpR49, TssiRef, TxAgcStep, 0));
2933 if (pAd->ate.Channel <= 14)
2935 bAutoTxAgc = pAd->bAutoTxAgcG;
2936 pTxAgcCompensate = &pAd->TxAgcCompensateG;
2940 bAutoTxAgc = pAd->bAutoTxAgcA;
2941 pTxAgcCompensate = &pAd->TxAgcCompensateA;
2945 DeltaPwr += (*pTxAgcCompensate);
2948 /* calculate delta power based on the percentage specified from UI */
2949 // E2PROM setting is calibrated for maximum TX power (i.e. 100%)
2950 // We lower TX power here according to the percentage specified from UI
2951 if (pAd->CommonCfg.TxPowerPercentage == 0xffffffff) // AUTO TX POWER control
2953 else if (pAd->CommonCfg.TxPowerPercentage > 90) // 91 ~ 100% & AUTO, treat as 100% in terms of mW
2955 else if (pAd->CommonCfg.TxPowerPercentage > 60) // 61 ~ 90%, treat as 75% in terms of mW
2959 else if (pAd->CommonCfg.TxPowerPercentage > 30) // 31 ~ 60%, treat as 50% in terms of mW
2963 else if (pAd->CommonCfg.TxPowerPercentage > 15) // 16 ~ 30%, treat as 25% in terms of mW
2967 else if (pAd->CommonCfg.TxPowerPercentage > 9) // 10 ~ 15%, treat as 12.5% in terms of mW
2971 else // 0 ~ 9 %, treat as MIN(~3%) in terms of mW
2976 /* reset different new tx power for different TX rate */
2979 if (TxPwr[i] != 0xffffffff)
2983 Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */
2985 if ((Value + DeltaPwr) < 0)
2987 Value = 0; /* min */
2989 else if ((Value + DeltaPwr) > 0xF)
2991 Value = 0xF; /* max */
2995 Value += DeltaPwr; /* temperature compensation */
2998 /* fill new value to CSR offset */
2999 TxPwr[i] = (TxPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4);
3002 /* write tx power value to CSR */
3003 /* TX_PWR_CFG_0 (8 tx rate) for TX power for OFDM 12M/18M
3004 TX power for OFDM 6M/9M
3005 TX power for CCK5.5M/11M
3006 TX power for CCK1M/2M */
3007 /* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */
3008 RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]);
3017 ========================================================================
3018 Routine Description:
3019 Write TxWI for ATE mode.
3023 ========================================================================
3027 static VOID ATEWriteTxWI(
3028 IN PRTMP_ADAPTER pAd,
3029 IN PTXWI_STRUC pTxWI,
3031 IN BOOLEAN InsTimestamp,
3034 IN BOOLEAN NSeq, // HW new a sequence.
3042 IN HTTRANSMIT_SETTING Transmit)
3045 // Always use Long preamble before verifiation short preamble functionality works well.
3046 // Todo: remove the following line if short preamble functionality works
3048 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
3050 pTxWI->TS= InsTimestamp;
3051 pTxWI->AMPDU = AMPDU;
3053 pTxWI->MIMOps = PWR_ACTIVE;
3054 pTxWI->MpduDensity = 4;
3056 pTxWI->txop = Txopmode;
3058 pTxWI->BAWinSize = BASize;
3060 pTxWI->WirelessCliID = WCID;
3061 pTxWI->MPDUtotalByteCount = Length;
3062 pTxWI->PacketId = PID;
3064 pTxWI->BW = Transmit.field.BW;
3065 pTxWI->ShortGI = Transmit.field.ShortGI;
3066 pTxWI->STBC= Transmit.field.STBC;
3068 pTxWI->MCS = Transmit.field.MCS;
3069 pTxWI->PHYMODE= Transmit.field.MODE;
3071 #ifdef DOT11_N_SUPPORT
3073 // MMPS is 802.11n features. Because TxWI->MCS > 7 must be HT mode,
3074 // so need not check if it's HT rate.
3076 if ((MIMOps == MMPS_STATIC) && (pTxWI->MCS > 7))
3079 if ((MIMOps == MMPS_DYNAMIC) && (pTxWI->MCS > 7)) // SMPS protect 2 spatial.
3081 #endif // DOT11_N_SUPPORT //
3083 pTxWI->CFACK = CfAck;
3089 ========================================================================
3091 Routine Description:
3092 Disable protection for ATE.
3093 ========================================================================
3095 VOID ATEDisableAsicProtect(
3096 IN PRTMP_ADAPTER pAd)
3098 PROT_CFG_STRUC ProtCfg, ProtCfg4;
3104 // Config ASIC RTS threshold register
3105 RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg);
3106 MacReg &= 0xFF0000FF;
3107 MacReg |= (pAd->CommonCfg.RtsThreshold << 8);
3108 RTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg);
3110 // Initial common protection settings
3111 RTMPZeroMemory(Protect, sizeof(Protect));
3114 ProtCfg.field.TxopAllowGF40 = 1;
3115 ProtCfg.field.TxopAllowGF20 = 1;
3116 ProtCfg.field.TxopAllowMM40 = 1;
3117 ProtCfg.field.TxopAllowMM20 = 1;
3118 ProtCfg.field.TxopAllowOfdm = 1;
3119 ProtCfg.field.TxopAllowCck = 1;
3120 ProtCfg.field.RTSThEn = 1;
3121 ProtCfg.field.ProtectNav = ASIC_SHORTNAV;
3123 // Handle legacy(B/G) protection
3124 ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate;
3125 ProtCfg.field.ProtectCtrl = 0;
3126 Protect[0] = ProtCfg.word;
3127 Protect[1] = ProtCfg.word;
3130 // 1.All STAs in the BSS are 20/40 MHz HT
3131 // 2. in ai 20/40MHz BSS
3132 // 3. all STAs are 20MHz in a 20MHz BSS
3133 // Pure HT. no protection.
3137 // PROT_TXOP(25:20) -- 010111
3138 // PROT_NAV(19:18) -- 01 (Short NAV protection)
3139 // PROT_CTRL(17:16) -- 00 (None)
3140 // PROT_RATE(15:0) -- 0x4004 (OFDM 24M)
3141 Protect[2] = 0x01744004;
3145 // PROT_TXOP(25:20) -- 111111
3146 // PROT_NAV(19:18) -- 01 (Short NAV protection)
3147 // PROT_CTRL(17:16) -- 00 (None)
3148 // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M)
3149 Protect[3] = 0x03f44084;
3153 // PROT_TXOP(25:20) -- 010111
3154 // PROT_NAV(19:18) -- 01 (Short NAV protection)
3155 // PROT_CTRL(17:16) -- 00 (None)
3156 // PROT_RATE(15:0) -- 0x4004 (OFDM 24M)
3157 Protect[4] = 0x01744004;
3161 // PROT_TXOP(25:20) -- 111111
3162 // PROT_NAV(19:18) -- 01 (Short NAV protection)
3163 // PROT_CTRL(17:16) -- 00 (None)
3164 // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M)
3165 Protect[5] = 0x03f44084;
3167 pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;
3169 offset = CCK_PROT_CFG;
3170 for (i = 0;i < 6;i++)
3171 RTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]);
3177 ========================================================================
3178 Routine Description:
3179 Write TxInfo for ATE mode.
3183 ========================================================================
3185 static VOID ATEWriteTxInfo(
3186 IN PRTMP_ADAPTER pAd,
3187 IN PTXINFO_STRUC pTxInfo,
3188 IN USHORT USBDMApktLen,
3194 pTxInfo->USBDMATxPktLen = USBDMApktLen;
3195 pTxInfo->QSEL = QueueSel;
3197 if (QueueSel != FIFO_EDCA)
3198 ATEDBGPRINT(RT_DEBUG_TRACE, ("=======> QueueSel != FIFO_EDCA<=======\n"));
3200 pTxInfo->USBDMANextVLD = NextValid;
3201 pTxInfo->USBDMATxburst = TxBurst;
3202 pTxInfo->WIV = bWiv;
3203 pTxInfo->SwUseLastRound = 0;
3211 /* There are two ways to convert Rssi */
3214 // The way used with GET_LNA_GAIN().
3216 CHAR ATEConvertToRssi(
3217 IN PRTMP_ADAPTER pAd,
3219 IN UCHAR RssiNumber)
3221 UCHAR RssiOffset, LNAGain;
3223 // Rssi equals to zero should be an invalid value
3227 LNAGain = GET_LNA_GAIN(pAd);
3228 if (pAd->LatchRfRegs.Channel > 14)
3230 if (RssiNumber == 0)
3231 RssiOffset = pAd->ARssiOffset0;
3232 else if (RssiNumber == 1)
3233 RssiOffset = pAd->ARssiOffset1;
3235 RssiOffset = pAd->ARssiOffset2;
3239 if (RssiNumber == 0)
3240 RssiOffset = pAd->BGRssiOffset0;
3241 else if (RssiNumber == 1)
3242 RssiOffset = pAd->BGRssiOffset1;
3244 RssiOffset = pAd->BGRssiOffset2;
3247 return (-12 - RssiOffset - LNAGain - Rssi);
3251 // The way originally used in ATE of rt2860ap.
3253 CHAR ATEConvertToRssi(
3254 IN PRTMP_ADAPTER pAd,
3256 IN UCHAR RssiNumber)
3258 UCHAR RssiOffset, LNAGain;
3260 // Rssi equals to zero should be an invalid value
3264 if (pAd->LatchRfRegs.Channel > 14)
3266 LNAGain = pAd->ALNAGain;
3267 if (RssiNumber == 0)
3268 RssiOffset = pAd->ARssiOffset0;
3269 else if (RssiNumber == 1)
3270 RssiOffset = pAd->ARssiOffset1;
3272 RssiOffset = pAd->ARssiOffset2;
3276 LNAGain = pAd->BLNAGain;
3277 if (RssiNumber == 0)
3278 RssiOffset = pAd->BGRssiOffset0;
3279 else if (RssiNumber == 1)
3280 RssiOffset = pAd->BGRssiOffset1;
3282 RssiOffset = pAd->BGRssiOffset2;
3285 return (-32 - RssiOffset + LNAGain - Rssi);
3287 #endif /* end of #if 1 */
3290 ========================================================================
3292 Routine Description:
3293 Set Japan filter coefficients if needed.
3295 This routine should only be called when
3296 entering TXFRAME mode or TXCONT mode.
3298 ========================================================================
3300 static VOID SetJapanFilter(
3301 IN PRTMP_ADAPTER pAd)
3306 // If Channel=14 and Bandwidth=20M and Mode=CCK, set BBP R4 bit5=1
3307 // (Japan Tx filter coefficients)when (TXFRAME or TXCONT).
3309 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BbpData);
3311 if ((pAd->ate.TxWI.PHYMODE == MODE_CCK) && (pAd->ate.Channel == 14) && (pAd->ate.TxWI.BW == BW_20))
3313 BbpData |= 0x20; // turn on
3314 ATEDBGPRINT(RT_DEBUG_TRACE, ("SetJapanFilter!!!\n"));
3318 BbpData &= 0xdf; // turn off
3319 ATEDBGPRINT(RT_DEBUG_TRACE, ("ClearJapanFilter!!!\n"));
3322 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData);
3326 IN PRTMP_ADAPTER pAd,
3327 IN PRXWI_STRUC pRxWI)
3329 /* There are two ways to collect RSSI. */
3331 //pAd->LastRxRate = (USHORT)((pRxWI->MCS) + (pRxWI->BW <<7) + (pRxWI->ShortGI <<8)+ (pRxWI->PHYMODE <<14)) ;
3332 if (pRxWI->RSSI0 != 0)
3334 pAd->ate.LastRssi0 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI0, RSSI_0);
3335 pAd->ate.AvgRssi0X8 = (pAd->ate.AvgRssi0X8 - pAd->ate.AvgRssi0) + pAd->ate.LastRssi0;
3336 pAd->ate.AvgRssi0 = pAd->ate.AvgRssi0X8 >> 3;
3338 if (pRxWI->RSSI1 != 0)
3340 pAd->ate.LastRssi1 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI1, RSSI_1);
3341 pAd->ate.AvgRssi1X8 = (pAd->ate.AvgRssi1X8 - pAd->ate.AvgRssi1) + pAd->ate.LastRssi1;
3342 pAd->ate.AvgRssi1 = pAd->ate.AvgRssi1X8 >> 3;
3344 if (pRxWI->RSSI2 != 0)
3346 pAd->ate.LastRssi2 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI2, RSSI_2);
3347 pAd->ate.AvgRssi2X8 = (pAd->ate.AvgRssi2X8 - pAd->ate.AvgRssi2) + pAd->ate.LastRssi2;
3348 pAd->ate.AvgRssi2 = pAd->ate.AvgRssi2X8 >> 3;
3351 pAd->ate.LastSNR0 = (CHAR)(pRxWI->SNR0);// CHAR ==> UCHAR ?
3352 pAd->ate.LastSNR1 = (CHAR)(pRxWI->SNR1);// CHAR ==> UCHAR ?
3354 pAd->ate.NumOfAvgRssiSample ++;
3356 pAd->ate.LastSNR0 = (CHAR)(pRxWI->SNR0);
3357 pAd->ate.LastSNR1 = (CHAR)(pRxWI->SNR1);
3358 pAd->ate.RxCntPerSec++;
3359 pAd->ate.LastRssi0 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI0, RSSI_0);
3360 pAd->ate.LastRssi1 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI1, RSSI_1);
3361 pAd->ate.LastRssi2 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI2, RSSI_2);
3362 pAd->ate.AvgRssi0X8 = (pAd->ate.AvgRssi0X8 - pAd->ate.AvgRssi0) + pAd->ate.LastRssi0;
3363 pAd->ate.AvgRssi0 = pAd->ate.AvgRssi0X8 >> 3;
3364 pAd->ate.AvgRssi1X8 = (pAd->ate.AvgRssi1X8 - pAd->ate.AvgRssi1) + pAd->ate.LastRssi1;
3365 pAd->ate.AvgRssi1 = pAd->ate.AvgRssi1X8 >> 3;
3366 pAd->ate.AvgRssi2X8 = (pAd->ate.AvgRssi2X8 - pAd->ate.AvgRssi2) + pAd->ate.LastRssi2;
3367 pAd->ate.AvgRssi2 = pAd->ate.AvgRssi2X8 >> 3;
3368 pAd->ate.NumOfAvgRssiSample ++;
3372 #ifdef CONFIG_STA_SUPPORT
3373 VOID RTMPStationStop(
3374 IN PRTMP_ADAPTER pAd)
3376 // BOOLEAN Cancelled;
3378 ATEDBGPRINT(RT_DEBUG_TRACE, ("==> RTMPStationStop\n"));
3381 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
3382 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
3383 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
3384 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
3385 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
3386 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
3388 // For rx statistics, we need to keep this timer running.
3389 // RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);
3391 ATEDBGPRINT(RT_DEBUG_TRACE, ("<== RTMPStationStop\n"));
3394 VOID RTMPStationStart(
3395 IN PRTMP_ADAPTER pAd)
3397 ATEDBGPRINT(RT_DEBUG_TRACE, ("==> RTMPStationStart\n"));
3398 ATEDBGPRINT(RT_DEBUG_TRACE, ("<== RTMPStationStart\n"));
3400 #endif // CONFIG_STA_SUPPORT //
3403 ==========================================================================
3407 This routine should only be used in ATE mode.
3408 ==========================================================================
3412 /*======================Start of RT2870======================*/
3415 static INT ATESetUpFrame(
3416 IN PRTMP_ADAPTER pAd,
3420 PTX_CONTEXT pNullContext;
3422 HTTRANSMIT_SETTING TxHTPhyMode;
3424 PTXINFO_STRUC pTxInfo;
3425 UINT32 TransferBufferLength, OrgBufferLength = 0;
3427 #ifdef RALINK_28xx_QA
3428 PHEADER_802_11 pHeader80211 = NULL;
3429 #endif // RALINK_28xx_QA //
3431 if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
3432 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) ||
3433 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||
3434 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
3439 /* We always use QID_AC_BE and FIFO_EDCA in ATE mode. */
3441 pNullContext = &(pAd->NullContext);
3442 ASSERT(pNullContext != NULL);
3444 if (pNullContext->InUse == FALSE)
3446 // Set the in use bit
3447 pNullContext->InUse = TRUE;
3448 NdisZeroMemory(&(pAd->NullFrame), sizeof(HEADER_802_11));
3450 // Fill 802.11 header.
3451 #ifdef RALINK_28xx_QA
3452 if (pAd->ate.bQATxStart == TRUE)
3454 pHeader80211 = NdisMoveMemory(&(pAd->NullFrame), pAd->ate.Header, pAd->ate.HLen);
3455 // pDest = NdisMoveMemory(&(pAd->NullFrame), pAd->ate.Header, pAd->ate.HLen);
3456 // pHeader80211 = (PHEADER_802_11)pDest;
3459 #endif // RALINK_28xx_QA //
3461 // Fill 802.11 header.
3462 NdisMoveMemory(&(pAd->NullFrame), TemplateFrame, sizeof(HEADER_802_11));
3464 #ifdef RT_BIG_ENDIAN
3465 RTMPFrameEndianChange(pAd, (PUCHAR)&(pAd->NullFrame), DIR_READ, FALSE);
3466 #endif // RT_BIG_ENDIAN //
3468 #ifdef RALINK_28xx_QA
3469 if (pAd->ate.bQATxStart == TRUE)
3471 /* modify sequence number.... */
3472 if (pAd->ate.TxDoneCount == 0)
3474 pAd->ate.seq = pHeader80211->Sequence;
3478 pHeader80211->Sequence = ++pAd->ate.seq;
3480 /* We already got all the addr. fields from QA GUI. */
3483 #endif // RALINK_28xx_QA //
3485 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->ate.Addr1);
3486 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->ate.Addr2);
3487 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->ate.Addr3);
3490 RTMPZeroMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[0], TX_BUFFER_NORMSIZE);//???
3491 pTxInfo = (PTXINFO_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[0];
3493 #ifdef RALINK_28xx_QA
3494 if (pAd->ate.bQATxStart == TRUE)
3496 // Avoid to exceed the range of WirelessPacket[].
3497 ASSERT(pAd->ate.TxInfo.USBDMATxPktLen <= (MAX_FRAME_SIZE - 34/* == 2312 */));
3498 NdisMoveMemory(pTxInfo, &(pAd->ate.TxInfo), sizeof(pAd->ate.TxInfo));
3501 #endif // RALINK_28xx_QA //
3503 // Avoid to exceed the range of WirelessPacket[].
3504 ASSERT(pAd->ate.TxLength <= (MAX_FRAME_SIZE - 34/* == 2312 */));
3506 // pTxInfo->USBDMATxPktLen will be updated to include padding later.
3507 ATEWriteTxInfo(pAd, pTxInfo, (USHORT)(TXWI_SIZE + pAd->ate.TxLength), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
3508 pTxInfo->QSEL = FIFO_EDCA;
3511 pTxWI = (PTXWI_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE];
3514 if (pAd->ate.bQATxStart == TRUE)
3516 TxHTPhyMode.field.BW = pAd->ate.TxWI.BW;
3517 TxHTPhyMode.field.ShortGI = pAd->ate.TxWI.ShortGI;
3518 TxHTPhyMode.field.STBC = pAd->ate.TxWI.STBC;
3519 TxHTPhyMode.field.MCS = pAd->ate.TxWI.MCS;
3520 TxHTPhyMode.field.MODE = pAd->ate.TxWI.PHYMODE;
3521 ATEWriteTxWI(pAd, pTxWI, pAd->ate.TxWI.FRAG, pAd->ate.TxWI.TS, pAd->ate.TxWI.AMPDU, pAd->ate.TxWI.ACK, pAd->ate.TxWI.NSEQ,
3522 pAd->ate.TxWI.BAWinSize, BSSID_WCID, pAd->ate.TxWI.MPDUtotalByteCount/* include 802.11 header */, pAd->ate.TxWI.PacketId, 0, pAd->ate.TxWI.txop/*IFS_HTTXOP*/, pAd->ate.TxWI.CFACK/*FALSE*/, TxHTPhyMode);
3526 TxHTPhyMode.field.BW = pAd->ate.TxWI.BW;
3527 TxHTPhyMode.field.ShortGI = pAd->ate.TxWI.ShortGI;
3528 TxHTPhyMode.field.STBC = 0;
3529 TxHTPhyMode.field.MCS = pAd->ate.TxWI.MCS;
3530 TxHTPhyMode.field.MODE = pAd->ate.TxWI.PHYMODE;
3532 ATEWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE/* No ack required. */, FALSE, 0, BSSID_WCID, pAd->ate.TxLength,
3533 0, 0, IFS_HTTXOP, FALSE, TxHTPhyMode);// "MMPS_STATIC" instead of "MMPS_DYNAMIC" ???
3536 RTMPMoveMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE+TXWI_SIZE], &pAd->NullFrame, sizeof(HEADER_802_11));
3538 pDest = &(pAd->NullContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE+TXWI_SIZE+sizeof(HEADER_802_11)]);
3540 // Prepare frame payload
3541 #ifdef RALINK_28xx_QA
3542 if (pAd->ate.bQATxStart == TRUE)
3545 if ((pAd->ate.PLen != 0))
3547 for (j = 0; j < pAd->ate.DLen; j+=pAd->ate.PLen)
3549 RTMPMoveMemory(pDest, pAd->ate.Pattern, pAd->ate.PLen);
3550 pDest += pAd->ate.PLen;
3553 TransferBufferLength = TXINFO_SIZE + TXWI_SIZE + pAd->ate.TxWI.MPDUtotalByteCount;
3556 #endif // RALINK_28xx_QA //
3558 for (j = 0; j < (pAd->ate.TxLength - sizeof(HEADER_802_11)); j++)
3563 TransferBufferLength = TXINFO_SIZE + TXWI_SIZE + pAd->ate.TxLength;
3567 OrgBufferLength = TransferBufferLength;
3568 TransferBufferLength = (TransferBufferLength + 3) & (~3);
3570 // Always add 4 extra bytes at every packet.
3571 padLen = TransferBufferLength - OrgBufferLength + 4;/* 4 == last packet padding */
3572 ASSERT((padLen <= (RTMP_PKT_TAIL_PADDING - 4/* 4 == MaxBulkOutsize alignment padding */)));
3574 /* Now memzero all extra padding bytes. */
3575 NdisZeroMemory(pDest, padLen);
3578 if ((TransferBufferLength % 4) == 1)
3580 NdisZeroMemory(pDest, 7);
3582 TransferBufferLength += 3;
3584 else if ((TransferBufferLength % 4) == 2)
3586 NdisZeroMemory(pDest, 6);
3588 TransferBufferLength += 2;
3590 else if ((TransferBufferLength % 4) == 3)
3592 NdisZeroMemory(pDest, 5);
3594 TransferBufferLength += 1;
3598 // Update pTxInfo->USBDMATxPktLen to include padding.
3599 pTxInfo->USBDMATxPktLen = TransferBufferLength - TXINFO_SIZE;
3601 TransferBufferLength += 4;
3603 // If TransferBufferLength is multiple of 64, add extra 4 bytes again.
3604 if ((TransferBufferLength % pAd->BulkOutMaxPacketSize) == 0)
3606 NdisZeroMemory(pDest, 4);
3607 TransferBufferLength += 4;
3610 // Fill out frame length information for global Bulk out arbitor
3611 pAd->NullContext.BulkOutSize = TransferBufferLength;
3613 #ifdef RT_BIG_ENDIAN
3614 RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);
3615 RTMPFrameEndianChange(pAd, (((PUCHAR)pTxInfo)+TXWI_SIZE+TXINFO_SIZE), DIR_WRITE, FALSE);
3616 RTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);
3617 #endif // RT_BIG_ENDIAN //
3621 VOID ATE_RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
3624 PTX_CONTEXT pNullContext;
3625 UCHAR BulkOutPipeId;
3627 unsigned long IrqFlags;
3630 pNullContext = (PTX_CONTEXT)pUrb->context;
3631 pAd = pNullContext->pAd;
3634 // Reset Null frame context flags
3635 pNullContext->IRPPending = FALSE;
3636 pNullContext->InUse = FALSE;
3637 Status = pUrb->status;
3639 // Store BulkOut PipeId
3640 BulkOutPipeId = pNullContext->BulkOutPipeId;
3641 pAd->BulkOutDataOneSecCount++;
3643 if (Status == USB_ST_NOERROR)
3645 #ifdef RALINK_28xx_QA
3646 if ((ATE_ON(pAd)) && (pAd->ate.bQATxStart == TRUE))
3648 if (pAd->ate.QID == BulkOutPipeId)
3650 // Let Rx can have a chance to break in during Tx process,
3651 // especially for loopback mode in QA ATE.
3652 // To trade off between tx performance and loopback mode integrity.
3653 /* Q : Now Rx is handled by tasklet, do we still need this delay ? */
3654 /* Ans : Even tasklet is used, Rx/Tx < 1 if we do not delay for a while right here. */
3656 pAd->ate.TxDoneCount++;
3657 pAd->RalinkCounters.KickTxCount++;
3658 ASSERT(pAd->ate.QID == 0);
3662 #endif // RALINK_28xx_QA //
3663 pAd->BulkOutComplete++;
3665 pAd->Counters8023.GoodTransmits++;
3667 /* Don't worry about the queue is empty or not. This function will check itself. */
3668 RTMPDeQueuePacket(pAd, TRUE, BulkOutPipeId, MAX_TX_PROCESS);
3670 /* In 28xx, SendTxWaitQueue ==> TxSwQueue */
3672 if (pAd->SendTxWaitQueue[BulkOutPipeId].Number > 0)
3674 RTMPDeQueuePacket(pAd, BulkOutPipeId);
3678 else // STATUS_OTHER
3680 pAd->BulkOutCompleteOther++;
3682 ATEDBGPRINT(RT_DEBUG_ERROR, ("BulkOutDataPacket Failed STATUS_OTHER = 0x%x . \n", Status));
3683 ATEDBGPRINT(RT_DEBUG_ERROR, (">>BulkOutReq=0x%lx, BulkOutComplete=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete));
3685 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
3686 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
3687 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
3688 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
3690 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
3691 /* In 28xx, RT_OID_USB_RESET_BULK_OUT ==> CMDTHREAD_RESET_BULK_OUT */
3692 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
3694 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3695 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
3696 pAd->bulkResetPipeid = BulkOutPipeId;
3697 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3704 if (atomic_read(&pAd->BulkOutRemained) > 0)
3706 atomic_dec(&pAd->BulkOutRemained);
3709 // 1st - Transmit Success
3710 OldValue = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;
3711 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart++;
3713 if (pAd->WlanCounters.TransmittedFragmentCount.u.LowPart < OldValue)
3715 pAd->WlanCounters.TransmittedFragmentCount.u.HighPart++;
3718 if(((pAd->ContinBulkOut == TRUE ) ||(atomic_read(&pAd->BulkOutRemained) > 0)) && (pAd->ate.Mode & ATE_TXFRAME))
3720 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
3724 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
3725 #ifdef RALINK_28xx_QA
3726 pAd->ate.TxStatus = 0;
3727 #endif // RALINK_28xx_QA //
3730 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3731 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
3732 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3734 // Always call Bulk routine, even reset bulk.
3735 // The protection of rest bulk should be in BulkOut routine.
3736 RTUSBKickBulkOut(pAd);
3740 ========================================================================
3742 Routine Description:
3750 ========================================================================
3752 VOID ATE_RTUSBBulkOutDataPacket(
3753 IN PRTMP_ADAPTER pAd,
3754 IN UCHAR BulkOutPipeId)
3756 PTX_CONTEXT pNullContext = &(pAd->NullContext);
3759 unsigned long IrqFlags;
3762 ASSERT(BulkOutPipeId == 0);
3764 /* Build up the frame first. */
3765 // ATESetUpFrame(pAd, 0);
3767 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3769 if (pAd->BulkOutPending[BulkOutPipeId] == TRUE)
3771 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3775 pAd->BulkOutPending[BulkOutPipeId] = TRUE;
3776 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
3778 // Increase Total transmit byte counter
3779 pAd->RalinkCounters.OneSecTransmittedByteCount += pNullContext->BulkOutSize;
3780 pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize;
3782 // Clear ATE frame bulk out flag
3783 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE);
3785 // Init Tx context descriptor
3786 pNullContext->IRPPending = TRUE;
3787 RTUSBInitTxDesc(pAd, pNullContext, BulkOutPipeId, (usb_complete_t)ATE_RTUSBBulkOutDataPacketComplete);
3788 pUrb = pNullContext->pUrb;
3790 if((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
3792 ATEDBGPRINT(RT_DEBUG_ERROR, ("ATE_RTUSBBulkOutDataPacket: Submit Tx URB failed %d\n", ret));
3802 ========================================================================
3804 Routine Description:
3812 ========================================================================
3814 VOID ATE_RTUSBCancelPendingBulkInIRP(
3815 IN PRTMP_ADAPTER pAd)
3817 PRX_CONTEXT pRxContext;
3820 ATEDBGPRINT(RT_DEBUG_TRACE, ("--->ATE_RTUSBCancelPendingBulkInIRP\n"));
3822 for ( i = 0; i < (RX_RING_SIZE); i++)
3824 pRxContext = &(pAd->RxContext[i]);
3825 if(pRxContext->IRPPending == TRUE)
3827 RTUSB_UNLINK_URB(pRxContext->pUrb);
3828 pRxContext->IRPPending = FALSE;
3829 pRxContext->InUse = FALSE;
3830 //NdisInterlockedDecrement(&pAd->PendingRx);
3835 for ( i = 0; i < (RX_RING_SIZE); i++)
3837 pRxContext = &(pAd->RxContext[i]);
3838 if(atomic_read(&pRxContext->IrpLock) == IRPLOCK_CANCELABLE)
3840 RTUSB_UNLINK_URB(pRxContext->pUrb);
3842 InterlockedExchange(&pRxContext->IrpLock, IRPLOCK_CANCE_START);
3845 ATEDBGPRINT(RT_DEBUG_TRACE, ("<---ATE_RTUSBCancelPendingBulkInIRP\n"));
3850 VOID rt_ee_read_all(PRTMP_ADAPTER pAd, USHORT *Data)
3855 for (i = 0 ; i < EEPROM_SIZE/2 ; )
3857 /* "value" is expecially for some compilers... */
3858 RT28xx_EEPROM_READ16(pAd, i*2, value);
3864 VOID rt_ee_write_all(PRTMP_ADAPTER pAd, USHORT *Data)
3869 for (i = 0 ; i < EEPROM_SIZE/2 ; )
3871 /* "value" is expecially for some compilers... */
3873 RT28xx_EEPROM_WRITE16(pAd, i*2, value);
3877 #ifdef RALINK_28xx_QA
3878 VOID ATE_QA_Statistics(
3879 IN PRTMP_ADAPTER pAd,
3880 IN PRXWI_STRUC pRxWI,
3881 IN PRT28XX_RXD_STRUC pRxD,
3882 IN PHEADER_802_11 pHeader)
3884 // update counter first
3885 if (pHeader != NULL)
3887 if (pHeader->FC.Type == BTYPE_DATA)
3892 pAd->ate.OtherData++;
3894 else if (pHeader->FC.Type == BTYPE_MGMT)
3896 if (pHeader->FC.SubType == SUBTYPE_BEACON)
3899 pAd->ate.OtherCount++;
3901 else if (pHeader->FC.Type == BTYPE_CNTL)
3903 pAd->ate.OtherCount++;
3906 pAd->ate.RSSI0 = pRxWI->RSSI0;
3907 pAd->ate.RSSI1 = pRxWI->RSSI1;
3908 pAd->ate.RSSI2 = pRxWI->RSSI2;
3909 pAd->ate.SNR0 = pRxWI->SNR0;
3910 pAd->ate.SNR1 = pRxWI->SNR1;
3913 /* command id with Cmd Type == 0x0008(for 28xx)/0x0005(for iNIC) */
3914 #define RACFG_CMD_RF_WRITE_ALL 0x0000
3915 #define RACFG_CMD_E2PROM_READ16 0x0001
3916 #define RACFG_CMD_E2PROM_WRITE16 0x0002
3917 #define RACFG_CMD_E2PROM_READ_ALL 0x0003
3918 #define RACFG_CMD_E2PROM_WRITE_ALL 0x0004
3919 #define RACFG_CMD_IO_READ 0x0005
3920 #define RACFG_CMD_IO_WRITE 0x0006
3921 #define RACFG_CMD_IO_READ_BULK 0x0007
3922 #define RACFG_CMD_BBP_READ8 0x0008
3923 #define RACFG_CMD_BBP_WRITE8 0x0009
3924 #define RACFG_CMD_BBP_READ_ALL 0x000a
3925 #define RACFG_CMD_GET_COUNTER 0x000b
3926 #define RACFG_CMD_CLEAR_COUNTER 0x000c
3928 #define RACFG_CMD_RSV1 0x000d
3929 #define RACFG_CMD_RSV2 0x000e
3930 #define RACFG_CMD_RSV3 0x000f
3932 #define RACFG_CMD_TX_START 0x0010
3933 #define RACFG_CMD_GET_TX_STATUS 0x0011
3934 #define RACFG_CMD_TX_STOP 0x0012
3935 #define RACFG_CMD_RX_START 0x0013
3936 #define RACFG_CMD_RX_STOP 0x0014
3937 #define RACFG_CMD_GET_NOISE_LEVEL 0x0015
3939 #define RACFG_CMD_ATE_START 0x0080
3940 #define RACFG_CMD_ATE_STOP 0x0081
3942 #define RACFG_CMD_ATE_START_TX_CARRIER 0x0100
3943 #define RACFG_CMD_ATE_START_TX_CONT 0x0101
3944 #define RACFG_CMD_ATE_START_TX_FRAME 0x0102
3945 #define RACFG_CMD_ATE_SET_BW 0x0103
3946 #define RACFG_CMD_ATE_SET_TX_POWER0 0x0104
3947 #define RACFG_CMD_ATE_SET_TX_POWER1 0x0105
3948 #define RACFG_CMD_ATE_SET_FREQ_OFFSET 0x0106
3949 #define RACFG_CMD_ATE_GET_STATISTICS 0x0107
3950 #define RACFG_CMD_ATE_RESET_COUNTER 0x0108
3951 #define RACFG_CMD_ATE_SEL_TX_ANTENNA 0x0109
3952 #define RACFG_CMD_ATE_SEL_RX_ANTENNA 0x010a
3953 #define RACFG_CMD_ATE_SET_PREAMBLE 0x010b
3954 #define RACFG_CMD_ATE_SET_CHANNEL 0x010c
3955 #define RACFG_CMD_ATE_SET_ADDR1 0x010d
3956 #define RACFG_CMD_ATE_SET_ADDR2 0x010e
3957 #define RACFG_CMD_ATE_SET_ADDR3 0x010f
3958 #define RACFG_CMD_ATE_SET_RATE 0x0110
3959 #define RACFG_CMD_ATE_SET_TX_FRAME_LEN 0x0111
3960 #define RACFG_CMD_ATE_SET_TX_FRAME_COUNT 0x0112
3961 #define RACFG_CMD_ATE_START_RX_FRAME 0x0113
3962 #define RACFG_CMD_ATE_E2PROM_READ_BULK 0x0114
3963 #define RACFG_CMD_ATE_E2PROM_WRITE_BULK 0x0115
3964 #define RACFG_CMD_ATE_IO_WRITE_BULK 0x0116
3965 #define RACFG_CMD_ATE_BBP_READ_BULK 0x0117
3966 #define RACFG_CMD_ATE_BBP_WRITE_BULK 0x0118
3967 #define RACFG_CMD_ATE_RF_READ_BULK 0x0119
3968 #define RACFG_CMD_ATE_RF_WRITE_BULK 0x011a
3972 #define A2Hex(_X, _p) \
3977 while (((*p >= 'a') && (*p <= 'f')) || ((*p >= 'A') && (*p <= 'F')) || ((*p >= '0') && (*p <= '9'))) \
3979 if ((*p >= 'a') && (*p <= 'f')) \
3980 _X = _X * 16 + *p - 87; \
3981 else if ((*p >= 'A') && (*p <= 'F')) \
3982 _X = _X * 16 + *p - 55; \
3983 else if ((*p >= '0') && (*p <= '9')) \
3984 _X = _X * 16 + *p - 48; \
3990 static VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len);
3991 static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len);
3992 static VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, UINT32 len);
3994 #define LEN_OF_ARG 16
3997 IN PRTMP_ADAPTER pAdapter,
3998 IN struct iwreq *wrq)
4000 unsigned short Command_Id;
4001 struct ate_racfghdr *pRaCfg;
4002 INT Status = NDIS_STATUS_SUCCESS;
4006 if((pRaCfg = kmalloc(sizeof(struct ate_racfghdr), GFP_KERNEL)) == NULL)
4012 NdisZeroMemory(pRaCfg, sizeof(struct ate_racfghdr));
4014 if (copy_from_user((PUCHAR)pRaCfg, wrq->u.data.pointer, wrq->u.data.length))
4022 Command_Id = ntohs(pRaCfg->command_id);
4024 ATEDBGPRINT(RT_DEBUG_TRACE,("\n%s: Command_Id = 0x%04x !\n", __func__, Command_Id));
4028 // We will get this command when QA starts.
4029 case RACFG_CMD_ATE_START:
4031 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START\n"));
4033 // prepare feedback as soon as we can to avoid QA timeout.
4034 pRaCfg->length = htons(2);
4035 pRaCfg->status = htons(0);
4037 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4038 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4039 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4041 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
4043 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4045 ATEDBGPRINT(RT_DEBUG_TRACE, ("copy_to_user() fail in case RACFG_CMD_ATE_START\n"));
4050 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_START is done !\n"));
4052 Set_ATE_Proc(pAdapter, "ATESTART");
4056 // We will get this command either QA is closed or ated is killed by user.
4057 case RACFG_CMD_ATE_STOP:
4061 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_STOP\n"));
4063 // Distinguish this command came from QA(via ated)
4064 // or ate daemon according to the existence of pid in payload.
4065 // No need to prepare feedback if this cmd came directly from ate daemon.
4066 pRaCfg->length = ntohs(pRaCfg->length);
4068 if (pRaCfg->length == sizeof(pAdapter->ate.AtePid))
4070 // This command came from QA.
4071 // Get the pid of ATE daemon.
4072 memcpy((UCHAR *)&pAdapter->ate.AtePid,
4073 (&pRaCfg->data[0]) - 2/* == &(pRaCfg->status) */,
4074 sizeof(pAdapter->ate.AtePid));
4076 // prepare feedback as soon as we can to avoid QA timeout.
4077 pRaCfg->length = htons(2);
4078 pRaCfg->status = htons(0);
4080 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4081 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4082 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4084 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
4086 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4088 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_STOP\n"));
4093 // kill ATE daemon when leaving ATE mode.
4094 // We must kill ATE daemon first before setting ATESTOP,
4095 // or Microsoft will report sth. wrong.
4096 ret = KILL_THREAD_PID(pAdapter->ate.AtePid, SIGTERM, 1);
4099 ATEDBGPRINT(RT_DEBUG_ERROR, ("%s: unable to signal thread\n", pAdapter->net_dev->name));
4103 // AP might have in ATE_STOP mode due to cmd from QA.
4104 if (ATE_ON(pAdapter))
4106 // Someone has killed ate daemon while QA GUI is still open.
4107 Set_ATE_Proc(pAdapter, "ATESTOP");
4108 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_AP_START is done !\n"));
4113 case RACFG_CMD_RF_WRITE_ALL:
4115 UINT32 R1, R2, R3, R4;
4118 memcpy(&R1, pRaCfg->data-2, 4);
4119 memcpy(&R2, pRaCfg->data+2, 4);
4120 memcpy(&R3, pRaCfg->data+6, 4);
4121 memcpy(&R4, pRaCfg->data+10, 4);
4122 memcpy(&channel, pRaCfg->data+14, 2);
4124 pAdapter->LatchRfRegs.R1 = ntohl(R1);
4125 pAdapter->LatchRfRegs.R2 = ntohl(R2);
4126 pAdapter->LatchRfRegs.R3 = ntohl(R3);
4127 pAdapter->LatchRfRegs.R4 = ntohl(R4);
4128 pAdapter->LatchRfRegs.Channel = ntohs(channel);
4130 RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R1);
4131 RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R2);
4132 RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R3);
4133 RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R4);
4136 pRaCfg->length = htons(2);
4137 pRaCfg->status = htons(0);
4139 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4140 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4141 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4143 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
4144 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4146 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_RF_WRITE_ALL\n"));
4151 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_RF_WRITE_ALL is done !\n"));
4156 case RACFG_CMD_E2PROM_READ16:
4158 USHORT offset, value, tmp;
4160 offset = ntohs(pRaCfg->status);
4161 /* "tmp" is expecially for some compilers... */
4162 RT28xx_EEPROM_READ16(pAdapter, offset, tmp);
4164 value = htons(value);
4166 ATEDBGPRINT(RT_DEBUG_TRACE,("EEPROM Read offset = 0x%04x, value = 0x%04x\n", offset, value));
4169 pRaCfg->length = htons(4);
4170 pRaCfg->status = htons(0);
4171 memcpy(pRaCfg->data, &value, 2);
4173 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4174 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4175 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4177 ATEDBGPRINT(RT_DEBUG_TRACE, ("sizeof(struct ate_racfghdr) = %d\n", sizeof(struct ate_racfghdr)));
4178 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
4180 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4182 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_E2PROM_READ16\n"));
4187 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_E2PROM_READ16 is done !\n"));
4192 case RACFG_CMD_E2PROM_WRITE16:
4194 USHORT offset, value;
4196 offset = ntohs(pRaCfg->status);
4197 memcpy(&value, pRaCfg->data, 2);
4198 value = ntohs(value);
4199 RT28xx_EEPROM_WRITE16(pAdapter, offset, value);
4202 pRaCfg->length = htons(2);
4203 pRaCfg->status = htons(0);
4204 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4205 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4206 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4208 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4210 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_E2PROM_WRITE16\n"));
4215 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_E2PROM_WRITE16 is done !\n"));
4220 case RACFG_CMD_E2PROM_READ_ALL:
4222 USHORT buffer[EEPROM_SIZE/2];
4224 rt_ee_read_all(pAdapter,(USHORT *)buffer);
4225 memcpy_exs(pAdapter, pRaCfg->data, (UCHAR *)buffer, EEPROM_SIZE);
4228 pRaCfg->length = htons(2+EEPROM_SIZE);
4229 pRaCfg->status = htons(0);
4230 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4231 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4232 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4234 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4236 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_E2PROM_READ_ALL\n"));
4241 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_E2PROM_READ_ALL is done !\n"));
4246 case RACFG_CMD_E2PROM_WRITE_ALL:
4248 USHORT buffer[EEPROM_SIZE/2];
4250 NdisZeroMemory((UCHAR *)buffer, EEPROM_SIZE);
4251 memcpy_exs(pAdapter, (UCHAR *)buffer, (UCHAR *)&pRaCfg->status, EEPROM_SIZE);
4252 rt_ee_write_all(pAdapter,(USHORT *)buffer);
4255 pRaCfg->length = htons(2);
4256 pRaCfg->status = htons(0);
4257 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4258 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4259 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4261 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4263 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_E2PROM_WRITE_ALL\n"));
4268 ATEDBGPRINT(RT_DEBUG_ERROR, ("RACFG_CMD_E2PROM_WRITE_ALL is done !\n"));
4274 case RACFG_CMD_IO_READ:
4279 memcpy(&offset, &pRaCfg->status, 4);
4280 offset = ntohl(offset);
4282 // We do not need the base address.
4283 // So just extract the offset out.
4284 offset &= 0x0000FFFF;
4285 RTMP_IO_READ32(pAdapter, offset, &value);
4286 value = htonl(value);
4289 pRaCfg->length = htons(6);
4290 pRaCfg->status = htons(0);
4291 memcpy(pRaCfg->data, &value, 4);
4293 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4294 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4295 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4297 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4299 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_IO_READ\n"));
4304 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_IO_READ is done !\n"));
4309 case RACFG_CMD_IO_WRITE:
4311 UINT32 offset, value;
4313 memcpy(&offset, pRaCfg->data-2, 4);
4314 memcpy(&value, pRaCfg->data+2, 4);
4316 offset = ntohl(offset);
4318 // We do not need the base address.
4319 // So just extract out the offset.
4320 offset &= 0x0000FFFF;
4321 value = ntohl(value);
4322 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_IO_WRITE: offset = %x, value = %x\n", offset, value));
4323 RTMP_IO_WRITE32(pAdapter, offset, value);
4326 pRaCfg->length = htons(2);
4327 pRaCfg->status = htons(0);
4328 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4329 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4330 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4332 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4334 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_IO_WRITE\n"));
4339 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_IO_WRITE is done !\n"));
4344 case RACFG_CMD_IO_READ_BULK:
4349 memcpy(&offset, &pRaCfg->status, 4);
4350 offset = ntohl(offset);
4352 // We do not need the base address.
4353 // So just extract the offset.
4354 offset &= 0x0000FFFF;
4355 memcpy(&len, pRaCfg->data+2, 2);
4360 ATEDBGPRINT(RT_DEBUG_TRACE,("len is too large, make it smaller\n"));
4361 pRaCfg->length = htons(2);
4362 pRaCfg->status = htons(1);
4366 RTMP_IO_READ_BULK(pAdapter, pRaCfg->data, (UCHAR *)offset, len*4);// unit in four bytes
4369 pRaCfg->length = htons(2+len*4);// unit in four bytes
4370 pRaCfg->status = htons(0);
4371 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4372 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4373 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4375 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4377 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_IO_READ_BULK\n"));
4382 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_IO_READ_BULK is done !\n"));
4387 case RACFG_CMD_BBP_READ8:
4393 offset = ntohs(pRaCfg->status);
4395 if (ATE_ON(pAdapter))
4397 ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, offset, &value);
4401 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, offset, &value);
4404 pRaCfg->length = htons(3);
4405 pRaCfg->status = htons(0);
4406 pRaCfg->data[0] = value;
4408 ATEDBGPRINT(RT_DEBUG_TRACE,("BBP value = %x\n", value));
4410 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4411 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4412 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4414 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4416 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_BBP_READ8\n"));
4421 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_BBP_READ8 is done !\n"));
4425 case RACFG_CMD_BBP_WRITE8:
4430 offset = ntohs(pRaCfg->status);
4431 memcpy(&value, pRaCfg->data, 1);
4433 if (ATE_ON(pAdapter))
4435 ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, offset, value);
4439 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, offset, value);
4442 if ((offset == BBP_R1) || (offset == BBP_R3))
4444 SyncTxRxConfig(pAdapter, offset, value);
4448 pRaCfg->length = htons(2);
4449 pRaCfg->status = htons(0);
4450 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4451 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4452 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4454 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4456 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_BBP_WRITE8\n"));
4461 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_BBP_WRITE8 is done !\n"));
4466 case RACFG_CMD_BBP_READ_ALL:
4470 for (j = 0; j < 137; j++)
4472 pRaCfg->data[j] = 0;
4474 if (ATE_ON(pAdapter))
4476 ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j]);
4480 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j]);
4485 pRaCfg->length = htons(2+137);
4486 pRaCfg->status = htons(0);
4488 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4489 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4490 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4492 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4494 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_BBP_READ_ALL\n"));
4499 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_BBP_READ_ALL is done !\n"));
4505 case RACFG_CMD_ATE_E2PROM_READ_BULK:
4509 USHORT buffer[EEPROM_SIZE/2];
4511 offset = ntohs(pRaCfg->status);
4512 memcpy(&len, pRaCfg->data, 2);
4515 rt_ee_read_all(pAdapter,(USHORT *)buffer);
4516 if (offset + len <= EEPROM_SIZE)
4517 memcpy_exs(pAdapter, pRaCfg->data, (UCHAR *)buffer+offset, len);
4519 ATEDBGPRINT(RT_DEBUG_ERROR, ("exceed EEPROM size\n"));
4522 pRaCfg->length = htons(2+len);
4523 pRaCfg->status = htons(0);
4524 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4525 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4526 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4528 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4530 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_E2PROM_READ_BULK\n"));
4535 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_E2PROM_READ_BULK is done !\n"));
4541 case RACFG_CMD_ATE_E2PROM_WRITE_BULK:
4545 USHORT buffer[EEPROM_SIZE/2];
4547 offset = ntohs(pRaCfg->status);
4548 memcpy(&len, pRaCfg->data, 2);
4551 rt_ee_read_all(pAdapter,(USHORT *)buffer);
4552 memcpy_exs(pAdapter, (UCHAR *)buffer + offset, (UCHAR *)pRaCfg->data + 2, len);
4553 rt_ee_write_all(pAdapter,(USHORT *)buffer);
4556 pRaCfg->length = htons(2);
4557 pRaCfg->status = htons(0);
4558 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4559 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4560 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4561 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4563 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_E2PROM_WRITE_BULK\n"));
4568 ATEDBGPRINT(RT_DEBUG_ERROR, ("RACFG_CMD_ATE_E2PROM_WRITE_BULK is done !\n"));
4574 case RACFG_CMD_ATE_IO_WRITE_BULK:
4576 UINT32 offset, i, value;
4579 memcpy(&offset, &pRaCfg->status, 4);
4580 offset = ntohl(offset);
4581 memcpy(&len, pRaCfg->data+2, 2);
4584 for (i = 0; i < len; i += 4)
4586 memcpy_exl(pAdapter, (UCHAR *)&value, pRaCfg->data+4+i, 4);
4587 printk("Write %x %x\n", offset + i, value);
4588 RTMP_IO_WRITE32(pAdapter, (offset +i) & 0xffff, value);
4592 pRaCfg->length = htons(2);
4593 pRaCfg->status = htons(0);
4594 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4595 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4596 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4597 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4599 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_IO_WRITE_BULK\n"));
4604 ATEDBGPRINT(RT_DEBUG_ERROR, ("RACFG_CMD_ATE_IO_WRITE_BULK is done !\n"));
4610 case RACFG_CMD_ATE_BBP_READ_BULK:
4616 offset = ntohs(pRaCfg->status);
4617 memcpy(&len, pRaCfg->data, 2);
4621 for (j = offset; j < (offset+len); j++)
4623 pRaCfg->data[j - offset] = 0;
4625 if (pAdapter->ate.Mode == ATE_STOP)
4627 RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j - offset]);
4631 ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j - offset]);
4636 pRaCfg->length = htons(2+len);
4637 pRaCfg->status = htons(0);
4638 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4639 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4640 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4642 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4644 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_BBP_READ_BULK\n"));
4649 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_BBP_READ_BULK is done !\n"));
4655 case RACFG_CMD_ATE_BBP_WRITE_BULK:
4662 offset = ntohs(pRaCfg->status);
4663 memcpy(&len, pRaCfg->data, 2);
4666 for (j = offset; j < (offset+len); j++)
4668 value = pRaCfg->data + 2 + (j - offset);
4669 if (pAdapter->ate.Mode == ATE_STOP)
4671 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j, *value);
4675 ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j, *value);
4680 pRaCfg->length = htons(2);
4681 pRaCfg->status = htons(0);
4682 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4683 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4684 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4686 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4688 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_BBP_WRITE_BULK\n"));
4693 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_BBP_WRITE_BULK is done !\n"));
4698 #ifdef CONFIG_RALINK_RT3052
4699 case RACFG_CMD_ATE_RF_READ_BULK:
4705 offset = ntohs(pRaCfg->status);
4706 memcpy(&len, pRaCfg->data, 2);
4709 for (j = offset; j < (offset+len); j++)
4711 pRaCfg->data[j - offset] = 0;
4712 RT30xxReadRFRegister(pAdapter, j, &pRaCfg->data[j - offset]);
4716 pRaCfg->length = htons(2+len);
4717 pRaCfg->status = htons(0);
4718 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4719 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4720 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4722 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4724 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_RF_READ_BULK\n"));
4729 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_RF_READ_BULK is done !\n"));
4735 case RACFG_CMD_ATE_RF_WRITE_BULK:
4742 offset = ntohs(pRaCfg->status);
4743 memcpy(&len, pRaCfg->data, 2);
4746 for (j = offset; j < (offset+len); j++)
4748 value = pRaCfg->data + 2 + (j - offset);
4749 RT30xxWriteRFRegister(pAdapter, j, *value);
4753 pRaCfg->length = htons(2);
4754 pRaCfg->status = htons(0);
4755 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4756 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4757 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4759 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4761 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_RF_WRITE_BULK\n"));
4766 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_RF_WRITE_BULK is done !\n"));
4774 case RACFG_CMD_GET_NOISE_LEVEL:
4777 INT32 buffer[3][10];/* 3 : RxPath ; 10 : no. of per rssi samples */
4779 channel = (ntohs(pRaCfg->status) & 0x00FF);
4780 CalNoiseLevel(pAdapter, channel, buffer);
4781 memcpy_exl(pAdapter, (UCHAR *)pRaCfg->data, (UCHAR *)&(buffer[0][0]), (sizeof(INT32)*3*10));
4784 pRaCfg->length = htons(2 + (sizeof(INT32)*3*10));
4785 pRaCfg->status = htons(0);
4786 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4787 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4788 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4790 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4792 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_GET_NOISE_LEVEL\n"));
4797 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_GET_NOISE_LEVEL is done !\n"));
4802 case RACFG_CMD_GET_COUNTER:
4804 memcpy_exl(pAdapter, &pRaCfg->data[0], (UCHAR *)&pAdapter->ate.U2M, 4);
4805 memcpy_exl(pAdapter, &pRaCfg->data[4], (UCHAR *)&pAdapter->ate.OtherData, 4);
4806 memcpy_exl(pAdapter, &pRaCfg->data[8], (UCHAR *)&pAdapter->ate.Beacon, 4);
4807 memcpy_exl(pAdapter, &pRaCfg->data[12], (UCHAR *)&pAdapter->ate.OtherCount, 4);
4808 memcpy_exl(pAdapter, &pRaCfg->data[16], (UCHAR *)&pAdapter->ate.TxAc0, 4);
4809 memcpy_exl(pAdapter, &pRaCfg->data[20], (UCHAR *)&pAdapter->ate.TxAc1, 4);
4810 memcpy_exl(pAdapter, &pRaCfg->data[24], (UCHAR *)&pAdapter->ate.TxAc2, 4);
4811 memcpy_exl(pAdapter, &pRaCfg->data[28], (UCHAR *)&pAdapter->ate.TxAc3, 4);
4812 memcpy_exl(pAdapter, &pRaCfg->data[32], (UCHAR *)&pAdapter->ate.TxHCCA, 4);
4813 memcpy_exl(pAdapter, &pRaCfg->data[36], (UCHAR *)&pAdapter->ate.TxMgmt, 4);
4814 memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&pAdapter->ate.RSSI0, 4);
4815 memcpy_exl(pAdapter, &pRaCfg->data[44], (UCHAR *)&pAdapter->ate.RSSI1, 4);
4816 memcpy_exl(pAdapter, &pRaCfg->data[48], (UCHAR *)&pAdapter->ate.RSSI2, 4);
4817 memcpy_exl(pAdapter, &pRaCfg->data[52], (UCHAR *)&pAdapter->ate.SNR0, 4);
4818 memcpy_exl(pAdapter, &pRaCfg->data[56], (UCHAR *)&pAdapter->ate.SNR1, 4);
4820 pRaCfg->length = htons(2+60);
4821 pRaCfg->status = htons(0);
4822 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4823 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4824 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4826 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4828 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_GET_COUNTER\n"));
4833 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_GET_COUNTER is done !\n"));
4838 case RACFG_CMD_CLEAR_COUNTER:
4840 pAdapter->ate.U2M = 0;
4841 pAdapter->ate.OtherData = 0;
4842 pAdapter->ate.Beacon = 0;
4843 pAdapter->ate.OtherCount = 0;
4844 pAdapter->ate.TxAc0 = 0;
4845 pAdapter->ate.TxAc1 = 0;
4846 pAdapter->ate.TxAc2 = 0;
4847 pAdapter->ate.TxAc3 = 0;
4848 pAdapter->ate.TxHCCA = 0;
4849 pAdapter->ate.TxMgmt = 0;
4850 pAdapter->ate.TxDoneCount = 0;
4852 pRaCfg->length = htons(2);
4853 pRaCfg->status = htons(0);
4855 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
4856 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
4857 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
4859 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
4861 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_CLEAR_COUNTER\n"));
4866 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_CLEAR_COUNTER is done !\n"));
4872 case RACFG_CMD_TX_START:
4876 UCHAR Bbp22Value = 0, Bbp24Value = 0;
4878 if ((pAdapter->ate.TxStatus != 0) && (pAdapter->ate.Mode & ATE_TXFRAME))
4880 ATEDBGPRINT(RT_DEBUG_TRACE,("Ate Tx is already running, to run next Tx, you must stop it first\n"));
4882 goto TX_START_ERROR;
4884 else if ((pAdapter->ate.TxStatus != 0) && !(pAdapter->ate.Mode & ATE_TXFRAME))
4888 while ((i++ < 10) && (pAdapter->ate.TxStatus != 0))
4890 RTMPusecDelay(5000);
4894 pAdapter->ate.TxStatus = 0;
4895 pAdapter->ate.TxDoneCount = 0;
4896 //pAdapter->ate.Repeat = 0;
4897 pAdapter->ate.bQATxStart = FALSE;
4900 // If pRaCfg->length == 0, this "RACFG_CMD_TX_START" is for Carrier test or Carrier Suppression.
4901 if (ntohs(pRaCfg->length) != 0)
4905 NdisMoveMemory(&pAdapter->ate.TxInfo, pRaCfg->data - 2, 4);
4906 #ifdef RT_BIG_ENDIAN
4907 RTMPDescriptorEndianChange((PUCHAR) &pAdapter->ate.TxInfo, TYPE_TXINFO);
4908 #endif // RT_BIG_ENDIAN //
4911 NdisMoveMemory(&pAdapter->ate.TxWI, pRaCfg->data + 2, 16);
4912 #ifdef RT_BIG_ENDIAN
4913 RTMPWIEndianChange((PUCHAR)&pAdapter->ate.TxWI, TYPE_TXWI);
4914 #endif // RT_BIG_ENDIAN //
4916 NdisMoveMemory(&pAdapter->ate.TxCount, pRaCfg->data + 18, 4);
4917 pAdapter->ate.TxCount = ntohl(pAdapter->ate.TxCount);
4919 p = (USHORT *)(&pRaCfg->data[22]);
4920 //p = pRaCfg->data + 22;
4921 // always use QID_AC_BE
4922 pAdapter->ate.QID = 0;
4923 p = (USHORT *)(&pRaCfg->data[24]);
4924 //p = pRaCfg->data + 24;
4925 pAdapter->ate.HLen = ntohs(*p);
4927 if (pAdapter->ate.HLen > 32)
4929 ATEDBGPRINT(RT_DEBUG_ERROR,("pAdapter->ate.HLen > 32\n"));
4931 goto TX_START_ERROR;
4934 NdisMoveMemory(&pAdapter->ate.Header, pRaCfg->data + 26, pAdapter->ate.HLen);
4937 pAdapter->ate.PLen = ntohs(pRaCfg->length) - (pAdapter->ate.HLen + 28);
4939 if (pAdapter->ate.PLen > 32)
4941 ATEDBGPRINT(RT_DEBUG_ERROR,("pAdapter->ate.PLen > 32\n"));
4943 goto TX_START_ERROR;
4946 NdisMoveMemory(&pAdapter->ate.Pattern, pRaCfg->data + 26 + pAdapter->ate.HLen, pAdapter->ate.PLen);
4947 pAdapter->ate.DLen = pAdapter->ate.TxWI.MPDUtotalByteCount - pAdapter->ate.HLen;
4950 ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R22, &Bbp22Value);
4956 if (pAdapter->ate.TxCount == 0)
4959 ATEDBGPRINT(RT_DEBUG_TRACE,("START TXFRAME\n"));
4960 pAdapter->ate.bQATxStart = TRUE;
4961 Set_ATE_Proc(pAdapter, "TXFRAME");
4965 case BBP22_TXCONT_OR_CARRSUPP:
4967 ATEDBGPRINT(RT_DEBUG_TRACE,("BBP22_TXCONT_OR_CARRSUPP\n"));
4968 ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, 24, &Bbp24Value);
4974 ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCONT\n"));
4975 pAdapter->ate.bQATxStart = TRUE;
4976 Set_ATE_Proc(pAdapter, "TXCONT");
4980 case BBP24_CARRSUPP:
4982 ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCARRSUPP\n"));
4983 pAdapter->ate.bQATxStart = TRUE;
4984 pAdapter->ate.Mode |= ATE_TXCARRSUPP;
4990 ATEDBGPRINT(RT_DEBUG_ERROR,("Unknown Start TX subtype !"));
4999 ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCARR\n"));
5000 pAdapter->ate.bQATxStart = TRUE;
5001 Set_ATE_Proc(pAdapter, "TXCARR");
5007 ATEDBGPRINT(RT_DEBUG_ERROR,("Unknown Start TX subtype !"));
5012 if (pAdapter->ate.bQATxStart == TRUE)
5015 pRaCfg->length = htons(2);
5016 pRaCfg->status = htons(0);
5018 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5019 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5020 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5022 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5024 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() was failed in case RACFG_CMD_TX_START\n"));
5029 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_TX_START is done !\n"));
5036 pRaCfg->length = htons(2);
5037 pRaCfg->status = htons(err);
5039 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5040 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5041 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5042 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5044 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_TX_START\n"));
5049 ATEDBGPRINT(RT_DEBUG_TRACE, ("feedback of TX_START_ERROR is done !\n"));
5054 case RACFG_CMD_GET_TX_STATUS:
5059 pRaCfg->length = htons(6);
5060 pRaCfg->status = htons(0);
5061 count = htonl(pAdapter->ate.TxDoneCount);
5062 NdisMoveMemory(pRaCfg->data, &count, 4);
5063 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5064 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5065 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5067 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5069 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_GET_TX_STATUS\n"));
5074 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_GET_TX_STATUS is done !\n"));
5079 case RACFG_CMD_TX_STOP:
5081 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_TX_STOP\n"));
5083 Set_ATE_Proc(pAdapter, "TXSTOP");
5086 pRaCfg->length = htons(2);
5087 pRaCfg->status = htons(0);
5088 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5089 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5090 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5092 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5094 ATEDBGPRINT(RT_DEBUG_TRACE, ("copy_to_user() fail in case RACFG_CMD_TX_STOP\n"));
5099 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_TX_STOP is done !\n"));
5104 case RACFG_CMD_RX_START:
5106 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_START\n"));
5108 pAdapter->ate.bQARxStart = TRUE;
5109 Set_ATE_Proc(pAdapter, "RXFRAME");
5112 pRaCfg->length = htons(2);
5113 pRaCfg->status = htons(0);
5114 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5115 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5116 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5118 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5120 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_RX_START\n"));
5125 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_RX_START is done !\n"));
5130 case RACFG_CMD_RX_STOP:
5132 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_STOP\n"));
5134 Set_ATE_Proc(pAdapter, "RXSTOP");
5137 pRaCfg->length = htons(2);
5138 pRaCfg->status = htons(0);
5139 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5140 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5141 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5143 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5145 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_RX_STOP\n"));
5150 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_RX_STOP is done !\n"));
5155 /* The following cases are for new ATE GUI(not QA). */
5156 /*==================================================*/
5157 case RACFG_CMD_ATE_START_TX_CARRIER:
5159 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_CARRIER\n"));
5161 Set_ATE_Proc(pAdapter, "TXCARR");
5163 pRaCfg->length = htons(2);
5164 pRaCfg->status = htons(0);
5166 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5167 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5168 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5170 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
5172 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5174 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_START_TX_CARRIER\n"));
5179 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_START_TX_CARRIER is done !\n"));
5184 case RACFG_CMD_ATE_START_TX_CONT:
5186 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_CONT\n"));
5188 Set_ATE_Proc(pAdapter, "TXCONT");
5190 pRaCfg->length = htons(2);
5191 pRaCfg->status = htons(0);
5193 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5194 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5195 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5197 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
5199 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5201 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_START_TX_CONT\n"));
5206 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_START_TX_CONT is done !\n"));
5211 case RACFG_CMD_ATE_START_TX_FRAME:
5213 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_FRAME\n"));
5215 Set_ATE_Proc(pAdapter, "TXFRAME");
5217 pRaCfg->length = htons(2);
5218 pRaCfg->status = htons(0);
5220 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5221 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5222 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5224 ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", wrq->u.data.length));
5226 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5228 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_START_TX_FRAME\n"));
5233 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_START_TX_FRAME is done !\n"));
5238 case RACFG_CMD_ATE_SET_BW:
5241 UCHAR str[LEN_OF_ARG];
5243 NdisZeroMemory(str, LEN_OF_ARG);
5245 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_BW\n"));
5247 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5248 value = ntohs(value);
5249 sprintf((PCHAR)str, "%d", value);
5251 Set_ATE_TX_BW_Proc(pAdapter, str);
5254 pRaCfg->length = htons(2);
5255 pRaCfg->status = htons(0);
5256 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5257 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5258 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5260 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5262 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_BW\n"));
5267 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_BW is done !\n"));
5272 case RACFG_CMD_ATE_SET_TX_POWER0:
5275 UCHAR str[LEN_OF_ARG];
5277 NdisZeroMemory(str, LEN_OF_ARG);
5279 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_POWER0\n"));
5281 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5282 value = ntohs(value);
5283 sprintf((PCHAR)str, "%d", value);
5284 Set_ATE_TX_POWER0_Proc(pAdapter, str);
5287 pRaCfg->length = htons(2);
5288 pRaCfg->status = htons(0);
5289 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5290 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5291 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5293 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5295 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_TX_POWER0\n"));
5300 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_TX_POWER0 is done !\n"));
5305 case RACFG_CMD_ATE_SET_TX_POWER1:
5308 UCHAR str[LEN_OF_ARG];
5310 NdisZeroMemory(str, LEN_OF_ARG);
5312 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_POWER1\n"));
5314 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5315 value = ntohs(value);
5316 sprintf((PCHAR)str, "%d", value);
5317 Set_ATE_TX_POWER1_Proc(pAdapter, str);
5320 pRaCfg->length = htons(2);
5321 pRaCfg->status = htons(0);
5322 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5323 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5324 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5326 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5328 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_TX_POWER1\n"));
5333 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_TX_POWER1 is done !\n"));
5338 case RACFG_CMD_ATE_SET_FREQ_OFFSET:
5341 UCHAR str[LEN_OF_ARG];
5343 NdisZeroMemory(str, LEN_OF_ARG);
5345 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_FREQ_OFFSET\n"));
5347 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5348 value = ntohs(value);
5349 sprintf((PCHAR)str, "%d", value);
5350 Set_ATE_TX_FREQOFFSET_Proc(pAdapter, str);
5353 pRaCfg->length = htons(2);
5354 pRaCfg->status = htons(0);
5355 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5356 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5357 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5359 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5361 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_FREQ_OFFSET\n"));
5366 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_FREQ_OFFSET is done !\n"));
5371 case RACFG_CMD_ATE_GET_STATISTICS:
5373 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_GET_STATISTICS\n"));
5375 memcpy_exl(pAdapter, &pRaCfg->data[0], (UCHAR *)&pAdapter->ate.TxDoneCount, 4);
5376 memcpy_exl(pAdapter, &pRaCfg->data[4], (UCHAR *)&pAdapter->WlanCounters.RetryCount.u.LowPart, 4);
5377 memcpy_exl(pAdapter, &pRaCfg->data[8], (UCHAR *)&pAdapter->WlanCounters.FailedCount.u.LowPart, 4);
5378 memcpy_exl(pAdapter, &pRaCfg->data[12], (UCHAR *)&pAdapter->WlanCounters.RTSSuccessCount.u.LowPart, 4);
5379 memcpy_exl(pAdapter, &pRaCfg->data[16], (UCHAR *)&pAdapter->WlanCounters.RTSFailureCount.u.LowPart, 4);
5380 memcpy_exl(pAdapter, &pRaCfg->data[20], (UCHAR *)&pAdapter->WlanCounters.ReceivedFragmentCount.QuadPart, 4);
5381 memcpy_exl(pAdapter, &pRaCfg->data[24], (UCHAR *)&pAdapter->WlanCounters.FCSErrorCount.u.LowPart, 4);
5382 memcpy_exl(pAdapter, &pRaCfg->data[28], (UCHAR *)&pAdapter->Counters8023.RxNoBuffer, 4);
5383 memcpy_exl(pAdapter, &pRaCfg->data[32], (UCHAR *)&pAdapter->WlanCounters.FrameDuplicateCount.u.LowPart, 4);
5384 memcpy_exl(pAdapter, &pRaCfg->data[36], (UCHAR *)&pAdapter->RalinkCounters.OneSecFalseCCACnt, 4);
5386 if (pAdapter->ate.RxAntennaSel == 0)
5392 RSSI0 = (INT32)(pAdapter->ate.LastRssi0 - pAdapter->BbpRssiToDbmDelta);
5393 RSSI1 = (INT32)(pAdapter->ate.LastRssi1 - pAdapter->BbpRssiToDbmDelta);
5394 RSSI2 = (INT32)(pAdapter->ate.LastRssi2 - pAdapter->BbpRssiToDbmDelta);
5395 memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4);
5396 memcpy_exl(pAdapter, &pRaCfg->data[44], (UCHAR *)&RSSI1, 4);
5397 memcpy_exl(pAdapter, &pRaCfg->data[48], (UCHAR *)&RSSI2, 4);
5398 pRaCfg->length = htons(2+52);
5404 RSSI0 = (INT32)(pAdapter->ate.LastRssi0 - pAdapter->BbpRssiToDbmDelta);
5405 memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4);
5406 pRaCfg->length = htons(2+44);
5408 pRaCfg->status = htons(0);
5409 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5410 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5411 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5413 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5415 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_GET_STATISTICS\n"));
5420 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_GET_STATISTICS is done !\n"));
5425 case RACFG_CMD_ATE_RESET_COUNTER:
5428 UCHAR str[LEN_OF_ARG];
5430 NdisZeroMemory(str, LEN_OF_ARG);
5432 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_RESET_COUNTER\n"));
5434 sprintf((PCHAR)str, "%d", value);
5435 Set_ResetStatCounter_Proc(pAdapter, str);
5437 pAdapter->ate.TxDoneCount = 0;
5439 pRaCfg->length = htons(2);
5440 pRaCfg->status = htons(0);
5442 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5443 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5444 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5446 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5448 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_RESET_COUNTER\n"));
5453 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_RESET_COUNTER is done !\n"));
5459 case RACFG_CMD_ATE_SEL_TX_ANTENNA:
5462 UCHAR str[LEN_OF_ARG];
5464 NdisZeroMemory(str, LEN_OF_ARG);
5466 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SEL_TX_ANTENNA\n"));
5468 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5469 value = ntohs(value);
5470 sprintf((PCHAR)str, "%d", value);
5471 Set_ATE_TX_Antenna_Proc(pAdapter, str);
5474 pRaCfg->length = htons(2);
5475 pRaCfg->status = htons(0);
5476 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5477 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5478 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5480 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5482 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SEL_TX_ANTENNA\n"));
5487 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SEL_TX_ANTENNA is done !\n"));
5492 case RACFG_CMD_ATE_SEL_RX_ANTENNA:
5495 UCHAR str[LEN_OF_ARG];
5497 NdisZeroMemory(str, LEN_OF_ARG);
5499 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SEL_RX_ANTENNA\n"));
5501 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5502 value = ntohs(value);
5503 sprintf((PCHAR)str, "%d", value);
5504 Set_ATE_RX_Antenna_Proc(pAdapter, str);
5507 pRaCfg->length = htons(2);
5508 pRaCfg->status = htons(0);
5509 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5510 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5511 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5513 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5515 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SEL_RX_ANTENNA\n"));
5520 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SEL_RX_ANTENNA is done !\n"));
5525 case RACFG_CMD_ATE_SET_PREAMBLE:
5528 UCHAR str[LEN_OF_ARG];
5530 NdisZeroMemory(str, LEN_OF_ARG);
5532 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_PREAMBLE\n"));
5534 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5535 value = ntohs(value);
5536 sprintf((PCHAR)str, "%d", value);
5537 Set_ATE_TX_MODE_Proc(pAdapter, str);
5540 pRaCfg->length = htons(2);
5541 pRaCfg->status = htons(0);
5542 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5543 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5544 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5546 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5548 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_PREAMBLE\n"));
5553 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_PREAMBLE is done !\n"));
5558 case RACFG_CMD_ATE_SET_CHANNEL:
5561 UCHAR str[LEN_OF_ARG];
5563 NdisZeroMemory(str, LEN_OF_ARG);
5565 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_CHANNEL\n"));
5567 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5568 value = ntohs(value);
5569 sprintf((PCHAR)str, "%d", value);
5570 Set_ATE_CHANNEL_Proc(pAdapter, str);
5573 pRaCfg->length = htons(2);
5574 pRaCfg->status = htons(0);
5575 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5576 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5577 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5579 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5581 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_CHANNEL\n"));
5586 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_CHANNEL is done !\n"));
5591 case RACFG_CMD_ATE_SET_ADDR1:
5593 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR1\n"));
5595 // Addr is an array of UCHAR,
5596 // so no need to perform endian swap.
5597 memcpy(pAdapter->ate.Addr1, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);
5600 pRaCfg->length = htons(2);
5601 pRaCfg->status = htons(0);
5602 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5603 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5604 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5606 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5608 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_ADDR1\n"));
5613 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_ADDR1 is done !\n (ADDR1 = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAdapter->ate.Addr1[0],
5614 pAdapter->ate.Addr1[1], pAdapter->ate.Addr1[2], pAdapter->ate.Addr1[3], pAdapter->ate.Addr1[4], pAdapter->ate.Addr1[5]));
5619 case RACFG_CMD_ATE_SET_ADDR2:
5621 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR2\n"));
5623 // Addr is an array of UCHAR,
5624 // so no need to perform endian swap.
5625 memcpy(pAdapter->ate.Addr2, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);
5628 pRaCfg->length = htons(2);
5629 pRaCfg->status = htons(0);
5630 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5631 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5632 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5634 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5636 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_ADDR2\n"));
5641 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_ADDR2 is done !\n (ADDR2 = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAdapter->ate.Addr2[0],
5642 pAdapter->ate.Addr2[1], pAdapter->ate.Addr2[2], pAdapter->ate.Addr2[3], pAdapter->ate.Addr2[4], pAdapter->ate.Addr2[5]));
5647 case RACFG_CMD_ATE_SET_ADDR3:
5649 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR3\n"));
5651 // Addr is an array of UCHAR,
5652 // so no need to perform endian swap.
5653 memcpy(pAdapter->ate.Addr3, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN);
5656 pRaCfg->length = htons(2);
5657 pRaCfg->status = htons(0);
5658 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5659 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5660 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5662 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5664 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_ADDR3\n"));
5669 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_ADDR3 is done !\n (ADDR3 = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAdapter->ate.Addr3[0],
5670 pAdapter->ate.Addr3[1], pAdapter->ate.Addr3[2], pAdapter->ate.Addr3[3], pAdapter->ate.Addr3[4], pAdapter->ate.Addr3[5]));
5675 case RACFG_CMD_ATE_SET_RATE:
5678 UCHAR str[LEN_OF_ARG];
5680 NdisZeroMemory(str, LEN_OF_ARG);
5682 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_RATE\n"));
5684 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5685 value = ntohs(value);
5686 sprintf((PCHAR)str, "%d", value);
5687 Set_ATE_TX_MCS_Proc(pAdapter, str);
5690 pRaCfg->length = htons(2);
5691 pRaCfg->status = htons(0);
5692 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5693 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5694 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5696 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5698 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_RATE\n"));
5703 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_RATE is done !\n"));
5708 case RACFG_CMD_ATE_SET_TX_FRAME_LEN:
5711 UCHAR str[LEN_OF_ARG];
5713 NdisZeroMemory(str, LEN_OF_ARG);
5715 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_FRAME_LEN\n"));
5717 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5718 value = ntohs(value);
5719 sprintf((PCHAR)str, "%d", value);
5720 Set_ATE_TX_LENGTH_Proc(pAdapter, str);
5723 pRaCfg->length = htons(2);
5724 pRaCfg->status = htons(0);
5725 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5726 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5727 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5729 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5731 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_TX_FRAME_LEN\n"));
5736 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_TX_FRAME_LEN is done !\n"));
5741 case RACFG_CMD_ATE_SET_TX_FRAME_COUNT:
5744 UCHAR str[LEN_OF_ARG];
5746 NdisZeroMemory(str, LEN_OF_ARG);
5748 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_FRAME_COUNT\n"));
5750 memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2);
5751 value = ntohs(value);
5753 sprintf((PCHAR)str, "%d", value);
5754 Set_ATE_TX_COUNT_Proc(pAdapter, str);
5758 pRaCfg->length = htons(2);
5759 pRaCfg->status = htons(0);
5760 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5761 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5762 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5764 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5766 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_SET_TX_FRAME_COUNT\n"));
5771 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_SET_TX_FRAME_COUNT is done !\n"));
5776 case RACFG_CMD_ATE_START_RX_FRAME:
5778 ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_START\n"));
5780 Set_ATE_Proc(pAdapter, "RXFRAME");
5783 pRaCfg->length = htons(2);
5784 pRaCfg->status = htons(0);
5785 wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
5786 + sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length)
5787 + sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
5789 if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
5791 ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_RX_START\n"));
5796 ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_RX_START is done !\n"));
5803 ASSERT(pRaCfg != NULL);
5811 VOID BubbleSort(INT32 n, INT32 a[])
5815 for (k = n-1; k>0; k--)
5817 for (j = 0; j<k; j++)
5829 VOID CalNoiseLevel(PRTMP_ADAPTER pAd, UCHAR channel, INT32 RSSI[3][10])
5831 INT32 RSSI0, RSSI1, RSSI2;
5832 CHAR Rssi0Offset, Rssi1Offset, Rssi2Offset;
5833 UCHAR BbpR50Rssi0 = 0, BbpR51Rssi1 = 0, BbpR52Rssi2 = 0;
5834 UCHAR Org_BBP66value = 0, Org_BBP69value = 0, Org_BBP70value = 0, data = 0;
5835 USHORT LNA_Gain = 0;
5837 UCHAR Org_Channel = pAd->ate.Channel;
5838 USHORT GainValue = 0, OffsetValue = 0;
5840 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &Org_BBP66value);
5841 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R69, &Org_BBP69value);
5842 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R70, &Org_BBP70value);
5844 //**********************************************************************
5845 // Read the value of LNA gain and Rssi offset
5846 //**********************************************************************
5847 RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, GainValue);
5852 LNA_Gain = GainValue & 0x00FF;
5854 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, OffsetValue);
5855 Rssi0Offset = OffsetValue & 0x00FF;
5856 Rssi1Offset = (OffsetValue & 0xFF00) >> 8;
5857 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_BG_OFFSET + 2)/* 0x48 */, OffsetValue);
5858 Rssi2Offset = OffsetValue & 0x00FF;
5862 LNA_Gain = (GainValue & 0xFF00) >> 8;
5864 RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, OffsetValue);
5865 Rssi0Offset = OffsetValue & 0x00FF;
5866 Rssi1Offset = (OffsetValue & 0xFF00) >> 8;
5867 RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET + 2)/* 0x4C */, OffsetValue);
5868 Rssi2Offset = OffsetValue & 0x00FF;
5870 //**********************************************************************
5872 pAd->ate.Channel = channel;
5873 ATEAsicSwitchChannel(pAd);
5877 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, data);
5879 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, data);
5881 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, data);
5885 pAd->ate.bQARxStart = TRUE;
5886 Set_ATE_Proc(pAd, "RXFRAME");
5890 for (j = 0; j < 10; j++)
5892 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R50, &BbpR50Rssi0);
5893 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R51, &BbpR51Rssi1);
5894 ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R52, &BbpR52Rssi2);
5899 if (BbpR50Rssi0 == 0)
5905 RSSI0 = (INT32)(-12 - BbpR50Rssi0 - LNA_Gain - Rssi0Offset);
5909 if ( pAd->Antenna.field.RxPath >= 2 ) // 2R
5912 if (BbpR51Rssi1 == 0)
5918 RSSI1 = (INT32)(-12 - BbpR51Rssi1 - LNA_Gain - Rssi1Offset);
5923 if ( pAd->Antenna.field.RxPath >= 3 ) // 3R
5926 if (BbpR52Rssi2 == 0)
5929 RSSI2 = (INT32)(-12 - BbpR52Rssi2 - LNA_Gain - Rssi2Offset);
5936 Set_ATE_Proc(pAd, "RXSTOP");
5940 #if 0// Debug Message................
5941 ate_print("\n**********************************************************\n");
5942 ate_print("Noise Level: Channel %d\n", channel);
5943 ate_print("RSSI0 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5944 RSSI[0][0], RSSI[0][1], RSSI[0][2],
5945 RSSI[0][3], RSSI[0][4], RSSI[0][5],
5946 RSSI[0][6], RSSI[0][7], RSSI[0][8],
5948 if ( pAd->Antenna.field.RxPath >= 2 ) // 2R
5950 ate_print("RSSI1 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5951 RSSI[1][0], RSSI[1][1], RSSI[1][2],
5952 RSSI[1][3], RSSI[1][4], RSSI[1][5],
5953 RSSI[1][6], RSSI[1][7], RSSI[1][8],
5956 if ( pAd->Antenna.field.RxPath >= 3 ) // 3R
5958 ate_print("RSSI2 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5959 RSSI[2][0], RSSI[2][1], RSSI[2][2],
5960 RSSI[2][3], RSSI[2][4], RSSI[2][5],
5961 RSSI[2][6], RSSI[2][7], RSSI[2][8],
5965 BubbleSort(10, RSSI[0]); // 1R
5967 if ( pAd->Antenna.field.RxPath >= 2 ) // 2R
5969 BubbleSort(10, RSSI[1]);
5972 if ( pAd->Antenna.field.RxPath >= 3 ) // 3R
5974 BubbleSort(10, RSSI[2]);
5977 #if 0// Debug Message................
5978 ate_print("\nAfter Sorting....Channel %d\n", channel);
5979 ate_print("RSSI0 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5980 RSSI[0][0], RSSI[0][1], RSSI[0][2],
5981 RSSI[0][3], RSSI[0][4], RSSI[0][5],
5982 RSSI[0][6], RSSI[0][7], RSSI[0][8],
5984 if ( pAd->Antenna.field.RxPath >= 2 ) // 2R
5986 ate_print("RSSI1 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5987 RSSI[1][0], RSSI[1][1], RSSI[1][2],
5988 RSSI[1][3], RSSI[1][4], RSSI[1][5],
5989 RSSI[1][6], RSSI[1][7], RSSI[1][8],
5992 if ( pAd->Antenna.field.RxPath >= 3 ) // 3R
5994 ate_print("RSSI2 = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n",
5995 RSSI[2][0], RSSI[2][1], RSSI[2][2],
5996 RSSI[2][3], RSSI[2][4], RSSI[2][5],
5997 RSSI[2][6], RSSI[2][7], RSSI[2][8],
6000 ate_print("**********************************************************\n");
6004 pAd->ate.Channel = Org_Channel;
6005 ATEAsicSwitchChannel(pAd);
6007 // Restore original value
6008 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, Org_BBP66value);
6009 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, Org_BBP69value);
6010 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, Org_BBP70value);
6015 BOOLEAN SyncTxRxConfig(PRTMP_ADAPTER pAd, USHORT offset, UCHAR value)
6017 UCHAR tmp = 0, bbp_data = 0;
6021 ATE_BBP_IO_READ8_BY_REG_ID(pAd, offset, &bbp_data);
6025 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, offset, &bbp_data);
6029 ASSERT(bbp_data == value);
6034 /* Need to sync. tx configuration with legacy ATE. */
6035 tmp = (bbp_data & ((1 << 4) | (1 << 3))/* 0x18 */) >> 3;
6038 /* The BBP R1 bit[4:3] = 2 :: Both DACs will be used by QA. */
6041 pAd->ate.TxAntennaSel = 0;
6043 /* The BBP R1 bit[4:3] = 0 :: DAC 0 will be used by QA. */
6046 pAd->ate.TxAntennaSel = 1;
6048 /* The BBP R1 bit[4:3] = 1 :: DAC 1 will be used by QA. */
6051 pAd->ate.TxAntennaSel = 2;
6054 DBGPRINT(RT_DEBUG_TRACE, ("%s -- Sth. wrong! : return FALSE; \n", __func__));
6057 break;/* case BBP_R1 */
6060 /* Need to sync. rx configuration with legacy ATE. */
6061 tmp = (bbp_data & ((1 << 1) | (1 << 0))/* 0x03 */);
6064 /* The BBP R3 bit[1:0] = 3 :: All ADCs will be used by QA. */
6067 pAd->ate.RxAntennaSel = 0;
6069 /* The BBP R3 bit[1:0] = 0 :: ADC 0 will be used by QA, */
6070 /* unless the BBP R3 bit[4:3] = 2 */
6073 pAd->ate.RxAntennaSel = 1;
6074 tmp = ((bbp_data & ((1 << 4) | (1 << 3))/* 0x03 */) >> 3);
6077 /* Default : All ADCs will be used by QA */
6078 pAd->ate.RxAntennaSel = 0;
6081 /* The BBP R3 bit[1:0] = 1 :: ADC 1 will be used by QA. */
6084 pAd->ate.RxAntennaSel = 2;
6086 /* The BBP R3 bit[1:0] = 2 :: ADC 2 will be used by QA. */
6089 pAd->ate.RxAntennaSel = 3;
6092 DBGPRINT(RT_DEBUG_ERROR, ("%s -- Impossible! : return FALSE; \n", __func__));
6095 break;/* case BBP_R3 */
6098 DBGPRINT(RT_DEBUG_ERROR, ("%s -- Sth. wrong! : return FALSE; \n", __func__));
6105 static VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len)
6112 pDst = (ULONG *) dst;
6113 pSrc = (ULONG *) src;
6115 for (i = 0 ; i < (len/4); i++)
6117 /* For alignment issue, we need a variable "Value". */
6118 memmove(&Value, pSrc, 4);
6119 Value = htonl(Value);
6120 memmove(pDst, &Value, 4);
6126 /* wish that it will never reach here */
6127 memmove(&Value, pSrc, (len % 4));
6128 Value = htonl(Value);
6129 memmove(pDst, &Value, (len % 4));
6133 static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len)
6141 for (i = 0; i < (len/2); i++)
6143 memmove(pDst, pSrc, 2);
6144 *((USHORT *)pDst) = htons(*((USHORT *)pDst));
6151 memmove(pDst, pSrc, 1);
6155 static VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, UINT32 len)
6158 UINT32 *pDst, *pSrc;
6160 pDst = (UINT32 *) dst;
6161 pSrc = (UINT32 *) src;
6163 for (i = 0 ; i < (len/4); i++)
6165 RTMP_IO_READ32(pAd, (ULONG)pSrc, &Value);
6166 Value = htonl(Value);
6167 memmove(pDst, &Value, 4);
6176 /* These work only when RALINK_ATE is defined */
6177 INT Set_TxStart_Proc(
6178 IN PRTMP_ADAPTER pAd,
6181 ULONG value = simple_strtol(arg, 0, 10);
6182 UCHAR buffer[26] = {0x88, 0x02, 0x2c, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x00, 0x55, 0x44, 0x33, 0x22, 0x11, 0xc0, 0x22, 0x00, 0x00};
6185 if (pAd->ate.TxStatus != 0)
6188 pAd->ate.TxInfo = 0x04000000;
6189 bzero(&pAd->ate.TxWI, sizeof(TXWI_STRUC));
6190 pAd->ate.TxWI.PHYMODE = 0;// MODE_CCK
6191 pAd->ate.TxWI.MPDUtotalByteCount = 1226;
6192 pAd->ate.TxWI.MCS = 3;
6193 //pAd->ate.Mode = ATE_START;
6194 pAd->ate.Mode |= ATE_TXFRAME;
6195 pAd->ate.TxCount = value;
6199 pAd->ate.DLen = 1200;
6200 memcpy(pAd->ate.Header, buffer, 26);
6201 pAd->ate.bQATxStart = TRUE;
6202 //pObj = (POS_COOKIE) pAd->OS_Cookie;
6203 //tasklet_hi_schedule(&pObj->AteTxTask);
6206 #endif /* end of #if 0 */
6208 INT Set_TxStop_Proc(
6209 IN PRTMP_ADAPTER pAd,
6212 ATEDBGPRINT(RT_DEBUG_TRACE,("Set_TxStop_Proc\n"));
6214 if (Set_ATE_Proc(pAd, "TXSTOP"))
6224 INT Set_RxStop_Proc(
6225 IN PRTMP_ADAPTER pAd,
6228 ATEDBGPRINT(RT_DEBUG_TRACE,("Set_RxStop_Proc\n"));
6230 if (Set_ATE_Proc(pAd, "RXSTOP"))
6241 INT Set_EEWrite_Proc(
6242 IN PRTMP_ADAPTER pAd,
6245 USHORT offset = 0, value;
6248 while((*p2 != ':') && (*p2 != '\0'))
6256 A2Hex(value, p2+ 1);
6263 if (offset >= EEPROM_SIZE)
6265 ate_print("Offset can not exceed EEPROM_SIZE( == 0x%04x)\n", EEPROM_SIZE);
6269 RTMP_EEPROM_WRITE16(pAd, offset, value);
6274 INT Set_BBPRead_Proc(
6275 IN PRTMP_ADAPTER pAd,
6278 UCHAR value = 0, offset;
6284 ATE_BBP_IO_READ8_BY_REG_ID(pAd, offset, &value);
6288 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, offset, &value);
6291 ate_print("%x\n", value);
6297 INT Set_BBPWrite_Proc(
6298 IN PRTMP_ADAPTER pAd,
6305 while((*p2 != ':') && (*p2 != '\0'))
6313 A2Hex(value, p2+ 1);
6322 ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value);
6326 RTNP_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value);
6332 INT Set_RFWrite_Proc(
6333 IN PRTMP_ADAPTER pAd,
6337 ULONG R1, R2, R3, R4;
6341 while((*p2 != ':') && (*p2 != '\0'))
6351 while((*p3 != ':') && (*p3 != '\0'))
6361 while((*p4 != ':') && (*p4 != '\0'))
6375 RTMP_RF_IO_WRITE32(pAd, R1);
6376 RTMP_RF_IO_WRITE32(pAd, R2);
6377 RTMP_RF_IO_WRITE32(pAd, R3);
6378 RTMP_RF_IO_WRITE32(pAd, R4);
6382 #endif // end of #if 0 //
6383 #endif // RALINK_28xx_QA //
6385 #endif // RALINK_ATE //