1 /*
2  * Copyright 2014-2017 Cavium, Inc.
3  * The contents of this file are subject to the terms of the Common Development
4  * and Distribution License, v.1,  (the "License").
5  *
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the License at available
9  * at http://opensource.org/licenses/CDDL-1.0
10  *
11  * See the License for the specific language governing permissions and
12  * limitations under the License.
13  */
14 
15 #ifndef _netlink_h_
16 #define _netlink_h_
17 
18 #include "bcmtype.h"
19 
20 /* The values are defined to adapt the previous IMD firmware definitions */
21 #define NETLINK_STATUS_SUCCESS                     0
22 #define NETLINK_STATUS_DENY_PHY_ACCESS_FAILURE     0x10005
23 #define NETLINK_STATUS_PHY_FAILURE                 0x1000a
24 #define NETLINK_STATUS_WRONG_MEDIA_FAILURE         0x20006
25 #define NETLINK_STATUS_BAD_LINK_SETTING_FAILURE    0x20007
26 #define NETLINK_STATUS_PWR_MGMT_CONFLICT_FAILURE   0x20008
27 #define NETLINK_STATUS_INVALID_INPUT_FAILURE       0x20002
28 #define NETLINK_STATUS_NOT_SUPPORTED_FAILURE       0x2000b
29 #define NETLINK_STATUS_BAD_SPEED_FAILURE           0x80000001
30 #define NETLINK_STATUS_LINK_ALREADY_UP_FAILURE     0x80000002
31 
32 
33 
34 
35 /* Link status codes: definition based on what's in shmem.h */
36 #define NETLINK_GET_LINK_STATUS_INIT_VALUE                 0xffffffff
37 #define NETLINK_GET_LINK_STATUS_LINK_UP                    0x1
38 #define NETLINK_GET_LINK_STATUS_LINK_DOWN                  0x0
39 #define NETLINK_GET_LINK_STATUS_SPEED_MASK                 0x1e
40 #define NETLINK_GET_LINK_STATUS_AN_INCOMPLETE              (0<<1)
41 
42 #define NETLINK_GET_LINK_STATUS_10HALF                     (1<<1)
43 #define NETLINK_GET_LINK_STATUS_10FULL                     (2<<1)
44 #define NETLINK_GET_LINK_STATUS_100HALF                    (3<<1)
45 #define NETLINK_GET_LINK_STATUS_100BASE_T4                 (4<<1)
46 #define NETLINK_GET_LINK_STATUS_100FULL                    (5<<1)
47 #define NETLINK_GET_LINK_STATUS_1000HALF                   (6<<1)
48 #define NETLINK_GET_LINK_STATUS_1000FULL                   (7<<1)
49 #define NETLINK_GET_LINK_STATUS_2500HALF                   (8<<1)
50 
51 #define NETLINK_GET_LINK_STATUS_2500FULL                   (9<<1)
52 
53 #define NETLINK_GET_LINK_STATUS_AN_ENABLED                 0x000020L
54 #define NETLINK_GET_LINK_STATUS_AN_COMPLETE                0x000040L
55 #define NETLINK_GET_LINK_STATUS_PARALLEL_DET               0x000080L
56 #define NETLINK_GET_LINK_STATUS_RESERVED                   0x000100L
57 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_1000FULL        0x000200L
58 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_1000HALF        0x000400L
59 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_100BT4          0x000800L
60 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_100FULL         0x001000L
61 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_100HALF         0x002000L
62 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_10FULL          0x004000L
63 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_10HALF          0x008000L
64 #define NETLINK_GET_LINK_STATUS_TX_FC_ENABLED              0x010000L
65 #define NETLINK_GET_LINK_STATUS_RX_FC_ENABLED              0x020000L
66 #define NETLINK_GET_LINK_STATUS_PARTNER_SYM_PAUSE_CAP      0x040000L
67 #define NETLINK_GET_LINK_STATUS_PARTNER_ASYM_PAUSE_CAP     0x080000L
68 #define NETLINK_GET_LINK_STATUS_SERDES_LINK                0x100000L
69 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_2500FULL        0x200000L
70 #define NETLINK_GET_LINK_STATUS_PARTNER_AD_2500HALF        0x400000L
71 
72 #define NETLINK_GET_LINK_STATUS_NO_MEDIA_DETECTED          0x20000000L
73 #define NETLINK_GET_LINK_STATUS_CABLESENSE                 0x40000000L
74 #define NETLINK_GET_LINK_STATUS_SW_TIMER_EVENT             0x80000000L
75 
76 
77 /* netlink_get_link_status():
78  * Input: A pointer to a u32_t type storage
79  * Output: bit-wise OR'd of any NETLINK_GET_LINK_STATUS_* constants
80  * Return: 0 for success, non-zero for failure (see NETLINK_CODE_* constants).
81  */
82 typedef u32_t (* netlink_get_link_status_t)(u32_t *get_link_attrib);
83 
84 u32_t netlink_get_link_status ( u32_t *get_link_attrib );
85 
86 
87 
88 /* netlink_drv_set_link()
89  * Input: A u32_t value indicating the desired link
90  * Output: None, in fact, the link may not be effective right away
91  *         (subject to the time needed to establish the link).
92  * Return: 0 for success, non-zero for failure (see NETLINK_CODE_* constants).
93  */
94 u32_t netlink_drv_set_link( u32_t drv_link_attrib );
95 
96 #define NETLINK_DRV_SET_LINK_SPEED_10HALF        (1<<0)
97 #define NETLINK_DRV_SET_LINK_SPEED_10FULL        (1<<1)
98 #define NETLINK_DRV_SET_LINK_SPEED_100HALF       (1<<2)
99 #define NETLINK_DRV_SET_LINK_SPEED_100FULL       (1<<3)
100 
101 #define NETLINK_DRV_SET_LINK_SPEED_1GHALF        (1<<4)
102 #define NETLINK_DRV_SET_LINK_SPEED_1GFULL        (1<<5)
103 
104 #define NETLINK_DRV_SET_LINK_SPEED_2G5HALF       (1<<6)
105 #define NETLINK_DRV_SET_LINK_SPEED_2G5FULL       (1<<7)
106 
107 #define NETLINK_DRV_SET_LINK_SPEED_10GHALF       (1<<8) // place holder for now.
108 #define NETLINK_DRV_SET_LINK_SPEED_10GFULL       (1<<9) // place holder for now.
109 #define NETLINK_DRV_SET_LINK_ENABLE_AUTONEG      (1<<10)
110                         /* (vs Forced): If autoeng enabled, the speed
111                          * bits above dictate what capability advertisement.
112                          * Otherwise, only one of the applicable speed/duplex
113                          * bits above can be set, and it will be used to
114                          * establish the forced link.
115                          */
116 #define NETLINK_DRV_SET_LINK_PHY_APP_MASK        (1<<11)
117 #define NETLINK_DRV_SET_LINK_PHY_APP_REMOTE      (1<<11)
118 #define NETLINK_DRV_SET_LINK_PHY_APP_LOCAL       (0<<11)
119 
120                         /* (Local vs Remote): The setting will be stored as
121                          * driver preference. If the media type matches the
122                          * current setup, the setting will also be applied
123                          * immediately.
124                          */
125 
126 #define NETLINK_DRV_SET_LINK_FC_SYM_PAUSE        (1<<12)
127 #define NETLINK_DRV_SET_LINK_FC_ASYM_PAUSE       (1<<13)
128 
129 #define NETLINK_DRV_SET_LINK_ETH_AT_WIRESPEED_ENABLE (1<<14)
130 #define NETLINK_DRV_SET_LINK_PHY_RESET           (1<<15)
131                         /* Local serdes will be reset. If remote Cu PHY
132                          * is present, MDIO write will be issued to the
133                          * remote PHY to reset it. Then, whatever other
134                          * settings will be applied.
135                          */
136 
137 
138 /* This override bit tells the set_link() routine to set the link
139  * again even if the link is already up at a desired speed */
140 #define NETLINK_SET_LINK_OVERRIDE              0x80000000
141 
142 /* Setting this will advertise all capability that the power budget (e.g.
143  * overdraw Vaux current in absence of main power) and design capability
144  * (e.g. 2.5G) allow.
145  * In case of the 5708 Serdes, fall back is assumed. */
146 #define NETLINK_SET_LINK_SPEED_AUTONEG         0x00
147 
148 /* These speed values are used for forced speed unless selective autoneg
149  * is selected. Do NOT try to bit-wise OR them. In the case of selective
150  * autoneg, that speed will be advertised. */
151 #define NETLINK_SET_LINK_SPEED_UNKNOWN         0x00
152 #define NETLINK_SET_LINK_SPEED_10MBPS          0x01
153 #define NETLINK_SET_LINK_SPEED_100MBPS         0x02
154 #define NETLINK_SET_LINK_SPEED_1000MBPS        0x04
155 #define NETLINK_SET_LINK_SPEED_2500MBPS        0x08
156 #define NETLINK_SET_LINK_SPEED_MASK            0xff
157 
158 #define NETLINK_SET_LINK_DUPLEX_HALF           0x0100
159 #define NETLINK_SET_LINK_DUPLEX_FULL           0x0000
160 
161 #define NETLINK_SET_LINK_PAUSE_CAP             0x0200
162 #define NETLINK_SET_LINK_ASYM_PAUSE            0x0400
163 
164 /* When selective autoneg is enabled, only one speed will be used for
165  * capability advertisement. */
166 #define NETLINK_SET_LINK_SELECTIVE_AUTONEG     0x10000
167 
168 /* netlink_set_link():
169  * Input: bit-wise OR'd of any NETLINK_SET_LINK_* constants (except the speed)
170  * Output: None.
171  * Return: 0 for success, non-zero for failure (see NETLINK_CODE_* constants).
172  *
173  * Example 1: To set 100Full forced speed, the parameter would look like
174  *                NETLINK_SET_LINK_SPEED_100MBPS |
175  *                NETLINK_SET_LINK_DUPLEX_FULL.
176  * Example 2: To set selective autoneg at 100Full with pause capability,
177  *            the parameter would look like
178  *                NETLINK_SET_LINK_SPEED_100MBPS |
179  *                NETLINK_SET_LINK_PAUSE_CAP |
180  *                NETLINK_SET_LINK_SELECTIVE_AUTONEG |
181  *                NETLINK_SET_LINK_DUPLEX_FULL.
182  *
183  * Note 1: If caller passes any speed settings, and if the system is
184  *         in OSPresent mode, no action will be taken, the actual speed
185  *         advertisement will be done by OS Driver.
186  * Note 2: If caller passes "NETLINK_SET_LINK_SPEED_AUTONEG" parameter,
187  *         if the system is in OSAbsent mode and if the system has
188  *         Vmain power the link speed 2500/1000/100/10 will be advertised.
189  * Note 3: If caller passes "NETLINK_SET_LINK_SPEED_AUTONEG" parameter,
190  *         if the system is in OSAbsent mode and if the system does
191  *         not have Vmain power (Vaux power mode) and the "
192  *         PowerOverDrawn" bit is set (OK to consume more power in
193  *         order to acquire highest link speed), the link speed
194  *         2500/1000/100/10 will be advertised.
195  * Note 4: If caller passes "NETLINK_SET_LINK_SPEED_AUTONEG" parameter,
196  *         if the system is in OSAbsent mode, and if the system does
197  *         not have Vmain power (Vaux power mode) and the
198  *         "PowerOverDrawn" bit is cleared (don't consume more power
199  *         than necessary), the link speed 100/10 will be advertised.
200  *
201  */
202 typedef u32_t (* netlink_set_link_t)(u32_t set_link_attrib);
203 
204 u32_t netlink_set_link ( u32_t set_link_attrib );
205 
206 
207 void netlink_serdes_fallback ( void );
208 
209 #endif /* _netlink_h_ */
210