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 + -
显示快捷键?