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: 42321 $ 13 * $Date: 2013-08-26 13:51:29 +0800 (������, 26 ������ 2013) $ 14 * 15 * Purpose : RTL8367C switch high-level API for RTL8367C 16 * Feature : Miscellaneous functions 17 * 18 */ 19 20#include <rtl8367c_asicdrv_misc.h> 21/* Function Name: 22 * rtl8367c_setAsicMacAddress 23 * Description: 24 * Set switch MAC address 25 * Input: 26 * mac - switch mac 27 * Output: 28 * None 29 * Return: 30 * RT_ERR_OK - Success 31 * RT_ERR_SMI - SMI access error 32 * Note: 33 * None 34 */ 35ret_t rtl8367c_setAsicMacAddress(ether_addr_t mac) 36{ 37 ret_t retVal; 38 rtk_uint32 regData; 39 rtk_uint8 *accessPtr; 40 rtk_uint32 i; 41 42 accessPtr = (rtk_uint8*)&mac; 43 44 regData = *accessPtr; 45 accessPtr ++; 46 regData = (regData << 8) | *accessPtr; 47 accessPtr ++; 48 for(i = 0; i <=2; i++) 49 { 50 retVal = rtl8367c_setAsicReg(RTL8367C_REG_SWITCH_MAC2 - i, regData); 51 if(retVal != RT_ERR_OK) 52 return retVal; 53 54 regData = *accessPtr; 55 accessPtr ++; 56 regData = (regData << 8) | *accessPtr; 57 accessPtr ++; 58 } 59 60 return retVal; 61} 62/* Function Name: 63 * rtl8367c_getAsicMacAddress 64 * Description: 65 * Get switch MAC address 66 * Input: 67 * pMac - switch mac 68 * Output: 69 * None 70 * Return: 71 * RT_ERR_OK - Success 72 * RT_ERR_SMI - SMI access error 73 * Note: 74 * None 75 */ 76ret_t rtl8367c_getAsicMacAddress(ether_addr_t *pMac) 77{ 78 ret_t retVal; 79 rtk_uint32 regData; 80 rtk_uint8 *accessPtr; 81 rtk_uint32 i; 82 83 84 accessPtr = (rtk_uint8*)pMac; 85 86 for(i = 0; i <= 2; i++) 87 { 88 retVal = rtl8367c_getAsicReg(RTL8367C_REG_SWITCH_MAC2 - i, ®Data); 89 if(retVal != RT_ERR_OK) 90 return retVal; 91 92 *accessPtr = (regData & 0xFF00) >> 8; 93 accessPtr ++; 94 *accessPtr = regData & 0xFF; 95 accessPtr ++; 96 } 97 98 return retVal; 99} 100/* Function Name: 101 * rtl8367c_getAsicDebugInfo 102 * Description: 103 * Get per-port packet forward debugging information 104 * Input: 105 * port - Physical port number (0~7) 106 * pDebugifo - per-port packet trap/drop/forward reason 107 * Output: 108 * None 109 * Return: 110 * RT_ERR_OK - Success 111 * RT_ERR_SMI - SMI access error 112 * RT_ERR_PORT_ID - Invalid port number 113 * Note: 114 * None 115 */ 116ret_t rtl8367c_getAsicDebugInfo(rtk_uint32 port, rtk_uint32 *pDebugifo) 117{ 118 if(port > RTL8367C_PORTIDMAX) 119 return RT_ERR_PORT_ID; 120 121 return rtl8367c_getAsicRegBits(RTL8367C_DEBUG_INFO_REG(port), RTL8367C_DEBUG_INFO_MASK(port), pDebugifo); 122} 123/* Function Name: 124 * rtl8367c_setAsicPortJamMode 125 * Description: 126 * Set half duplex flow control setting 127 * Input: 128 * mode - 0: Back-Pressure 1: DEFER 129 * Output: 130 * None 131 * Return: 132 * RT_ERR_OK - Success 133 * RT_ERR_SMI - SMI access error 134 * Note: 135 * None 136 */ 137ret_t rtl8367c_setAsicPortJamMode(rtk_uint32 mode) 138{ 139 return rtl8367c_setAsicRegBit(RTL8367C_REG_CFG_BACKPRESSURE, RTL8367C_LONGTXE_OFFSET,mode); 140} 141/* Function Name: 142 * rtl8367c_getAsicPortJamMode 143 * Description: 144 * Get half duplex flow control setting 145 * Input: 146 * pMode - 0: Back-Pressure 1: DEFER 147 * Output: 148 * None 149 * Return: 150 * RT_ERR_OK - Success 151 * RT_ERR_SMI - SMI access error 152 * Note: 153 * None 154 */ 155ret_t rtl8367c_getAsicPortJamMode(rtk_uint32* pMode) 156{ 157 return rtl8367c_getAsicRegBit(RTL8367C_REG_CFG_BACKPRESSURE, RTL8367C_LONGTXE_OFFSET, pMode); 158} 159 160/* Function Name: 161 * rtl8367c_setAsicMaxLengthCfg 162 * Description: 163 * Set Max packet length configuration 164 * Input: 165 * cfgId - Configuration ID 166 * maxLength - Max Length 167 * Output: 168 * None 169 * Return: 170 * RT_ERR_OK - Success 171 * RT_ERR_SMI - SMI access error 172 * Note: 173 * None 174 */ 175ret_t rtl8367c_setAsicMaxLengthCfg(rtk_uint32 cfgId, rtk_uint32 maxLength) 176{ 177 return rtl8367c_setAsicRegBits(RTL8367C_REG_MAX_LEN_RX_TX_CFG0 + cfgId, RTL8367C_MAX_LEN_RX_TX_CFG0_MASK, maxLength); 178} 179 180/* Function Name: 181 * rtl8367c_getAsicMaxLengthCfg 182 * Description: 183 * Get Max packet length configuration 184 * Input: 185 * cfgId - Configuration ID 186 * maxLength - Max Length 187 * Output: 188 * None 189 * Return: 190 * RT_ERR_OK - Success 191 * RT_ERR_SMI - SMI access error 192 * Note: 193 * None 194 */ 195ret_t rtl8367c_getAsicMaxLengthCfg(rtk_uint32 cfgId, rtk_uint32 *pMaxLength) 196{ 197 return rtl8367c_getAsicRegBits(RTL8367C_REG_MAX_LEN_RX_TX_CFG0 + cfgId, RTL8367C_MAX_LEN_RX_TX_CFG0_MASK, pMaxLength); 198} 199 200/* Function Name: 201 * rtl8367c_setAsicMaxLength 202 * Description: 203 * Set Max packet length 204 * Input: 205 * port - port ID 206 * type - 0: 10M/100M speed, 1: giga speed 207 * cfgId - Configuration ID 208 * Output: 209 * None 210 * Return: 211 * RT_ERR_OK - Success 212 * RT_ERR_SMI - SMI access error 213 * Note: 214 * None 215 */ 216ret_t rtl8367c_setAsicMaxLength(rtk_uint32 port, rtk_uint32 type, rtk_uint32 cfgId) 217{ 218 ret_t retVal; 219 220 if(port < 8) 221 { 222 retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_MAX_LENGTH_CFG, (type * 8) + port, cfgId); 223 if(retVal != RT_ERR_OK) 224 return retVal; 225 } 226 else 227 { 228 retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_MAX_LENGTH_CFG_EXT, (type * 3) + port - 8, cfgId); 229 if(retVal != RT_ERR_OK) 230 return retVal; 231 } 232 233 return RT_ERR_OK; 234} 235 236/* Function Name: 237 * rtl8367c_getAsicMaxLength 238 * Description: 239 * Get Max packet length 240 * Input: 241 * port - port ID 242 * type - 0: 10M/100M speed, 1: giga speed 243 * cfgId - Configuration ID 244 * Output: 245 * None 246 * Return: 247 * RT_ERR_OK - Success 248 * RT_ERR_SMI - SMI access error 249 * Note: 250 * None 251 */ 252ret_t rtl8367c_getAsicMaxLength(rtk_uint32 port, rtk_uint32 type, rtk_uint32 *pCfgId) 253{ 254 ret_t retVal; 255 256 if(port < 8) 257 { 258 retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_MAX_LENGTH_CFG, (type * 8) + port, pCfgId); 259 if(retVal != RT_ERR_OK) 260 return retVal; 261 } 262 else 263 { 264 retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_MAX_LENGTH_CFG_EXT, (type * 3) + port - 8, pCfgId); 265 if(retVal != RT_ERR_OK) 266 return retVal; 267 } 268 return RT_ERR_OK; 269} 270 271