📄 rtusb_io.c
字号:
/*
***************************************************************************
* Ralink Tech Inc.
* 4F, No. 2 Technology 5th Rd.
* Science-based Industrial Park
* Hsin-chu, Taiwan, R.O.C.
*
* (c) Copyright 2002-2006, 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:
Note:
========================================================================
*/
NTSTATUS RTUSBFirmwareRun(
IN PRTMP_ADAPTER pAd)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x01,
0x8,
0,
NULL,
0);
return Status;
}
/*
========================================================================
Routine Description: Read various length data from RT2573
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBMultiRead(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT PUCHAR pData,
IN USHORT length)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_IN,
0x7,
0,
Offset,
pData,
length);
return Status;
}
/*
========================================================================
Routine Description: Write various length data to RT2573
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBMultiWrite(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN PUCHAR pData,
IN USHORT length)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x6,
0,
Offset,
pData,
length);
return Status;
}
/*
========================================================================
Routine Description: Read 32-bit MAC register
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBReadMACRegister(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT PULONG pValue)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_IN,
0x7,
0,
Offset,
pValue,
4);
return Status;
}
/*
========================================================================
Routine Description: Write 32-bit MAC register
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBWriteMACRegister(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN ULONG Value)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x6,
0x00,
Offset,
&Value,
4);
return Status;
}
/*
========================================================================
Routine Description: Write 32-bit MAC register
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBSetLED(
IN PRTMP_ADAPTER pAd,
IN MCU_LEDCS_STRUC LedStatus,
IN USHORT LedIndicatorStrength)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x0a,
LedStatus.word,
LedIndicatorStrength,
NULL,
0);
return Status;
}
/*
========================================================================
Routine Description: Read 8-bit BBP register
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBReadBBPRegister(
IN PRTMP_ADAPTER pAd,
IN UCHAR Id,
IN PUCHAR pValue)
{
PHY_CSR3_STRUC PhyCsr3;
UINT i = 0;
// Verify the busy condition
do
{
RTUSBReadMACRegister(pAd, PHY_CSR3, &PhyCsr3.word);
if (!(PhyCsr3.field.Busy == BUSY))
break;
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
PhyCsr3.word = 0;
PhyCsr3.field.fRead = 1;
PhyCsr3.field.Busy = 1;
PhyCsr3.field.RegNum = Id;
RTUSBWriteMACRegister(pAd, PHY_CSR3, PhyCsr3.word);
i = 0;
// Verify the busy condition
do
{
RTUSBReadMACRegister(pAd, PHY_CSR3, &PhyCsr3.word);
if (!(PhyCsr3.field.Busy == BUSY))
{
*pValue = (UCHAR)PhyCsr3.field.Value;
break;
}
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:
Note:
========================================================================
*/
NTSTATUS RTUSBWriteBBPRegister(
IN PRTMP_ADAPTER pAd,
IN UCHAR Id,
IN UCHAR Value)
{
PHY_CSR3_STRUC PhyCsr3;
UINT i = 0;
// Verify the busy condition
do
{
RTUSBReadMACRegister(pAd, PHY_CSR3, &PhyCsr3.word);
if (!(PhyCsr3.field.Busy == BUSY))
break;
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
PhyCsr3.word = 0;
PhyCsr3.field.fRead = 0;
PhyCsr3.field.Value = Value;
PhyCsr3.field.Busy = 1;
PhyCsr3.field.RegNum = Id;
RTUSBWriteMACRegister(pAd, PHY_CSR3, PhyCsr3.word);
pAd->BbpWriteLatch[Id] = Value;
return STATUS_SUCCESS;
}
/*
========================================================================
Routine Description: Write RF register through MAC
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBWriteRFRegister(
IN PRTMP_ADAPTER pAd,
IN ULONG Value)
{
PHY_CSR4_STRUC PhyCsr4;
UINT i = 0;
do
{
RTUSBReadMACRegister(pAd, PHY_CSR4, &PhyCsr4.word);
if (!(PhyCsr4.field.Busy))
break;
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, PHY_CSR4, Value);
return STATUS_SUCCESS;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBReadEEPROM(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
OUT PUCHAR pData,
IN USHORT length)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_IN,
0x9,
0,
Offset,
pData,
length);
return Status;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBWriteEEPROM(
IN PRTMP_ADAPTER pAd,
IN USHORT Offset,
IN PUCHAR pData,
IN USHORT length)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x8,
0,
Offset,
pData,
length);
return Status;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBPutToSleep(
IN PRTMP_ADAPTER pAd)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x01,
0x07,
0,
NULL,
0);
return Status;
}
/*
========================================================================
Routine Description:
Arguments:
Return Value:
Note:
========================================================================
*/
NTSTATUS RTUSBWakeUp(
IN PRTMP_ADAPTER pAd)
{
NTSTATUS Status;
Status = RTUSB_VendorRequest(
pAd,
0,
DEVICE_VENDOR_REQUEST_OUT,
0x01,
0x09,
0,
NULL,
0);
return Status;
}
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -