• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/char/rtl8365mb/
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, &regData);
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, &regData);
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