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: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : Green ethernet related functions
17 #include <rtl8367c_asicdrv_green.h>
20 * rtl8367c_getAsicGreenPortPage
22 * Get per-Port ingress page usage per second
24 * port - Physical port number (0~7)
25 * pPage - page number of ingress packet occuping per second
30 * RT_ERR_SMI - SMI access error
31 * RT_ERR_PORT_ID - Invalid port number
33 * Ingress traffic occuping page number per second for high layer green feature usage
35 ret_t
rtl8367c_getAsicGreenPortPage(rtk_uint32 port
, rtk_uint32
* pPage
)
41 if(port
> RTL8367C_PORTIDMAX
)
42 return RT_ERR_PORT_ID
;
44 retVal
= rtl8367c_getAsicReg(RTL8367C_PAGEMETER_PORT_REG(port
), ®Data
);
45 if(retVal
!= RT_ERR_OK
)
50 retVal
= rtl8367c_getAsicReg(RTL8367C_PAGEMETER_PORT_REG(port
) + 1, ®Data
);
51 if(retVal
!= RT_ERR_OK
)
54 pageMeter
= pageMeter
+ (regData
<< 16);
60 * rtl8367c_setAsicGreenTrafficType
62 * Set traffic type for each priority
64 * priority - internal priority (0~7)
65 * traffictype - high/low traffic type, 1:high priority traffic type, 0:low priority traffic type
70 * RT_ERR_SMI - SMI access error
71 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
75 ret_t
rtl8367c_setAsicGreenTrafficType(rtk_uint32 priority
, rtk_uint32 traffictype
)
78 if(priority
> RTL8367C_PRIMAX
)
79 return RT_ERR_QOS_INT_PRIORITY
;
81 return rtl8367c_setAsicRegBit(RTL8367C_REG_HIGHPRI_CFG
, priority
, (traffictype
?1:0));
84 * rtl8367c_getAsicGreenTrafficType
86 * Get traffic type for each priority
88 * priority - internal priority (0~7)
89 * pTraffictype - high/low traffic type, 1:high priority traffic type, 0:low priority traffic type
94 * RT_ERR_SMI - SMI access error
95 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
99 ret_t
rtl8367c_getAsicGreenTrafficType(rtk_uint32 priority
, rtk_uint32
* pTraffictype
)
101 if(priority
> RTL8367C_PRIMAX
)
102 return RT_ERR_QOS_INT_PRIORITY
;
104 return rtl8367c_getAsicRegBit(RTL8367C_REG_HIGHPRI_CFG
, priority
, pTraffictype
);
108 * rtl8367c_setAsicGreenHighPriorityTraffic
110 * Set indicator which ASIC had received high priority traffic
112 * port - Physical port number (0~7)
116 * RT_ERR_OK - Success
117 * RT_ERR_SMI - SMI access error
118 * RT_ERR_PORT_ID - Invalid port number
122 ret_t
rtl8367c_setAsicGreenHighPriorityTraffic(rtk_uint32 port
)
124 if(port
> RTL8367C_PORTIDMAX
)
125 return RT_ERR_PORT_ID
;
127 return rtl8367c_setAsicRegBit(RTL8367C_REG_HIGHPRI_INDICATOR
, port
, 1);
132 * rtl8367c_getAsicGreenHighPriorityTraffic
134 * Get indicator which ASIC had received high priority traffic or not
136 * port - Physical port number (0~7)
137 * pIndicator - Have received high priority traffic indicator. If 1 means ASCI had received high priority in 1second checking priod
141 * RT_ERR_OK - Success
142 * RT_ERR_SMI - SMI access error
143 * RT_ERR_PORT_ID - Invalid port number
147 ret_t
rtl8367c_getAsicGreenHighPriorityTraffic(rtk_uint32 port
, rtk_uint32
* pIndicator
)
149 if(port
> RTL8367C_PORTIDMAX
)
150 return RT_ERR_PORT_ID
;
152 return rtl8367c_getAsicRegBit(RTL8367C_REG_HIGHPRI_INDICATOR
, port
, pIndicator
);
156 @func rtk_int32 | rtl8367c_setAsicGreenEthernet | Set green ethernet function.
157 @parm rtk_uint32 | green | Green feature function usage 1:enable 0:disable.
158 @rvalue RT_ERR_OK | Success.
159 @rvalue RT_ERR_SMI | SMI access error.
161 The API can set Green Ethernet function to reduce power consumption. While green feature is enabled, ASIC will automatic
162 detect the cable length and then select different power mode for best performance with minimums power consumption. Link down
163 ports will enter power savining mode in 10 seconds after the cable disconnected if power saving function is enabled.
165 ret_t
rtl8367c_setAsicGreenEthernet(rtk_uint32 port
, rtk_uint32 green
)
168 rtk_uint32 checkCounter
;
170 rtk_uint32 phy_status
;
171 rtk_uint32 patchData
[6][2] = { {0x809A, 0x8911}, {0x80A3, 0x9233}, {0x80AC, 0xA444}, {0x809F, 0x6B20}, {0x80A8, 0x6B22}, {0x80B1, 0x6B23} };
179 if((retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xA420, ®Data
)) != RT_ERR_OK
)
181 phy_status
= (regData
& 0x0007);
186 if((retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xB820, ®Data
)) != RT_ERR_OK
)
189 regData
|= (0x0001 << 4);
191 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xB820, regData
)) != RT_ERR_OK
)
194 /* wait 0xb800[6] = 1 */
198 retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xB800, ®Data
);
199 if( (retVal
!= RT_ERR_OK
) || ((regData
& 0x0040) != 0x0040) )
202 if(0 == checkCounter
)
203 return RT_ERR_BUSYWAIT_TIMEOUT
;
210 if((retVal
= rtl8367c_setAsicReg(0x13C2, 0x0249)) != RT_ERR_OK
)
213 if((retVal
= rtl8367c_getAsicReg(0x1300, &data
)) != RT_ERR_OK
)
216 if((retVal
= rtl8367c_setAsicReg(0x13C2, 0x0000)) != RT_ERR_OK
)
226 for(idx
= 0; idx
< 6; idx
++ )
228 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xA436, patchData
[idx
][0])) != RT_ERR_OK
)
231 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xA438, patchData
[idx
][1])) != RT_ERR_OK
)
242 /* 0xa436 = 0x8011 */
243 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xA436, 0x8011)) != RT_ERR_OK
)
246 /* wr 0xa438[15] = 0: disable, 1: enable */
247 if((retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xA438, ®Data
)) != RT_ERR_OK
)
255 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xA438, regData
)) != RT_ERR_OK
)
261 if((retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xB820, ®Data
)) != RT_ERR_OK
)
264 regData
&= ~(0x0001 << 4);
266 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xB820, regData
)) != RT_ERR_OK
)
269 /* wait 0xb800[6] = 0 */
273 retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xB800, ®Data
);
274 if( (retVal
!= RT_ERR_OK
) || ((regData
& 0x0040) != 0x0000) )
277 if(0 == checkCounter
)
278 return RT_ERR_BUSYWAIT_TIMEOUT
;
289 @func rtk_int32 | rtl8367c_getAsicGreenEthernet | Get green ethernet function.
290 @parm rtk_uint32 | *green | Green feature function usage 1:enable 0:disable.
291 @rvalue RT_ERR_OK | Success.
292 @rvalue RT_ERR_SMI | SMI access error.
294 The API can set Green Ethernet function to reduce power consumption. While green feature is enabled, ASIC will automatic
295 detect the cable length and then select different power mode for best performance with minimums power consumption. Link down
296 ports will enter power savining mode in 10 seconds after the cable disconnected if power saving function is enabled.
298 ret_t
rtl8367c_getAsicGreenEthernet(rtk_uint32 port
, rtk_uint32
* green
)
303 /* 0xa436 = 0x8011 */
304 if((retVal
= rtl8367c_setAsicPHYOCPReg(port
, 0xA436, 0x8011)) != RT_ERR_OK
)
307 /* wr 0xa438[15] = 0: disable, 1: enable */
308 if((retVal
= rtl8367c_getAsicPHYOCPReg(port
, 0xA438, ®Data
)) != RT_ERR_OK
)
321 @func ret_t | rtl8367c_setAsicPowerSaving | Set power saving mode
322 @parm rtk_uint32 | phy | phy number
323 @parm rtk_uint32 | enable | enable power saving mode.
324 @rvalue RT_ERR_OK | Success.
325 @rvalue RT_ERR_SMI | SMI access error.
326 @rvalue RT_ERR_PORT_ID | Invalid port number.
328 The API can set power saving mode per phy.
330 ret_t
rtl8367c_setAsicPowerSaving(rtk_uint32 phy
, rtk_uint32 enable
)
332 rtk_api_ret_t retVal
;
335 rtk_uint32 phy_status
;
336 rtk_uint32 checkCounter
;
342 if((retVal
= rtl8367c_getAsicPHYOCPReg(phy
, 0xA420, ®Data
)) != RT_ERR_OK
)
345 phy_status
= (regData
& 0x0007);
350 if((retVal
= rtl8367c_getAsicPHYOCPReg(phy
, 0xB820, ®Data
)) != RT_ERR_OK
)
353 regData
|= (0x0001 << 4);
355 if((retVal
= rtl8367c_setAsicPHYOCPReg(phy
, 0xB820, regData
)) != RT_ERR_OK
)
358 /* wait 0xb800[6] = 1 */
362 retVal
= rtl8367c_getAsicPHYOCPReg(phy
, 0xB800, ®Data
);
363 if( (retVal
!= RT_ERR_OK
) || ((regData
& 0x0040) != 0x0040) )
366 if(0 == checkCounter
)
368 return RT_ERR_BUSYWAIT_TIMEOUT
;
376 if ((retVal
= rtl8367c_getAsicPHYReg(phy
,PHY_POWERSAVING_REG
,&phyData
))!=RT_ERR_OK
)
379 phyData
= phyData
& ~(0x0001 << 2);
380 phyData
= phyData
| (enable
<< 2);
382 if ((retVal
= rtl8367c_setAsicPHYReg(phy
,PHY_POWERSAVING_REG
,phyData
))!=RT_ERR_OK
)
388 if((retVal
= rtl8367c_getAsicPHYOCPReg(phy
, 0xB820, ®Data
)) != RT_ERR_OK
)
391 regData
&= ~(0x0001 << 4);
393 if((retVal
= rtl8367c_setAsicPHYOCPReg(phy
, 0xB820, regData
)) != RT_ERR_OK
)
396 /* wait 0xb800[6] = 0 */
400 retVal
= rtl8367c_getAsicPHYOCPReg(phy
, 0xB800, ®Data
);
401 if( (retVal
!= RT_ERR_OK
) || ((regData
& 0x0040) != 0x0000) )
404 if(0 == checkCounter
)
406 return RT_ERR_BUSYWAIT_TIMEOUT
;
418 @func ret_t | rtl8367c_getAsicPowerSaving | Get power saving mode
419 @parm rtk_uint32 | port | The port number
420 @parm rtk_uint32* | enable | enable power saving mode.
421 @rvalue RT_ERR_OK | Success.
422 @rvalue RT_ERR_SMI | SMI access error.
423 @rvalue RT_ERR_PORT_ID | Invalid port number.
425 The API can get power saving mode per phy.
427 ret_t
rtl8367c_getAsicPowerSaving(rtk_uint32 phy
, rtk_uint32
* enable
)
429 rtk_api_ret_t retVal
;
433 return RT_ERR_NULL_POINTER
;
435 if ((retVal
= rtl8367c_getAsicPHYReg(phy
,PHY_POWERSAVING_REG
,&phyData
))!=RT_ERR_OK
)
438 if ((phyData
& 0x0004) > 0)