2 * Copyright (C) 2013 Realtek Semiconductor Corp.
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
11 * $Date: 2015-12-31 16:31:55 +0800 (週四, 31 十二月 2015) $
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : RMA related functions
18 #include <rtl8367c_asicdrv_rma.h>
22 * Set reserved multicast address for CPU trapping
24 * index - reserved multicast LSB byte, 0x00~0x2F is available value
25 * pRmacfg - type of RMA for trapping frame type setting
30 * RT_ERR_SMI - SMI access error
31 * RT_ERR_RMA_ADDR - Invalid RMA address index
35 ret_t
rtl8367c_setAsicRma(rtk_uint32 index
, rtl8367c_rma_t
* pRmacfg
)
37 rtk_uint32 regData
= 0;
40 if(index
> RTL8367C_RMAMAX
)
41 return RT_ERR_RMA_ADDR
;
43 regData
|= (pRmacfg
->portiso_leaky
& 0x0001);
44 regData
|= ((pRmacfg
->vlan_leaky
& 0x0001) << 1);
45 regData
|= ((pRmacfg
->keep_format
& 0x0001) << 2);
46 regData
|= ((pRmacfg
->trap_priority
& 0x0007) << 3);
47 regData
|= ((pRmacfg
->discard_storm_filter
& 0x0001) << 6);
48 regData
|= ((pRmacfg
->operation
& 0x0003) << 7);
50 if( (index
>= 0x4 && index
<= 0x7) || (index
>= 0x9 && index
<= 0x0C) || (0x0F == index
))
52 else if((index
>= 0x13 && index
<= 0x17) || (0x19 == index
) || (index
>= 0x1B && index
<= 0x1f))
54 else if(index
>= 0x22 && index
<= 0x2F)
57 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, pRmacfg
->trap_priority
);
58 if(retVal
!= RT_ERR_OK
)
61 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL00
+index
, regData
);
66 * Get reserved multicast address for CPU trapping
68 * index - reserved multicast LSB byte, 0x00~0x2F is available value
69 * rmacfg - type of RMA for trapping frame type setting
74 * RT_ERR_SMI - SMI access error
75 * RT_ERR_RMA_ADDR - Invalid RMA address index
79 ret_t
rtl8367c_getAsicRma(rtk_uint32 index
, rtl8367c_rma_t
* pRmacfg
)
84 if(index
> RTL8367C_RMAMAX
)
85 return RT_ERR_RMA_ADDR
;
87 if( (index
>= 0x4 && index
<= 0x7) || (index
>= 0x9 && index
<= 0x0C) || (0x0F == index
))
89 else if((index
>= 0x13 && index
<= 0x17) || (0x19 == index
) || (index
>= 0x1B && index
<= 0x1f))
91 else if(index
>= 0x22 && index
<= 0x2F)
94 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL00
+index
, ®Data
);
95 if(retVal
!= RT_ERR_OK
)
98 pRmacfg
->operation
= ((regData
>> 7) & 0x0003);
99 pRmacfg
->discard_storm_filter
= ((regData
>> 6) & 0x0001);
100 pRmacfg
->trap_priority
= ((regData
>> 3) & 0x0007);
101 pRmacfg
->keep_format
= ((regData
>> 2) & 0x0001);
102 pRmacfg
->vlan_leaky
= ((regData
>> 1) & 0x0001);
103 pRmacfg
->portiso_leaky
= (regData
& 0x0001);
106 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, ®Data
);
107 if(retVal
!= RT_ERR_OK
)
110 pRmacfg
->trap_priority
= regData
;
116 * rtl8367c_setAsicRmaCdp
118 * Set CDP(Cisco Discovery Protocol) for CPU trapping
120 * pRmacfg - type of RMA for trapping frame type setting
124 * RT_ERR_OK - Success
125 * RT_ERR_SMI - SMI access error
126 * RT_ERR_RMA_ADDR - Invalid RMA address index
130 ret_t
rtl8367c_setAsicRmaCdp(rtl8367c_rma_t
* pRmacfg
)
132 rtk_uint32 regData
= 0;
135 if(pRmacfg
->operation
>= RMAOP_END
)
136 return RT_ERR_RMA_ACTION
;
138 if(pRmacfg
->trap_priority
> RTL8367C_PRIMAX
)
139 return RT_ERR_QOS_INT_PRIORITY
;
141 regData
|= (pRmacfg
->portiso_leaky
& 0x0001);
142 regData
|= ((pRmacfg
->vlan_leaky
& 0x0001) << 1);
143 regData
|= ((pRmacfg
->keep_format
& 0x0001) << 2);
144 regData
|= ((pRmacfg
->trap_priority
& 0x0007) << 3);
145 regData
|= ((pRmacfg
->discard_storm_filter
& 0x0001) << 6);
146 regData
|= ((pRmacfg
->operation
& 0x0003) << 7);
148 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, pRmacfg
->trap_priority
);
149 if(retVal
!= RT_ERR_OK
)
152 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_CDP
, regData
);
155 * rtl8367c_getAsicRmaCdp
157 * Get CDP(Cisco Discovery Protocol) for CPU trapping
161 * pRmacfg - type of RMA for trapping frame type setting
163 * RT_ERR_OK - Success
164 * RT_ERR_SMI - SMI access error
165 * RT_ERR_RMA_ADDR - Invalid RMA address index
169 ret_t
rtl8367c_getAsicRmaCdp(rtl8367c_rma_t
* pRmacfg
)
174 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_CDP
, ®Data
);
175 if(retVal
!= RT_ERR_OK
)
178 pRmacfg
->operation
= ((regData
>> 7) & 0x0003);
179 pRmacfg
->discard_storm_filter
= ((regData
>> 6) & 0x0001);
180 pRmacfg
->trap_priority
= ((regData
>> 3) & 0x0007);
181 pRmacfg
->keep_format
= ((regData
>> 2) & 0x0001);
182 pRmacfg
->vlan_leaky
= ((regData
>> 1) & 0x0001);
183 pRmacfg
->portiso_leaky
= (regData
& 0x0001);
185 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, ®Data
);
186 if(retVal
!= RT_ERR_OK
)
189 pRmacfg
->trap_priority
= regData
;
195 * rtl8367c_setAsicRmaCsstp
197 * Set CSSTP(Cisco Shared Spanning Tree Protocol) for CPU trapping
199 * pRmacfg - type of RMA for trapping frame type setting
203 * RT_ERR_OK - Success
204 * RT_ERR_SMI - SMI access error
205 * RT_ERR_RMA_ADDR - Invalid RMA address index
209 ret_t
rtl8367c_setAsicRmaCsstp(rtl8367c_rma_t
* pRmacfg
)
211 rtk_uint32 regData
= 0;
214 if(pRmacfg
->operation
>= RMAOP_END
)
215 return RT_ERR_RMA_ACTION
;
217 if(pRmacfg
->trap_priority
> RTL8367C_PRIMAX
)
218 return RT_ERR_QOS_INT_PRIORITY
;
220 regData
|= (pRmacfg
->portiso_leaky
& 0x0001);
221 regData
|= ((pRmacfg
->vlan_leaky
& 0x0001) << 1);
222 regData
|= ((pRmacfg
->keep_format
& 0x0001) << 2);
223 regData
|= ((pRmacfg
->trap_priority
& 0x0007) << 3);
224 regData
|= ((pRmacfg
->discard_storm_filter
& 0x0001) << 6);
225 regData
|= ((pRmacfg
->operation
& 0x0003) << 7);
227 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, pRmacfg
->trap_priority
);
228 if(retVal
!= RT_ERR_OK
)
231 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_CSSTP
, regData
);
234 * rtl8367c_getAsicRmaCsstp
236 * Get CSSTP(Cisco Shared Spanning Tree Protocol) for CPU trapping
240 * pRmacfg - type of RMA for trapping frame type setting
242 * RT_ERR_OK - Success
243 * RT_ERR_SMI - SMI access error
244 * RT_ERR_RMA_ADDR - Invalid RMA address index
248 ret_t
rtl8367c_getAsicRmaCsstp(rtl8367c_rma_t
* pRmacfg
)
253 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_CSSTP
, ®Data
);
254 if(retVal
!= RT_ERR_OK
)
257 pRmacfg
->operation
= ((regData
>> 7) & 0x0003);
258 pRmacfg
->discard_storm_filter
= ((regData
>> 6) & 0x0001);
259 pRmacfg
->trap_priority
= ((regData
>> 3) & 0x0007);
260 pRmacfg
->keep_format
= ((regData
>> 2) & 0x0001);
261 pRmacfg
->vlan_leaky
= ((regData
>> 1) & 0x0001);
262 pRmacfg
->portiso_leaky
= (regData
& 0x0001);
264 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, ®Data
);
265 if(retVal
!= RT_ERR_OK
)
268 pRmacfg
->trap_priority
= regData
;
274 * rtl8367c_setAsicRmaLldp
276 * Set LLDP for CPU trapping
278 * pRmacfg - type of RMA for trapping frame type setting
282 * RT_ERR_OK - Success
283 * RT_ERR_SMI - SMI access error
284 * RT_ERR_RMA_ADDR - Invalid RMA address index
288 ret_t
rtl8367c_setAsicRmaLldp(rtk_uint32 enabled
, rtl8367c_rma_t
* pRmacfg
)
290 rtk_uint32 regData
= 0;
294 return RT_ERR_ENABLE
;
296 if(pRmacfg
->operation
>= RMAOP_END
)
297 return RT_ERR_RMA_ACTION
;
299 if(pRmacfg
->trap_priority
> RTL8367C_PRIMAX
)
300 return RT_ERR_QOS_INT_PRIORITY
;
302 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_RMA_LLDP_EN
, RTL8367C_RMA_LLDP_EN_OFFSET
,enabled
);
303 if(retVal
!= RT_ERR_OK
)
306 regData
|= (pRmacfg
->portiso_leaky
& 0x0001);
307 regData
|= ((pRmacfg
->vlan_leaky
& 0x0001) << 1);
308 regData
|= ((pRmacfg
->keep_format
& 0x0001) << 2);
309 regData
|= ((pRmacfg
->trap_priority
& 0x0007) << 3);
310 regData
|= ((pRmacfg
->discard_storm_filter
& 0x0001) << 6);
311 regData
|= ((pRmacfg
->operation
& 0x0003) << 7);
313 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, pRmacfg
->trap_priority
);
314 if(retVal
!= RT_ERR_OK
)
317 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_LLDP
, regData
);
320 * rtl8367c_getAsicRmaLldp
322 * Get LLDP for CPU trapping
326 * pRmacfg - type of RMA for trapping frame type setting
328 * RT_ERR_OK - Success
329 * RT_ERR_SMI - SMI access error
330 * RT_ERR_RMA_ADDR - Invalid RMA address index
334 ret_t
rtl8367c_getAsicRmaLldp(rtk_uint32
*pEnabled
, rtl8367c_rma_t
* pRmacfg
)
339 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_RMA_LLDP_EN
, RTL8367C_RMA_LLDP_EN_OFFSET
,pEnabled
);
340 if(retVal
!= RT_ERR_OK
)
343 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_LLDP
, ®Data
);
344 if(retVal
!= RT_ERR_OK
)
347 pRmacfg
->operation
= ((regData
>> 7) & 0x0003);
348 pRmacfg
->discard_storm_filter
= ((regData
>> 6) & 0x0001);
349 pRmacfg
->trap_priority
= ((regData
>> 3) & 0x0007);
350 pRmacfg
->keep_format
= ((regData
>> 2) & 0x0001);
351 pRmacfg
->vlan_leaky
= ((regData
>> 1) & 0x0001);
352 pRmacfg
->portiso_leaky
= (regData
& 0x0001);
354 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00
, RTL8367C_TRAP_PRIORITY_MASK
, ®Data
);
355 if(retVal
!= RT_ERR_OK
)
358 pRmacfg
->trap_priority
= regData
;