mediatek: add support for rtl8367c
[openwrt/openwrt.git] / target / linux / mediatek / files-5.4 / drivers / net / phy / rtk / rtl8367c / rtl8367c_asicdrv_trunking.c
1 /*
2 * Copyright (C) 2013 Realtek Semiconductor Corp.
3 * All Rights Reserved.
4 *
5 * Unless you and Realtek execute a separate written software license
6 * agreement governing use of this software, this software is licensed
7 * to you under the terms of the GNU General Public License version 2,
8 * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
9 *
10 * $Revision: 76306 $
11 * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
12 *
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : Port trunking related functions
15 *
16 */
17
18 #include <rtl8367c_asicdrv_trunking.h>
19 /* Function Name:
20 * rtl8367c_setAsicTrunkingMode
21 * Description:
22 * Set port trunking mode
23 * Input:
24 * mode - 1:dumb 0:user defined
25 * Output:
26 * None
27 * Return:
28 * RT_ERR_OK - Success
29 * RT_ERR_SMI - SMI access error
30 * Note:
31 * None
32 */
33 ret_t rtl8367c_setAsicTrunkingMode(rtk_uint32 mode)
34 {
35 return rtl8367c_setAsicRegBit(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_DUMB_OFFSET, mode);
36 }
37 /* Function Name:
38 * rtl8367c_getAsicTrunkingMode
39 * Description:
40 * Get port trunking mode
41 * Input:
42 * pMode - 1:dumb 0:user defined
43 * Output:
44 * None
45 * Return:
46 * RT_ERR_OK - Success
47 * RT_ERR_SMI - SMI access error
48 * Note:
49 * None
50 */
51 ret_t rtl8367c_getAsicTrunkingMode(rtk_uint32* pMode)
52 {
53 return rtl8367c_getAsicRegBit(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_DUMB_OFFSET, pMode);
54 }
55 /* Function Name:
56 * rtl8367c_setAsicTrunkingFc
57 * Description:
58 * Set port trunking flow control
59 * Input:
60 * group - Trunk Group ID
61 * enabled - 0:disable, 1:enable
62 * Output:
63 * None
64 * Return:
65 * RT_ERR_OK - Success
66 * RT_ERR_SMI - SMI access error
67 * Note:
68 * None
69 */
70 ret_t rtl8367c_setAsicTrunkingFc(rtk_uint32 group, rtk_uint32 enabled)
71 {
72 ret_t retVal;
73
74 if(group > RTL8367C_MAX_TRUNK_GID)
75 return RT_ERR_LA_TRUNK_ID;
76
77 if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_PORT_TRUNK_DROP_CTRL, RTL8367C_PORT_TRUNK_DROP_CTRL_OFFSET, ENABLED)) != RT_ERR_OK)
78 return retVal;
79
80 return rtl8367c_setAsicRegBit(RTL8367C_REG_PORT_TRUNK_FLOWCTRL, (RTL8367C_EN_FLOWCTRL_TG0_OFFSET + group), enabled);
81 }
82 /* Function Name:
83 * rtl8367c_getAsicTrunkingFc
84 * Description:
85 * Get port trunking flow control
86 * Input:
87 * group - Trunk Group ID
88 * pEnabled - 0:disable, 1:enable
89 * Output:
90 * None
91 * Return:
92 * RT_ERR_OK - Success
93 * RT_ERR_SMI - SMI access error
94 * Note:
95 * None
96 */
97 ret_t rtl8367c_getAsicTrunkingFc(rtk_uint32 group, rtk_uint32* pEnabled)
98 {
99 if(group > RTL8367C_MAX_TRUNK_GID)
100 return RT_ERR_LA_TRUNK_ID;
101
102 return rtl8367c_getAsicRegBit(RTL8367C_REG_PORT_TRUNK_FLOWCTRL, (RTL8367C_EN_FLOWCTRL_TG0_OFFSET + group), pEnabled);
103 }
104 /* Function Name:
105 * rtl8367c_setAsicTrunkingGroup
106 * Description:
107 * Set trunking group available port mask
108 * Input:
109 * group - Trunk Group ID
110 * portmask - Logic trunking enable port mask, max 4 ports
111 * Output:
112 * None
113 * Return:
114 * RT_ERR_OK - Success
115 * RT_ERR_SMI - SMI access error
116 * Note:
117 * None
118 */
119 ret_t rtl8367c_setAsicTrunkingGroup(rtk_uint32 group, rtk_uint32 portmask)
120 {
121 if(group > RTL8367C_MAX_TRUNK_GID)
122 return RT_ERR_LA_TRUNK_ID;
123 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_GROUP_MASK, RTL8367C_PORT_TRUNK_GROUP0_MASK_MASK << (group * 4), portmask);
124 }
125 /* Function Name:
126 * rtl8367c_getAsicTrunkingGroup
127 * Description:
128 * Get trunking group available port mask
129 * Input:
130 * group - Trunk Group ID
131 * Output:
132 * pPortmask - Logic trunking enable port mask, max 4 ports
133 * Return:
134 * RT_ERR_OK - Success
135 * RT_ERR_SMI - SMI access error
136 * Note:
137 * None
138 */
139 ret_t rtl8367c_getAsicTrunkingGroup(rtk_uint32 group, rtk_uint32* pPortmask)
140 {
141 if(group > RTL8367C_MAX_TRUNK_GID)
142 return RT_ERR_LA_TRUNK_ID;
143
144 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_GROUP_MASK, RTL8367C_PORT_TRUNK_GROUP0_MASK_MASK << (group * 4), pPortmask);
145 }
146 /* Function Name:
147 * rtl8367c_setAsicTrunkingFlood
148 * Description:
149 * Set port trunking flood function
150 * Input:
151 * enabled - Port trunking flooding function 0:disable 1:enable
152 * Output:
153 * None
154 * Return:
155 * RT_ERR_OK - Success
156 * RT_ERR_SMI - SMI access error
157 * Note:
158 * None
159 */
160 ret_t rtl8367c_setAsicTrunkingFlood(rtk_uint32 enabled)
161 {
162 return rtl8367c_setAsicRegBit(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_FLOOD_OFFSET, enabled);
163 }
164 /* Function Name:
165 * rtl8367c_getAsicTrunkingFlood
166 * Description:
167 * Get port trunking flood function
168 * Input:
169 * pEnabled - Port trunking flooding function 0:disable 1:enable
170 * Output:
171 * None
172 * Return:
173 * RT_ERR_OK - Success
174 * RT_ERR_SMI - SMI access error
175 * Note:
176 * None
177 */
178 ret_t rtl8367c_getAsicTrunkingFlood(rtk_uint32* pEnabled)
179 {
180 return rtl8367c_getAsicRegBit(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_FLOOD_OFFSET, pEnabled);
181 }
182 /* Function Name:
183 * rtl8367c_setAsicTrunkingHashSelect
184 * Description:
185 * Set port trunking hash select sources
186 * Input:
187 * hashsel - hash sources mask
188 * Output:
189 * None
190 * Return:
191 * RT_ERR_OK - Success
192 * RT_ERR_SMI - SMI access error
193 * Note:
194 * 7 bits mask for link aggregation group0 hash parameter selection {DIP, SIP, DMAC, SMAC, SPA}
195 * 0b0000001: SPA
196 * 0b0000010: SMAC
197 * 0b0000100: DMAC
198 * 0b0001000: SIP
199 * 0b0010000: DIP
200 * 0b0100000: TCP/UDP Source Port
201 * 0b1000000: TCP/UDP Destination Port
202 */
203 ret_t rtl8367c_setAsicTrunkingHashSelect(rtk_uint32 hashsel)
204 {
205 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_HASH_MASK, hashsel);
206 }
207 /* Function Name:
208 * rtl8367c_getAsicTrunkingHashSelect
209 * Description:
210 * Get port trunking hash select sources
211 * Input:
212 * pHashsel - hash sources mask
213 * Output:
214 * None
215 * Return:
216 * RT_ERR_OK - Success
217 * RT_ERR_SMI - SMI access error
218 * Note:
219 * None
220 */
221 ret_t rtl8367c_getAsicTrunkingHashSelect(rtk_uint32* pHashsel)
222 {
223 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_CTRL, RTL8367C_PORT_TRUNK_HASH_MASK, pHashsel);
224 }
225 /* Function Name:
226 * rtl8367c_getAsicQeueuEmptyStatus
227 * Description:
228 * Get current output queue if empty status
229 * Input:
230 * portmask - queue empty port mask
231 * Output:
232 * None
233 * Return:
234 * RT_ERR_OK - Success
235 * RT_ERR_SMI - SMI access error
236 * Note:
237 * None
238 */
239 ret_t rtl8367c_getAsicQeueuEmptyStatus(rtk_uint32* portmask)
240 {
241 return rtl8367c_getAsicReg(RTL8367C_REG_PORT_QEMPTY, portmask);
242 }
243 /* Function Name:
244 * rtl8367c_setAsicTrunkingHashTable
245 * Description:
246 * Set port trunking hash value mapping table
247 * Input:
248 * hashval - hashing value 0-15
249 * portId - trunking port id 0-3
250 * Output:
251 * None
252 * Return:
253 * RT_ERR_OK - Success
254 * RT_ERR_SMI - SMI access error
255 * RT_ERR_PORT_ID - Invalid port number
256 * RT_ERR_OUT_OF_RANGE - Invalid hashing value (0-15)
257 * Note:
258 * None
259 */
260 ret_t rtl8367c_setAsicTrunkingHashTable(rtk_uint32 hashval, rtk_uint32 portId)
261 {
262 if(hashval > RTL8367C_TRUNKING_HASHVALUE_MAX)
263 return RT_ERR_OUT_OF_RANGE;
264
265 if(portId >= RTL8367C_TRUNKING_PORTNO)
266 return RT_ERR_PORT_ID;
267
268 if(hashval >= 8)
269 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL1, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL1_HASH8_MASK<<((hashval-8)*2), portId);
270 else
271 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL0, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL0_HASH0_MASK<<(hashval*2), portId);
272 }
273 /* Function Name:
274 * rtl8367c_getAsicTrunkingHashTable
275 * Description:
276 * Get port trunking hash value mapping table
277 * Input:
278 * hashval - hashing value 0-15
279 * pPortId - trunking port id 0-3
280 * Output:
281 * None
282 * Return:
283 * RT_ERR_OK - Success
284 * RT_ERR_SMI - SMI access error
285 * RT_ERR_OUT_OF_RANGE - Invalid hashing value (0-15)
286 * Note:
287 * None
288 */
289 ret_t rtl8367c_getAsicTrunkingHashTable(rtk_uint32 hashval, rtk_uint32* pPortId)
290 {
291 if(hashval > RTL8367C_TRUNKING_HASHVALUE_MAX)
292 return RT_ERR_OUT_OF_RANGE;
293
294 if(hashval >= 8)
295 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL1, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL1_HASH8_MASK<<((hashval-8)*2), pPortId);
296 else
297 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL0, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL0_HASH0_MASK<<(hashval*2), pPortId);
298 }
299
300 /* Function Name:
301 * rtl8367c_setAsicTrunkingHashTable1
302 * Description:
303 * Set port trunking hash value mapping table
304 * Input:
305 * hashval - hashing value 0-15
306 * portId - trunking port id 0-3
307 * Output:
308 * None
309 * Return:
310 * RT_ERR_OK - Success
311 * RT_ERR_SMI - SMI access error
312 * RT_ERR_PORT_ID - Invalid port number
313 * RT_ERR_OUT_OF_RANGE - Invalid hashing value (0-15)
314 * Note:
315 * None
316 */
317 ret_t rtl8367c_setAsicTrunkingHashTable1(rtk_uint32 hashval, rtk_uint32 portId)
318 {
319 if(hashval > RTL8367C_TRUNKING_HASHVALUE_MAX)
320 return RT_ERR_OUT_OF_RANGE;
321
322 if(portId >= RTL8367C_TRUNKING1_PORTN0)
323 return RT_ERR_PORT_ID;
324
325 if(hashval >= 8)
326 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL3, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL3_HASH8_MASK<<((hashval-8)*2), portId);
327 else
328 return rtl8367c_setAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL2, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL2_HASH0_MASK<<(hashval*2), portId);
329 }
330 /* Function Name:
331 * rtl8367c_getAsicTrunkingHashTable1
332 * Description:
333 * Get port trunking hash value mapping table
334 * Input:
335 * hashval - hashing value 0-15
336 * pPortId - trunking port id 0-3
337 * Output:
338 * None
339 * Return:
340 * RT_ERR_OK - Success
341 * RT_ERR_SMI - SMI access error
342 * RT_ERR_OUT_OF_RANGE - Invalid hashing value (0-15)
343 * Note:
344 * None
345 */
346 ret_t rtl8367c_getAsicTrunkingHashTable1(rtk_uint32 hashval, rtk_uint32* pPortId)
347 {
348 if(hashval > RTL8367C_TRUNKING_HASHVALUE_MAX)
349 return RT_ERR_OUT_OF_RANGE;
350
351 if(hashval >= 8)
352 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL3, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL3_HASH8_MASK<<((hashval-8)*2), pPortId);
353 else
354 return rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_TRUNK_HASH_MAPPING_CTRL2, RTL8367C_PORT_TRUNK_HASH_MAPPING_CTRL2_HASH0_MASK<<(hashval*2), pPortId);
355 }
356