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 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 Name Date Modification logs
36 Paul Lin 06-25-2004 created
42 #include "../rt_config.h"
46 ========================================================================
48 Routine Description: NIC initialization complete
58 ========================================================================
61 static NTSTATUS RTUSBFirmwareRun(
66 Status = RTUSB_VendorRequest(
68 USBD_TRANSFER_DIRECTION_OUT,
69 DEVICE_VENDOR_REQUEST_OUT,
82 ========================================================================
84 Routine Description: Write Firmware to NIC.
94 ========================================================================
96 NTSTATUS RTUSBFirmwareWrite(
106 Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg);
110 RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen);
112 Status = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff);
113 Status = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff);
114 Status = RTUSBFirmwareRun(pAd);
116 //2008/11/28:KH add to fix the dead rf frequency offset bug<--
117 RTMPusecDelay(10000);
118 RTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0);
119 AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00); //reset rf by MCU supported by new firmware
120 //2008/11/28:KH add to fix the dead rf frequency offset bug-->
126 NTSTATUS RTUSBVenderReset(
127 IN PRTMP_ADAPTER pAd)
130 DBGPRINT_RAW(RT_DEBUG_ERROR, ("-->RTUSBVenderReset\n"));
131 Status = RTUSB_VendorRequest(
133 USBD_TRANSFER_DIRECTION_OUT,
134 DEVICE_VENDOR_REQUEST_OUT,
141 DBGPRINT_RAW(RT_DEBUG_ERROR, ("<--RTUSBVenderReset\n"));
145 ========================================================================
147 Routine Description: Read various length data from RT2573
157 ========================================================================
159 NTSTATUS RTUSBMultiRead(
160 IN PRTMP_ADAPTER pAd,
167 Status = RTUSB_VendorRequest(
169 (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),
170 DEVICE_VENDOR_REQUEST_IN,
181 ========================================================================
183 Routine Description: Write various length data to RT2573
193 ========================================================================
195 NTSTATUS RTUSBMultiWrite_OneByte(
196 IN PRTMP_ADAPTER pAd,
202 // TODO: In 2870, use this funciton carefully cause it's not stable.
203 Status = RTUSB_VendorRequest(
205 USBD_TRANSFER_DIRECTION_OUT,
206 DEVICE_VENDOR_REQUEST_OUT,
216 NTSTATUS RTUSBMultiWrite(
217 IN PRTMP_ADAPTER pAd,
225 USHORT index = 0,Value;
233 Value =(USHORT)( *pSrc | (*(pSrc + 1) << 8));
234 Status = RTUSBSingleWrite(pAd,Offset + index,Value);
244 NTSTATUS RTUSBSingleWrite(
245 IN RTMP_ADAPTER *pAd,
251 Status = RTUSB_VendorRequest(
253 USBD_TRANSFER_DIRECTION_OUT,
254 DEVICE_VENDOR_REQUEST_OUT,
267 ========================================================================
269 Routine Description: Read 32-bit MAC register
279 ========================================================================
281 NTSTATUS RTUSBReadMACRegister(
282 IN PRTMP_ADAPTER pAd,
289 Status = RTUSB_VendorRequest(
291 (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),
292 DEVICE_VENDOR_REQUEST_IN,
299 *pValue = le2cpu32(localVal);
303 *pValue = 0xffffffff;
310 ========================================================================
312 Routine Description: Write 32-bit MAC register
322 ========================================================================
324 NTSTATUS RTUSBWriteMACRegister(
325 IN PRTMP_ADAPTER pAd,
334 Status = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff));
335 Status = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16));
343 ========================================================================
345 Routine Description: Read 8-bit BBP register
355 ========================================================================
357 NTSTATUS RTUSBReadBBPRegister(
358 IN PRTMP_ADAPTER pAd,
362 BBP_CSR_CFG_STRUC BbpCsr;
366 // Verify the busy condition
369 status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
372 if (!(BbpCsr.field.Busy == BUSY))
375 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBReadBBPRegister(BBP_CSR_CFG_1):retry count=%d!\n", i));
377 }while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
379 if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
382 // Read failed then Return Default value.
384 *pValue = pAd->BbpWriteLatch[Id];
386 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
387 return STATUS_UNSUCCESSFUL;
390 // Prepare for write material
392 BbpCsr.field.fRead = 1;
393 BbpCsr.field.Busy = 1;
394 BbpCsr.field.RegNum = Id;
395 RTUSBWriteMACRegister(pAd, BBP_CSR_CFG, BbpCsr.word);
398 // Verify the busy condition
401 status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
404 if (!(BbpCsr.field.Busy == BUSY))
406 *pValue = (UCHAR)BbpCsr.field.Value;
410 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBReadBBPRegister(BBP_CSR_CFG_2):retry count=%d!\n", i));
412 }while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
414 if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
417 // Read failed then Return Default value.
419 *pValue = pAd->BbpWriteLatch[Id];
421 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
422 return STATUS_UNSUCCESSFUL;
425 return STATUS_SUCCESS;
430 ========================================================================
432 Routine Description: Write 8-bit BBP register
442 ========================================================================
444 NTSTATUS RTUSBWriteBBPRegister(
445 IN PRTMP_ADAPTER pAd,
449 BBP_CSR_CFG_STRUC BbpCsr;
452 // Verify the busy condition
455 status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);
458 if (!(BbpCsr.field.Busy == BUSY))
461 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBWriteBBPRegister(BBP_CSR_CFG):retry count=%d!\n", i));
464 while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
466 if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
468 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
469 return STATUS_UNSUCCESSFUL;
472 // Prepare for write material
474 BbpCsr.field.fRead = 0;
475 BbpCsr.field.Value = Value;
476 BbpCsr.field.Busy = 1;
477 BbpCsr.field.RegNum = Id;
478 RTUSBWriteMACRegister(pAd, BBP_CSR_CFG, BbpCsr.word);
480 pAd->BbpWriteLatch[Id] = Value;
482 return STATUS_SUCCESS;
485 ========================================================================
487 Routine Description: Write RF register through MAC
497 ========================================================================
499 NTSTATUS RTUSBWriteRFRegister(
500 IN PRTMP_ADAPTER pAd,
503 PHY_CSR4_STRUC PhyCsr4;
507 NdisZeroMemory(&PhyCsr4, sizeof(PHY_CSR4_STRUC));
510 status = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word);
513 if (!(PhyCsr4.field.Busy))
516 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\n", i));
519 while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
521 if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
523 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
524 return STATUS_UNSUCCESSFUL;
527 RTUSBWriteMACRegister(pAd, RF_CSR_CFG0, Value);
529 return STATUS_SUCCESS;
534 ========================================================================
546 ========================================================================
548 NTSTATUS RTUSBReadEEPROM(
549 IN PRTMP_ADAPTER pAd,
554 NTSTATUS Status = STATUS_SUCCESS;
556 Status = RTUSB_VendorRequest(
558 (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),
559 DEVICE_VENDOR_REQUEST_IN,
570 ========================================================================
582 ========================================================================
584 NTSTATUS RTUSBWriteEEPROM(
585 IN PRTMP_ADAPTER pAd,
590 NTSTATUS Status = STATUS_SUCCESS;
592 Status = RTUSB_VendorRequest(
594 USBD_TRANSFER_DIRECTION_OUT,
595 DEVICE_VENDOR_REQUEST_OUT,
606 NTSTATUS RTUSBReadEEPROM16(
607 IN PRTMP_ADAPTER pAd,
614 status = RTUSBReadEEPROM(pAd, offset, (PUCHAR)(&localData), 2);
615 if (status == STATUS_SUCCESS)
616 *pData = le2cpu16(localData);
623 ========================================================================
635 ========================================================================
637 VOID RTUSBPutToSleep(
638 IN PRTMP_ADAPTER pAd)
642 // Timeout 0x40 x 50us
643 value = (SLEEPCID<<16)+(OWNERMCU<<24)+ (0x40<<8)+1;
644 RTUSBWriteMACRegister(pAd, 0x7010, value);
645 RTUSBWriteMACRegister(pAd, 0x404, 0x30);
646 //RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
647 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Sleep Mailbox testvalue %x\n", value));
652 ========================================================================
664 ========================================================================
666 NTSTATUS RTUSBWakeUp(
667 IN PRTMP_ADAPTER pAd)
671 Status = RTUSB_VendorRequest(
673 USBD_TRANSFER_DIRECTION_OUT,
674 DEVICE_VENDOR_REQUEST_OUT,
685 ========================================================================
697 ========================================================================
699 VOID RTUSBInitializeCmdQ(
705 cmdq->CmdQState = RTMP_TASK_STAT_INITED;
709 ========================================================================
721 ========================================================================
723 NDIS_STATUS RTUSBEnqueueCmdFromNdis(
724 IN PRTMP_ADAPTER pAd,
726 IN BOOLEAN SetInformation,
727 IN PVOID pInformationBuffer,
728 IN UINT32 InformationBufferLength)
731 PCmdQElmt cmdqelmt = NULL;
732 RTMP_OS_TASK *pTask = &pAd->cmdQTask;
734 #ifdef KTHREAD_SUPPORT
735 if (pTask->kthread_task == NULL)
737 CHECK_PID_LEGALITY(pTask->taskPID)
742 return (NDIS_STATUS_RESOURCES);
744 status = os_alloc_mem(pAd, (PUCHAR *)(&cmdqelmt), sizeof(CmdQElmt));
745 if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
746 return (NDIS_STATUS_RESOURCES);
748 cmdqelmt->buffer = NULL;
749 if (pInformationBuffer != NULL)
751 status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);
752 if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))
755 return (NDIS_STATUS_RESOURCES);
759 NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
760 cmdqelmt->bufferlength = InformationBufferLength;
764 cmdqelmt->bufferlength = 0;
766 cmdqelmt->command = Oid;
767 cmdqelmt->CmdFromNdis = TRUE;
768 if (SetInformation == TRUE)
769 cmdqelmt->SetOperation = TRUE;
771 cmdqelmt->SetOperation = FALSE;
773 NdisAcquireSpinLock(&pAd->CmdQLock);
774 if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)
776 EnqueueCmd((&pAd->CmdQ), cmdqelmt);
777 status = NDIS_STATUS_SUCCESS;
781 status = NDIS_STATUS_FAILURE;
783 NdisReleaseSpinLock(&pAd->CmdQLock);
785 if (status == NDIS_STATUS_FAILURE)
787 if (cmdqelmt->buffer)
788 os_free_mem(pAd, cmdqelmt->buffer);
789 os_free_mem(pAd, cmdqelmt);
795 return(NDIS_STATUS_SUCCESS);
799 ========================================================================
811 ========================================================================
813 NDIS_STATUS RTUSBEnqueueInternalCmd(
814 IN PRTMP_ADAPTER pAd,
816 IN PVOID pInformationBuffer,
817 IN UINT32 InformationBufferLength)
820 PCmdQElmt cmdqelmt = NULL;
823 status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt));
824 if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
825 return (NDIS_STATUS_RESOURCES);
826 NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));
828 if(InformationBufferLength > 0)
830 status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);
831 if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))
833 os_free_mem(pAd, cmdqelmt);
834 return (NDIS_STATUS_RESOURCES);
838 NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
839 cmdqelmt->bufferlength = InformationBufferLength;
844 cmdqelmt->buffer = NULL;
845 cmdqelmt->bufferlength = 0;
848 cmdqelmt->command = Oid;
849 cmdqelmt->CmdFromNdis = FALSE;
851 if (cmdqelmt != NULL)
853 NdisAcquireSpinLock(&pAd->CmdQLock);
854 if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)
856 EnqueueCmd((&pAd->CmdQ), cmdqelmt);
857 status = NDIS_STATUS_SUCCESS;
861 status = NDIS_STATUS_FAILURE;
863 NdisReleaseSpinLock(&pAd->CmdQLock);
865 if (status == NDIS_STATUS_FAILURE)
867 if (cmdqelmt->buffer)
868 os_free_mem(pAd, cmdqelmt->buffer);
869 os_free_mem(pAd, cmdqelmt);
874 return(NDIS_STATUS_SUCCESS);
878 ========================================================================
890 ========================================================================
892 VOID RTUSBDequeueCmd(
894 OUT PCmdQElmt *pcmdqelmt)
896 *pcmdqelmt = cmdq->head;
898 if (*pcmdqelmt != NULL)
900 cmdq->head = cmdq->head->next;
908 ========================================================================
909 usb_control_msg - Builds a control urb, sends it off and waits for completion
910 @dev: pointer to the usb device to send the message to
911 @pipe: endpoint "pipe" to send the message to
912 @request: USB message request value
913 @requesttype: USB message request type value
914 @value: USB message value
915 @index: USB message index value
916 @data: pointer to the data to send
917 @size: length in bytes of the data to send
918 @timeout: time in jiffies to wait for the message to complete before
919 timing out (if 0 the wait is forever)
920 Context: !in_interrupt ()
922 This function sends a simple control message to a specified endpoint
923 and waits for the message to complete, or timeout.
924 If successful, it returns the number of bytes transferred, otherwise a negative error number.
926 Don't use this function from within an interrupt context, like a
927 bottom half handler. If you need an asynchronous message, or need to send
928 a message from within interrupt context, use usb_submit_urb()
929 If a thread in your driver uses this call, make sure your disconnect()
930 method can wait for it to complete. Since you don't have a handle on
931 the URB used, you can't cancel the request.
942 ========================================================================
944 NTSTATUS RTUSB_VendorRequest(
945 IN PRTMP_ADAPTER pAd,
946 IN UINT32 TransferFlags,
947 IN UCHAR RequestType,
951 IN PVOID TransferBuffer,
952 IN UINT32 TransferBufferLength)
955 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
957 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
959 DBGPRINT(RT_DEBUG_ERROR, ("device disconnected\n"));
962 else if (in_interrupt())
964 DBGPRINT(RT_DEBUG_ERROR, ("in_interrupt, RTUSB_VendorRequest Request%02x Value%04x Offset%04x\n",Request,Value,Index));
970 #define MAX_RETRY_COUNT 10
973 void *tmpBuf = TransferBuffer;
975 ret = down_interruptible(&(pAd->UsbVendorReq_semaphore));
976 if (pAd->UsbVendorReqBuf)
978 ASSERT(TransferBufferLength <MAX_PARAM_BUFFER_SIZE);
980 tmpBuf = (void *)pAd->UsbVendorReqBuf;
981 NdisZeroMemory(pAd->UsbVendorReqBuf, TransferBufferLength);
983 if (RequestType == DEVICE_VENDOR_REQUEST_OUT)
984 NdisMoveMemory(tmpBuf, TransferBuffer, TransferBufferLength);
988 if( RequestType == DEVICE_VENDOR_REQUEST_OUT)
989 ret=usb_control_msg(pObj->pUsb_Dev, usb_sndctrlpipe( pObj->pUsb_Dev, 0 ), Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, CONTROL_TIMEOUT_JIFFIES);
990 else if(RequestType == DEVICE_VENDOR_REQUEST_IN)
991 ret=usb_control_msg(pObj->pUsb_Dev, usb_rcvctrlpipe( pObj->pUsb_Dev, 0 ), Request, RequestType, Value,Index, tmpBuf, TransferBufferLength, CONTROL_TIMEOUT_JIFFIES);
994 DBGPRINT(RT_DEBUG_ERROR, ("vendor request direction is failed\n"));
1000 DBGPRINT(RT_DEBUG_OFF, ("#\n"));
1001 RTMPusecDelay(5000);
1003 } while((ret < 0) && (retryCount < MAX_RETRY_COUNT));
1005 if ((pAd->UsbVendorReqBuf) && (RequestType == DEVICE_VENDOR_REQUEST_IN))
1006 NdisMoveMemory(TransferBuffer, tmpBuf, TransferBufferLength);
1007 up(&(pAd->UsbVendorReq_semaphore));
1010 DBGPRINT(RT_DEBUG_ERROR, ("RTUSB_VendorRequest failed(%d),TxFlags=0x%x, ReqType=%s, Req=0x%x, Index=0x%x\n",
1011 ret, TransferFlags, (RequestType == DEVICE_VENDOR_REQUEST_OUT ? "OUT" : "IN"), Request, Index));
1013 DBGPRINT(RT_DEBUG_ERROR, ("\tRequest Value=0x%04x!\n", Value));
1015 if ((TransferBuffer!= NULL) && (TransferBufferLength > 0))
1016 hex_dump("Failed TransferBuffer value", TransferBuffer, TransferBufferLength);
1023 return STATUS_SUCCESS;
1025 return STATUS_UNSUCCESSFUL;
1029 ========================================================================
1031 Routine Description:
1032 Creates an IRP to submite an IOCTL_INTERNAL_USB_RESET_PORT
1033 synchronously. Callers of this function must be running at
1042 ========================================================================
1044 NTSTATUS RTUSB_ResetDevice(
1045 IN PRTMP_ADAPTER pAd)
1047 NTSTATUS Status = TRUE;
1049 DBGPRINT_RAW(RT_DEBUG_TRACE, ("--->USB_ResetDevice\n"));
1050 //RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);
1055 IN PRTMP_ADAPTER pAd)
1059 NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS;
1062 // unsigned long IrqFlags;
1064 while (pAd && pAd->CmdQ.size > 0)
1066 NdisStatus = NDIS_STATUS_SUCCESS;
1068 NdisAcquireSpinLock(&pAd->CmdQLock);
1069 RTUSBDequeueCmd(&pAd->CmdQ, &cmdqelmt);
1070 NdisReleaseSpinLock(&pAd->CmdQLock);
1072 if (cmdqelmt == NULL)
1075 pData = cmdqelmt->buffer;
1077 if(!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)))
1079 switch (cmdqelmt->command)
1081 case CMDTHREAD_CHECK_GPIO:
1086 // Read GPIO pin2 as Hardware controlled radio state
1088 RTUSBReadMACRegister( pAd, GPIO_CTRL_CFG, &data);
1092 pAd->StaCfg.bHwRadio = TRUE;
1096 pAd->StaCfg.bHwRadio = FALSE;
1099 if(pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
1101 pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);
1102 if(pAd->StaCfg.bRadio == TRUE)
1104 DBGPRINT_RAW(RT_DEBUG_ERROR, ("!!! Radio On !!!\n"));
1107 // Update extra information
1108 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
1112 DBGPRINT_RAW(RT_DEBUG_ERROR, ("!!! Radio Off !!!\n"));
1115 // Update extra information
1116 pAd->ExtraInfo = HW_RADIO_OFF;
1123 case CMDTHREAD_QKERIODIC_EXECUT:
1125 StaQuickResponeForRateUpExec(NULL, pAd, NULL, NULL);
1129 case CMDTHREAD_RESET_BULK_OUT:
1134 PHT_TX_CONTEXT pHTTXContext;
1135 // RTMP_TX_RING *pTxRing;
1136 unsigned long IrqFlags;
1138 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_OUT(ResetPipeid=0x%0x)===>\n", pAd->bulkResetPipeid));
1139 // All transfers must be aborted or cancelled before attempting to reset the pipe.
1140 //RTUSBCancelPendingBulkOutIRP(pAd);
1141 // Wait 10ms to let previous packet that are already in HW FIFO to clear. by MAXLEE 12-25-2007
1145 RTUSBReadMACRegister(pAd, TXRXQ_PCNT, &MACValue);
1146 if ((MACValue & 0xf00000/*0x800000*/) == 0)
1149 RTMPusecDelay(10000);
1150 }while(Index < 100);
1152 RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);
1153 // To prevent Read Register error, we 2nd check the validity.
1154 if ((MACValue & 0xc00000) == 0)
1155 RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);
1156 // To prevent Read Register error, we 3rd check the validity.
1157 if ((MACValue & 0xc00000) == 0)
1158 RTUSBReadMACRegister(pAd, USB_DMA_CFG, &MACValue);
1159 MACValue |= 0x80000;
1160 RTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue);
1162 // Wait 1ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007
1163 RTMPusecDelay(1000);
1165 MACValue &= (~0x80000);
1166 RTUSBWriteMACRegister(pAd, USB_DMA_CFG, MACValue);
1167 DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tSet 0x2a0 bit19. Clear USB DMA TX path\n"));
1169 // Wait 5ms to prevent next URB to bulkout before HW reset. by MAXLEE 12-25-2007
1170 //RTMPusecDelay(5000);
1172 if ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)
1174 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
1175 if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)
1177 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
1179 RTUSBKickBulkOut(pAd);
1181 DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tTX MGMT RECOVER Done!\n"));
1185 pHTTXContext = &(pAd->TxContext[pAd->bulkResetPipeid]);
1186 //NdisAcquireSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
1187 RTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1188 if ( pAd->BulkOutPending[pAd->bulkResetPipeid] == FALSE)
1190 pAd->BulkOutPending[pAd->bulkResetPipeid] = TRUE;
1191 pHTTXContext->IRPPending = TRUE;
1192 pAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 1;
1194 // no matter what, clean the flag
1195 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
1197 //NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
1198 RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1200 RTUSBInitHTTxDesc(pAd, pHTTXContext, pAd->bulkResetPipeid, pHTTXContext->BulkOutSize, (usb_complete_t)RTUSBBulkOutDataPacketComplete);
1202 if((ret = RTUSB_SUBMIT_URB(pHTTXContext->pUrb))!=0)
1204 RTMP_INT_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1205 pAd->BulkOutPending[pAd->bulkResetPipeid] = FALSE;
1206 pHTTXContext->IRPPending = FALSE;
1207 pAd->watchDogTxPendingCnt[pAd->bulkResetPipeid] = 0;
1208 RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1210 DBGPRINT(RT_DEBUG_ERROR, ("CmdThread : CMDTHREAD_RESET_BULK_OUT: Submit Tx URB failed %d\n", ret));
1214 RTMP_IRQ_LOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1215 DBGPRINT_RAW(RT_DEBUG_TRACE,("\tCMDTHREAD_RESET_BULK_OUT: TxContext[%d]:CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, pending=%d!\n",
1216 pAd->bulkResetPipeid, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition,
1217 pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, pAd->BulkOutPending[pAd->bulkResetPipeid]));
1218 DBGPRINT_RAW(RT_DEBUG_TRACE,("\t\tBulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n",
1219 pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));
1220 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1221 DBGPRINT_RAW(RT_DEBUG_TRACE, ("\tCMDTHREAD_RESET_BULK_OUT: Submit Tx DATA URB for failed BulkReq(0x%lx) Done, status=%d!\n", pAd->bulkResetReq[pAd->bulkResetPipeid], pHTTXContext->pUrb->status));
1228 //NdisReleaseSpinLock(&pAd->BulkOutLock[pAd->bulkResetPipeid]);
1229 //RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1231 DBGPRINT_RAW(RT_DEBUG_ERROR, ("CmdThread : TX DATA RECOVER FAIL for BulkReq(0x%lx) because BulkOutPending[%d] is TRUE!\n", pAd->bulkResetReq[pAd->bulkResetPipeid], pAd->bulkResetPipeid));
1232 if (pAd->bulkResetPipeid == 0)
1234 UCHAR pendingContext = 0;
1235 PHT_TX_CONTEXT pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[pAd->bulkResetPipeid ]);
1236 PTX_CONTEXT pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa);
1237 PTX_CONTEXT pNULLContext = (PTX_CONTEXT)(&pAd->PsPollContext);
1238 PTX_CONTEXT pPsPollContext = (PTX_CONTEXT)(&pAd->NullContext);
1240 if (pHTTXContext->IRPPending)
1241 pendingContext |= 1;
1242 else if (pMLMEContext->IRPPending)
1243 pendingContext |= 2;
1244 else if (pNULLContext->IRPPending)
1245 pendingContext |= 4;
1246 else if (pPsPollContext->IRPPending)
1247 pendingContext |= 8;
1251 DBGPRINT_RAW(RT_DEBUG_ERROR, ("\tTX Occupied by %d!\n", pendingContext));
1254 // no matter what, clean the flag
1255 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
1257 RTMP_INT_UNLOCK(&pAd->BulkOutLock[pAd->bulkResetPipeid], IrqFlags);
1259 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << pAd->bulkResetPipeid));
1262 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
1263 //RTUSBKickBulkOut(pAd);
1268 // Don't cancel BULKIN.
1269 while ((atomic_read(&pAd->PendingRx) > 0) &&
1270 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
1272 if (atomic_read(&pAd->PendingRx) > 0)
1274 DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkIn IRP Pending!!cancel it!\n"));
1275 RTUSBCancelPendingBulkInIRP(pAd);
1277 RTMPusecDelay(100000);
1280 if ((atomic_read(&pAd->PendingRx) == 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)))
1284 pAd->NextRxBulkInReadIndex = 0; // Next Rx Read index
1285 pAd->NextRxBulkInIndex = 0; // Rx Bulk pointer
1286 for (i = 0; i < (RX_RING_SIZE); i++)
1288 PRX_CONTEXT pRxContext = &(pAd->RxContext[i]);
1290 pRxContext->pAd = pAd;
1291 pRxContext->InUse = FALSE;
1292 pRxContext->IRPPending = FALSE;
1293 pRxContext->Readable = FALSE;
1294 pRxContext->ReorderInUse = FALSE;
1297 RTUSBBulkReceive(pAd);
1298 DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTUSBBulkReceive\n"));
1300 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_OUT<===\n"));
1303 case CMDTHREAD_RESET_BULK_IN:
1304 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN === >\n"));
1306 // All transfers must be aborted or cancelled before attempting to reset the pipe.
1311 //while ((atomic_read(&pAd->PendingRx) > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
1312 if((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
1314 DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkIn IRP Pending!!!\n"));
1315 RTUSBCancelPendingBulkInIRP(pAd);
1316 RTMPusecDelay(100000);
1321 // Wait 10ms before reading register.
1322 RTMPusecDelay(10000);
1323 ntStatus = RTUSBReadMACRegister(pAd, MAC_CSR0, &MACValue);
1325 if ((NT_SUCCESS(ntStatus) == TRUE) &&
1326 (!(RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF |
1327 fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))))
1331 if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF |
1332 fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))
1334 pAd->NextRxBulkInPosition = pAd->RxContext[pAd->NextRxBulkInIndex].BulkInOffset;
1335 DBGPRINT(RT_DEBUG_TRACE, ("BULK_IN_RESET: NBIIdx=0x%x,NBIRIdx=0x%x, BIRPos=0x%lx. BIReq=x%lx, BIComplete=0x%lx, BICFail0x%lx\n",
1336 pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pAd->NextRxBulkInPosition, pAd->BulkInReq, pAd->BulkInComplete, pAd->BulkInCompleteFail));
1337 for (i = 0; i < RX_RING_SIZE; i++)
1339 DBGPRINT(RT_DEBUG_TRACE, ("\tRxContext[%d]: IRPPending=%d, InUse=%d, Readable=%d!\n"
1340 , i, pAd->RxContext[i].IRPPending, pAd->RxContext[i].InUse, pAd->RxContext[i].Readable));
1344 DBGPRINT_RAW(RT_DEBUG_ERROR, ("==========================================\n"));
1346 pAd->NextRxBulkInReadIndex = 0; // Next Rx Read index
1347 pAd->NextRxBulkInIndex = 0; // Rx Bulk pointer
1348 for (i = 0; i < (RX_RING_SIZE); i++)
1350 PRX_CONTEXT pRxContext = &(pAd->RxContext[i]);
1352 pRxContext->pAd = pAd;
1353 pRxContext->InUse = FALSE;
1354 pRxContext->IRPPending = FALSE;
1355 pRxContext->Readable = FALSE;
1356 pRxContext->ReorderInUse = FALSE;
1359 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
1360 for (i = 0; i < pAd->CommonCfg.NumOfBulkInIRP; i++)
1362 //RTUSBBulkReceive(pAd);
1363 PRX_CONTEXT pRxContext;
1366 unsigned long IrqFlags;
1369 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
1370 pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);
1371 if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE))
1373 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
1376 pRxContext->InUse = TRUE;
1377 pRxContext->IRPPending = TRUE;
1380 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
1382 // Init Rx context descriptor
1383 RTUSBInitRxDesc(pAd, pRxContext);
1384 pUrb = pRxContext->pUrb;
1385 if ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
1388 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
1389 pRxContext->InUse = FALSE;
1390 pRxContext->IRPPending = FALSE;
1393 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
1394 DBGPRINT(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB failed(%d), status=%d\n", ret, pUrb->status));
1398 //DBGPRINT(RT_DEBUG_TRACE, ("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n",
1399 // pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex));
1400 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB Done, status=%d!\n", pUrb->status));
1401 ASSERT((pRxContext->InUse == pRxContext->IRPPending));
1408 // Card must be removed
1409 if (NT_SUCCESS(ntStatus) != TRUE)
1411 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);
1412 DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Read Register Failed!Card must be removed!!\n\n"));
1416 DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Cannot do bulk in because flags(0x%lx) on !\n", pAd->Flags));
1420 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN <===\n"));
1423 case CMDTHREAD_SET_ASIC_WCID:
1425 RT_SET_ASIC_WCID SetAsicWcid;
1427 UINT32 MACValue, MACRValue = 0;
1428 SetAsicWcid = *((PRT_SET_ASIC_WCID)(pData));
1430 if (SetAsicWcid.WCID >= MAX_LEN_OF_MAC_TABLE)
1433 offset = MAC_WCID_BASE + ((UCHAR)SetAsicWcid.WCID)*HW_WCID_ENTRY_SIZE;
1435 DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = %ld, SetTid = %lx, DeleteTid = %lx.\n", SetAsicWcid.WCID, SetAsicWcid.SetTid, SetAsicWcid.DeleteTid));
1436 MACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[3]<<24)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[2]<<16)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[1]<<8)+(pAd->MacTab.Content[SetAsicWcid.WCID].Addr[0]);
1437 DBGPRINT_RAW(RT_DEBUG_TRACE, ("1-MACValue= %x,\n", MACValue));
1438 RTUSBWriteMACRegister(pAd, offset, MACValue);
1440 RTUSBReadMACRegister(pAd, offset+4, &MACRValue);
1441 if ( SetAsicWcid.DeleteTid != 0xffffffff)
1442 MACRValue &= (~SetAsicWcid.DeleteTid);
1443 if (SetAsicWcid.SetTid != 0xffffffff)
1444 MACRValue |= (SetAsicWcid.SetTid);
1445 MACRValue &= 0xffff0000;
1447 MACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[5]<<8)+pAd->MacTab.Content[SetAsicWcid.WCID].Addr[4];
1448 MACValue |= MACRValue;
1449 RTUSBWriteMACRegister(pAd, offset+4, MACValue);
1451 DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-MACValue= %x,\n", MACValue));
1455 case CMDTHREAD_SET_ASIC_WCID_CIPHER:
1457 RT_SET_ASIC_WCID_ATTRI SetAsicWcidAttri;
1459 UINT32 MACRValue = 0;
1460 SHAREDKEY_MODE_STRUC csr1;
1461 SetAsicWcidAttri = *((PRT_SET_ASIC_WCID_ATTRI)(pData));
1463 if (SetAsicWcidAttri.WCID >= MAX_LEN_OF_MAC_TABLE)
1466 offset = MAC_WCID_ATTRIBUTE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_WCID_ATTRI_SIZE;
1468 DBGPRINT_RAW(RT_DEBUG_TRACE, ("Cmd : CMDTHREAD_SET_ASIC_WCID_CIPHER : WCID = %ld, Cipher = %lx.\n", SetAsicWcidAttri.WCID, SetAsicWcidAttri.Cipher));
1470 RTUSBReadMACRegister(pAd, offset, &MACRValue);
1472 MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1);
1474 RTUSBWriteMACRegister(pAd, offset, MACRValue);
1475 DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue));
1477 offset = PAIRWISE_IVEIV_TABLE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_IVEIV_ENTRY_SIZE;
1479 if ( (SetAsicWcidAttri.Cipher <= CIPHER_WEP128))
1480 MACRValue |= ( pAd->StaCfg.DefaultKeyId << 30);
1482 MACRValue |= (0x20000000);
1483 RTUSBWriteMACRegister(pAd, offset, MACRValue);
1484 DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue));
1487 // Update cipher algorithm. WSTA always use BSS0
1489 // for adhoc mode only ,because wep status slow than add key, when use zero config
1490 if (pAd->StaCfg.BssType == BSS_ADHOC )
1492 offset = MAC_WCID_ATTRIBUTE_BASE;
1494 RTUSBReadMACRegister(pAd, offset, &MACRValue);
1495 MACRValue &= (~0xe);
1496 MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1);
1498 RTUSBWriteMACRegister(pAd, offset, MACRValue);
1500 //Update group key cipher,,because wep status slow than add key, when use zero config
1501 RTUSBReadMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), &csr1.word);
1503 csr1.field.Bss0Key0CipherAlg = SetAsicWcidAttri.Cipher;
1504 csr1.field.Bss0Key1CipherAlg = SetAsicWcidAttri.Cipher;
1506 RTUSBWriteMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), csr1.word);
1511 //Benson modified for USB interface, avoid in interrupt when write key, 20080724 -->
1512 case RT_CMD_SET_KEY_TABLE: //General call for AsicAddPairwiseKeyEntry()
1514 RT_ADD_PAIRWISE_KEY_ENTRY KeyInfo;
1515 KeyInfo = *((PRT_ADD_PAIRWISE_KEY_ENTRY)(pData));
1516 AsicAddPairwiseKeyEntry(pAd,
1518 (UCHAR)KeyInfo.MacTabMatchWCID,
1519 &KeyInfo.CipherKey);
1523 case RT_CMD_SET_RX_WCID_TABLE: //General call for RTMPAddWcidAttributeEntry()
1525 PMAC_TABLE_ENTRY pEntry ;
1527 UCHAR CipherAlg = CIPHER_NONE;
1530 pEntry = (PMAC_TABLE_ENTRY)(pData);
1534 RTMPAddWcidAttributeEntry(
1542 //Benson modified for USB interface, avoid in interrupt when write key, 20080724 <--
1544 case CMDTHREAD_SET_CLIENT_MAC_ENTRY:
1546 MAC_TABLE_ENTRY *pEntry;
1547 pEntry = (MAC_TABLE_ENTRY *)pData;
1550 AsicRemovePairwiseKeyEntry(pAd, pEntry->apidx, (UCHAR)pEntry->Aid);
1551 if ((pEntry->AuthMode <= Ndis802_11AuthModeAutoSwitch) && (pEntry->WepStatus == Ndis802_11Encryption1Enabled))
1556 ptr = (PUCHAR) &uIV;
1557 *(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6);
1558 AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0);
1559 AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE);
1561 else if (pEntry->AuthMode == Ndis802_11AuthModeWPANone)
1566 ptr = (PUCHAR) &uIV;
1567 *(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6);
1568 AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0);
1569 AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE);
1574 // Other case, disable engine.
1575 // Don't worry WPA key, we will add WPA Key after 4-Way handshaking.
1578 offset = MAC_WCID_ATTRIBUTE_BASE + (pEntry->Aid * HW_WCID_ATTRI_SIZE);
1579 // RX_PKEY_MODE:0 for no security; RX_KEY_TAB:0 for shared key table; BSS_IDX:0
1580 RTUSBWriteMACRegister(pAd, offset, 0);
1584 AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);
1585 DBGPRINT(RT_DEBUG_TRACE, ("UpdateRxWCIDTable(): Aid=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x!\n", pEntry->Aid,
1586 pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));
1590 // add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
1591 case CMDTHREAD_UPDATE_PROTECT:
1593 AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0);
1598 case OID_802_11_ADD_WEP:
1602 PNDIS_802_11_WEP pWepKey;
1604 DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP \n"));
1606 pWepKey = (PNDIS_802_11_WEP)pData;
1607 KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
1609 // it is a shared key
1610 if ((KeyIdx >= 4) || ((pWepKey->KeyLength != 5) && (pWepKey->KeyLength != 13)))
1612 NdisStatus = NDIS_STATUS_INVALID_DATA;
1613 DBGPRINT(RT_DEBUG_ERROR, ("CmdThread::OID_802_11_ADD_WEP, INVALID_DATA!!\n"));
1618 pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
1619 NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
1620 CipherAlg = (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 5)? CIPHER_WEP64 : CIPHER_WEP128;
1623 // Change the WEP cipher to CKIP cipher if CKIP KP on.
1624 // Funk UI or Meetinghouse UI will add ckip key from this path.
1627 if (pAd->OpMode == OPMODE_STA)
1629 pAd->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;
1630 pAd->MacTab.Content[BSSID_WCID].PairwiseKey.KeyLen = pAd->SharedKey[BSS0][KeyIdx].KeyLen;
1632 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg;
1633 if (pWepKey->KeyIndex & 0x80000000)
1635 // Default key for tx (shared key)
1637 UINT32 WCIDAttri, Value;
1638 USHORT offset, offset2;
1639 NdisZeroMemory(IVEIV, 8);
1640 pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;
1641 // Add BSSID to WCTable. because this is Tx wep key.
1642 // WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0
1643 WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE;
1645 offset = MAC_WCID_ATTRIBUTE_BASE + (BSSID_WCID* HW_WCID_ATTRI_SIZE);
1646 RTUSBWriteMACRegister(pAd, offset, WCIDAttri);
1648 // Specify key index to find shared key.
1649 IVEIV[3] = (UCHAR)(KeyIdx<< 6); //WEP Eiv bit off. groupkey index is not 0
1650 offset = PAIRWISE_IVEIV_TABLE_BASE + (BSS0Mcast_WCID * HW_IVEIV_ENTRY_SIZE);
1651 offset2 = PAIRWISE_IVEIV_TABLE_BASE + (BSSID_WCID* HW_IVEIV_ENTRY_SIZE);
1655 Value += (IVEIV[i+1]<<8);
1656 Value += (IVEIV[i+2]<<16);
1657 Value += (IVEIV[i+3]<<24);
1658 RTUSBWriteMACRegister(pAd, offset+i, Value);
1659 RTUSBWriteMACRegister(pAd, offset2+i, Value);
1663 // 2. WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:use share key, BSSIdx is 0
1664 WCIDAttri = (pAd->SharedKey[BSS0][KeyIdx].CipherAlg<<1)|SHAREDKEYTABLE;
1665 offset = MAC_WCID_ATTRIBUTE_BASE + (BSS0Mcast_WCID* HW_WCID_ATTRI_SIZE);
1666 DBGPRINT(RT_DEBUG_TRACE, ("BSS0Mcast_WCID : offset = %x, WCIDAttri = %x\n", offset, WCIDAttri));
1667 RTUSBWriteMACRegister(pAd, offset, WCIDAttri);
1670 AsicAddSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx, CipherAlg, pWepKey->KeyMaterial, NULL, NULL);
1671 DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n", KeyIdx, pWepKey->KeyLength));
1676 case CMDTHREAD_802_11_COUNTER_MEASURE:
1679 case CMDTHREAD_SET_GROUP_KEY:
1680 WpaStaGroupKeySetting(pAd);
1683 case CMDTHREAD_SET_PAIRWISE_KEY:
1684 WpaStaPairwiseKeySetting(pAd);
1687 case CMDTHREAD_SET_PSM_BIT:
1689 USHORT *pPsm = (USHORT *)pData;
1690 MlmeSetPsmBit(pAd, *pPsm);
1693 case CMDTHREAD_FORCE_WAKE_UP:
1694 AsicForceWakeup(pAd, TRUE);
1698 DBGPRINT(RT_DEBUG_ERROR, ("--> Control Thread !! ERROR !! Unknown(cmdqelmt->command=0x%x) !! \n", cmdqelmt->command));
1703 if (cmdqelmt->CmdFromNdis == TRUE)
1705 if (cmdqelmt->buffer != NULL)
1706 os_free_mem(pAd, cmdqelmt->buffer);
1707 os_free_mem(pAd, cmdqelmt);
1711 if ((cmdqelmt->buffer != NULL) && (cmdqelmt->bufferlength != 0))
1712 os_free_mem(pAd, cmdqelmt->buffer);
1713 os_free_mem(pAd, cmdqelmt);
1715 } /* end of while */
1718 #endif // RTMP_MAC_USB //