rtusb_io.c

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

C
1,909
字号
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify  *  * it under the terms of the GNU General Public License as published by  *  * the Free Software Foundation; either version 2 of the License, or     *  * (at your option) any later version.                                   *  *                                                                       *  * This program is distributed in the hope that it will be useful,       *  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *  * GNU General Public License for more details.                          *  *                                                                       *  * You should have received a copy of the GNU General Public License     *  * along with this program; if not, write to the                         *  * Free Software Foundation, Inc.,                                       *  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *  *                                                                       *  *************************************************************************  	Module Name:	rtusb_io.c	Abstract:	Revision History:	Who			When	    What	--------	----------  ----------------------------------------------	Name		Date	    Modification logs	Paul Lin    06-25-2004  created*/#include	"rt_config.h"/*	========================================================================		Routine Description: NIC initialization complete	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBFirmwareRun(	IN	PRTMP_ADAPTER	pAd){	NTSTATUS	Status;	Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x01,		0x8,		0,		NULL,		0);		return Status;}/*	========================================================================		Routine Description: Write Firmware to NIC.	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS RTUSBFirmwareWrite(	IN PRTMP_ADAPTER pAd,	IN PUCHAR		pFwImage,	IN ULONG		FwLen){	UINT32		MacReg;	NTSTATUS 	Status;//	ULONG 		i;	USHORT		writeLen;		Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacReg);	writeLen = FwLen;	RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE, pFwImage, writeLen);		Status = RTUSBWriteMACRegister(pAd, 0x7014, 0xffffffff);	Status = RTUSBWriteMACRegister(pAd, 0x701c, 0xffffffff);	Status = RTUSBFirmwareRun(pAd);	RTMPusecDelay(10000);	RTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0);	AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00);//reset rf by MCU supported by new firmware		return Status;}/*	========================================================================		Routine Description: Get current firmware operation mode (Return Value)	Arguments:	Return Value: 		0 or 1 = Downloaded by host driver		others = Driver doesn't download firmware	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBFirmwareOpmode(	IN	PRTMP_ADAPTER	pAd,	OUT	PUINT32			pValue){	NTSTATUS	Status;	Status = RTUSB_VendorRequest(		pAd,		(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),		DEVICE_VENDOR_REQUEST_IN,		0x1,		0x11,		0,		pValue,		4);	return Status;}NTSTATUS	RTUSBVenderReset(	IN	PRTMP_ADAPTER	pAd){	NTSTATUS	Status;	DBGPRINT_RAW(RT_DEBUG_ERROR, ("-->RTUSBVenderReset\n"));	Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x01,		0x1,		0,		NULL,		0);	DBGPRINT_RAW(RT_DEBUG_ERROR, ("<--RTUSBVenderReset\n"));	return Status;}/*	========================================================================		Routine Description: Read various length data from RT2573	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBMultiRead(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	OUT	PUCHAR			pData,	IN	USHORT			length){	NTSTATUS	Status;	Status = RTUSB_VendorRequest(		pAd,		(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),		DEVICE_VENDOR_REQUEST_IN,		0x7,		0,		Offset,		pData,		length);		return Status;}/*	========================================================================		Routine Description: Write various length data to RT2573	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBMultiWrite_OneByte(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	IN	PUCHAR			pData){	NTSTATUS	Status;	// TODO: In 2870, use this funciton carefully cause it's not stable.	Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x6,		0,		Offset,		pData,		1);	return Status;}NTSTATUS	RTUSBMultiWrite(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	IN	PUCHAR			pData,	IN	USHORT			length){	NTSTATUS	Status;        USHORT          index = 0,Value;        PUCHAR          pSrc = pData;        USHORT          resude = 0;		        resude = length % 2;		length  += resude;		do		{			Value =(USHORT)( *pSrc  | (*(pSrc + 1) << 8));		Status = RTUSBSingleWrite(pAd,Offset + index,Value);            index +=2;            length -= 2;            pSrc = pSrc + 2;        }while(length > 0);	return Status;}NTSTATUS RTUSBSingleWrite(	IN 	RTMP_ADAPTER 	*pAd,	IN	USHORT			Offset,	IN	USHORT			Value){	NTSTATUS	Status;	Status = RTUSB_VendorRequest(		pAd,		USBD_TRANSFER_DIRECTION_OUT,		DEVICE_VENDOR_REQUEST_OUT,		0x2,		Value,		Offset,		NULL,		0);		return Status;}/*	========================================================================		Routine Description: Read 32-bit MAC register	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBReadMACRegister(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	OUT	PUINT32			pValue){	NTSTATUS	Status;	UINT32		localVal;	Status = RTUSB_VendorRequest(		pAd,		(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),		DEVICE_VENDOR_REQUEST_IN,		0x7,		0,		Offset,		&localVal,		4);		*pValue = le2cpu32(localVal);	if (Status < 0)		*pValue = 0xffffffff;		return Status;}/*	========================================================================		Routine Description: Write 32-bit MAC register	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBWriteMACRegister(	IN	PRTMP_ADAPTER	pAd,	IN	USHORT			Offset,	IN	UINT32			Value){	NTSTATUS	Status;	UINT32		localVal;	localVal = Value;	Status = RTUSBSingleWrite(pAd, Offset, (USHORT)(localVal & 0xffff));	Status = RTUSBSingleWrite(pAd, Offset + 2, (USHORT)((localVal & 0xffff0000) >> 16));	return Status;}#if 1/*	========================================================================		Routine Description: Read 8-bit BBP register	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBReadBBPRegister(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Id,	IN	PUCHAR			pValue){	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("RTUSBReadBBPRegister(BBP_CSR_CFG_1):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)))	{		//		// Read failed then Return Default value.		//		*pValue = pAd->BbpWriteLatch[Id];			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			= 1;	BbpCsr.field.Busy			= 1;	BbpCsr.field.RegNum 		= Id;	RTUSBWriteMACRegister(pAd, BBP_CSR_CFG, BbpCsr.word);	i = 0;		// Verify the busy condition	do	{		status = RTUSBReadMACRegister(pAd, BBP_CSR_CFG, &BbpCsr.word);		if (status >= 0)		{		if (!(BbpCsr.field.Busy == BUSY))		{			*pValue = (UCHAR)BbpCsr.field.Value;			break;		}		}		printk("RTUSBReadBBPRegister(BBP_CSR_CFG_2):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)))	{		//		// Read failed then Return Default value.		//		*pValue = pAd->BbpWriteLatch[Id];		DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));		return STATUS_UNSUCCESSFUL;	}		return STATUS_SUCCESS;}#else/*	========================================================================		Routine Description: Read 8-bit BBP register via firmware	Arguments:	Return Value:	IRQL = 		Note:		========================================================================*/NTSTATUS	RTUSBReadBBPRegister(	IN	PRTMP_ADAPTER	pAd,	IN	UCHAR			Id,	IN	PUCHAR			pValue)

⌨️ 快捷键说明

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