예제 #1
0
/* Function Name:
 *      rtl8367b_getAsicLutLearnLimitNo
 * Description:
 *      Get per-Port auto learning limit number
 * Input:
 *      port 	- Physical port number (0~7)
 *      pNumber 	- ASIC auto learning entries limit number
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 *      RT_ERR_PORT_ID  - Invalid port number
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicLutLearnLimitNo(rtk_uint32 port, rtk_uint32* pNumber)
{
    if(port > RTL8367B_PORTIDMAX)
        return RT_ERR_PORT_ID;

	return rtl8367b_getAsicReg(RTL8367B_LUT_PORT_LEARN_LIMITNO_REG(port), pNumber);
}
예제 #2
0
/* Function Name:
 *      rtl8367b_getAsicRldpLoopStatePara
 * Description:
 *      Get retry count and retry period of loop state
 * Input:
 *      pRetryCount 	- 0~0xFF (times)
 *      pRetryPeriod 	- 0~0xFFFF (ms)
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_OUT_OF_RANGE - input parameter out of range
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpLoopStatePara(rtk_uint32 *pRetryCount, rtk_uint32 *pRetryPeriod)
{
    ret_t retVal;

    retVal = rtl8367b_getAsicRegBits(RTL8367B_RLDP_RETRY_COUNT_REG, RTL8367B_RLDP_RETRY_COUNT_LOOPSTATE_MASK, pRetryCount);
    if(retVal != RT_ERR_OK)
        return retVal;

    return rtl8367b_getAsicReg(RTL8367B_RLDP_RETRY_PERIOD_LOOPSTATE_REG, pRetryPeriod);
}
예제 #3
0
/* Function Name:
 *      rtl8367b_getAsicPortForceLinkExt
 * Description:
 *      Get external interface force linking configuration
 * Input:
 *      id 			- external interface id (0~1)
 *      pPortAbility - port ability configuration
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_OUT_OF_RANGE - input parameter out of range
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPortForceLinkExt(rtk_uint32 id, rtl8367b_port_ability_t *pPortAbility)
{
    rtk_uint32  reg_data;
    rtk_uint16  ability_data;
    ret_t       retVal;

    /* Invalid input parameter */
    if(id >= RTL8367B_EXTNO)
        return RT_ERR_OUT_OF_RANGE;

	if(0 == id || 1 == id)
    	retVal = rtl8367b_getAsicReg(RTL8367B_REG_DIGITAL_INTERFACE0_FORCE+id, &reg_data);
	else
	    retVal = rtl8367b_getAsicReg(RTL8367B_REG_DIGITAL_INTERFACE2_FORCE, &reg_data);

    if(retVal != RT_ERR_OK)
        return retVal;

    ability_data = (rtk_uint16)reg_data;
    memcpy(pPortAbility, &ability_data, sizeof(rtl8367b_port_ability_t));
    return RT_ERR_OK;
}
예제 #4
0
/* Function Name:
 *      rtl8367b_getAsicMIBsControl
 * Description:
 *      Get MIB control register
 * Input:
 *      pMask 		- MIB control status mask bit[0]-busy bit[1]
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 * Note:
 * 		Software need to check this control register atfer doing port resetting or global resetting
 */
ret_t rtl8367b_getAsicMIBsControl(rtk_uint32* pMask)
{
	ret_t retVal;
	rtk_uint32 regData;

	retVal = rtl8367b_getAsicReg(RTL8367B_MIB_CTRL_REG, &regData);
	if(retVal != RT_ERR_OK)
		return retVal;

	*pMask = regData & (RTL8367B_MIB_CTRL0_BUSY_FLAG_MASK | RTL8367B_RESET_FLAG_MASK);
	
	return RT_ERR_OK;
}
예제 #5
0
/* Function Name:
 *      rtl8367b_getAsicPHYReg
 * Description:
 *      Get PHY registers
 * Input:
 *      phyNo 	- Physical port number (0~4)
 *      phyAddr - PHY address (0~31)
 *      pRegData - Writing data
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 *      RT_ERR_PHY_REG_ID  		- invalid PHY address
 *      RT_ERR_PHY_ID  			- invalid PHY no
 *      RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPHYReg( rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 *value)
{
	rtk_uint32 regAddr;

    if(phyNo > RTL8367B_PHY_INTERNALNOMAX)
        return RT_ERR_PORT_ID;

    if(phyAddr > RTL8367B_PHY_REGNOMAX)
        return RT_ERR_PHY_REG_ID;

    regAddr = 0x2000 + (phyNo << 5) + phyAddr;

    return rtl8367b_getAsicReg(regAddr, value);
}
/* Function Name:
 *      rtl8367b_getAsicMaxLengthAltTxRx
 * Description:
 *      Get per-port Max receiving/transmit packet length in different speed
 * Input:
 *      pMaxLength 	- 0: 1522 bytes 1:1536 bytes 2:1552 bytes 3:16000bytes
 *      pPmskGiga 	- enable port mask in 100Mpbs
 *      pPmask100M 	- enable port mask in Giga
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicMaxLengthAltTxRx(rtk_uint32* pMaxLength, rtk_uint32* pPmskGiga, rtk_uint32* pPmask100M)
{	
	ret_t retVal;
	rtk_uint32 regData;

	retVal = rtl8367b_getAsicReg(RTL8367B_REG_MAX_LENGTH_CFG, &regData);
	if(retVal != RT_ERR_OK)
		return retVal;

    *pPmskGiga = (regData & RTL8367B_MAX_LENGTH_GIGA_MASK) >> RTL8367B_MAX_LENGTH_GIGA_OFFSET;
    *pPmask100M = regData & RTL8367B_MAX_LENGTH_10_100M_MASK;

    return rtl8367b_getAsicRegBits(RTL8367B_REG_MAX_LEN_RX_TX, RTL8367B_MAX_LEN_RX_TX_MASK, pMaxLength);
}
예제 #7
0
/* Function Name:
 *      rtl8367b_getAsicIGMPQueryInterval
 * Description:
 *      Get Query Interval of IGMP/MLD
 * Input:
 *      None
 * Output:
 *      pinterval       - Query Interval
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicIGMPQueryInterval(rtk_uint32 *pinterval)
{
    ret_t   retVal;
    rtk_uint32  value;

    /* Query Interval */
    retVal = rtl8367b_getAsicReg(RTL8367B_REG_IGMP_MLD_CFG2, &value);
    if(retVal != RT_ERR_OK)
        return retVal;

    *pinterval = value;

    return RT_ERR_OK;
}
예제 #8
0
/* Function Name:
 *      rtl8367b_getAsicGreenPortPage
 * Description:
 *      Get per-Port ingress page usage per second
 * Input:
 *      port 	- Physical port number (0~7)
 *      pPage 	- page number of ingress packet occuping per second
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 *      RT_ERR_PORT_ID  - Invalid port number
 * Note:
 *      Ingress traffic occuping page number per second for high layer green feature usage
 */
ret_t rtl8367b_getAsicGreenPortPage(rtk_uint32 port, rtk_uint32* pPage)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_uint32 pageMeter;
    
    if(port > RTL8367B_PORTIDMAX)
        return RT_ERR_PORT_ID;

    retVal = rtl8367b_getAsicReg(RTL8367B_PAGEMETER_PORT_REG(port), &regData);
    if(retVal != RT_ERR_OK)
        return retVal;

   pageMeter = regData;

    retVal = rtl8367b_getAsicReg(RTL8367B_PAGEMETER_PORT_REG(port) + 1, &regData);
    if(retVal != RT_ERR_OK)
        return retVal;

    pageMeter = pageMeter + (regData << 16);

    *pPage = pageMeter;     
    return RT_ERR_OK;
}
예제 #9
0
/* Function Name:
 *      rtl8367b_getAsicLutAgeTimerSpeed
 * Description:
 *      Get LUT agging out speed
 * Input:
 *      pTimer - Agging out timer 0:Has been aged out
 *      pSpeed - Agging out speed 0-fastest 3-slowest
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_OUT_OF_RANGE - input parameter out of range
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicLutAgeTimerSpeed(rtk_uint32* pTimer, rtk_uint32* pSpeed)
{
	rtk_uint32 regData;
	ret_t retVal;

	retVal = rtl8367b_getAsicReg(RTL8367B_REG_LUT_CFG, &regData);
	if(retVal != RT_ERR_OK)
		return retVal;

	*pTimer =  (regData & RTL8367B_AGE_TIMER_MASK) >> RTL8367B_AGE_TIMER_OFFSET;

	*pSpeed =  (regData & RTL8367B_AGE_SPEED_MASK) >> RTL8367B_AGE_SPEED_OFFSET;

	return RT_ERR_OK;

}
예제 #10
0
파일: myrtk.c 프로젝트: tsingui/bootloader
void test_smi_signal_and_wait()
{
        int i;
        for (i=0; i<100; i++)
        {
                rtk_uint32 data;
                rtk_api_ret_t retVal;

            if((retVal = rtl8367b_getAsicReg(0x1202, &data)) != RT_ERR_OK)
            {
                        printf("error = %d\n", retVal);
                }
                printf("data = %x\n", data);
                if (data == 0x88a8) break;

            CLK_DURATION(50000);
        }
}
예제 #11
0
/* Function Name:
 *      rtl8367b_getAsicRldpRandomNumber
 * Description:
 *      Get Random number of RLDP
 * Input:
 *      pRandNumber 	- MAC
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpRandomNumber(ether_addr_t *pRandNumber)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_int16 accessPtr[3];
    rtk_uint32 i;

    for(i = 0; i < 3; i++)
    {
        retVal = rtl8367b_getAsicReg(RTL8367B_RLDP_RAND_NUM_REG_BASE+ i, &regData);
        if(retVal != RT_ERR_OK)
            return retVal;

        accessPtr[i] = regData;
    }

    memcpy(pRandNumber, accessPtr, 6);
    return retVal;
}
예제 #12
0
/* Function Name:
 *      rtl8367b_getAsicRldpMagicNum
 * Description:
 *      Get Random seed of RLDP
 * Input:
 *      pSeed 	- MAC
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpMagicNum(ether_addr_t *pSeed)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_int16 *accessPtr;
    rtk_uint32 i;

    accessPtr = (rtk_uint16*)pSeed;

    for(i = 0; i < 3; i++)
    {
        retVal = rtl8367b_getAsicReg(RTL8367B_RLDP_MAGIC_NUM_REG_BASE + i, &regData);
        if(retVal != RT_ERR_OK)
            return retVal;

        *accessPtr = regData;
        accessPtr++;
    }

    return retVal;
}
예제 #13
0
파일: rtl8367.c 프로젝트: jing-git/rt-n56u
static int test_smi_signal_and_wait(void)
{
	int i, good = 0;
	rtk_uint32 data;

	for (i = 0; i < 20; i++) {
		data = 0;
		rtl8367b_getAsicReg(0x1202, &data);
		
		if (data == 0x88a8)
			good++;
		else
			good = 0;
		
		if (good > 2)
			return 0;
		
		mdelay(30);
	}

	return -1;
}
/* Function Name:
 *      rtl8367b_getAsicMacAddress
 * Description:
 *      Get switch MAC address
 * Input:
 *      pMac 	- switch mac
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicMacAddress(ether_addr_t *pMac)
{
	ret_t retVal;
	rtk_uint32 regData;
	rtk_uint8 *accessPtr;
	rtk_uint32 i;


	accessPtr = (rtk_uint8*)pMac;

	for(i = 0; i <= 2; i++)
	{
		retVal = rtl8367b_getAsicReg(RTL8367B_REG_SWITCH_MAC2 - i, &regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		*accessPtr = (regData & 0xFF00) >> 8;
		accessPtr ++;
		*accessPtr = regData & 0xFF;
		accessPtr ++;
	}

	return retVal;
}
/* Function Name:
 *      rtl8367b_getAsicPortIngressBandwidth
 * Description:
 *      Get per-port total ingress bandwidth
 * Input:
 *      port 		- Physical port number (0~7)
 *      pBandwidth 	- The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable
 *      pPreifg 		- Include preamble and IFG, 0:Exclude, 1:Include
 *      pEnableFC 	- Action when input rate exceeds. 0: Drop	1: Flow Control
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_PORT_ID  	- Invalid port number
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32* pBandwidth, rtk_uint32* pPreifg, rtk_uint32* pEnableFC)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_uint32 regAddr;

    /* Invalid input parameter */
    if(port >= RTL8367B_PORTNO)
        return RT_ERR_PORT_ID;

    regAddr = RTL8367B_INGRESSBW_PORT_RATE_LSB_REG(port);
    retVal = rtl8367b_getAsicReg(regAddr, &regData);
    if(retVal != RT_ERR_OK)
        return retVal;

    *pBandwidth = regData;

    regAddr += 1;
    retVal = rtl8367b_getAsicRegBit(regAddr, 0, &regData);
    if(retVal != RT_ERR_OK)
        return retVal;

    *pBandwidth |= (regData << RTL8367B_QOS_GRANULARTY_MSB_OFFSET);

    regAddr = RTL8367B_PORT_MISC_CFG_REG(port);
    retVal = rtl8367b_getAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, pPreifg);
    if(retVal != RT_ERR_OK)
        return retVal;

    regAddr = RTL8367B_PORT_MISC_CFG_REG(port);
    retVal = rtl8367b_getAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, pEnableFC);
    if(retVal != RT_ERR_OK)
        return retVal;

    return RT_ERR_OK;
}
/* Function Name:
 *      rtl8367b_getAsicVlan4kEntry
 * Description:
 *      Get VID mapped entry to 4K VLAN table
 * Input:
 *      pVlan4kEntry - 4K VLAN configuration
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 *      RT_ERR_VLAN_VID 		- Invalid VID parameter (0~4095)
 *      RT_ERR_BUSYWAIT_TIMEOUT - LUT is busy at retrieving
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicVlan4kEntry(rtl8367b_user_vlan4kentry *pVlan4kEntry )
{
#if defined(DISABLE_VLAN_SHADOW)
	rtl8367b_vlan4kentrysmi vlan_4k_entry;
	rtk_uint32					page_idx;
	rtk_uint16					*tableAddr;
	ret_t 					    retVal;
	rtk_uint32 					regData;

    if(pVlan4kEntry->vid > RTL8367B_VIDMAX)
        return RT_ERR_VLAN_VID;

	/* Write Address (VLAN_ID) */
	regData = pVlan4kEntry->vid;
	retVal = rtl8367b_setAsicReg(RTL8367B_TABLE_ACCESS_ADDR_REG, regData);
	if(retVal != RT_ERR_OK)
		return retVal;

	/* Read Command */
	retVal = rtl8367b_setAsicRegBits(RTL8367B_TABLE_ACCESS_CTRL_REG, RTL8367B_TABLE_TYPE_MASK | RTL8367B_COMMAND_TYPE_MASK, RTL8367B_TABLE_ACCESS_REG_DATA(TB_OP_READ,TB_TARGET_CVLAN));
	if(retVal != RT_ERR_OK)
		return retVal;

	/* Check ASIC Command */
	retVal = rtl8367b_getAsicRegBit(RTL8367B_TABLE_ACCESS_STATUS_REG, RTL8367B_TABLE_LUT_ADDR_BUSY_FLAG_OFFSET,&regData);
	if(retVal != RT_ERR_OK)
        return RT_ERR_BUSYWAIT_TIMEOUT;

	/* Read VLAN data from register */
	tableAddr = (rtk_uint16 *)&vlan_4k_entry;
	for(page_idx = 0; page_idx < (sizeof(rtl8367b_vlan4kentrysmi) / 2); page_idx++)
	{
		retVal = rtl8367b_getAsicReg(RTL8367B_TABLE_ACCESS_RDDATA_BASE + page_idx, &regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		*tableAddr = regData;
		tableAddr++;
	}

	_rtl8367b_Vlan4kStSmi2User(&vlan_4k_entry, pVlan4kEntry);

#else

    rtk_uint16  vid;

    if(pVlan4kEntry->vid > RTL8367B_VIDMAX)
        return RT_ERR_VLAN_VID;

    vid = pVlan4kEntry->vid;
    memcpy(pVlan4kEntry, &user_4kvlan[pVlan4kEntry->vid], sizeof(rtl8367b_user_vlan4kentry));
    pVlan4kEntry->vid = vid;

#endif

#if defined(CONFIG_RTL8367B_ASICDRV_TEST)
    _rtl8367b_Vlan4kStSmi2User(&Rtl8370sVirtualVlanTable[pVlan4kEntry->vid], pVlan4kEntry);
#endif

    return RT_ERR_OK;
}
/* Function Name:
 *      rtl8367b_getAsicEeepGigaTxRateTh
 * Description:
 *      Get EEEP detect Tx rate threshold for sleeping in GIGA mode
 * Input:
 *      pThreshold 	- Threshold of Rx rate for falling sleep
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */  
ret_t rtl8367b_getAsicEeepGigaTxRateTh(rtk_uint32* pThreshold)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_EEEP_TX_RATE_GIGA, pThreshold);
}
/* Function Name:
 *      rtl8367b_getAsicEeep100mTxRateTh
 * Description:
 *      Get EEEP detect Tx rate threshold for sleeping in 100Mpbs mode
 * Input:
 *      pThreshold 	- Threshold of Rx rate for falling sleep
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */ 
ret_t rtl8367b_getAsicEeep100mTxRateTh(rtk_uint32* pThreshold)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_EEEP_TX_RATE_100M, pThreshold);
}
예제 #19
0
/* Function Name:
 *      rtl8367b_getAsicMIBsCounter
 * Description:
 *      Get MIBs counter
 * Input:
 *      port 		- Physical port number (0~7)
 *      mibIdx 		- MIB counter index
 *      pCounter 	- MIB retrived counter
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 *      RT_ERR_PORT_ID  		- Invalid port number
 *      RT_ERR_BUSYWAIT_TIMEOUT - MIB is busy at retrieving
 *      RT_ERR_STAT_CNTR_FAIL  	- MIB is resetting
 * Note:
 * 		Before MIBs counter retrieving, writting accessing address to ASIC at first and check the MIB 
 * 		control register status. If busy bit of MIB control is set, that means MIB counter have been 
 * 		waiting for preparing, then software must wait atfer this busy flag reset by ASIC. This driver
 * 		did not recycle reading user desired counter. Software must use driver again to get MIB counter 
 * 		if return value is not RT_ERR_OK.
 */
ret_t rtl8367b_getAsicMIBsCounter(rtk_uint32 port, RTL8367B_MIBCOUNTER mibIdx, rtk_uint64* pCounter)
{
	ret_t retVal;
	rtk_uint32 regAddr;
	rtk_uint32 regData;
	rtk_uint32 mibAddr;
	rtk_uint32 mibOff=0;

	/* address offset to MIBs counter */
	CONST rtk_uint16 mibLength[RTL8367B_MIBS_NUMBER]= {
        4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
        4,2,2,2,2,2,2,2,2,
        4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};

	rtk_uint16 i;
	rtk_uint64 mibCounter;


	if(port > RTL8367B_PORTIDMAX)
		return RT_ERR_PORT_ID;

	if(mibIdx >= RTL8367B_MIBS_NUMBER)
		return RT_ERR_STAT_INVALID_CNTR;

	if(dot1dTpLearnedEntryDiscards == mibIdx)
	{
		mibAddr = RTL8367B_MIB_LEARNENTRYDISCARD_OFFSET;
	}
	else
	{
		i = 0;
		mibOff = RTL8367B_MIB_PORT_OFFSET * port;

		while(i < mibIdx)
		{
			mibOff += mibLength[i];
			i++;
		}		
		
		mibAddr = mibOff;
	}
	

	/*writing access counter address first*/
    /*This address is SRAM address, and SRAM address = MIB register address >> 2*/
	/*then ASIC will prepare 64bits counter wait for being retrived*/
	/*Write Mib related address to access control register*/
	retVal = rtl8367b_setAsicReg(RTL8367B_REG_MIB_ADDRESS, (mibAddr >> 2));
	if(retVal != RT_ERR_OK)
		return retVal;



    /* polling busy flag */
    i = 100;
    while(i > 0)
    {
        /*read MIB control register*/
        retVal = rtl8367b_getAsicReg(RTL8367B_MIB_CTRL_REG,&regData);
    
        if((regData & RTL8367B_MIB_CTRL0_BUSY_FLAG_MASK) == 0)
        {
            break;
        }
    
        i--;
    }

	if(regData & RTL8367B_MIB_CTRL0_BUSY_FLAG_MASK)
		return RT_ERR_BUSYWAIT_TIMEOUT;

	if(regData & RTL8367B_RESET_FLAG_MASK)
		return RT_ERR_STAT_CNTR_FAIL;

	mibCounter = 0;
	i = mibLength[mibIdx];
	if(4 == i)
		regAddr = RTL8367B_MIB_COUNTER_BASE_REG + 3;
	else
		regAddr = RTL8367B_MIB_COUNTER_BASE_REG + ((mibOff + 1) % 4);
	
	while(i)
	{
		retVal = rtl8367b_getAsicReg(regAddr, &regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		mibCounter = (mibCounter << 16) | (regData & 0xFFFF);

		regAddr --;
		i --;
		
	}
	
	*pCounter = mibCounter;	
	
	return RT_ERR_OK;
}
예제 #20
0
/* Function Name:
 *      rtl8367b_getAsicReg
 * Description:
 *      Get accepted S-VLAN ether type. The default ether type of S-VLAN is 0x88a8
 * Input:
 *      pProtocolType 	- Ether type of S-tag frame parsing in uplink ports
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicSvlanTpid(rtk_uint32* pProtocolType)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_VS_TPID, pProtocolType);
}
예제 #21
0
/* Function Name:
 *      rtl8367b_getAsicRldpTxPortmask
 * Description:
 *      Get portmask that send/forward RLDP frame
 * Input:
 *      pPortmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpTxPortmask(rtk_uint32 *pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_RLDP_TX_PMSK_REG, pPortmask);
}
예제 #22
0
/* Function Name:
 *      rtl8367b_getAsicPortBcastFloodingPortmask
 * Description:
 *      Get Bcast flooding portmask
 * Input:
 *      pPortmask 	- portmask(0~0xFF)
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPortBcastFloodingPortmask(rtk_uint32 *pPortmask)
{
	return rtl8367b_getAsicReg(RTL8367B_BCAST_FLOADING_PMSK_REG, pPortmask);
}
예제 #23
0
/* Function Name:
 *      rtl8367b_getAsicPortUnknownMulticastFloodingPortmask
 * Description:
 *      Get UNMC flooding portmask
 * Input:
 *      pPortmask 	- portmask(0~0xFF)
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPortUnknownMulticastFloodingPortmask(rtk_uint32 *pPortmask)
{
	return rtl8367b_getAsicReg(RTL8367B_UNMCAST_FLOADING_PMSK_REG, pPortmask);
}
예제 #24
0
/* Function Name:
 *      rtl8367b_getAsicRldpLeaveLoopedPortmask
 * Description:
 *      Get leaved looped portmask
 * Input:
 *      pPortmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpLeaveLoopedPortmask(rtk_uint32 *pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_RLDP_RELEASED_INDICATOR, pPortmask);
}
예제 #25
0
/* Function Name:
 *      rtl8367b_getAsicRldpLoopedPortmask
 * Description:
 *      Get looped portmask
 * Input:
 *      pPortmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicRldpLoopedPortmask(rtk_uint32 *pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_RLDP_LOOP_PMSK_REG, pPortmask);
}
예제 #26
0
/* Function Name:
 *      rtl8367b_getAsicPHYReg
 * Description:
 *      Get PHY registers
 * Input:
 *      phyNo 	- Physical port number (0~7)
 *      phyAddr - PHY address (0~31)
 *      pRegData - Writing data
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 *      RT_ERR_PHY_REG_ID  		- invalid PHY address
 *      RT_ERR_PHY_ID  			- invalid PHY no
 *      RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicPHYReg(rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 *pRegData )
{
	ret_t retVal;
	rtk_uint32 regData;
    rtk_uint32 busyFlag,checkCounter;

#ifdef RTK_X86_CLE

#else
	if(phyNo > RTL8367B_PHY_INTERNALNOMAX)
		return RT_ERR_PHY_ID;
#endif
	if(phyAddr > RTL8367B_PHY_REGNOMAX)
		return RT_ERR_PHY_REG_ID;

    /*Check internal phy access busy or not*/
    /*retVal = rtl8367b_getAsicRegBit(RTL8367B_REG_INDRECT_ACCESS_STATUS, RTL8367B_INDRECT_ACCESS_STATUS_OFFSET,&busyFlag);*/
    retVal = rtl8367b_getAsicReg(RTL8367B_REG_INDRECT_ACCESS_STATUS,&busyFlag);
	if(retVal != RT_ERR_OK)
		return retVal;

    if(busyFlag)
        return RT_ERR_BUSYWAIT_TIMEOUT;

    /*prepare access address*/
    regData = RTL8367B_PHY_BASE | (phyNo << RTL8367B_PHY_OFFSET) | phyAddr;

    retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_ADDRESS, regData);
	if(retVal != RT_ERR_OK)
		return retVal;

    /*Set READ Command*/
    retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_CTRL, RTL8367B_CMD_MASK );
	if(retVal != RT_ERR_OK)
		return retVal;

	checkCounter = 5;
	while(checkCounter)
	{
    //	retVal = rtl8367b_getAsicRegBit(RTL8367B_REG_INDRECT_ACCESS_STATUS, RTL8367B_INDRECT_ACCESS_STATUS_OFFSET,&busyFlag);
    	retVal = rtl8367b_getAsicReg(RTL8367B_REG_INDRECT_ACCESS_STATUS,&busyFlag);
		if((retVal != RT_ERR_OK) || busyFlag)
		{
			checkCounter --;
			if(0 == checkCounter)
                return RT_ERR_FAILED;
		}
		else
		{
			checkCounter = 0;
		}
	}

    /*get PHY register*/
    retVal = rtl8367b_getAsicReg(RTL8367B_REG_INDRECT_ACCESS_READ_DATA, &regData);
	if(retVal != RT_ERR_OK)
		return retVal;

    *pRegData = regData;

    return RT_ERR_OK;
}
예제 #27
0
/* Function Name:
 *      rtl8367b_getAsicSvlanUplinkPortMask
 * Description:
 *      Get uplink ports mask
 * Input:
 *      pPortmask 	- Uplink port mask setting
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicSvlanUplinkPortMask(rtk_uint32* pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_SVLAN_UPLINK_PORTMASK, pPortmask);
}
예제 #28
0
/* Function Name:
 *      rtl8367b_getAsicEgressQueueEmptyPortMask
 * Description:
 *      Get queue empty port mask
 * Input:
 *      pPortmask 	-  Queue empty port mask
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicEgressQueueEmptyPortMask(rtk_uint32 *pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_REG_PORT_QEMPTY, pPortmask);
}
예제 #29
0
/* Function Name:
 *      rtl8367b_getAsicCputagPortmask
 * Description:
 *      Get ports that can parse CPU tag
 * Input:
 *      pPortmask - port mask
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 * Note:
 *     None
 */
ret_t rtl8367b_getAsicCputagPortmask(rtk_uint32 *pPortmask)
{
    return rtl8367b_getAsicReg(RTL8367B_CPU_PORT_MASK_REG, pPortmask);
}