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

📄 rtmp_main.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
				    else if(Antenna == 1)					    pAd->Antenna.field.RxDefaultAntenna = 2;    // ant-B				    else					    pAd->Antenna.field.RxDefaultAntenna = 0;    // diversity			    pAd->PortCfg.BandState = UNKNOWN_BAND;			    AsicAntennaSelect(pAd, pAd->LatchRfRegs.Channel);			    DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_RX_ANTENNA_SELECTED (=%d)\n", Antenna);            }		    break;			case OID_802_11_TX_ANTENNA_SELECTED:		    {			    NDIS_802_11_ANTENNA	Antenna = *(NDIS_802_11_ANTENNA *)pData;			    if (Antenna == 0)				    pAd->Antenna.field.TxDefaultAntenna = 1;    // ant-A			    else if(Antenna == 1)				    pAd->Antenna.field.TxDefaultAntenna = 2;    // ant-B			    else				    pAd->Antenna.field.TxDefaultAntenna = 0;    // diversity			    pAd->PortCfg.BandState = UNKNOWN_BAND;			    AsicAntennaSelect(pAd, pAd->LatchRfRegs.Channel);			    DBGPRINT(RT_DEBUG_TRACE, "CMDHandler::OID_802_11_TX_ANTENNA_SELECTED (=%d)\n", Antenna);            }		    break;#if 0	        case RT_OID_802_11_QUERY_HARDWARE_REGISTER:		        NdisStatus = RTUSBQueryHardWareRegister(pAd, pData);		    break;		    case RT_OID_802_11_SET_HARDWARE_REGISTER:		        NdisStatus = RTUSBSetHardWareRegister(pAd, pData);			break;#endif			case RT_OID_MULTI_READ_MAC:	        {			    USHORT	Offset = *((PUSHORT)pData);			    USHORT	Length = *((PUSHORT)(pData + 2));		        RTUSBMultiRead(pAd, Offset, pData + 4, Length);		    }		    break;			case RT_OID_MULTI_WRITE_MAC:	        {		        USHORT	Offset = *((PUSHORT)pData);			    USHORT	Length = *((PUSHORT)(pData + 2));			    RTUSBMultiWrite(pAd, Offset, pData + 4, Length);		    }		    break;			case RT_OID_USB_VENDOR_EEPROM_READ:			{				USHORT	Offset = *((PUSHORT)pData);				USHORT	Length = *((PUSHORT)(pData + 2));				RTUSBReadEEPROM(pAd, Offset, pData + 4, Length);			}			break;			case RT_OID_USB_VENDOR_EEPROM_WRITE:			{				USHORT	Offset = *((PUSHORT)pData);#if 0				USHORT	Length = *((PUSHORT)(pData + 2));				RTUSBWriteEEPROM(pAd, Offset, pData + 4, Length);#else//F/W restricts the max EEPROM write size to 62 bytes.				USHORT	Residual = *((PUSHORT)(pData + 2));				pData += 4;				while (Residual > 62)				{				RTUSBWriteEEPROM(pAd, Offset, pData, 62);				Offset += 62;				Residual -= 62;				pData += 62;				}				RTUSBWriteEEPROM(pAd, Offset, pData, Residual);#endif			}			break;			case RT_OID_USB_VENDOR_ENTER_TESTMODE:			    RTUSB_VendorRequest(pAd,					0,					DEVICE_VENDOR_REQUEST_OUT,					0x1,					0x4,					0x1,					NULL,					0);					break;			case RT_OID_USB_VENDOR_EXIT_TESTMODE:				RTUSB_VendorRequest(pAd,					0,					DEVICE_VENDOR_REQUEST_OUT,					0x1,					0x4,					0x0,					NULL,					0);			break;			case RT_OID_USB_RESET_BULK_OUT:			{				INT 	Index;		        DBGPRINT(RT_DEBUG_INFO, "RT_OID_USB_RESET_BULK_OUT\n");				RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);				RTUSBRejectPendingPackets(pAd); //reject all NDIS packets waiting in TX queue				RTUSBCancelPendingBulkOutIRP(pAd);				RTUSBCleanUpDataBulkOutQueue(pAd);				NICInitializeAsic(pAd);				//ReleaseAdapter(pAd, FALSE, TRUE);   // unlink urb releated tx context				//NICInitTransmit(pAd);				RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);				if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))				{					RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);				}				if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))				{					for (Index = 0; Index < 4; Index++)					{						if(!skb_queue_empty(&pAd->SendTxWaitQueue[Index]))						{							RTMPDeQueuePacket(pAd, Index);						}					}					RTUSBKickBulkOut(pAd);				}			}    	    break;			case RT_OID_USB_RESET_BULK_IN:		    {			    int	i;				DBGPRINT(RT_DEBUG_INFO, "!!!!!RT_OID_USB_RESET_BULK_IN\n");				RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);				NICInitializeAsic(pAd);				//RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x025eb032); // ??				for (i = 0; i < RX_RING_SIZE; i++)				{					PRX_CONTEXT  pRxContext = &(pAd->RxContext[i]);					if (pRxContext->pUrb != NULL)					{						RTUSB_UNLINK_URB(pRxContext->pUrb);						usb_free_urb(pRxContext->pUrb);						pRxContext->pUrb = NULL;					}					if (pRxContext->TransferBuffer != NULL)					{						kfree(pRxContext->TransferBuffer);						pRxContext->TransferBuffer = NULL;					}				}				NICInitRecv(pAd);				RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_PIPE_IN_PROGRESS);				if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET))				{					RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);				}				if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))				{					RTUSBBulkReceive(pAd);					RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x0276b032);  // enable RX of MAC block				}		    }			break;			case RT_OID_802_11_STA_CONFIG:			{				RT_802_11_STA_CONFIG *pStaConfig = (RT_802_11_STA_CONFIG *)pData;				if (pStaConfig->EnableTxBurst != pAd->PortCfg.bEnableTxBurst)				{					pAd->PortCfg.bEnableTxBurst = (pStaConfig->EnableTxBurst == 1);					//Currently Tx burst mode is only implemented in infrastructure mode.					if (INFRA_ON(pAd))					{						if (pAd->PortCfg.bEnableTxBurst)						{							//Extend slot time if any encryption method is used to give ASIC more time to do encryption/decryption during Tx burst mode.							if (pAd->PortCfg.WepStatus != Ndis802_11EncryptionDisabled)							{							// Nemo  RT2573USBWriteMACRegister_old(pAd, MAC_CSR10, 0x20);							}							//Set CWmin/CWmax to 0.							// Nemo 2004    RT2573USBWriteMACRegister_old(pAd, MAC_CSR22, 0x100);						}						else						{							if (pAd->PortCfg.WepStatus != Ndis802_11EncryptionDisabled)								AsicSetSlotTime(pAd, (BOOLEAN)pAd->PortCfg.UseShortSlotTime);						// Nemo 2004    RT2573USBWriteMACRegister_old(pAd, MAC_CSR22, 0x53);						}					}				}				//pAd->PortCfg.EnableTurboRate = pStaConfig->EnableTurboRate;				pAd->PortCfg.UseBGProtection = pStaConfig->UseBGProtection;				//pAd->PortCfg.UseShortSlotTime = pStaConfig->UseShortSlotTime;				pAd->PortCfg.UseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable				if (pAd->PortCfg.AdhocMode != pStaConfig->AdhocMode)				{					// allow dynamic change of "USE OFDM rate or not" in ADHOC mode					// if setting changed, need to reset current TX rate as well as BEACON frame format					pAd->PortCfg.AdhocMode = pStaConfig->AdhocMode;					if (pAd->PortCfg.BssType == BSS_ADHOC)					{						MlmeUpdateTxRates(pAd, FALSE);						MakeIbssBeacon(pAd);						AsicEnableIbssSync(pAd);					}				}				DBGPRINT(RT_DEBUG_TRACE, "CmdThread::RT_OID_802_11_SET_STA_CONFIG (Burst=%d,BGprot=%d,ShortSlot=%d,Adhoc=%d,Protection=%d\n",					pStaConfig->EnableTxBurst,					pStaConfig->UseBGProtection,					pStaConfig->UseShortSlotTime,					pStaConfig->AdhocMode,					pAd->PortCfg.UseBGProtection);			}		    break;			case RT_OID_SET_PSM_BIT_SAVE:				MlmeSetPsmBit(pAd, PWR_SAVE);				RTMPSendNullFrame(pAd, pAd->PortCfg.TxRate);		    break;		    case RT_OID_SET_RADIO:			    if (pAd->PortCfg.bRadio == TRUE)                {				    MlmeRadioOn(pAd);				    // Update extra information				    pAd->ExtraInfo = EXTRA_INFO_CLEAR;			    }			    else                {					disassocSTA(pAd);			        MlmeRadioOff(pAd);				    // Update extra information    			    pAd->ExtraInfo = SW_RADIO_OFF;    		    }		    break;			case RT_OID_RESET_FROM_ERROR:			case RT_OID_RESET_FROM_NDIS:			{				UINT	i = 0;				DBGPRINT(RT_DEBUG_TRACE, "- (%s)::RT_OID_RESET_FROM_ERROR\n",						__FUNCTION__);				RTUSBRejectPendingPackets(pAd);//reject all NDIS packets waiting in TX queue				RTUSBCleanUpDataBulkOutQueue(pAd);				MlmeSuspend(pAd, FALSE);				//Add code to access necessary registers here.				//disable Rx				RTUSBWriteMACRegister(pAd, TXRX_CSR2, 1);				//Ask our device to complete any pending bulk in IRP.				while ((atomic_read(&pAd->PendingRx) > 0) ||                       (pAd->BulkOutPending[0] == TRUE) ||					   (pAd->BulkOutPending[1] == TRUE) ||					   (pAd->BulkOutPending[2] == TRUE) ||					   (pAd->BulkOutPending[3] == TRUE))				{				    if (atomic_read(&pAd->PendingRx) > 0)					{						DBGPRINT(RT_DEBUG_TRACE,								"- (%s) BulkIn IRP Pending!!!\n", __FUNCTION__);						RTUSB_VendorRequest(pAd,											0,											DEVICE_VENDOR_REQUEST_OUT,											0x0C,											0x0,											0x0,											NULL,											0);					}					if ((pAd->BulkOutPending[0] == TRUE) ||						(pAd->BulkOutPending[1] == TRUE) ||						(pAd->BulkOutPending[2] == TRUE) ||						(pAd->BulkOutPending[3] == TRUE))					{						DBGPRINT(RT_DEBUG_TRACE,							"- (%s) BulkOut IRP Pending!!!\n", __FUNCTION__);						if (i == 0)						{							RTUSBCancelPendingBulkOutIRP(pAd);							i++;						}					}					RTMPusecDelay(500000);				}				NICResetFromError(pAd);				if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR))				{					RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR);				}				if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET))				{					RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);				}				if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))				{					RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);				}				RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);				if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) &&					(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&					(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))				{					MlmeResume(pAd);					RTUSBBulkReceive(pAd);					RTUSBWriteMACRegister(pAd, TXRX_CSR2, 0x7e);				}			}			break;			case RT_OID_LINK_DOWN:				DBGPRINT(RT_DEBUG_INFO, "LinkDown(RT_OID_LINK_DOWN)\n");				LinkDown(pAd, TRUE);			break;			case RT_OID_VENDOR_WRITE_BBP:			{				UCHAR	Offset, Value;				Offset = *((PUCHAR)pData);				Value = *((PUCHAR)(pData + 1));				DBGPRINT(RT_DEBUG_INFO, "offset = 0x%02x	value = 0x%02x\n", Offset, Value);				RTUSBWriteBBPRegister(pAd, Offset, Value);			}			break;			case RT_OID_VENDOR_READ_BBP:			{				UCHAR	Offset = *((PUCHAR)pData);				PUCHAR	pValue = (PUCHAR)(pData + 1);				DBGPRINT(RT_DEBUG_INFO, "offset = 0x%02x\n", Offset);				RTUSBReadBBPRegister(pAd, Offset, pValue);				DBGPRINT(RT_DEBUG_INFO, "value = 0x%02x\n", *pValue);			}			break;			case RT_OID_VENDOR_WRITE_RF:			{				ULONG	Value = *((PULONG)pData);				DBGPRINT(RT_DEBUG_INFO, "value = 0x%08x\n", Value);				RTUSBWriteRFRegister(pAd, Value);			}			break;			case RT_OID_802_11_RESET_COUNTERS:			{				UCHAR	Value[22];				RTUSBMultiRead(pAd, STA_CSR0, Value, 24);			}			break;			case RT_OID_USB_VENDOR_RESET:				RTUSB_VendorRequest(pAd,									0,									DEVICE_VENDOR_REQUEST_OUT,									1,									1,									0,									NULL,									0);			break;			case RT_OID_USB_VENDOR_UNPLUG:				RTUSB_VendorRequest(pAd,									0,									DEVICE_VENDOR_REQUEST_OUT,									1,									2,									0,									NULL,									0);			break;#if 0			case RT_OID_USB_VENDOR_SWITCH_FUNCTION:				RTUSBWriteMACRegister(pAd, MAC_CSR13, 0x2121);				RTUSBWriteMACRegister(pAd, MAC_CSR14, 0x1e1e);				RTUSBWriteMACRegister(pAd, MAC_CSR1, 3);				RTUSBWriteMACRegister(pAd, PHY_CSR4, 0xf);				RTUSB_VendorRequest(pAd,									0,									DEVICE_VENDOR_REQUEST_OUT,									1,									3,									0,									NULL,									0);			break;#endif			case RT_OID_VENDOR_FLIP_IQ:			{				ULONG	Value1, Value2;				RTUSBReadMACRegister(pAd, PHY_CSR5, &Value1);				RTUSBReadMACRegister(pAd, PHY_CSR6, &Value2);				if (*pData == 1)				{					DBGPRINT(RT_DEBUG_INFO, "I/Q Flip\n");					Value1 = Value1 | 0x0004;					Value2 = Value2 | 0x0004;				}				else				{					DBGPRINT(RT_DEBUG_INFO, "I/Q Not Flip\n");					Value1 = Value1 & 0xFFFB;					Value2 = Value2 & 0xFFFB;				}				RTUSBWriteMACRegister(pAd, PHY_CSR5, Value1);				RTUSBWriteMACRegister(pAd, PHY_CSR6, Value2);			}			break;			case RT_OID_UPDATE_TX_RATE:				MlmeUpdateTxRates(pAd, FALSE);				if (ADHOC_ON(pAd))					MakeIbssBeacon(pAd);			break;			case RT_OID_802_11_PREAMBLE:			{				ULONG	Preamble = *((PULONG)(cmdqelmt->buffer));				if (Preamble == Rt802_11PreambleShort)				{					pAd->PortCfg.TxPreamble = Preamble;					MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);				}				else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))				{					// if user wants AUTO, initialize to LONG here, then change according to AP's					// capability upon association.					pAd->PortCfg.TxPreamble = Preamble;					MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);				}				else					NdisStatus = NDIS_STATUS_FAILURE;				DBGPRINT(RT_DEBUG_ERROR, "CMDHandler::RT_OID_802_11_SET_PREAMBLE (=%d)\n", Preamble);			}			break;

⌨️ 快捷键说明

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