Exemplo n.º 1
0
/* Function Name:
 *      rtl8367b_setAsicPHYReg
 * Description:
 *      Set PHY registers
 * Input:
 *      phyNo 	- Physical port number (0~7)
 *      phyAddr - PHY address (0~31)
 *      phyData - 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_setAsicPHYReg(rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 phyData )
{
	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 data*/
    retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_WRITE_DATA, phyData);
	if(retVal != RT_ERR_OK)
		return retVal;

    /*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 WRITE Command*/
    retVal = rtl8367b_setAsicReg(RTL8367B_REG_INDRECT_ACCESS_CTRL, RTL8367B_CMD_MASK | RTL8367B_RW_MASK);

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

    return retVal;
}
Exemplo n.º 2
0
/* Function Name:
 *      rtl8367b_setAsicMIBsResetLoggingCounter
 * Description:
 *      MIB logging counter type
 * Input:
 *      index 	- logging counter index (0~31)
 * 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_setAsicMIBsResetLoggingCounter(rtk_uint32 index)
{
    ret_t retVal;
	
	if(index > RTL8367B_MIB_MAX_LOG_CNT_IDX)
		return RT_ERR_OUT_OF_RANGE;

	if(index < 16)
    	retVal = rtl8367b_setAsicReg(RTL8367B_REG_MIB_CTRL1, 1<<index);  
	else
    	retVal = rtl8367b_setAsicReg(RTL8367B_REG_MIB_CTRL2, 1<<(index-16));  	

	return retVal;
}
Exemplo n.º 3
0
/* Function Name:
 *      rtl8367b_setAsicPortForceLinkExt
 * Description:
 *      Set external interface force linking configuration
 * Input:
 *      id 			- external interface id (0~2)
 *      portAbility - 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_setAsicPortForceLinkExt(rtk_uint32 id, rtl8367b_port_ability_t *pPortAbility)
{
    rtk_uint32  reg_data;

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

    reg_data = (rtk_uint32)(*(rtk_uint16 *)pPortAbility);

	if(0 == id || 1 == id)
	    return rtl8367b_setAsicReg(RTL8367B_REG_DIGITAL_INTERFACE0_FORCE + id, reg_data);
	else
	    return rtl8367b_setAsicReg(RTL8367B_REG_DIGITAL_INTERFACE2_FORCE, reg_data);
}
Exemplo n.º 4
0
/* Function Name:
 *      rtl8367b_setAsicRldpTxPortmask
 * Description:
 *      Set portmask that send/forward RLDP frame
 * Input:
 *      portmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_PORT_MASK  	- Invalid portmask
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicRldpTxPortmask(rtk_uint32 portmask)
{
    if(portmask > RTL8367B_PORTMASK)
        return RT_ERR_PORT_MASK;

    return rtl8367b_setAsicReg(RTL8367B_RLDP_TX_PMSK_REG, portmask);
}
Exemplo n.º 5
0
/* Function Name:
 *      rtl8367b_setAsicCputagPortmask
 * Description:
 *      Set ports that can parse CPU tag
 * Input:
 *      portmask - port mask
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_PORT_MASK  	- Invalid portmask
 * Note:
 *     None
 */
ret_t rtl8367b_setAsicCputagPortmask(rtk_uint32 portmask)
{
    if(portmask > RTL8367B_PORTMASK)
        return RT_ERR_PORT_MASK;

    return rtl8367b_setAsicReg(RTL8367B_CPU_PORT_MASK_REG, portmask);
}
/* Function Name:
 *      rtl8367b_setAsicMacAddress
 * Description:
 *      Set switch MAC address
 * Input:
 *      mac 	- switch mac
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicMacAddress(ether_addr_t mac)
{
	ret_t retVal;
	rtk_uint32 regData;
	rtk_uint8 *accessPtr;
	rtk_uint32 i;

	accessPtr =  (rtk_uint8*)&mac;

	regData = *accessPtr;
	accessPtr ++;
	regData = (regData << 8) | *accessPtr;
	accessPtr ++;
	for(i = 0; i <=2; i++)
	{
		retVal = rtl8367b_setAsicReg(RTL8367B_REG_SWITCH_MAC2 - i, regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		regData = *accessPtr;
		accessPtr ++;
		regData = (regData << 8) | *accessPtr;
		accessPtr ++;
	}

	return retVal;
}
/* Function Name:
 *      rtl8367b_setAsicVlanProtocolBasedGroupData
 * Description:
 *      Set protocol and port based group database
 * Input:
 *      index 		- Index to VLAN member configuration
 *      pPbCfg 	- Protocol and port based group database entry
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 					- Success
 *      RT_ERR_SMI  				- SMI access error
 *      RT_ERR_INPUT  				- Invalid input parameter
 *      RT_ERR_VLAN_PROTO_AND_PORT  - Invalid protocol base group database index
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicVlanProtocolBasedGroupData(rtk_uint32 index, rtl8367b_protocolgdatacfg *pPbCfg)
{
	rtk_uint32  frameType;
    rtk_uint32  etherType;
	ret_t	retVal;

	/* Error Checking */
	if(index > RTL8367B_PROTOVLAN_GIDX_MAX)
		return RT_ERR_VLAN_PROTO_AND_PORT;

    if(pPbCfg->frameType >= PPVLAN_FRAME_TYPE_END )
		return RT_ERR_INPUT;

	frameType = pPbCfg->frameType;
	etherType = pPbCfg->etherType;

	/* Frame type */
    retVal = rtl8367b_setAsicRegBits(RTL8367BG_VLAN_PPB_FRAMETYPE_REG(index), RTL8367BG_VLAN_PPB_FRAMETYPE_MASK, frameType);
    if(retVal != RT_ERR_OK)
        return retVal;

	/* Ether type */
	retVal = rtl8367b_setAsicReg(RTL8367B_VLAN_PPB_ETHERTYPR_REG(index), etherType);
    if(retVal != RT_ERR_OK)
        return retVal;

    return RT_ERR_OK;
}
Exemplo n.º 8
0
/* Function Name:
 *      rtl8367b_setAsicPortBcastFloodingPortmask
 * Description:
 *      Set Bcast flooding portmask
 * Input:
 *      portmask 	- portmask(0~0xFF)
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 			- Success
 *      RT_ERR_SMI  		- SMI access error
 *      RT_ERR_PORT_MASK 	- Invalid portmask
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicPortBcastFloodingPortmask(rtk_uint32 portmask)
{
	if(portmask > RTL8367B_PORTMASK)
		return RT_ERR_PORT_MASK;

	return rtl8367b_setAsicReg(RTL8367B_BCAST_FLOADING_PMSK_REG, portmask);
}
/* Function Name:
 *      rtl8367b_setAsicMaxLengthAltTxRx
 * Description:
 *      Set per-port Max receiving/transmit packet length in different speed
 * Input:
 *      maxLength 	- 0: 1522 bytes 1:1536 bytes 2:1552 bytes 3:16000bytes
 *      pmskGiga 	- enable port mask in 100Mpbs
 *      pmask100M 	- enable port mask in Giga
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicMaxLengthAltTxRx(rtk_uint32 maxLength, rtk_uint32 pmskGiga, rtk_uint32 pmask100M)
{	
	ret_t retVal;

	retVal = rtl8367b_setAsicReg(RTL8367B_REG_MAX_LENGTH_CFG, ((pmskGiga << RTL8367B_MAX_LENGTH_GIGA_OFFSET) & RTL8367B_MAX_LENGTH_GIGA_MASK) | (pmask100M & RTL8367B_MAX_LENGTH_10_100M_MASK));
	if(retVal != RT_ERR_OK)
		return retVal;
    
	return rtl8367b_setAsicRegBits(RTL8367B_REG_MAX_LEN_RX_TX, RTL8367B_MAX_LEN_RX_TX_MASK, maxLength);
}
/* Function Name:
 *      rtl8367b_setAsicPortBasedFid
 * Description:
 *      Set port based FID
 * Input:
 *      port 	- Physical port number (0~7)
 *      fid 	- Port based fid
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		- Success
 *      RT_ERR_SMI  	- SMI access error
 *      RT_ERR_L2_FID  	- Invalid FID
 *      RT_ERR_PORT_ID  - Invalid port number
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicPortBasedFid(rtk_uint32 port, rtk_uint32 fid)
{
    if(port > RTL8367B_PORTIDMAX)
        return RT_ERR_PORT_ID;

    if(fid > RTL8367B_FIDMAX)
        return RT_ERR_L2_FID;

    return rtl8367b_setAsicReg(RTL8367B_PORT_PBFID_REG(port),fid);
}
Exemplo n.º 11
0
/* Function Name:
 *      rtl8367b_setAsicLutLearnLimitNo
 * Description:
 *      Set per-Port auto learning limit number
 * Input:
 *      port 	- Physical port number (0~7)
 *      number 	- 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
 *      RT_ERR_LIMITED_L2ENTRY_NUM  - Invalid auto learning limit number
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicLutLearnLimitNo(rtk_uint32 port, rtk_uint32 number)
{
    if(port > RTL8367B_PORTIDMAX)
        return RT_ERR_PORT_ID;

    if(number > RTL8367B_LUT_LEARNLIMITMAX)
        return RT_ERR_LIMITED_L2ENTRY_NUM;

	return rtl8367b_setAsicReg(RTL8367B_LUT_PORT_LEARN_LIMITNO_REG(port), number);
}
Exemplo n.º 12
0
int rtl8367_switch_init_post(void)
{
	rtk_api_ret_t retVal;
	rtk_portmask_t portmask;
	rtk_port_mac_ability_t mac_cfg;

	printf(" Reset and init RTL8367 external switch...");

	/* soft reset switch */
	rtl8367b_setAsicReg(RTL8367B_REG_CHIP_RESET, 1);

	/* wait 1s for switch ready */
	mdelay(1000);

	/* main switch init */
	retVal = rtk_switch_init();
	if (retVal != RT_ERR_OK) {
		printf("FAILED! (code: %d)\n", retVal);
		return retVal;
	}

	/* create default ports isolation */
	partition_bridge_default();

	/* configure ExtIf to RGMII, fixed gigabit mode w/o autoneg */
	mac_cfg.forcemode	= MAC_FORCE;
	mac_cfg.speed		= SPD_1000M;
	mac_cfg.duplex		= FULL_DUPLEX;
	mac_cfg.link		= PORT_LINKUP;
	mac_cfg.nway		= DISABLED;
	mac_cfg.rxpause		= ENABLED;
	mac_cfg.txpause		= ENABLED;
	rtk_port_macForceLinkExt_set(EXT_PORT_1, MODE_EXT_RGMII, &mac_cfg);

	/* disable iNIC_mii port link */
	mac_cfg.link		= PORT_LINKDOWN;
	rtk_port_macForceLinkExt_set(EXT_PORT_2, MODE_EXT_RGMII, &mac_cfg);

	/* configure ExtIf RGMII delays */
	rtk_port_rgmiiDelayExt_set(EXT_PORT_1, RTL8367_RGMII_DELAY_TX, RTL8367_RGMII_DELAY_RX);
	rtk_port_rgmiiDelayExt_set(EXT_PORT_2, RTL8367_RGMII_DELAY_TX, RTL8367_RGMII_DELAY_RX);

	/* configure PHY leds */
	portmask.bits[0] = 0x1F;
	rtk_led_enable_set(LED_GROUP_0, portmask);
	rtk_led_enable_set(LED_GROUP_1, portmask);
	rtk_led_operation_set(LED_OP_PARALLEL);
	rtk_led_groupConfig_set(LED_GROUP_0, LED_CONFIG_SPD10010ACT);	// group 0 - green LED
	rtk_led_groupConfig_set(LED_GROUP_1, LED_CONFIG_SPD1000ACT);	// group 1 - yellow LED

	printf("SUCCESS!\n");

	return RT_ERR_OK;
}
Exemplo n.º 13
0
/* Function Name:
 *      rtl8367b_setAsicPHYReg
 * Description:
 *      Set PHY registers
 * Input:
 *      phyNo 	- Physical port number (0~4)
 *      phyAddr - PHY address (0~31)
 *      phyData - 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_setAsicPHYReg( 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_setAsicReg(regAddr, value);
}
Exemplo n.º 14
0
/* Function Name:
 *      rtl8367b_setAsicIGMPQueryInterval
 * Description:
 *      Set Query Interval of IGMP/MLD
 * Input:
 *      interval    - Query Interval
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 		    - Success
 *      RT_ERR_SMI  	    - SMI access error
 *      RT_ERR_OUT_OF_RANGE - input parameter is out of range
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicIGMPQueryInterval(rtk_uint32 interval)
{
    ret_t  retVal;

    if(interval > RTL8367B_MAX_QUERY_INT)
        return RT_ERR_OUT_OF_RANGE;

    /* Query Interval */
    retVal = rtl8367b_setAsicReg(RTL8367B_REG_IGMP_MLD_CFG2, interval);
    if(retVal != RT_ERR_OK)
        return retVal;
        
    return RT_ERR_OK;
}
Exemplo n.º 15
0
/* Function Name:
 *      rtl8367b_setAsicRldpCheckingStatePara
 * Description:
 *      Set retry count and retry period of checking state
 * Input:
 *      retryCount 	- 0~0xFF (times)
 *      retryPeriod - 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_setAsicRldpCheckingStatePara(rtk_uint32 retryCount, rtk_uint32 retryPeriod)
{
    ret_t retVal;

    if(retryCount > 0xFF)
        return RT_ERR_OUT_OF_RANGE;
    if(retryPeriod > RTL8367B_REGDATAMAX)
        return RT_ERR_OUT_OF_RANGE;

    retVal = rtl8367b_setAsicRegBits(RTL8367B_RLDP_RETRY_COUNT_REG, RTL8367B_RLDP_RETRY_COUNT_CHKSTATE_MASK, retryCount);
    if(retVal != RT_ERR_OK)
        return retVal;

    return rtl8367b_setAsicReg(RTL8367B_RLDP_RETRY_PERIOD_CHKSTATE_REG, retryPeriod);
}
Exemplo n.º 16
0
/* Function Name:
 *      rtl8367b_getAsicIGMPGroup
 * Description:
 *      Get IGMP group
 * Input:
 *      idx 	- Group index (0~255)
 *      valid 	- valid bit
 *      grp 	- IGMP group
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 				- Success
 *      RT_ERR_SMI  			- SMI access error
 *      RT_ERR_OUT_OF_RANGE		- Group index is out of range
 * Note:
 *      None
 */
ret_t rtl8367b_getAsicIGMPGroup(rtk_uint32 idx, rtk_uint32 *valid, rtl8367b_igmpgroup *grp)
{
    ret_t   retVal;
    rtk_uint32  regAddr, regData;
    rtk_uint16* tableAddr;
    rtk_uint32  i;

    if(idx > RTL8367B_IGMP_MAX_GOUP)
        return RT_ERR_OUT_OF_RANGE;

    /* Write ACS_ADR register for data bits */
	regAddr = RTL8367B_TABLE_ACCESS_ADDR_REG;
	regData = idx;
	retVal = rtl8367b_setAsicReg(regAddr, regData);
	if(retVal != RT_ERR_OK)
		return retVal;

    /* Write ACS_CMD register */
	regAddr = RTL8367B_TABLE_ACCESS_CTRL_REG;
	regData = RTL8367B_TABLE_ACCESS_REG_DATA(TB_OP_READ, TB_TARGET_IGMP_GROUP);
	retVal = rtl8367b_setAsicRegBits(regAddr, RTL8367B_TABLE_TYPE_MASK | RTL8367B_COMMAND_TYPE_MASK, regData);
	if(retVal != RT_ERR_OK)
		return retVal;

    /* Read Data Bits */
	regAddr = RTL8367B_TABLE_ACCESS_RDDATA_BASE;
	tableAddr = (rtk_uint16*)grp;
	for(i=0;i<RTL8367B_IGMP_GRP_BLEN;i++)
	{
		retVal = rtl8367b_getAsicReg(regAddr, &regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		*tableAddr = regData;
		
		regAddr ++;
		tableAddr ++;
	}

    /* Valid bit */
    retVal = rtl8367b_getAsicReg(RTL8367B_IGMP_GROUP_USAGE_REG(idx), &regData);
    if(retVal != RT_ERR_OK)
		return retVal;

    *valid = ((regData & (0x0001 << (idx %16))) != 0) ? 1 : 0;

    return RT_ERR_OK;
}
/* Function Name:
 *      rtl8367b_setAsicVlanMemberConfig
 * Description:
 *      Set 32 VLAN member configurations
 * Input:
 *      index 		- VLAN member configuration index (0~31)
 *      pVlanCg - VLAN member configuration
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 					- Success
 *      RT_ERR_SMI  				- SMI access error
 *      RT_ERR_INPUT  				- Invalid input parameter
 *      RT_ERR_L2_FID  				- Invalid FID
 *      RT_ERR_PORT_MASK  			- Invalid portmask
 *      RT_ERR_FILTER_METER_ID  	- Invalid meter
 *      RT_ERR_QOS_INT_PRIORITY  	- Invalid priority
 *      RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicVlanMemberConfig(rtk_uint32 index, rtl8367b_vlanconfiguser *pVlanCg)
{
	ret_t  retVal;
	rtk_uint32 regAddr;
	rtk_uint32 regData;
	rtk_uint16 *tableAddr;
    rtk_uint32 page_idx;
    rtl8367b_vlanconfigsmi  smi_vlancfg;

    /* Error Checking  */
	if(index > RTL8367B_CVIDXMAX)
        return RT_ERR_VLAN_ENTRY_NOT_FOUND;

    if(pVlanCg->evid > RTL8367B_EVIDMAX)
        return RT_ERR_INPUT;


    if(pVlanCg->mbr > RTL8367B_PORTMASK)
        return RT_ERR_PORT_MASK;

    if(pVlanCg->fid_msti > RTL8367B_FIDMAX)
        return RT_ERR_L2_FID;

    if(pVlanCg->meteridx > RTL8367B_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    if(pVlanCg->vbpri > RTL8367B_PRIMAX)
        return RT_ERR_QOS_INT_PRIORITY;

    memset(&smi_vlancfg, 0x00, sizeof(rtl8367b_vlanconfigsmi));
    _rtl8367b_VlanMCStUser2Smi(pVlanCg, &smi_vlancfg);
    tableAddr = (rtk_uint16*)&smi_vlancfg;

    for(page_idx = 0; page_idx < 4; page_idx++)  /* 4 pages per VLAN Member Config */
    {
        regAddr = RTL8367B_VLAN_MEMBER_CONFIGURATION_BASE + (index * 4) + page_idx;
    	regData = *tableAddr;

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

        tableAddr++;
    }

	return RT_ERR_OK;
}
Exemplo n.º 18
0
/* Function Name:
 *      rtl8367b_setAsicPortForceLink
 * Description:
 *      Set port force linking configuration
 * Input:
 *      port 		- Physical port number (0~7)
 *      pPortAbility - port ability configuration
 * 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_setAsicPortForceLink(rtk_uint32 port, rtl8367b_port_ability_t *pPortAbility)
{
    rtk_uint32 regData;
    rtk_uint16 *accessPtr;
	rtl8367b_port_ability_t ability;

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

    memset(&ability, 0x00, sizeof(rtl8367b_port_ability_t));
    memcpy(&ability, pPortAbility, sizeof(rtl8367b_port_ability_t));

    accessPtr =  (rtk_uint16*)&ability;

    regData = *accessPtr;
    return rtl8367b_setAsicReg(RTL8367B_REG_MAC0_FORCE_SELECT+port, regData);
}
Exemplo n.º 19
0
/* Function Name:
 *      rtl8367b_setAsicRldpMagicNum
 * Description:
 *      Set Random seed of RLDP
 * Input:
 *      seed 	- MAC
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicRldpMagicNum(ether_addr_t seed)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_uint16 *accessPtr;
    rtk_uint32 i;

    accessPtr = (rtk_uint16*)&seed;

    for (i = 0; i < 3; i++)
    {
        regData = *accessPtr;
        retVal = rtl8367b_setAsicReg(RTL8367B_RLDP_MAGIC_NUM_REG_BASE + i, regData);
        if(retVal != RT_ERR_OK)
            return retVal;

        accessPtr++;
    }

    return retVal;
}
/* Function Name:
 *      rtl8367b_setAsicPortIngressBandwidth
 * Description:
 *      Set per-port total ingress bandwidth
 * Input:
 *      port 		- Physical port number (0~7)
 *      bandwidth 	- The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable
 *      preifg 		- Include preamble and IFG, 0:Exclude, 1:Include
 *      enableFC 	- 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
 *      RT_ERR_OUT_OF_RANGE - input parameter out of range
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32 bandwidth, rtk_uint32 preifg, rtk_uint32 enableFC)
{
    ret_t retVal;
    rtk_uint32 regData;
    rtk_uint32 regAddr;

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

    if(bandwidth > RTL8367B_QOS_GRANULARTY_MAX)
        return RT_ERR_OUT_OF_RANGE;

    regAddr = RTL8367B_INGRESSBW_PORT_RATE_LSB_REG(port);
    regData = bandwidth & RTL8367B_QOS_GRANULARTY_LSB_MASK;
    retVal = rtl8367b_setAsicReg(regAddr, regData);
    if(retVal != RT_ERR_OK)
        return retVal;

    regAddr += 1;
    regData = (bandwidth & RTL8367B_QOS_GRANULARTY_MSB_MASK) >> RTL8367B_QOS_GRANULARTY_MSB_OFFSET;
    retVal = rtl8367b_setAsicRegBit(regAddr, 0, regData);
    if(retVal != RT_ERR_OK)
        return retVal;

    regAddr = RTL8367B_PORT_MISC_CFG_REG(port);
    retVal = rtl8367b_setAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, preifg);
    if(retVal != RT_ERR_OK)
        return retVal;

    regAddr = RTL8367B_PORT_MISC_CFG_REG(port);
    retVal = rtl8367b_setAsicRegBit(regAddr, RTL8367B_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, enableFC);
    if(retVal != RT_ERR_OK)
        return retVal;

    return RT_ERR_OK;
}
Exemplo n.º 21
0
/* Function Name:
 *      rtl8367b_setAsicPortExtMode
 * Description:
 *      Set external interface mode configuration
 * Input:
 *      id 		- external interface id (0~2)
 *      mode 	- external interface mode
 * 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_setAsicPortExtMode(rtk_uint32 id, rtk_uint32 mode)
{
    ret_t   retVal;

    if(id >= RTL8367B_EXTNO)
        return RT_ERR_OUT_OF_RANGE;

    if(mode >= EXT_END)
        return RT_ERR_OUT_OF_RANGE;

    if(mode == EXT_GMII)
    {
        if( (retVal = rtl8367b_setAsicRegBit(RTL8367B_REG_EXT0_RGMXF, RTL8367B_EXT0_RGTX_INV_OFFSET, 1)) != RT_ERR_OK)
            return retVal;

        if( (retVal = rtl8367b_setAsicRegBit(RTL8367B_REG_EXT1_RGMXF, RTL8367B_EXT1_RGTX_INV_OFFSET, 1)) != RT_ERR_OK)
            return retVal;

        if( (retVal = rtl8367b_setAsicRegBits(RTL8367B_REG_EXT_TXC_DLY, RTL8367B_EXT1_GMII_TX_DELAY_MASK, 5)) != RT_ERR_OK)
            return retVal;

        if( (retVal = rtl8367b_setAsicRegBits(RTL8367B_REG_EXT_TXC_DLY, RTL8367B_EXT0_GMII_TX_DELAY_MASK, 6)) != RT_ERR_OK)
            return retVal;
    }

    if( (mode == EXT_TMII_MAC) || (mode == EXT_TMII_PHY) )
    {
        if( (retVal = rtl8367b_setAsicReg(RTL8367B_REG_BYPASS_LINE_RATE, 0x0007)) != RT_ERR_OK)
            return retVal;
    }

	if(0 == id || 1 == id)
   		return rtl8367b_setAsicRegBits(RTL8367B_REG_DIGITAL_INTERFACE_SELECT, RTL8367B_SELECT_GMII_0_MASK << (id * RTL8367B_SELECT_GMII_1_OFFSET), mode);
	else
   		return rtl8367b_setAsicRegBits(RTL8367B_REG_DIGITAL_INTERFACE_SELECT_1, RTL8367B_SELECT_RGMII_2_MASK, mode);
}
Exemplo n.º 22
0
/* Function Name:
 *      rtl8367b_setAsicRldpLoopedPortmask
 * Description:
 *      Clear looped portmask
 * Input:
 *      portmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicRldpLoopedPortmask(rtk_uint32 portmask)
{
    return rtl8367b_setAsicReg(RTL8367B_RLDP_LOOP_PMSK_REG, portmask);
}
Exemplo n.º 23
0
/* Function Name:
 *      rtl8367b_setAsicSvlanUplinkPortMask
 * Description:
 *      Set uplink ports mask
 * Input:
 *      portMask 	- Uplink port mask setting
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicSvlanUplinkPortMask(rtk_uint32 portMask)
{
    return rtl8367b_setAsicReg(RTL8367B_REG_SVLAN_UPLINK_PORTMASK, portMask);
}
Exemplo n.º 24
0
/* Function Name:
 *      rtl8367b_setAsicSvlanTpid
 * Description:
 *      Set accepted S-VLAN ether type. The default ether type of S-VLAN is 0x88a8
 * Input:
 *      protocolType 	- Ether type of S-tag frame parsing in uplink ports
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200
 * 		for Q-in-Q SLAN design. User can set mathced ether type as service provider supported protocol
 */
ret_t rtl8367b_setAsicSvlanTpid(rtk_uint32 protocolType)
{
    return rtl8367b_setAsicReg(RTL8367B_REG_VS_TPID, protocolType);
}
/* 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_setAsicVlan4kEntry
 * Description:
 *      Set 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_INPUT  				- Invalid input parameter
 *      RT_ERR_L2_FID  				- Invalid FID
 *      RT_ERR_VLAN_VID 			- Invalid VID parameter (0~4095)
 *      RT_ERR_PORT_MASK  			- Invalid portmask
 *      RT_ERR_FILTER_METER_ID  	- Invalid meter
 *      RT_ERR_QOS_INT_PRIORITY  	- Invalid priority
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicVlan4kEntry(rtl8367b_user_vlan4kentry *pVlan4kEntry )
{
    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;

    if(pVlan4kEntry->mbr > RTL8367B_PORTMASK)
        return RT_ERR_PORT_MASK;

    if(pVlan4kEntry->untag > RTL8367B_PORTMASK)
        return RT_ERR_PORT_MASK;

    if(pVlan4kEntry->fid_msti > RTL8367B_FIDMAX)
        return RT_ERR_L2_FID;

    if(pVlan4kEntry->meteridx > RTL8367B_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    if(pVlan4kEntry->vbpri > RTL8367B_PRIMAX)
        return RT_ERR_QOS_INT_PRIORITY;

    memset(&vlan_4k_entry, 0x00, sizeof(rtl8367b_vlan4kentrysmi));
    _rtl8367b_Vlan4kStUser2Smi(pVlan4kEntry, &vlan_4k_entry);

	/* Prepare Data */
	tableAddr = (rtk_uint16 *)&vlan_4k_entry;
	for(page_idx = 0; page_idx < (sizeof(rtl8367b_vlan4kentrysmi) / 2); page_idx++)
	{
		regData = *tableAddr;
		retVal = rtl8367b_setAsicReg(RTL8367B_TABLE_ACCESS_WRDATA_BASE + page_idx, regData);
		if(retVal != RT_ERR_OK)
			return retVal;

		tableAddr++;
	}

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

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

#if defined(CONFIG_RTL8367B_ASICDRV_TEST)
    memcpy(&Rtl8370sVirtualVlanTable[pVlan4kEntry->vid], &vlan_4k_entry, sizeof(rtl8367b_vlan4kentrysmi));
#endif

#if !defined(DISABLE_VLAN_SHADOW)
    memcpy(&user_4kvlan[pVlan4kEntry->vid], pVlan4kEntry, sizeof(rtl8367b_user_vlan4kentry));
#endif

    return RT_ERR_OK;
}
/* Function Name:
 *      rtl8367b_setAsicEeepGigaTxRateTh
 * Description:
 *      Set EEEP detect Tx rate threshold for sleeping in GIGA mode
 * Input:
 *      threshold 	- 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_setAsicEeepGigaTxRateTh(rtk_uint32 threshold)
{
    return rtl8367b_setAsicReg(RTL8367B_REG_EEEP_TX_RATE_GIGA, threshold);
}
/* Function Name:
 *      rtl8367b_setAsicEeep100mTxRateTh
 * Description:
 *      Set EEEP detect Tx rate threshold for sleeping in 100Mpbs mode
 * Input:
 *      threshold 	- 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_setAsicEeep100mTxRateTh(rtk_uint32 threshold)
{
    return rtl8367b_setAsicReg(RTL8367B_REG_EEEP_TX_RATE_100M, threshold);
}
Exemplo n.º 29
0
/* Function Name:
 *      rtl8367b_setAsicRldpLeaveLoopedPortmask
 * Description:
 *      Clear leaved looped portmask
 * Input:
 *      portmask 	- 0~0xFF
 * Output:
 *      None
 * Return:
 *      RT_ERR_OK 	- Success
 *      RT_ERR_SMI  - SMI access error
 * Note:
 *      None
 */
ret_t rtl8367b_setAsicRldpLeaveLoopedPortmask(rtk_uint32 portmask)
{
    return rtl8367b_setAsicReg(RTL8367B_REG_RLDP_RELEASED_INDICATOR, portmask);
}