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: 38651 $ 13 * $Date: 2013-04-17 14:32:56 +0800 (������, 17 ������ 2013) $ 14 * 15 * Purpose : RTL8367C switch high-level API for RTL8367C 16 * Feature : RMA related functions 17 * 18 */ 19#include <rtl8367c_asicdrv_rma.h> 20/* Function Name: 21 * rtl8367c_setAsicRma 22 * Description: 23 * Set reserved multicast address for CPU trapping 24 * Input: 25 * index - reserved multicast LSB byte, 0x00~0x2F is available value 26 * pRmacfg - type of RMA for trapping frame type setting 27 * Output: 28 * None 29 * Return: 30 * RT_ERR_OK - Success 31 * RT_ERR_SMI - SMI access error 32 * RT_ERR_RMA_ADDR - Invalid RMA address index 33 * Note: 34 * None 35 */ 36ret_t rtl8367c_setAsicRma(rtk_uint32 index, rtl8367c_rma_t* pRmacfg) 37{ 38 rtk_uint32 regData; 39 ret_t retVal; 40 41 if(index > RTL8367C_RMAMAX) 42 return RT_ERR_RMA_ADDR; 43 44 regData = *(rtk_uint16*)pRmacfg; 45 46 if( (index >= 0x4 && index <= 0x7) || (index >= 0x9 && index <= 0x0C) || (0x0F == index)) 47 index = 0x04; 48 else if((index >= 0x13 && index <= 0x17) || (0x19 == index) || (index >= 0x1B && index <= 0x1f)) 49 index = 0x13; 50 else if(index >= 0x22 && index <= 0x2F) 51 index = 0x22; 52 53 retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, pRmacfg->trap_priority); 54 if(retVal != RT_ERR_OK) 55 return retVal; 56 57 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL00+index, regData); 58} 59/* Function Name: 60 * rtl8367c_getAsicRma 61 * Description: 62 * Get reserved multicast address for CPU trapping 63 * Input: 64 * index - reserved multicast LSB byte, 0x00~0x2F is available value 65 * rmacfg - type of RMA for trapping frame type setting 66 * Output: 67 * None 68 * Return: 69 * RT_ERR_OK - Success 70 * RT_ERR_SMI - SMI access error 71 * RT_ERR_RMA_ADDR - Invalid RMA address index 72 * Note: 73 * None 74 */ 75ret_t rtl8367c_getAsicRma(rtk_uint32 index, rtl8367c_rma_t* pRmacfg) 76{ 77 ret_t retVal; 78 rtk_uint32 regData; 79 80 if(index > RTL8367C_RMAMAX) 81 return RT_ERR_RMA_ADDR; 82 83 if( (index >= 0x4 && index <= 0x7) || (index >= 0x9 && index <= 0x0C) || (0x0F == index)) 84 index = 0x04; 85 else if((index >= 0x13 && index <= 0x17) || (0x19 == index) || (index >= 0x1B && index <= 0x1f)) 86 index = 0x13; 87 else if(index >= 0x22 && index <= 0x2F) 88 index = 0x22; 89 90 retVal = rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL00+index, ®Data); 91 if(retVal != RT_ERR_OK) 92 return retVal; 93 94 *pRmacfg = *(rtl8367c_rma_t*)(®Data); 95 96 retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, ®Data); 97 if(retVal != RT_ERR_OK) 98 return retVal; 99 100 pRmacfg->trap_priority = regData; 101 102 return RT_ERR_OK; 103} 104 105/* Function Name: 106 * rtl8367c_setAsicRmaCdp 107 * Description: 108 * Set CDP(Cisco Discovery Protocol) for CPU trapping 109 * Input: 110 * pRmacfg - type of RMA for trapping frame type setting 111 * Output: 112 * None 113 * Return: 114 * RT_ERR_OK - Success 115 * RT_ERR_SMI - SMI access error 116 * RT_ERR_RMA_ADDR - Invalid RMA address index 117 * Note: 118 * None 119 */ 120ret_t rtl8367c_setAsicRmaCdp(rtl8367c_rma_t* pRmacfg) 121{ 122 rtk_uint32 regData; 123 ret_t retVal; 124 125 if(pRmacfg->operation >= RMAOP_END) 126 return RT_ERR_RMA_ACTION; 127 128 if(pRmacfg->trap_priority > RTL8367C_PRIMAX) 129 return RT_ERR_QOS_INT_PRIORITY; 130 131 regData = *(rtk_uint16*)pRmacfg; 132 133 retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, pRmacfg->trap_priority); 134 if(retVal != RT_ERR_OK) 135 return retVal; 136 137 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_CDP, regData); 138} 139/* Function Name: 140 * rtl8367c_getAsicRmaCdp 141 * Description: 142 * Get CDP(Cisco Discovery Protocol) for CPU trapping 143 * Input: 144 * None 145 * Output: 146 * pRmacfg - type of RMA for trapping frame type setting 147 * Return: 148 * RT_ERR_OK - Success 149 * RT_ERR_SMI - SMI access error 150 * RT_ERR_RMA_ADDR - Invalid RMA address index 151 * Note: 152 * None 153 */ 154ret_t rtl8367c_getAsicRmaCdp(rtl8367c_rma_t* pRmacfg) 155{ 156 ret_t retVal; 157 rtk_uint32 regData; 158 159 retVal = rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_CDP, ®Data); 160 if(retVal != RT_ERR_OK) 161 return retVal; 162 163 *pRmacfg = *(rtl8367c_rma_t*)(®Data); 164 165 retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, ®Data); 166 if(retVal != RT_ERR_OK) 167 return retVal; 168 169 pRmacfg->trap_priority = regData; 170 171 return RT_ERR_OK; 172} 173 174/* Function Name: 175 * rtl8367c_setAsicRmaCsstp 176 * Description: 177 * Set CSSTP(Cisco Shared Spanning Tree Protocol) for CPU trapping 178 * Input: 179 * pRmacfg - type of RMA for trapping frame type setting 180 * Output: 181 * None 182 * Return: 183 * RT_ERR_OK - Success 184 * RT_ERR_SMI - SMI access error 185 * RT_ERR_RMA_ADDR - Invalid RMA address index 186 * Note: 187 * None 188 */ 189ret_t rtl8367c_setAsicRmaCsstp(rtl8367c_rma_t* pRmacfg) 190{ 191 rtk_uint32 regData; 192 ret_t retVal; 193 194 if(pRmacfg->operation >= RMAOP_END) 195 return RT_ERR_RMA_ACTION; 196 197 if(pRmacfg->trap_priority > RTL8367C_PRIMAX) 198 return RT_ERR_QOS_INT_PRIORITY; 199 200 regData = *(rtk_uint16*)pRmacfg; 201 202 retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, pRmacfg->trap_priority); 203 if(retVal != RT_ERR_OK) 204 return retVal; 205 206 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_CSSTP, regData); 207} 208/* Function Name: 209 * rtl8367c_getAsicRmaCsstp 210 * Description: 211 * Get CSSTP(Cisco Shared Spanning Tree Protocol) for CPU trapping 212 * Input: 213 * None 214 * Output: 215 * pRmacfg - type of RMA for trapping frame type setting 216 * Return: 217 * RT_ERR_OK - Success 218 * RT_ERR_SMI - SMI access error 219 * RT_ERR_RMA_ADDR - Invalid RMA address index 220 * Note: 221 * None 222 */ 223ret_t rtl8367c_getAsicRmaCsstp(rtl8367c_rma_t* pRmacfg) 224{ 225 ret_t retVal; 226 rtk_uint32 regData; 227 228 retVal = rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_CSSTP, ®Data); 229 if(retVal != RT_ERR_OK) 230 return retVal; 231 232 *pRmacfg = *(rtl8367c_rma_t*)(®Data); 233 234 retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, ®Data); 235 if(retVal != RT_ERR_OK) 236 return retVal; 237 238 pRmacfg->trap_priority = regData; 239 240 return RT_ERR_OK; 241} 242 243/* Function Name: 244 * rtl8367c_setAsicRmaLldp 245 * Description: 246 * Set LLDP for CPU trapping 247 * Input: 248 * pRmacfg - type of RMA for trapping frame type setting 249 * Output: 250 * None 251 * Return: 252 * RT_ERR_OK - Success 253 * RT_ERR_SMI - SMI access error 254 * RT_ERR_RMA_ADDR - Invalid RMA address index 255 * Note: 256 * None 257 */ 258ret_t rtl8367c_setAsicRmaLldp(rtk_uint32 enabled, rtl8367c_rma_t* pRmacfg) 259{ 260 rtk_uint32 regData; 261 ret_t retVal; 262 263 if(enabled > 1) 264 return RT_ERR_ENABLE; 265 266 if(pRmacfg->operation >= RMAOP_END) 267 return RT_ERR_RMA_ACTION; 268 269 if(pRmacfg->trap_priority > RTL8367C_PRIMAX) 270 return RT_ERR_QOS_INT_PRIORITY; 271 272 retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_RMA_LLDP_EN, RTL8367C_RMA_LLDP_EN_OFFSET,enabled); 273 if(retVal != RT_ERR_OK) 274 return retVal; 275 276 regData = *(rtk_uint16*)pRmacfg; 277 278 retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, pRmacfg->trap_priority); 279 if(retVal != RT_ERR_OK) 280 return retVal; 281 282 return rtl8367c_setAsicReg(RTL8367C_REG_RMA_CTRL_LLDP, regData); 283} 284/* Function Name: 285 * rtl8367c_getAsicRmaLldp 286 * Description: 287 * Get LLDP for CPU trapping 288 * Input: 289 * None 290 * Output: 291 * pRmacfg - type of RMA for trapping frame type setting 292 * Return: 293 * RT_ERR_OK - Success 294 * RT_ERR_SMI - SMI access error 295 * RT_ERR_RMA_ADDR - Invalid RMA address index 296 * Note: 297 * None 298 */ 299ret_t rtl8367c_getAsicRmaLldp(rtk_uint32 *pEnabled, rtl8367c_rma_t* pRmacfg) 300{ 301 ret_t retVal; 302 rtk_uint32 regData; 303 304 retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_RMA_LLDP_EN, RTL8367C_RMA_LLDP_EN_OFFSET,pEnabled); 305 if(retVal != RT_ERR_OK) 306 return retVal; 307 308 retVal = rtl8367c_getAsicReg(RTL8367C_REG_RMA_CTRL_LLDP, ®Data); 309 if(retVal != RT_ERR_OK) 310 return retVal; 311 312 *pRmacfg = *(rtl8367c_rma_t*)(®Data); 313 314 retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_RMA_CTRL00, RTL8367C_TRAP_PRIORITY_MASK, ®Data); 315 if(retVal != RT_ERR_OK) 316 return retVal; 317 318 pRmacfg->trap_priority = regData; 319 320 return RT_ERR_OK; 321} 322 323