rtusb_io.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,909 行 · 第 1/4 页

C
1,909
字号
{																			BBP_CSR_CFG_STRUC	BbpCsr;												int					i, k;												for (i=0; i<MAX_BUSY_COUNT; i++)										{																			RTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word);						if (BbpCsr.field.Busy == BUSY)											{																			continue;															}																		BbpCsr.word = 0;														BbpCsr.field.fRead = 1;													BbpCsr.field.BBP_RW_MODE = 1;											BbpCsr.field.Busy = 1;													BbpCsr.field.RegNum = Id;												RTUSBWriteMACRegister(pAd, H2M_BBP_AGENT, BbpCsr.word);						AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0);							for (k=0; k<MAX_BUSY_COUNT; k++)										{																			RTUSBReadMACRegister(pAd, H2M_BBP_AGENT, &BbpCsr.word);						if (BbpCsr.field.Busy == IDLE)												break;															}																		if ((BbpCsr.field.Busy == IDLE) &&											(BbpCsr.field.RegNum == Id))										{																			*pValue = (UCHAR)BbpCsr.field.Value;										break;																}																	}	if (BbpCsr.field.Busy == BUSY)											{																			DBGPRINT_ERR(("BBP read R%d=0x%x fail\n", Id, BbpCsr.word));			*pValue = pAd->BbpWriteLatch[Id];										return STATUS_UNSUCCESSFUL;	}	return STATUS_SUCCESS;}#endif#if 1/*	========================================================================		Routine Description: Write 8-bit BBP register	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBWriteBBPRegister(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Id,	IN	UCHAR			Value){	BBP_CSR_CFG_STRUC	BbpCsr;	UINT			i = 0;	NTSTATUS		status;	// Verify the busy condition	do	{		status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);		if (status >= 0)		{		if (!(BbpCsr.field.Busy == BUSY))			break;		}		printk("RTUSBWriteBBPRegister(BBP_CSR_CFG):retry count=%d!\n", i);		i++;	}	while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));		if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))	{		DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));		return STATUS_UNSUCCESSFUL;	}	// Prepare for write material	BbpCsr.word 				= 0;	BbpCsr.field.fRead			= 0;	BbpCsr.field.Value			= Value;	BbpCsr.field.Busy			= 1;	BbpCsr.field.RegNum 		= Id;	RTUSBWriteMACRegister(pAd, BBP_CSR_CFG, BbpCsr.word);		pAd->BbpWriteLatch[Id] = Value;	return STATUS_SUCCESS;}#else/*	========================================================================		Routine Description: Write 8-bit BBP register via firmware	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBWriteBBPRegister(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Id,	IN	UCHAR			Value){																			BBP_CSR_CFG_STRUC	BbpCsr;												int					BusyCnt;											for (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++)					{																		RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word);						if (BbpCsr.field.Busy == BUSY)												continue;														BbpCsr.word = 0;														BbpCsr.field.fRead = 0;													BbpCsr.field.BBP_RW_MODE = 1;											BbpCsr.field.Busy = 1;													BbpCsr.field.Value = Value;										BbpCsr.field.RegNum = Id;												RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);						AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0);						pAd->BbpWriteLatch[Id] = Value;											break;															}																	if (BusyCnt == MAX_BUSY_COUNT)										{																		DBGPRINT_ERR(("BBP write R%d=0x%x fail\n", Id, BbpCsr.word));			return STATUS_UNSUCCESSFUL;	}										return STATUS_SUCCESS;}#endif/*	========================================================================		Routine Description: Write RF register through MAC	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBWriteRFRegister(	IN	PRTMP_ADAPTER	pAd,	IN	UINT32			Value){	PHY_CSR4_STRUC	PhyCsr4;	UINT			i = 0;	NTSTATUS		status;	NdisZeroMemory(&PhyCsr4, sizeof(PHY_CSR4_STRUC));	do	{		status = RTUSBReadMACRegister(pAd, RF_CSR_CFG0, &PhyCsr4.word);		if (status >= 0)		{		if (!(PhyCsr4.field.Busy))			break;		}		printk("RTUSBWriteRFRegister(RF_CSR_CFG0):retry count=%d!\n", i);		i++;	}	while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));	if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))	{		DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));		return STATUS_UNSUCCESSFUL;	}	RTUSBWriteMACRegister(pAd, RF_CSR_CFG0, Value);		return STATUS_SUCCESS;}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBReadEEPROM(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	OUT	PUCHAR			pData,	IN	USHORT			length){	NTSTATUS	Status = STATUS_SUCCESS;#ifdef RT30xx	if(pAd->bUseEfuse)	{		Status =eFuseRead(pAd, Offset, pData, length);	}	else#endif // RT30xx //	{	Status = RTUSB_VendorRequest(		pAd,		(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),		DEVICE_VENDOR_REQUEST_IN,		0x9,		0,		Offset,		pData,		length);	}		return Status;}/*	========================================================================		Routine Description:	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBWriteEEPROM(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	IN	PUCHAR			pData,	IN	USHORT			length){	NTSTATUS	Status = STATUS_SUCCESS;#ifdef RT30xx	if(pAd->bUseEfuse)	{		Status = eFuseWrite(pAd, Offset, pData, length);	}	else#endif // RT30xx //	{	Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x8,		0,		Offset,		pData,		length);	}		return Status;}/*	========================================================================		Routine Description:	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/VOID RTUSBPutToSleep(	IN	PRTMP_ADAPTER	pAd){	UINT32		value;		// Timeout 0x40 x 50us	value = (SLEEPCID<<16)+(OWNERMCU<<24)+ (0x40<<8)+1;	RTUSBWriteMACRegister(pAd, 0x7010, value);	RTUSBWriteMACRegister(pAd, 0x404, 0x30);	//RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);				DBGPRINT_RAW(RT_DEBUG_ERROR, ("Sleep Mailbox testvalue %x\n", value));	}/*	========================================================================		Routine Description:	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/NTSTATUS RTUSBWakeUp(	IN	PRTMP_ADAPTER	pAd){	NTSTATUS	Status;		Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x01,		0x09,		0,		NULL,		0);		return Status;}/*	========================================================================		Routine Description:	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/VOID	RTUSBInitializeCmdQ(	IN	PCmdQ	cmdq){	cmdq->head = NULL;	cmdq->tail = NULL;	cmdq->size = 0;	cmdq->CmdQState = RT2870_THREAD_INITED;}/*	========================================================================		Routine Description:	Arguments:	Return Value:		IRQL = 		Note:		========================================================================*/NDIS_STATUS	RTUSBEnqueueCmdFromNdis(	IN	PRTMP_ADAPTER	pAd,	IN	NDIS_OID		Oid,	IN	BOOLEAN			SetInformation,	IN	PVOID			pInformationBuffer,	IN	UINT32			InformationBufferLength){	NDIS_STATUS	status;	PCmdQElmt	cmdqelmt = NULL;	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;		if (pObj->RTUSBCmdThr_pid < 0) 		return (NDIS_STATUS_RESOURCES);        	status = RTMPAllocateMemory((PVOID *)&cmdqelmt, sizeof(CmdQElmt));	if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))		return (NDIS_STATUS_RESOURCES);		cmdqelmt->buffer = NULL;		if (pInformationBuffer != NULL)		{			status = RTMPAllocateMemory((PVOID *)&cmdqelmt->buffer, InformationBufferLength);			if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))			{       				kfree(cmdqelmt);				return (NDIS_STATUS_RESOURCES);			}			else			{				NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);				cmdqelmt->bufferlength = InformationBufferLength;			}		}		else			cmdqelmt->bufferlength = 0;		cmdqelmt->command = Oid;	cmdqelmt->CmdFromNdis = TRUE;	if (SetInformation == TRUE)		cmdqelmt->SetOperation = TRUE;	else		cmdqelmt->SetOperation = FALSE;	NdisAcquireSpinLock(&pAd->CmdQLock);	if (pAd->CmdQ.CmdQState & RT2870_THREAD_CAN_DO_INSERT)	{		EnqueueCmd((&pAd->CmdQ), cmdqelmt);		status = NDIS_STATUS_SUCCESS;	}	else	{		status = NDIS_STATUS_FAILURE;	}	NdisReleaseSpinLock(&pAd->CmdQLock);		if (status == NDIS_STATUS_FAILURE)	{		if (cmdqelmt->buffer)			NdisFreeMemory(cmdqelmt->buffer, cmdqelmt->bufferlength, 0);		NdisFreeMemory(cmdqelmt, sizeof(CmdQElmt), 0);	}	else	RTUSBCMDUp(pAd);    return(NDIS_STATUS_SUCCESS);}/*	========================================================================		Routine Description:	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NDIS_STATUS RTUSBEnqueueInternalCmd(	IN PRTMP_ADAPTER	pAd,	IN NDIS_OID			Oid,	IN PVOID			pInformationBuffer,	IN UINT32			InformationBufferLength)	{	NDIS_STATUS	status;	PCmdQElmt	cmdqelmt = NULL;		

⌨️ 快捷键说明

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