📄 rtusb_io.c
字号:
/* ************************************************************************* * 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*/#ifdef RTMP_MAC_USB#include "rt_config.h"/* ======================================================================== Routine Description: NIC initialization complete Arguments: Return Value: IRQL = Note: ========================================================================*/static 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); //2008/11/28:KH add to fix the dead rf frequency offset bug<-- RTMPusecDelay(10000); RTUSBWriteMACRegister(pAd,H2M_MAILBOX_CSR,0); AsicSendCommandToMcu(pAd, 0x72, 0x00, 0x00, 0x00); //reset rf by MCU supported by new firmware //2008/11/28:KH add to fix the dead rf frequency offset bug-->#ifdef NEW_FW if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) { // send 0x36 mcu command after 0x72 for RT3xxx to fix Radio-Off current leakage issue RTMPusecDelay(200); AsicSendCommandToMcu(pAd, 0x36, 0, 0, 0); RTMPusecDelay(10); }#endif // NEW_FW // 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 = 0; 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;}/* ======================================================================== 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; } DBGPRINT(RT_DEBUG_TRACE, ("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; } } DBGPRINT(RT_DEBUG_TRACE, ("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;}/* ======================================================================== Routine Description: Write 8-bit BBP register Arguments: Return Value: IRQL = Note: ========================================================================*/NTSTATUS RTUSBWriteBBPRegister( IN PRTMP_ADAPTER pAd, IN UCHAR Id, IN UCHAR Value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -