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