1/* 2 * Copyright (C) 2013 Realtek Semiconductor Corp. 3 * All Rights Reserved. 4 * 5 * This program is the proprietary software of Realtek Semiconductor 6 * Corporation and/or its licensors, and only be used, duplicated, 7 * modified or distributed under the authorized license from Realtek. 8 * 9 * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER 10 * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. 11 * 12 * $Revision: 39691 $ 13 * $Date: 2013-05-23 20:30:53 +0800 (������, 23 ������ 2013) $ 14 * 15 * Purpose : RTL8367C switch high-level API for RTL8367C 16 * Feature : Ingress bandwidth control related functions 17 * 18 */ 19#include <rtl8367c_asicdrv_inbwctrl.h> 20/* Function Name: 21 * rtl8367c_setAsicPortIngressBandwidth 22 * Description: 23 * Set per-port total ingress bandwidth 24 * Input: 25 * port - Physical port number (0~7) 26 * bandwidth - The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable 27 * preifg - Include preamble and IFG, 0:Exclude, 1:Include 28 * enableFC - Action when input rate exceeds. 0: Drop 1: Flow Control 29 * Output: 30 * None 31 * Return: 32 * RT_ERR_OK - Success 33 * RT_ERR_SMI - SMI access error 34 * RT_ERR_PORT_ID - Invalid port number 35 * RT_ERR_OUT_OF_RANGE - input parameter out of range 36 * Note: 37 * None 38 */ 39ret_t rtl8367c_setAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32 bandwidth, rtk_uint32 preifg, rtk_uint32 enableFC) 40{ 41 ret_t retVal; 42 rtk_uint32 regData; 43 rtk_uint32 regAddr; 44 45 /* Invalid input parameter */ 46 if(port >= RTL8367C_PORTNO) 47 return RT_ERR_PORT_ID; 48 49 if(bandwidth > RTL8367C_QOS_GRANULARTY_MAX) 50 return RT_ERR_OUT_OF_RANGE; 51 52 regAddr = RTL8367C_INGRESSBW_PORT_RATE_LSB_REG(port); 53 regData = bandwidth & RTL8367C_QOS_GRANULARTY_LSB_MASK; 54 retVal = rtl8367c_setAsicReg(regAddr, regData); 55 if(retVal != RT_ERR_OK) 56 return retVal; 57 58 regAddr += 1; 59 regData = (bandwidth & RTL8367C_QOS_GRANULARTY_MSB_MASK) >> RTL8367C_QOS_GRANULARTY_MSB_OFFSET; 60 retVal = rtl8367c_setAsicRegBits(regAddr, RTL8367C_INGRESSBW_PORT0_RATE_CTRL1_INGRESSBW_RATE16_MASK, regData); 61 if(retVal != RT_ERR_OK) 62 return retVal; 63 64 regAddr = RTL8367C_PORT_MISC_CFG_REG(port); 65 retVal = rtl8367c_setAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, preifg); 66 if(retVal != RT_ERR_OK) 67 return retVal; 68 69 regAddr = RTL8367C_PORT_MISC_CFG_REG(port); 70 retVal = rtl8367c_setAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, enableFC); 71 if(retVal != RT_ERR_OK) 72 return retVal; 73 74 return RT_ERR_OK; 75} 76/* Function Name: 77 * rtl8367c_getAsicPortIngressBandwidth 78 * Description: 79 * Get per-port total ingress bandwidth 80 * Input: 81 * port - Physical port number (0~7) 82 * pBandwidth - The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable 83 * pPreifg - Include preamble and IFG, 0:Exclude, 1:Include 84 * pEnableFC - Action when input rate exceeds. 0: Drop 1: Flow Control 85 * Output: 86 * None 87 * Return: 88 * RT_ERR_OK - Success 89 * RT_ERR_SMI - SMI access error 90 * RT_ERR_PORT_ID - Invalid port number 91 * Note: 92 * None 93 */ 94ret_t rtl8367c_getAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32* pBandwidth, rtk_uint32* pPreifg, rtk_uint32* pEnableFC) 95{ 96 ret_t retVal; 97 rtk_uint32 regData; 98 rtk_uint32 regAddr; 99 100 /* Invalid input parameter */ 101 if(port >= RTL8367C_PORTNO) 102 return RT_ERR_PORT_ID; 103 104 regAddr = RTL8367C_INGRESSBW_PORT_RATE_LSB_REG(port); 105 retVal = rtl8367c_getAsicReg(regAddr, ®Data); 106 if(retVal != RT_ERR_OK) 107 return retVal; 108 109 *pBandwidth = regData; 110 111 regAddr += 1; 112 retVal = rtl8367c_getAsicRegBits(regAddr, RTL8367C_INGRESSBW_PORT0_RATE_CTRL1_INGRESSBW_RATE16_MASK, ®Data); 113 if(retVal != RT_ERR_OK) 114 return retVal; 115 116 *pBandwidth |= (regData << RTL8367C_QOS_GRANULARTY_MSB_OFFSET); 117 118 regAddr = RTL8367C_PORT_MISC_CFG_REG(port); 119 retVal = rtl8367c_getAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, pPreifg); 120 if(retVal != RT_ERR_OK) 121 return retVal; 122 123 regAddr = RTL8367C_PORT_MISC_CFG_REG(port); 124 retVal = rtl8367c_getAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, pEnableFC); 125 if(retVal != RT_ERR_OK) 126 return retVal; 127 128 return RT_ERR_OK; 129} 130/* Function Name: 131 * rtl8367c_setAsicPortIngressBandwidthBypass 132 * Description: 133 * Set ingress bandwidth control bypasss 8899, RMA 01-80-C2-00-00-xx and IGMP 134 * Input: 135 * enabled - 1: enabled, 0: disabled 136 * Output: 137 * None 138 * Return: 139 * RT_ERR_OK - Success 140 * RT_ERR_SMI - SMI access error 141 * Note: 142 * None 143 */ 144ret_t rtl8367c_setAsicPortIngressBandwidthBypass(rtk_uint32 enabled) 145{ 146 return rtl8367c_setAsicRegBit(RTL8367C_REG_SW_DUMMY0, RTL8367C_INGRESSBW_BYPASS_EN_OFFSET, enabled); 147} 148/* Function Name: 149 * rtl8367c_getAsicPortIngressBandwidthBypass 150 * Description: 151 * Set ingress bandwidth control bypasss 8899, RMA 01-80-C2-00-00-xx and IGMP 152 * Input: 153 * pEnabled - 1: enabled, 0: disabled 154 * Output: 155 * None 156 * Return: 157 * RT_ERR_OK - Success 158 * RT_ERR_SMI - SMI access error 159 * Note: 160 * None 161 */ 162ret_t rtl8367c_getAsicPortIngressBandwidthBypass(rtk_uint32* pEnabled) 163{ 164 return rtl8367c_getAsicRegBit(RTL8367C_REG_SW_DUMMY0, RTL8367C_INGRESSBW_BYPASS_EN_OFFSET, pEnabled); 165} 166 167