mediatek: add support for rtl8367c
[openwrt/staging/rmilecki.git] / target / linux / mediatek / files-5.4 / drivers / net / phy / rtk / rtl8367c / rtl8367c_asicdrv_hsb.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 : Field selector related functions
15 *
16 */
17 #include <rtl8367c_asicdrv_hsb.h>
18 /* Function Name:
19 * rtl8367c_setAsicFieldSelector
20 * Description:
21 * Set user defined field selectors in HSB
22 * Input:
23 * index - index of field selector 0-15
24 * format - Format of field selector
25 * offset - Retrieving data offset
26 * Output:
27 * None
28 * Return:
29 * RT_ERR_OK - Success
30 * RT_ERR_SMI - SMI access error
31 * RT_ERR_OUT_OF_RANGE - input parameter out of range
32 * Note:
33 * System support 16 user defined field selctors.
34 * Each selector can be enabled or disable. User can defined retrieving 16-bits in many predefiend
35 * standard l2/l3/l4 payload.
36 */
37 ret_t rtl8367c_setAsicFieldSelector(rtk_uint32 index, rtk_uint32 format, rtk_uint32 offset)
38 {
39 rtk_uint32 regData;
40
41 if(index > RTL8367C_FIELDSEL_FORMAT_NUMBER)
42 return RT_ERR_OUT_OF_RANGE;
43
44 if(format >= FIELDSEL_FORMAT_END)
45 return RT_ERR_OUT_OF_RANGE;
46
47 regData = (((format << RTL8367C_FIELD_SELECTOR_FORMAT_OFFSET) & RTL8367C_FIELD_SELECTOR_FORMAT_MASK ) |
48 ((offset << RTL8367C_FIELD_SELECTOR_OFFSET_OFFSET) & RTL8367C_FIELD_SELECTOR_OFFSET_MASK ));
49
50 return rtl8367c_setAsicReg(RTL8367C_FIELD_SELECTOR_REG(index), regData);
51 }
52 /* Function Name:
53 * rtl8367c_getAsicFieldSelector
54 * Description:
55 * Get user defined field selectors in HSB
56 * Input:
57 * index - index of field selector 0-15
58 * pFormat - Format of field selector
59 * pOffset - Retrieving data offset
60 * Output:
61 * None
62 * Return:
63 * RT_ERR_OK - Success
64 * RT_ERR_SMI - SMI access error
65 * Note:
66 * None
67 */
68 ret_t rtl8367c_getAsicFieldSelector(rtk_uint32 index, rtk_uint32* pFormat, rtk_uint32* pOffset)
69 {
70 ret_t retVal;
71 rtk_uint32 regData;
72
73 retVal = rtl8367c_getAsicReg(RTL8367C_FIELD_SELECTOR_REG(index), &regData);
74 if(retVal != RT_ERR_OK)
75 return retVal;
76
77 *pFormat = ((regData & RTL8367C_FIELD_SELECTOR_FORMAT_MASK) >> RTL8367C_FIELD_SELECTOR_FORMAT_OFFSET);
78 *pOffset = ((regData & RTL8367C_FIELD_SELECTOR_OFFSET_MASK) >> RTL8367C_FIELD_SELECTOR_OFFSET_OFFSET);
79
80 return RT_ERR_OK;
81 }