rtmp_init.c
来自「Ralink RT61 SoftAP Driver source code. 」· C语言 代码 · 共 1,988 行 · 第 1/5 页
C
1,988 行
RTMP_IO_WRITE32(pAdapter, RX_CNTL_CSR, 0x00000001); // enable RX of DMA block
// This delay is needed when ATE(RXFRAME) turn on
RTMPusecDelay(10);
// Clear raw counters
RTMP_IO_READ32(pAdapter, STA_CSR0, &Counter);
RTMP_IO_READ32(pAdapter, STA_CSR1, &Counter);
RTMP_IO_READ32(pAdapter, STA_CSR2, &Counter);
// assert HOST ready bit
// RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark
// RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x4);
RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x4);
DBGPRINT(RT_DEBUG_TRACE, "<-- NICInitializeAsic\n");
}
/*
========================================================================
Routine Description:
Reset NIC Asics
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
Reset NIC to initial state AS IS system boot up time.
========================================================================
*/
VOID NICIssueReset(
IN PRTMP_ADAPTER pAdapter)
{
ULONG DmaRxIdle=0;
ULONG DmaTxIdle=0;
int retryCount = 0;
DBGPRINT(RT_DEBUG_TRACE, "--> NICIssueReset\n");
// Abort Tx, prevent ASIC from writing to Host memory
RTMP_IO_WRITE32(pAdapter, TX_CNTL_CSR, 0x001f0000);
RetryTxDMA:
RTMP_IO_READ32(pAdapter,DMA_STATUS_CSR,&DmaTxIdle);
if((DmaTxIdle & (0x1<<8))) {
DBGPRINT(RT_DEBUG_TRACE, "DmaTx already idle\n");
DBGPRINT(RT_DEBUG_TRACE, "DmaTx value (%x) \n", DmaTxIdle);
}
else {
udelay(1000);// delay 1 ms
retryCount++;
if (retryCount <= 100)
goto RetryTxDMA;
}
// Disable Rx, register value supposed will remain after reset
RTMP_IO_WRITE32(pAdapter, TXRX_CSR0, 0x0257b032);//0x0256b032
// Need Delay
udelay(1000);// delay 1 ms
// Disbable DMA RX
RTMP_IO_WRITE32(pAdapter, RX_CNTL_CSR,0x0);
//
// Need Delay
udelay(1000);// delay 1 ms
// Check 3480 register. bit 9
RTMP_IO_READ32(pAdapter,DMA_STATUS_CSR,&DmaRxIdle);
retryCount = 0;
RetryRxDMA:
RTMP_IO_READ32(pAdapter,DMA_STATUS_CSR,&DmaRxIdle);
if((DmaRxIdle & (0x1<<9))) {
DBGPRINT(RT_DEBUG_TRACE, "DmaRx already idle\n");
DBGPRINT(RT_DEBUG_TRACE, "DmaRx value (%x) \n", DmaRxIdle);
}
else {
udelay(1000);// delay 1 ms
retryCount++;
if (retryCount <= 100)
goto RetryRxDMA;
}
// Issue reset and clear from reset state
RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x03); // 2004-09-17 change from 0x01
//RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x00); // 2005-07-22 Mark suggest
DBGPRINT(RT_DEBUG_TRACE, "<-- NICIssueReset\n");
}
/*
========================================================================
Routine Description:
Check ASIC registers and find any reason the system might hang
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
========================================================================
*/
BOOLEAN NICCheckForHang(
IN PRTMP_ADAPTER pAd)
{
return (FALSE);
}
/*
========================================================================
Routine Description:
Read statistical counters from hardware registers and record them
in software variables for later on query
Arguments:
pAdapter Pointer to our adapter
Return Value:
None
========================================================================
*/
VOID NICUpdateRawCounters(
IN PRTMP_ADAPTER pAdapter)
{
STA_CSR0_STRUC StaCsr0;
STA_CSR1_STRUC StaCsr1;
STA_CSR2_STRUC StaCsr2;
STA_CSR3_STRUC StaCsr3;
RTMP_IO_READ32(pAdapter, STA_CSR0, &StaCsr0.word);
// Update RX PLCP error counter
pAdapter->PrivateInfo.PhyRxErrCnt += StaCsr0.field.PlcpErr;
// Update FCS counters
pAdapter->WlanCounters.FCSErrorCount += StaCsr0.field.CrcErr;
// Add FCS error count to private counters
pAdapter->RalinkCounters.OneSecRxFcsErrCnt += StaCsr0.field.CrcErr;
pAdapter->RalinkCounters.RealFcsErrCount += StaCsr0.field.CrcErr;
// Update False CCA counter
RTMP_IO_READ32(pAdapter, STA_CSR1, &StaCsr1.word);
pAdapter->RalinkCounters.OneSecFalseCCACnt = StaCsr1.field.FalseCca;
DBGPRINT(RT_DEBUG_INFO, "OneSecFalseCCACnt = %d\n", pAdapter->RalinkCounters.OneSecFalseCCACnt);
// Update RX Overflow counter
RTMP_IO_READ32(pAdapter, STA_CSR2, &StaCsr2.word);
pAdapter->Counters8023.RxNoBuffer += (StaCsr2.field.RxOverflowCount + StaCsr2.field.RxFifoOverflowCount);
// Update BEACON sent count
RTMP_IO_READ32(pAdapter, STA_CSR3, &StaCsr3.word);
pAdapter->RalinkCounters.OneSecBeaconSentCnt += StaCsr3.field.TxBeaconCount;
#ifdef RALINK_ATE
if (pAdapter->ate.bRxFer == 1)
{
printk("CrcErr= %d, FalseCca= %d\n", StaCsr0.field.CrcErr, StaCsr1.field.FalseCca);
}
#endif
}
/*
========================================================================
Routine Description:
Reset NIC from error
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
Reset NIC from error state
========================================================================
*/
VOID NICResetFromError(
IN PRTMP_ADAPTER pAdapter)
{
// Reset BBP (according to alex, reset ASIC will force reset BBP
// Therefore, skip the reset BBP
// RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x2);
// Release BBP reset
// RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x0);
RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x1);
// Remove ASIC from reset state
RTMP_IO_WRITE32(pAdapter, MAC_CSR1, 0x0);
// Init send data structures and related parameters
NICInitTxRxRingAndBacklogQueue(pAdapter);
NICInitializeAdapter(pAdapter);
NICInitAsicFromEEPROM(pAdapter);
// Switch to current channel, since during reset process, the connection should remains on.
AsicSwitchChannel(pAdapter, pAdapter->PortCfg.Channel);
AsicLockChannel(pAdapter, pAdapter->PortCfg.Channel);
}
/*
========================================================================
Routine Description:
Find key section for Get key parameter.
Arguments:
buffer Pointer to the buffer to start find the key section
section the key of the secion to be find
Return Value:
NULL Fail
Others Success
========================================================================
*/
PUCHAR RTMPFindSection(
IN PCHAR buffer)
{
CHAR temp_buf[32];
PUCHAR ptr;
strcpy(temp_buf, "Default");
if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
return (ptr+strlen("\n"));
else
return NULL;
}
/**
* strstr - Find the first substring in a %NUL terminated string
* @s1: The string to be searched
* @s2: The string to search for
*/
char * rtstrstr(const char * s1,const char * s2)
{
INT l1, l2;
l2 = strlen(s2);
if (!l2)
return (char *) s1;
l1 = strlen(s1);
while (l1 >= l2)
{
l1--;
if (!memcmp(s1,s2,l2))
return (char *) s1;
s1++;
}
return NULL;
}
/**
* rstrtok - Split a string into tokens
* @s: The string to be searched
* @ct: The characters to search for
* * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
*/
char * __rstrtok;
char * rstrtok(char * s,const char * ct)
{
char *sbegin, *send;
sbegin = s ? s : __rstrtok;
if (!sbegin)
{
return NULL;
}
sbegin += strspn(sbegin,ct);
if (*sbegin == '\0')
{
__rstrtok = NULL;
return( NULL );
}
send = strpbrk( sbegin, ct);
if (send && *send != '\0')
*send++ = '\0';
__rstrtok = send;
return (sbegin);
}
/*
========================================================================
Routine Description:
Get key parameter.
Arguments:
key Pointer to key string
dest Pointer to destination
destsize The datasize of the destination
buffer Pointer to the buffer to start find the key
Return Value:
TRUE Success
FALSE Fail
Note:
This routine get the value with the matched key (case case-sensitive)
========================================================================
*/
INT RTMPGetKeyParameter(
IN PCHAR key,
OUT PCHAR dest,
IN INT destsize,
IN PCHAR buffer)
{
CHAR *temp_buf1;
CHAR *temp_buf2;
CHAR *start_ptr;
CHAR *end_ptr;
CHAR *ptr;
CHAR *offset = 0;
INT len;
temp_buf1 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
if(temp_buf1 == NULL)
return (FALSE);
temp_buf2 = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);
if(temp_buf2 == NULL)
{
kfree(temp_buf1);
return (FALSE);
}
//find section
if((offset = RTMPFindSection(buffer)) == NULL)
{
kfree(temp_buf1);
kfree(temp_buf2);
return (FALSE);
}
strcpy(temp_buf1, "\n");
strcat(temp_buf1, key);
strcat(temp_buf1, "=");
//search key
if((start_ptr=rtstrstr(offset, temp_buf1))==NULL)
{
kfree(temp_buf1);
kfree(temp_buf2);
return (FALSE);
}
start_ptr+=strlen("\n");
if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL)
end_ptr=start_ptr+strlen(start_ptr);
if (end_ptr<start_ptr)
{
kfree(temp_buf1);
kfree(temp_buf2);
return (FALSE);
}
memcpy(temp_buf2, start_ptr, end_ptr-start_ptr);
temp_buf2[end_ptr-start_ptr]='\0';
len = strlen(temp_buf2);
strcpy(temp_buf1, temp_buf2);
if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL)
{
kfree(temp_buf1);
kfree(temp_buf2);
return (FALSE);
}
strcpy(temp_buf2, start_ptr+1);
ptr = temp_buf2;
//trim space or tab
while(*ptr != 0x00)
{
if( (*ptr == ' ') || (*ptr == '\t') )
ptr++;
else
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?