⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtusb_io.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
								pRxContext->Readable	= FALSE;								pRxContext->ReorderInUse = FALSE;														}							RTUSBBulkReceive(pAd);							DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTUSBBulkReceive\n"));						}*/					DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_OUT<===\n"));    	   			break;                                                                                                                                                          	                                                                                                                                                    				case CMDTHREAD_RESET_BULK_IN:                                                                                                                      					DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN === >\n"));					// All transfers must be aborted or cancelled before attempting to reset the pipe.					{						UINT32		MACValue;#ifdef RALINK_ATE						if (ATE_ON(pAd))						{							ATEResetBulkIn(pAd);						}						else#endif // RALINK_ATE //						{						//while ((atomic_read(&pAd->PendingRx) > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) 						if((pAd->PendingRx > 0) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))						{							DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkIn IRP Pending!!!\n"));							RTUSBCancelPendingBulkInIRP(pAd);							RTMPusecDelay(100000);							pAd->PendingRx = 0;						}						}																		// Wait 10ms before reading register.						RTMPusecDelay(10000);						ntStatus = RTUSBReadMACRegister(pAd, MAC_CSR0, &MACValue);						if ((NT_SUCCESS(ntStatus) == TRUE) && 							(!(RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF | 													fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))))						{									UCHAR	i;							if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_RADIO_OFF | 														fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)))								break;							pAd->NextRxBulkInPosition = pAd->RxContext[pAd->NextRxBulkInIndex].BulkInOffset;							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", 									pAd->NextRxBulkInIndex,  pAd->NextRxBulkInReadIndex, pAd->NextRxBulkInPosition, pAd->BulkInReq, pAd->BulkInComplete, pAd->BulkInCompleteFail));							for (i = 0; i < RX_RING_SIZE; i++)							{ 								DBGPRINT(RT_DEBUG_TRACE, ("\tRxContext[%d]: IRPPending=%d, InUse=%d, Readable=%d!\n"									, i, pAd->RxContext[i].IRPPending, pAd->RxContext[i].InUse, pAd->RxContext[i].Readable));							} 							/*							DBGPRINT_RAW(RT_DEBUG_ERROR, ("==========================================\n"));							pAd->NextRxBulkInReadIndex = 0;	// Next Rx Read index							pAd->NextRxBulkInIndex		= 0;	// Rx Bulk pointer							for (i = 0; i < (RX_RING_SIZE); i++)							{								PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);								pRxContext->pAd	= pAd;								pRxContext->InUse		= FALSE;								pRxContext->IRPPending	= FALSE;								pRxContext->Readable	= FALSE;								pRxContext->ReorderInUse = FALSE;																}*/							RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);							for (i = 0; i < pAd->CommonCfg.NumOfBulkInIRP; i++)							{								//RTUSBBulkReceive(pAd);								PRX_CONTEXT		pRxContext;								PURB			pUrb;								int				ret = 0;								unsigned long	IrqFlags;									RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);								pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);								if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE))								{									RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);									break;								}								pRxContext->InUse = TRUE;								pRxContext->IRPPending = TRUE;								pAd->PendingRx++;								pAd->BulkInReq++;								RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);								// Init Rx context descriptor								RTUSBInitRxDesc(pAd, pRxContext);								pUrb = pRxContext->pUrb;								if ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)								{	// fail																	RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);									pRxContext->InUse = FALSE;									pRxContext->IRPPending = FALSE;									pAd->PendingRx--;									pAd->BulkInReq--;									RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);									DBGPRINT(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB failed(%d), status=%d\n", ret, pUrb->status));								}								else								{	// success									//DBGPRINT(RT_DEBUG_TRACE, ("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n", 									//							pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex));									DBGPRINT_RAW(RT_DEBUG_TRACE, ("CMDTHREAD_RESET_BULK_IN: Submit Rx URB Done, status=%d!\n", pUrb->status));									ASSERT((pRxContext->InUse == pRxContext->IRPPending));								}							}											}						else						{							// Card must be removed							if (NT_SUCCESS(ntStatus) != TRUE)							{								RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);								DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Read Register Failed!Card must be removed!!\n\n"));							}							else							{								DBGPRINT_RAW(RT_DEBUG_ERROR, ("CMDTHREAD_RESET_BULK_IN: Cannot do bulk in because flags(0x%lx) on !\n", pAd->Flags));							}						}                                                                                                                                                   					}					DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_RESET_BULK_IN <===\n"));					break;                                                                                                                                                          	                                                                                                                                                    				case CMDTHREAD_SET_ASIC_WCID:					{						RT_SET_ASIC_WCID	SetAsicWcid;						USHORT		offset;						UINT32		MACValue, MACRValue = 0;						SetAsicWcid = *((PRT_SET_ASIC_WCID)(pData));												if (SetAsicWcid.WCID >= MAX_LEN_OF_MAC_TABLE)							return;												offset = MAC_WCID_BASE + ((UCHAR)SetAsicWcid.WCID)*HW_WCID_ENTRY_SIZE;						DBGPRINT_RAW(RT_DEBUG_TRACE, ("CmdThread : CMDTHREAD_SET_ASIC_WCID : WCID = %ld, SetTid  = %lx, DeleteTid = %lx.\n", SetAsicWcid.WCID, SetAsicWcid.SetTid, SetAsicWcid.DeleteTid));						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]);						DBGPRINT_RAW(RT_DEBUG_TRACE, ("1-MACValue= %x,\n", MACValue));						RTUSBWriteMACRegister(pAd, offset, MACValue);						// Read bitmask						RTUSBReadMACRegister(pAd, offset+4, &MACRValue);						if ( SetAsicWcid.DeleteTid != 0xffffffff)							MACRValue &= (~SetAsicWcid.DeleteTid);						if (SetAsicWcid.SetTid != 0xffffffff)							MACRValue |= (SetAsicWcid.SetTid);						MACRValue &= 0xffff0000;											MACValue = (pAd->MacTab.Content[SetAsicWcid.WCID].Addr[5]<<8)+pAd->MacTab.Content[SetAsicWcid.WCID].Addr[4];						MACValue |= MACRValue;						RTUSBWriteMACRegister(pAd, offset+4, MACValue);												DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-MACValue= %x,\n", MACValue));					}					break;									case CMDTHREAD_SET_ASIC_WCID_CIPHER:					{#ifdef CONFIG_STA_SUPPORT						RT_SET_ASIC_WCID_ATTRI	SetAsicWcidAttri;						USHORT		offset;						UINT32		MACRValue = 0;						SHAREDKEY_MODE_STRUC csr1;						SetAsicWcidAttri = *((PRT_SET_ASIC_WCID_ATTRI)(pData));												if (SetAsicWcidAttri.WCID >= MAX_LEN_OF_MAC_TABLE)							return;												offset = MAC_WCID_ATTRIBUTE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_WCID_ATTRI_SIZE;						DBGPRINT_RAW(RT_DEBUG_TRACE, ("Cmd : CMDTHREAD_SET_ASIC_WCID_CIPHER : WCID = %ld, Cipher = %lx.\n", SetAsicWcidAttri.WCID, SetAsicWcidAttri.Cipher));						// Read bitmask						RTUSBReadMACRegister(pAd, offset, &MACRValue);						MACRValue = 0;						MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1);						RTUSBWriteMACRegister(pAd, offset, MACRValue);						DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue));												offset = PAIRWISE_IVEIV_TABLE_BASE + ((UCHAR)SetAsicWcidAttri.WCID)*HW_IVEIV_ENTRY_SIZE;						MACRValue = 0;													if ( (SetAsicWcidAttri.Cipher <= CIPHER_WEP128))							MACRValue |= ( pAd->StaCfg.DefaultKeyId << 30);						else							MACRValue |= (0x20000000);						RTUSBWriteMACRegister(pAd, offset, MACRValue);						DBGPRINT_RAW(RT_DEBUG_TRACE, ("2-offset = %x , MACValue= %x,\n", offset, MACRValue));						//						// Update cipher algorithm. WSTA always use BSS0													//						// for adhoc mode only ,because wep status slow than add key, when use zero config						if (pAd->StaCfg.BssType == BSS_ADHOC )						{							offset = MAC_WCID_ATTRIBUTE_BASE;							RTUSBReadMACRegister(pAd, offset, &MACRValue);							MACRValue &= (~0xe);							MACRValue |= (((UCHAR)SetAsicWcidAttri.Cipher) << 1);							RTUSBWriteMACRegister(pAd, offset, MACRValue);							//Update group key cipher,,because wep status slow than add key, when use zero config							RTUSBReadMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), &csr1.word);															csr1.field.Bss0Key0CipherAlg = SetAsicWcidAttri.Cipher;							csr1.field.Bss0Key1CipherAlg = SetAsicWcidAttri.Cipher;																							RTUSBWriteMACRegister(pAd, SHARED_KEY_MODE_BASE+4*(0/2), csr1.word);						}#endif // CONFIG_STA_SUPPORT //					}					break;//Benson modified for USB interface, avoid in interrupt when write key, 20080724 -->				case RT_CMD_SET_KEY_TABLE: //General call for AsicAddPairwiseKeyEntry()                    					{						RT_ADD_PAIRWISE_KEY_ENTRY KeyInfo;						KeyInfo  = *((PRT_ADD_PAIRWISE_KEY_ENTRY)(pData));						AsicAddPairwiseKeyEntry(pAd,												KeyInfo.MacAddr,												(UCHAR)KeyInfo.MacTabMatchWCID,												&KeyInfo.CipherKey);					}					break;				case RT_CMD_SET_RX_WCID_TABLE: //General call for RTMPAddWcidAttributeEntry()					{						PMAC_TABLE_ENTRY pEntry ;						UCHAR KeyIdx = 0;						UCHAR CipherAlg = CIPHER_NONE;						UCHAR ApIdx = BSS0;						pEntry = (PMAC_TABLE_ENTRY)(pData);#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT					KeyIdx = 0;					CipherAlg = pEntry->PairwiseKey.CipherAlg;					ApIdx = BSS0;#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //						RTMPAddWcidAttributeEntry(										  pAd,										  ApIdx,										  KeyIdx,										  CipherAlg,													pEntry);					}					break;//Benson modified for USB interface, avoid in interrupt when write key, 20080724 <--				case CMDTHREAD_SET_CLIENT_MAC_ENTRY:					{						MAC_TABLE_ENTRY *pEntry;						pEntry = (MAC_TABLE_ENTRY *)pData;#ifdef CONFIG_STA_SUPPORT						IF_DEV_CONFIG_OPMODE_ON_STA(pAd)						{							AsicRemovePairwiseKeyEntry(pAd, pEntry->apidx, (UCHAR)pEntry->Aid);							if ((pEntry->AuthMode <= Ndis802_11AuthModeAutoSwitch) && (pEntry->WepStatus == Ndis802_11Encryption1Enabled))							{								UINT32 uIV = 1;								PUCHAR  ptr;								ptr = (PUCHAR) &uIV;								*(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6);								AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0);								AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE);							}							else if (pEntry->AuthMode == Ndis802_11AuthModeWPANone)							{								UINT32 uIV = 1;								PUCHAR  ptr;								ptr = (PUCHAR) &uIV;								*(ptr + 3) = (pAd->StaCfg.DefaultKeyId << 6);								AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, uIV, 0);								AsicUpdateWCIDAttribute(pAd, pEntry->Aid, BSS0, pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, FALSE);							}							else							{								//								// Other case, disable engine.								// Don't worry WPA key, we will add WPA Key after 4-Way handshaking.								//								USHORT   offset;								offset = MAC_WCID_ATTRIBUTE_BASE + (pEntry->Aid * HW_WCID_ATTRI_SIZE);								// RX_PKEY_MODE:0 for no security; RX_KEY_TAB:0 for shared key table; BSS_IDX:0								RTUSBWriteMACRegister(pAd, offset, 0);							}						}#endif // CONFIG_STA_SUPPORT //						AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);						DBGPRINT(RT_DEBUG_TRACE, ("UpdateRxWCIDTable(): Aid=%d, Addr=%02x:%02x:%02x:%02x:%02x:%02x!\n", pEntry->Aid, 								pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]));					}					break;// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet				case CMDTHREAD_UPDATE_PROTECT:					{						AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0);					}					break;// end johnli				case OID_802_11_ADD_WEP:					{#ifdef CONFIG_STA_SUPPORT						UINT	i;						UINT32	KeyIdx;						PNDIS_802_11_WEP	pWepKey;						DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP  \n"));												pWepKey = (PNDIS_802_11_WEP)pData;						KeyIdx = pWepKey->KeyIndex & 0x0fffffff;						// it is a shared key						if ((KeyIdx >= 4) || ((pWepKey->KeyLength != 5) && (pWepKey->KeyLength != 13)))						{							NdisStatus = NDIS_STATUS_INVALID_DATA;							DBGPRINT(RT_DEBUG_ERROR, ("CmdThread::OID_802_11_ADD_WEP, INVALID_DATA!!\n"));						}						else 						{							UCHAR CipherAlg;							pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;							NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);							CipherAlg = (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 5)? CIPHER_WEP64 : CIPHER_WEP128;							//							// Change the WEP cipher to CKIP cipher if CKIP KP on.							// Funk UI or Meetinghouse UI will add ckip key from this path.							//								if (pAd->OpMode == OPMODE_STA)						 	{								pAd->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;								pAd->MacTab.Content[BSSID_WCID].PairwiseKey.KeyLen = pAd->SharedKey[BSS0][KeyIdx].KeyLen;						 	}							pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg;							if (pWepKey->KeyIndex & 0x80000000)							{								// Default key for tx (shared key)								UCHAR	IVEIV[8];								UINT32	WCIDAttri, Value;								USHORT	offset, offset2;								NdisZeroMemory(IVEIV, 8);								pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;								// Add BSSID to WCTable. because this is Tx wep key.								// WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:1=PAIRWISE KEY, BSSIdx is 0								WCIDAttri = (CipherAlg<<1)|SHAREDKEYTABLE;																offset = MAC_WCID_ATTRIBUTE_BASE + (BSSID_WCID* HW_WCID_ATTRI_SIZE);								RTUSBWriteMACRegister(pAd, offset, WCIDAttri);								// 1. IV/EIV								// Specify key index to find shared key.								IVEIV[3] = (UCHAR)(KeyIdx<< 6);	//WEP Eiv bit off. groupkey index is not 0								offset = PAIRWISE_IVEIV_TABLE_BASE + (BSS0Mcast_WCID * HW_IVEIV_ENTRY_SIZE);								offset2 = PAIRWISE_IVEIV_TABLE_BASE + (BSSID_WCID* HW_IVEIV_ENTRY_SIZE);								for (i=0; i<8;)								{									Value = IVEIV[i];									Value += (IVEIV[i+1]<<8);									Value += (IVEIV[i+2]<<16);									Value += (IVEIV[i+3]<<24);									RTUSBWriteMACRegister(pAd, offset+i, Value);									RTUSBWriteMACRegister(pAd, offset2+i, Value);									i+=4;								}								// 2. WCID Attribute UDF:3, BSSIdx:3, Alg:3, Keytable:use share key, BSSIdx is 0								WCIDAttri = (pAd->SharedKey[BSS0][KeyIdx].CipherAlg<<1)|SHAREDKEYTABLE;								offset = MAC_WCID_ATTRIBUTE_BASE + (BSS0Mcast_WCID* HW_WCID_ATTRI_SIZE);							        DBGPRINT(RT_DEBUG_TRACE, ("BSS0Mcast_WCID : offset = %x, WCIDAttri = %x\n", offset, WCIDAttri));								RTUSBWriteMACRegister(pAd, offset, WCIDAttri);															}							AsicAddSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx, CipherAlg, pWepKey->KeyMaterial, NULL, NULL);							DBGPRINT(RT_DEBUG_TRACE, ("CmdThread::OID_802_11_ADD_WEP (KeyIdx=%d, Len=%d-byte)\n", KeyIdx, pWepKey->KeyLength));						}#endif // CONFIG_STA_SUPPORT //					}					break;									case CMDTHREAD_802_11_COUNTER_MEASURE:					break;#ifdef CONFIG_STA_SUPPORT				case CMDTHREAD_SET_GROUP_KEY:					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)						WpaStaGroupKeySetting(pAd);					break;				case CMDTHREAD_SET_PAIRWISE_KEY:					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)						WpaStaPairwiseKeySetting(pAd);					break;				case CMDTHREAD_SET_PSM_BIT:					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)					{						USHORT *pPsm = (USHORT *)pData;						MlmeSetPsmBit(pAd, *pPsm);					}					break;				case CMDTHREAD_FORCE_WAKE_UP:					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)						AsicForceWakeup(pAd, TRUE);					break;#endif // CONFIG_STA_SUPPORT //				default:					DBGPRINT(RT_DEBUG_ERROR, ("--> Control Thread !! ERROR !! Unknown(cmdqelmt->command=0x%x) !! \n", cmdqelmt->command));					break;                                                                                                                                              			}                                                                                                                                                       		}                                                                                                                                                                                                                                                                                                                          		if (cmdqelmt->CmdFromNdis == TRUE)		{			if (cmdqelmt->buffer != NULL)				os_free_mem(pAd, cmdqelmt->buffer);			os_free_mem(pAd, cmdqelmt);		}		else		{			if ((cmdqelmt->buffer != NULL) && (cmdqelmt->bufferlength != 0))				os_free_mem(pAd, cmdqelmt->buffer);			os_free_mem(pAd, cmdqelmt);		}	}	/* end of while */}#endif // RTMP_MAC_USB //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -