aafba4805b5261feceaf00d80a569cd34b7aede3
[akaros.git] / kern / drivers / net / bxe / bxe_elink.c
1 /*-
2  * Copyright (c) 2007-2014 QLogic Corporation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 //__FBSDID("$FreeBSD: head/sys/dev/bxe/bxe_elink.c 265411 2014-05-06 02:32:27Z davidcs $");
29
30 #include "bxe.h"
31 #include "bxe_elink.h"
32 #include "ecore_mfw_req.h"
33 #include "ecore_fw_defs.h"
34 #include "ecore_hsi.h"
35 #include "ecore_reg.h"
36
37
38 #define MDIO_REG_BANK_CL73_IEEEB0                       0x0
39         #define MDIO_CL73_IEEEB0_CL73_AN_CONTROL                0x0
40                 #define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_RESTART_AN     0x0200
41                 #define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN          0x1000
42                 #define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_MAIN_RST       0x8000
43
44 #define MDIO_REG_BANK_CL73_IEEEB1                       0x10
45         #define MDIO_CL73_IEEEB1_AN_ADV1                        0x00
46                 #define MDIO_CL73_IEEEB1_AN_ADV1_PAUSE                  0x0400
47                 #define MDIO_CL73_IEEEB1_AN_ADV1_ASYMMETRIC             0x0800
48                 #define MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_BOTH             0x0C00
49                 #define MDIO_CL73_IEEEB1_AN_ADV1_PAUSE_MASK             0x0C00
50         #define MDIO_CL73_IEEEB1_AN_ADV2                                0x01
51                 #define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M             0x0000
52                 #define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX          0x0020
53                 #define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4           0x0040
54                 #define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KR            0x0080
55         #define MDIO_CL73_IEEEB1_AN_LP_ADV1                     0x03
56                 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE               0x0400
57                 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_ASYMMETRIC          0x0800
58                 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_BOTH          0x0C00
59                 #define MDIO_CL73_IEEEB1_AN_LP_ADV1_PAUSE_MASK          0x0C00
60         #define MDIO_CL73_IEEEB1_AN_LP_ADV2                     0x04
61
62 #define MDIO_REG_BANK_RX0                               0x80b0
63         #define MDIO_RX0_RX_STATUS                              0x10
64                 #define MDIO_RX0_RX_STATUS_SIGDET                       0x8000
65                 #define MDIO_RX0_RX_STATUS_RX_SEQ_DONE                  0x1000
66         #define MDIO_RX0_RX_EQ_BOOST                            0x1c
67                 #define MDIO_RX0_RX_EQ_BOOST_EQUALIZER_CTRL_MASK        0x7
68                 #define MDIO_RX0_RX_EQ_BOOST_OFFSET_CTRL                0x10
69
70 #define MDIO_REG_BANK_RX1                               0x80c0
71         #define MDIO_RX1_RX_EQ_BOOST                            0x1c
72                 #define MDIO_RX1_RX_EQ_BOOST_EQUALIZER_CTRL_MASK        0x7
73                 #define MDIO_RX1_RX_EQ_BOOST_OFFSET_CTRL                0x10
74
75 #define MDIO_REG_BANK_RX2                               0x80d0
76         #define MDIO_RX2_RX_EQ_BOOST                            0x1c
77                 #define MDIO_RX2_RX_EQ_BOOST_EQUALIZER_CTRL_MASK        0x7
78                 #define MDIO_RX2_RX_EQ_BOOST_OFFSET_CTRL                0x10
79
80 #define MDIO_REG_BANK_RX3                               0x80e0
81         #define MDIO_RX3_RX_EQ_BOOST                            0x1c
82                 #define MDIO_RX3_RX_EQ_BOOST_EQUALIZER_CTRL_MASK        0x7
83                 #define MDIO_RX3_RX_EQ_BOOST_OFFSET_CTRL                0x10
84
85 #define MDIO_REG_BANK_RX_ALL                            0x80f0
86         #define MDIO_RX_ALL_RX_EQ_BOOST                         0x1c
87                 #define MDIO_RX_ALL_RX_EQ_BOOST_EQUALIZER_CTRL_MASK     0x7
88                 #define MDIO_RX_ALL_RX_EQ_BOOST_OFFSET_CTRL     0x10
89
90 #define MDIO_REG_BANK_TX0                               0x8060
91         #define MDIO_TX0_TX_DRIVER                              0x17
92                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK             0xf000
93                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT            12
94                 #define MDIO_TX0_TX_DRIVER_IDRIVER_MASK                 0x0f00
95                 #define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT                8
96                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK              0x00f0
97                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT             4
98                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK                0x000e
99                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT               1
100                 #define MDIO_TX0_TX_DRIVER_ICBUF1T                      1
101
102 #define MDIO_REG_BANK_TX1                               0x8070
103         #define MDIO_TX1_TX_DRIVER                              0x17
104                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK             0xf000
105                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT            12
106                 #define MDIO_TX0_TX_DRIVER_IDRIVER_MASK                 0x0f00
107                 #define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT                8
108                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK              0x00f0
109                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT             4
110                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK                0x000e
111                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT               1
112                 #define MDIO_TX0_TX_DRIVER_ICBUF1T                      1
113
114 #define MDIO_REG_BANK_TX2                               0x8080
115         #define MDIO_TX2_TX_DRIVER                              0x17
116                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK             0xf000
117                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT            12
118                 #define MDIO_TX0_TX_DRIVER_IDRIVER_MASK                 0x0f00
119                 #define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT                8
120                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK              0x00f0
121                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT             4
122                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK                0x000e
123                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT               1
124                 #define MDIO_TX0_TX_DRIVER_ICBUF1T                      1
125
126 #define MDIO_REG_BANK_TX3                               0x8090
127         #define MDIO_TX3_TX_DRIVER                              0x17
128                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK             0xf000
129                 #define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT            12
130                 #define MDIO_TX0_TX_DRIVER_IDRIVER_MASK                 0x0f00
131                 #define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT                8
132                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK              0x00f0
133                 #define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT             4
134                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK                0x000e
135                 #define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT               1
136                 #define MDIO_TX0_TX_DRIVER_ICBUF1T                      1
137
138 #define MDIO_REG_BANK_XGXS_BLOCK0                       0x8000
139         #define MDIO_BLOCK0_XGXS_CONTROL                        0x10
140
141 #define MDIO_REG_BANK_XGXS_BLOCK1                       0x8010
142         #define MDIO_BLOCK1_LANE_CTRL0                          0x15
143         #define MDIO_BLOCK1_LANE_CTRL1                          0x16
144         #define MDIO_BLOCK1_LANE_CTRL2                          0x17
145         #define MDIO_BLOCK1_LANE_PRBS                           0x19
146
147 #define MDIO_REG_BANK_XGXS_BLOCK2                       0x8100
148         #define MDIO_XGXS_BLOCK2_RX_LN_SWAP                     0x10
149                 #define MDIO_XGXS_BLOCK2_RX_LN_SWAP_ENABLE              0x8000
150                 #define MDIO_XGXS_BLOCK2_RX_LN_SWAP_FORCE_ENABLE        0x4000
151                 #define MDIO_XGXS_BLOCK2_TX_LN_SWAP             0x11
152                 #define MDIO_XGXS_BLOCK2_TX_LN_SWAP_ENABLE              0x8000
153                 #define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G       0x14
154                 #define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_CX4_XGXS      0x0001
155                 #define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_HIGIG_XGXS    0x0010
156                 #define MDIO_XGXS_BLOCK2_TEST_MODE_LANE         0x15
157
158 #define MDIO_REG_BANK_GP_STATUS                         0x8120
159 #define MDIO_GP_STATUS_TOP_AN_STATUS1                           0x1B
160         #define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE     0x0001
161         #define MDIO_GP_STATUS_TOP_AN_STATUS1_CL37_AUTONEG_COMPLETE     0x0002
162         #define MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS               0x0004
163         #define MDIO_GP_STATUS_TOP_AN_STATUS1_DUPLEX_STATUS             0x0008
164         #define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE     0x0010
165         #define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_LP_NP_BAM_ABLE       0x0020
166         #define MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_TXSIDE    0x0040
167         #define MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_RXSIDE    0x0080
168         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_MASK         0x3f00
169         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M          0x0000
170         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M         0x0100
171         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G           0x0200
172         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G         0x0300
173         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_5G           0x0400
174         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_6G           0x0500
175         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_HIG      0x0600
176         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_CX4      0x0700
177         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12G_HIG      0x0800
178         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12_5G        0x0900
179         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_13G          0x0A00
180         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_15G          0x0B00
181         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_16G          0x0C00
182         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G_KX        0x0D00
183         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KX4      0x0E00
184         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KR       0x0F00
185         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_XFI      0x1B00
186         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_DXGXS    0x1E00
187         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_SFI      0x1F00
188         #define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_KR2      0x3900
189
190
191 #define MDIO_REG_BANK_10G_PARALLEL_DETECT               0x8130
192 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_STATUS             0x10
193 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_STATUS_PD_LINK             0x8000
194 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL            0x11
195 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL_PARDET10G_EN       0x1
196 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK               0x13
197 #define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK_CNT           (0xb71<<1)
198
199 #define MDIO_REG_BANK_SERDES_DIGITAL                    0x8300
200 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1                    0x10
201 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_FIBER_MODE                 0x0001
202 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_TBI_IF                     0x0002
203 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_SIGNAL_DETECT_EN           0x0004
204 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_INVERT_SIGNAL_DETECT       0x0008
205 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_AUTODET                    0x0010
206 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_MSTR_MODE                  0x0020
207 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2                    0x11
208 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_PRL_DT_EN                  0x0001
209 #define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_AN_FST_TMR                 0x0040
210 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1                     0x14
211 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SGMII                       0x0001
212 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_LINK                        0x0002
213 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_DUPLEX                      0x0004
214 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_MASK                  0x0018
215 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_SHIFT                 3
216 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_2_5G                  0x0018
217 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_1G                    0x0010
218 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_100M                  0x0008
219 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_10M                   0x0000
220 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS2                     0x15
221 #define MDIO_SERDES_DIGITAL_A_1000X_STATUS2_AN_DISABLED                 0x0002
222 #define MDIO_SERDES_DIGITAL_MISC1                               0x18
223 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_MASK                       0xE000
224 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_25M                        0x0000
225 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_100M                       0x2000
226 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_125M                       0x4000
227 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_156_25M                    0x6000
228 #define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_187_5M                     0x8000
229 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_SEL                       0x0010
230 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_MASK                      0x000f
231 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_2_5G                      0x0000
232 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_5G                        0x0001
233 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_6G                        0x0002
234 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_10G_HIG                   0x0003
235 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_10G_CX4                   0x0004
236 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_12G                       0x0005
237 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_12_5G                     0x0006
238 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_13G                       0x0007
239 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_15G                       0x0008
240 #define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_16G                       0x0009
241
242 #define MDIO_REG_BANK_OVER_1G                           0x8320
243 #define MDIO_OVER_1G_DIGCTL_3_4                                 0x14
244 #define MDIO_OVER_1G_DIGCTL_3_4_MP_ID_MASK                              0xffe0
245 #define MDIO_OVER_1G_DIGCTL_3_4_MP_ID_SHIFT                             5
246 #define MDIO_OVER_1G_UP1                                        0x19
247 #define MDIO_OVER_1G_UP1_2_5G                                           0x0001
248 #define MDIO_OVER_1G_UP1_5G                                             0x0002
249 #define MDIO_OVER_1G_UP1_6G                                             0x0004
250 #define MDIO_OVER_1G_UP1_10G                                            0x0010
251 #define MDIO_OVER_1G_UP1_10GH                                           0x0008
252 #define MDIO_OVER_1G_UP1_12G                                            0x0020
253 #define MDIO_OVER_1G_UP1_12_5G                                          0x0040
254 #define MDIO_OVER_1G_UP1_13G                                            0x0080
255 #define MDIO_OVER_1G_UP1_15G                                            0x0100
256 #define MDIO_OVER_1G_UP1_16G                                            0x0200
257 #define MDIO_OVER_1G_UP2                                        0x1A
258 #define MDIO_OVER_1G_UP2_IPREDRIVER_MASK                                0x0007
259 #define MDIO_OVER_1G_UP2_IDRIVER_MASK                                   0x0038
260 #define MDIO_OVER_1G_UP2_PREEMPHASIS_MASK                               0x03C0
261 #define MDIO_OVER_1G_UP3                                        0x1B
262 #define MDIO_OVER_1G_UP3_HIGIG2                                         0x0001
263 #define MDIO_OVER_1G_LP_UP1                                     0x1C
264 #define MDIO_OVER_1G_LP_UP2                                     0x1D
265 #define MDIO_OVER_1G_LP_UP2_MR_ADV_OVER_1G_MASK                         0x03ff
266 #define MDIO_OVER_1G_LP_UP2_PREEMPHASIS_MASK                            0x0780
267 #define MDIO_OVER_1G_LP_UP2_PREEMPHASIS_SHIFT                           7
268 #define MDIO_OVER_1G_LP_UP3                                             0x1E
269
270 #define MDIO_REG_BANK_REMOTE_PHY                        0x8330
271 #define MDIO_REMOTE_PHY_MISC_RX_STATUS                          0x10
272 #define MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_OVER1G_MSG     0x0010
273 #define MDIO_REMOTE_PHY_MISC_RX_STATUS_CL37_FSM_RECEIVED_BRCM_OUI_MSG   0x0600
274
275 #define MDIO_REG_BANK_BAM_NEXT_PAGE                     0x8350
276 #define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL                   0x10
277 #define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_BAM_MODE                  0x0001
278 #define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_TETON_AN                  0x0002
279
280 #define MDIO_REG_BANK_CL73_USERB0               0x8370
281 #define MDIO_CL73_USERB0_CL73_UCTRL                             0x10
282 #define MDIO_CL73_USERB0_CL73_UCTRL_USTAT1_MUXSEL                       0x0002
283 #define MDIO_CL73_USERB0_CL73_USTAT1                            0x11
284 #define MDIO_CL73_USERB0_CL73_USTAT1_LINK_STATUS_CHECK                  0x0100
285 #define MDIO_CL73_USERB0_CL73_USTAT1_AN_GOOD_CHECK_BAM37                0x0400
286 #define MDIO_CL73_USERB0_CL73_BAM_CTRL1                         0x12
287 #define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_EN                          0x8000
288 #define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_STATION_MNGR_EN             0x4000
289 #define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_NP_AFTER_BP_EN              0x2000
290 #define MDIO_CL73_USERB0_CL73_BAM_CTRL3                         0x14
291 #define MDIO_CL73_USERB0_CL73_BAM_CTRL3_USE_CL73_HCD_MR                 0x0001
292
293 #define MDIO_REG_BANK_AER_BLOCK                 0xFFD0
294 #define MDIO_AER_BLOCK_AER_REG                                  0x1E
295
296 #define MDIO_REG_BANK_COMBO_IEEE0               0xFFE0
297 #define MDIO_COMBO_IEEE0_MII_CONTROL                            0x10
298 #define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_MASK                   0x2040
299 #define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_10                     0x0000
300 #define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_100                    0x2000
301 #define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_1000                   0x0040
302 #define MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX                         0x0100
303 #define MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN                          0x0200
304 #define MDIO_COMBO_IEEO_MII_CONTROL_AN_EN                               0x1000
305 #define MDIO_COMBO_IEEO_MII_CONTROL_LOOPBACK                            0x4000
306 #define MDIO_COMBO_IEEO_MII_CONTROL_RESET                               0x8000
307 #define MDIO_COMBO_IEEE0_MII_STATUS                             0x11
308 #define MDIO_COMBO_IEEE0_MII_STATUS_LINK_PASS                           0x0004
309 #define MDIO_COMBO_IEEE0_MII_STATUS_AUTONEG_COMPLETE                    0x0020
310 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV                           0x14
311 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX                       0x0020
312 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_HALF_DUPLEX                       0x0040
313 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK                        0x0180
314 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE                        0x0000
315 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_SYMMETRIC                   0x0080
316 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC                  0x0100
317 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH                        0x0180
318 #define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_NEXT_PAGE                         0x8000
319 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1         0x15
320 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_NEXT_PAGE       0x8000
321 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_ACK             0x4000
322 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_MASK      0x0180
323 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_NONE      0x0000
324 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_BOTH      0x0180
325 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_HALF_DUP_CAP    0x0040
326 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_FULL_DUP_CAP    0x0020
327 /*WhenthelinkpartnerisinSGMIImode(bit0=1),then
328 bit15=link,bit12=duplex,bits11:10=speed,bit14=acknowledge.
329 Theotherbitsarereservedandshouldbezero*/
330 #define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_SGMII_MODE      0x0001
331
332
333 #define MDIO_PMA_DEVAD                  0x1
334 /*ieee*/
335 #define MDIO_PMA_REG_CTRL               0x0
336 #define MDIO_PMA_REG_STATUS             0x1
337 #define MDIO_PMA_REG_10G_CTRL2          0x7
338 #define MDIO_PMA_REG_TX_DISABLE         0x0009
339 #define MDIO_PMA_REG_RX_SD              0xa
340 /*bcm*/
341 #define MDIO_PMA_REG_BCM_CTRL           0x0096
342 #define MDIO_PMA_REG_FEC_CTRL           0x00ab
343 #define MDIO_PMA_LASI_RXCTRL            0x9000
344 #define MDIO_PMA_LASI_TXCTRL            0x9001
345 #define MDIO_PMA_LASI_CTRL              0x9002
346 #define MDIO_PMA_LASI_RXSTAT            0x9003
347 #define MDIO_PMA_LASI_TXSTAT            0x9004
348 #define MDIO_PMA_LASI_STAT              0x9005
349 #define MDIO_PMA_REG_PHY_IDENTIFIER     0xc800
350 #define MDIO_PMA_REG_DIGITAL_CTRL       0xc808
351 #define MDIO_PMA_REG_DIGITAL_STATUS     0xc809
352 #define MDIO_PMA_REG_TX_POWER_DOWN      0xca02
353 #define MDIO_PMA_REG_CMU_PLL_BYPASS     0xca09
354 #define MDIO_PMA_REG_MISC_CTRL          0xca0a
355 #define MDIO_PMA_REG_GEN_CTRL           0xca10
356         #define MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP     0x0188
357         #define MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET           0x018a
358 #define MDIO_PMA_REG_M8051_MSGIN_REG    0xca12
359 #define MDIO_PMA_REG_M8051_MSGOUT_REG   0xca13
360 #define MDIO_PMA_REG_ROM_VER1           0xca19
361 #define MDIO_PMA_REG_ROM_VER2           0xca1a
362 #define MDIO_PMA_REG_EDC_FFE_MAIN       0xca1b
363 #define MDIO_PMA_REG_PLL_BANDWIDTH      0xca1d
364 #define MDIO_PMA_REG_PLL_CTRL           0xca1e
365 #define MDIO_PMA_REG_MISC_CTRL0         0xca23
366 #define MDIO_PMA_REG_LRM_MODE           0xca3f
367 #define MDIO_PMA_REG_CDR_BANDWIDTH      0xca46
368 #define MDIO_PMA_REG_MISC_CTRL1         0xca85
369
370 #define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL          0x8000
371         #define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK      0x000c
372                 #define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE           0x0000
373                 #define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE       0x0004
374                 #define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IN_PROGRESS    0x0008
375                 #define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_FAILED         0x000c
376 #define MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT      0x8002
377 #define MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR      0x8003
378 #define MDIO_PMA_REG_8726_TWO_WIRE_DATA_BUF     0xc820
379         #define MDIO_PMA_REG_8726_TWO_WIRE_DATA_MASK 0xff
380 #define MDIO_PMA_REG_8726_TX_CTRL1              0xca01
381 #define MDIO_PMA_REG_8726_TX_CTRL2              0xca05
382
383 #define MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR   0x8005
384 #define MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF     0x8007
385         #define MDIO_PMA_REG_8727_TWO_WIRE_DATA_MASK 0xff
386 #define MDIO_PMA_REG_8727_MISC_CTRL             0x8309
387 #define MDIO_PMA_REG_8727_TX_CTRL1              0xca02
388 #define MDIO_PMA_REG_8727_TX_CTRL2              0xca05
389 #define MDIO_PMA_REG_8727_PCS_OPT_CTRL          0xc808
390 #define MDIO_PMA_REG_8727_GPIO_CTRL             0xc80e
391 #define MDIO_PMA_REG_8727_PCS_GP                0xc842
392 #define MDIO_PMA_REG_8727_OPT_CFG_REG           0xc8e4
393
394 #define MDIO_AN_REG_8727_MISC_CTRL              0x8309
395 #define MDIO_PMA_REG_8073_CHIP_REV                      0xc801
396 #define MDIO_PMA_REG_8073_SPEED_LINK_STATUS             0xc820
397 #define MDIO_PMA_REG_8073_XAUI_WA                       0xc841
398 #define MDIO_PMA_REG_8073_OPT_DIGITAL_CTRL              0xcd08
399
400 #define MDIO_PMA_REG_7101_RESET         0xc000
401 #define MDIO_PMA_REG_7107_LED_CNTL      0xc007
402 #define MDIO_PMA_REG_7107_LINK_LED_CNTL 0xc009
403 #define MDIO_PMA_REG_7101_VER1          0xc026
404 #define MDIO_PMA_REG_7101_VER2          0xc027
405
406 #define MDIO_PMA_REG_8481_PMD_SIGNAL    0xa811
407 #define MDIO_PMA_REG_8481_LED1_MASK     0xa82c
408 #define MDIO_PMA_REG_8481_LED2_MASK     0xa82f
409 #define MDIO_PMA_REG_8481_LED3_MASK     0xa832
410 #define MDIO_PMA_REG_8481_LED3_BLINK    0xa834
411 #define MDIO_PMA_REG_8481_LED5_MASK                     0xa838
412 #define MDIO_PMA_REG_8481_SIGNAL_MASK   0xa835
413 #define MDIO_PMA_REG_8481_LINK_SIGNAL   0xa83b
414 #define MDIO_PMA_REG_8481_LINK_SIGNAL_LED4_ENABLE_MASK  0x800
415 #define MDIO_PMA_REG_8481_LINK_SIGNAL_LED4_ENABLE_SHIFT 11
416
417
418
419 #define MDIO_WIS_DEVAD                  0x2
420 /*bcm*/
421 #define MDIO_WIS_REG_LASI_CNTL          0x9002
422 #define MDIO_WIS_REG_LASI_STATUS        0x9005
423
424 #define MDIO_PCS_DEVAD                  0x3
425 #define MDIO_PCS_REG_STATUS             0x0020
426 #define MDIO_PCS_REG_LASI_STATUS        0x9005
427 #define MDIO_PCS_REG_7101_DSP_ACCESS    0xD000
428 #define MDIO_PCS_REG_7101_SPI_MUX       0xD008
429 #define MDIO_PCS_REG_7101_SPI_CTRL_ADDR 0xE12A
430         #define MDIO_PCS_REG_7101_SPI_RESET_BIT (5)
431 #define MDIO_PCS_REG_7101_SPI_FIFO_ADDR 0xE02A
432         #define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_WRITE_ENABLE_CMD (6)
433         #define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_BULK_ERASE_CMD   (0xC7)
434         #define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_PAGE_PROGRAM_CMD (2)
435 #define MDIO_PCS_REG_7101_SPI_BYTES_TO_TRANSFER_ADDR 0xE028
436
437
438
439 #define MDIO_XS_DEVAD                   0x4
440 #define MDIO_XS_REG_STATUS              0x0001
441 #define MDIO_XS_PLL_SEQUENCER           0x8000
442 #define MDIO_XS_SFX7101_XGXS_TEST1      0xc00a
443
444 #define MDIO_XS_8706_REG_BANK_RX0       0x80bc
445 #define MDIO_XS_8706_REG_BANK_RX1       0x80cc
446 #define MDIO_XS_8706_REG_BANK_RX2       0x80dc
447 #define MDIO_XS_8706_REG_BANK_RX3       0x80ec
448 #define MDIO_XS_8706_REG_BANK_RXA       0x80fc
449
450 #define MDIO_XS_REG_8073_RX_CTRL_PCIE   0x80FA
451
452 #define MDIO_AN_DEVAD                   0x7
453 /*ieee*/
454 #define MDIO_AN_REG_CTRL                0x0000
455 #define MDIO_AN_REG_STATUS              0x0001
456         #define MDIO_AN_REG_STATUS_AN_COMPLETE          0x0020
457 #define MDIO_AN_REG_ADV_PAUSE           0x0010
458         #define MDIO_AN_REG_ADV_PAUSE_PAUSE             0x0400
459         #define MDIO_AN_REG_ADV_PAUSE_ASYMMETRIC        0x0800
460         #define MDIO_AN_REG_ADV_PAUSE_BOTH              0x0C00
461         #define MDIO_AN_REG_ADV_PAUSE_MASK              0x0C00
462 #define MDIO_AN_REG_ADV                 0x0011
463 #define MDIO_AN_REG_ADV2                0x0012
464 #define MDIO_AN_REG_LP_AUTO_NEG         0x0013
465 #define MDIO_AN_REG_LP_AUTO_NEG2        0x0014
466 #define MDIO_AN_REG_MASTER_STATUS       0x0021
467 #define MDIO_AN_REG_EEE_ADV             0x003c
468 #define MDIO_AN_REG_LP_EEE_ADV          0x003d
469 /*bcm*/
470 #define MDIO_AN_REG_LINK_STATUS         0x8304
471 #define MDIO_AN_REG_CL37_CL73           0x8370
472 #define MDIO_AN_REG_CL37_AN             0xffe0
473 #define MDIO_AN_REG_CL37_FC_LD          0xffe4
474 #define         MDIO_AN_REG_CL37_FC_LP          0xffe5
475 #define         MDIO_AN_REG_1000T_STATUS        0xffea
476
477 #define MDIO_AN_REG_8073_2_5G           0x8329
478 #define MDIO_AN_REG_8073_BAM            0x8350
479
480 #define MDIO_AN_REG_8481_10GBASE_T_AN_CTRL      0x0020
481 #define MDIO_AN_REG_8481_LEGACY_MII_CTRL        0xffe0
482         #define MDIO_AN_REG_8481_MII_CTRL_FORCE_1G      0x40
483 #define MDIO_AN_REG_8481_LEGACY_MII_STATUS      0xffe1
484 #define MDIO_AN_REG_8481_LEGACY_AN_ADV          0xffe4
485 #define MDIO_AN_REG_8481_LEGACY_AN_EXPANSION    0xffe6
486 #define MDIO_AN_REG_8481_1000T_CTRL             0xffe9
487 #define MDIO_AN_REG_8481_1G_100T_EXT_CTRL       0xfff0
488         #define MIDO_AN_REG_8481_EXT_CTRL_FORCE_LEDS_OFF        0x0008
489 #define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW    0xfff5
490 #define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS   0xfff7
491 #define MDIO_AN_REG_8481_AUX_CTRL               0xfff8
492 #define MDIO_AN_REG_8481_LEGACY_SHADOW          0xfffc
493
494 /* BCM84823 only */
495 #define MDIO_CTL_DEVAD                  0x1e
496 #define MDIO_CTL_REG_84823_MEDIA                0x401a
497         #define MDIO_CTL_REG_84823_MEDIA_MAC_MASK               0x0018
498         /* These pins configure the BCM84823 interface to MAC after reset. */
499                 #define MDIO_CTL_REG_84823_CTRL_MAC_XFI                 0x0008
500                 #define MDIO_CTL_REG_84823_MEDIA_MAC_XAUI_M             0x0010
501         /* These pins configure the BCM84823 interface to Line after reset. */
502         #define MDIO_CTL_REG_84823_MEDIA_LINE_MASK              0x0060
503                 #define MDIO_CTL_REG_84823_MEDIA_LINE_XAUI_L            0x0020
504                 #define MDIO_CTL_REG_84823_MEDIA_LINE_XFI               0x0040
505         /* When this pin is active high during reset, 10GBASE-T core is power
506          * down, When it is active low the 10GBASE-T is power up
507          */
508         #define MDIO_CTL_REG_84823_MEDIA_COPPER_CORE_DOWN       0x0080
509         #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_MASK          0x0100
510                 #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_COPPER        0x0000
511                 #define MDIO_CTL_REG_84823_MEDIA_PRIORITY_FIBER         0x0100
512         #define MDIO_CTL_REG_84823_MEDIA_FIBER_1G                       0x1000
513 #define MDIO_CTL_REG_84823_USER_CTRL_REG                        0x4005
514         #define MDIO_CTL_REG_84823_USER_CTRL_CMS                        0x0080
515 #define MDIO_PMA_REG_84823_CTL_SLOW_CLK_CNT_HIGH                0xa82b
516         #define MDIO_PMA_REG_84823_BLINK_RATE_VAL_15P9HZ        0x2f
517 #define MDIO_PMA_REG_84823_CTL_LED_CTL_1                        0xa8e3
518 #define MDIO_PMA_REG_84833_CTL_LED_CTL_1                        0xa8ec
519         #define MDIO_PMA_REG_84823_LED3_STRETCH_EN                      0x0080
520
521 /* BCM84833 only */
522 #define MDIO_84833_TOP_CFG_FW_REV                       0x400f
523         #define MDIO_84833_TOP_CFG_FW_EEE               0x10b1
524         #define MDIO_84833_TOP_CFG_FW_NO_EEE            0x1f81
525 #define MDIO_84833_TOP_CFG_XGPHY_STRAP1                 0x401a
526         #define MDIO_84833_SUPER_ISOLATE                0x8000
527 /* These are mailbox register set used by 84833. */
528 #define MDIO_84833_TOP_CFG_SCRATCH_REG0                 0x4005
529 #define MDIO_84833_TOP_CFG_SCRATCH_REG1                 0x4006
530 #define MDIO_84833_TOP_CFG_SCRATCH_REG2                 0x4007
531 #define MDIO_84833_TOP_CFG_SCRATCH_REG3                 0x4008
532 #define MDIO_84833_TOP_CFG_SCRATCH_REG4                 0x4009
533 #define MDIO_84833_TOP_CFG_SCRATCH_REG26                0x4037
534 #define MDIO_84833_TOP_CFG_SCRATCH_REG27                0x4038
535 #define MDIO_84833_TOP_CFG_SCRATCH_REG28                0x4039
536 #define MDIO_84833_TOP_CFG_SCRATCH_REG29                0x403a
537 #define MDIO_84833_TOP_CFG_SCRATCH_REG30                0x403b
538 #define MDIO_84833_TOP_CFG_SCRATCH_REG31                0x403c
539 #define MDIO_84833_CMD_HDLR_COMMAND     MDIO_84833_TOP_CFG_SCRATCH_REG0
540 #define MDIO_84833_CMD_HDLR_STATUS      MDIO_84833_TOP_CFG_SCRATCH_REG26
541 #define MDIO_84833_CMD_HDLR_DATA1       MDIO_84833_TOP_CFG_SCRATCH_REG27
542 #define MDIO_84833_CMD_HDLR_DATA2       MDIO_84833_TOP_CFG_SCRATCH_REG28
543 #define MDIO_84833_CMD_HDLR_DATA3       MDIO_84833_TOP_CFG_SCRATCH_REG29
544 #define MDIO_84833_CMD_HDLR_DATA4       MDIO_84833_TOP_CFG_SCRATCH_REG30
545 #define MDIO_84833_CMD_HDLR_DATA5       MDIO_84833_TOP_CFG_SCRATCH_REG31
546
547 /* Mailbox command set used by 84833. */
548 #define PHY84833_CMD_SET_PAIR_SWAP                      0x8001
549 #define PHY84833_CMD_GET_EEE_MODE                       0x8008
550 #define PHY84833_CMD_SET_EEE_MODE                       0x8009
551 #define PHY84833_CMD_GET_CURRENT_TEMP                   0x8031
552 /* Mailbox status set used by 84833. */
553 #define PHY84833_STATUS_CMD_RECEIVED                    0x0001
554 #define PHY84833_STATUS_CMD_IN_PROGRESS                 0x0002
555 #define PHY84833_STATUS_CMD_COMPLETE_PASS               0x0004
556 #define PHY84833_STATUS_CMD_COMPLETE_ERROR              0x0008
557 #define PHY84833_STATUS_CMD_OPEN_FOR_CMDS               0x0010
558 #define PHY84833_STATUS_CMD_SYSTEM_BOOT                 0x0020
559 #define PHY84833_STATUS_CMD_NOT_OPEN_FOR_CMDS           0x0040
560 #define PHY84833_STATUS_CMD_CLEAR_COMPLETE              0x0080
561 #define PHY84833_STATUS_CMD_OPEN_OVERRIDE               0xa5a5
562
563
564 /* Warpcore clause 45 addressing */
565 #define MDIO_WC_DEVAD                                   0x3
566 #define MDIO_WC_REG_IEEE0BLK_MIICNTL                    0x0
567 #define MDIO_WC_REG_IEEE0BLK_AUTONEGNP                  0x7
568 #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT0       0x10
569 #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1       0x11
570 #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT2       0x12
571         #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADV2_FEC_ABILITY     0x4000
572         #define MDIO_WC_REG_AN_IEEE1BLK_AN_ADV2_FEC_REQ         0x8000
573 #define MDIO_WC_REG_PCS_STATUS2                         0x0021
574 #define MDIO_WC_REG_PMD_KR_CONTROL                      0x0096
575 #define MDIO_WC_REG_XGXSBLK0_XGXSCONTROL                0x8000
576 #define MDIO_WC_REG_XGXSBLK0_MISCCONTROL1               0x800e
577 #define MDIO_WC_REG_XGXSBLK1_DESKEW                     0x8010
578 #define MDIO_WC_REG_XGXSBLK1_LANECTRL0                  0x8015
579 #define MDIO_WC_REG_XGXSBLK1_LANECTRL1                  0x8016
580 #define MDIO_WC_REG_XGXSBLK1_LANECTRL2                  0x8017
581 #define MDIO_WC_REG_XGXSBLK1_LANECTRL3                  0x8018
582 #define MDIO_WC_REG_XGXSBLK1_LANETEST0                  0x801a
583 #define MDIO_WC_REG_TX0_ANA_CTRL0                       0x8061
584 #define MDIO_WC_REG_TX1_ANA_CTRL0                       0x8071
585 #define MDIO_WC_REG_TX2_ANA_CTRL0                       0x8081
586 #define MDIO_WC_REG_TX3_ANA_CTRL0                       0x8091
587 #define MDIO_WC_REG_TX0_TX_DRIVER                       0x8067
588 #define MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET            0x04
589 #define MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_MASK                      0x00f0
590 #define MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET                0x08
591 #define MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_MASK                          0x0f00
592 #define MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET            0x0c
593 #define MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_MASK                      0x7000
594 #define MDIO_WC_REG_TX1_TX_DRIVER                       0x8077
595 #define MDIO_WC_REG_TX2_TX_DRIVER                       0x8087
596 #define MDIO_WC_REG_TX3_TX_DRIVER                       0x8097
597 #define MDIO_WC_REG_RX0_ANARXCONTROL1G                  0x80b9
598 #define MDIO_WC_REG_RX2_ANARXCONTROL1G                  0x80d9
599 #define MDIO_WC_REG_RX0_PCI_CTRL                        0x80ba
600 #define MDIO_WC_REG_RX1_PCI_CTRL                        0x80ca
601 #define MDIO_WC_REG_RX2_PCI_CTRL                        0x80da
602 #define MDIO_WC_REG_RX3_PCI_CTRL                        0x80ea
603 #define MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI              0x80fa
604 #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G           0x8104
605 #define MDIO_WC_REG_XGXS_STATUS3                        0x8129
606 #define MDIO_WC_REG_PAR_DET_10G_STATUS                  0x8130
607 #define MDIO_WC_REG_PAR_DET_10G_CTRL                    0x8131
608 #define MDIO_WC_REG_XGXS_STATUS4                        0x813c
609 #define MDIO_WC_REG_XGXS_X2_CONTROL2                    0x8141
610 #define MDIO_WC_REG_XGXS_X2_CONTROL3                    0x8142
611 #define MDIO_WC_REG_XGXS_RX_LN_SWAP1                    0x816B
612 #define MDIO_WC_REG_XGXS_TX_LN_SWAP1                    0x8169
613 #define MDIO_WC_REG_GP2_STATUS_GP_2_0                   0x81d0
614 #define MDIO_WC_REG_GP2_STATUS_GP_2_1                   0x81d1
615 #define MDIO_WC_REG_GP2_STATUS_GP_2_2                   0x81d2
616 #define MDIO_WC_REG_GP2_STATUS_GP_2_3                   0x81d3
617 #define MDIO_WC_REG_GP2_STATUS_GP_2_4                   0x81d4
618         #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL73_AN_CMPL 0x1000
619         #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CMPL 0x0100
620         #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_LP_AN_CAP 0x0010
621         #define MDIO_WC_REG_GP2_STATUS_GP_2_4_CL37_AN_CAP 0x1
622 #define MDIO_WC_REG_UC_INFO_B0_DEAD_TRAP                0x81EE
623 #define MDIO_WC_REG_UC_INFO_B1_VERSION                  0x81F0
624 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE            0x81F2
625         #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_LANE0_OFFSET    0x0
626                 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE_DEFAULT        0x0
627                 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE_SFP_OPT_LR     0x1
628                 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE_SFP_DAC        0x2
629                 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE_SFP_XLAUI      0x3
630                 #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE_LONG_CH_6G     0x4
631         #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_LANE1_OFFSET    0x4
632         #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_LANE2_OFFSET    0x8
633         #define MDIO_WC_REG_UC_INFO_B1_FIRMWARE_LANE3_OFFSET    0xc
634 #define MDIO_WC_REG_UC_INFO_B1_CRC                      0x81FE
635 #define MDIO_WC_REG_DSC1B0_UC_CTRL                              0x820e
636         #define MDIO_WC_REG_DSC1B0_UC_CTRL_RDY4CMD                      (1<<7)
637 #define MDIO_WC_REG_DSC_SMC                             0x8213
638 #define MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0               0x821e
639 #define MDIO_WC_REG_TX_FIR_TAP                          0x82e2
640         #define MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET           0x00
641         #define MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_MASK                     0x000f
642         #define MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET          0x04
643         #define MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_MASK            0x03f0
644         #define MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET          0x0a
645         #define MDIO_WC_REG_TX_FIR_TAP_POST_TAP_MASK            0x7c00
646         #define MDIO_WC_REG_TX_FIR_TAP_ENABLE           0x8000
647 #define MDIO_WC_REG_CL72_USERB0_CL72_TX_FIR_TAP         0x82e2
648 #define MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL      0x82e3
649 #define MDIO_WC_REG_CL72_USERB0_CL72_OS_DEF_CTRL        0x82e6
650 #define MDIO_WC_REG_CL72_USERB0_CL72_BR_DEF_CTRL        0x82e7
651 #define MDIO_WC_REG_CL72_USERB0_CL72_2P5_DEF_CTRL       0x82e8
652 #define MDIO_WC_REG_CL72_USERB0_CL72_MISC4_CONTROL      0x82ec
653 #define MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1         0x8300
654 #define MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2         0x8301
655 #define MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X3         0x8302
656 #define MDIO_WC_REG_SERDESDIGITAL_STATUS1000X1          0x8304
657 #define MDIO_WC_REG_SERDESDIGITAL_MISC1                 0x8308
658 #define MDIO_WC_REG_SERDESDIGITAL_MISC2                 0x8309
659 #define MDIO_WC_REG_DIGITAL3_UP1                        0x8329
660 #define MDIO_WC_REG_DIGITAL3_LP_UP1                     0x832c
661 #define MDIO_WC_REG_DIGITAL4_MISC3                      0x833c
662 #define MDIO_WC_REG_DIGITAL4_MISC5                      0x833e
663 #define MDIO_WC_REG_DIGITAL5_MISC6                      0x8345
664 #define MDIO_WC_REG_DIGITAL5_MISC7                      0x8349
665 #define MDIO_WC_REG_DIGITAL5_LINK_STATUS                0x834d
666 #define MDIO_WC_REG_DIGITAL5_ACTUAL_SPEED               0x834e
667 #define MDIO_WC_REG_DIGITAL6_MP5_NEXTPAGECTRL           0x8350
668 #define MDIO_WC_REG_CL49_USERB0_CTRL                    0x8368
669 #define MDIO_WC_REG_CL73_USERB0_CTRL                    0x8370
670 #define MDIO_WC_REG_CL73_USERB0_USTAT                   0x8371
671 #define MDIO_WC_REG_CL73_BAM_CTRL1                      0x8372
672 #define MDIO_WC_REG_CL73_BAM_CTRL2                      0x8373
673 #define MDIO_WC_REG_CL73_BAM_CTRL3                      0x8374
674 #define MDIO_WC_REG_CL73_BAM_CODE_FIELD                 0x837b
675 #define MDIO_WC_REG_EEE_COMBO_CONTROL0                  0x8390
676 #define MDIO_WC_REG_TX66_CONTROL                        0x83b0
677 #define MDIO_WC_REG_RX66_CONTROL                        0x83c0
678 #define MDIO_WC_REG_RX66_SCW0                           0x83c2
679 #define MDIO_WC_REG_RX66_SCW1                           0x83c3
680 #define MDIO_WC_REG_RX66_SCW2                           0x83c4
681 #define MDIO_WC_REG_RX66_SCW3                           0x83c5
682 #define MDIO_WC_REG_RX66_SCW0_MASK                      0x83c6
683 #define MDIO_WC_REG_RX66_SCW1_MASK                      0x83c7
684 #define MDIO_WC_REG_RX66_SCW2_MASK                      0x83c8
685 #define MDIO_WC_REG_RX66_SCW3_MASK                      0x83c9
686 #define MDIO_WC_REG_FX100_CTRL1                         0x8400
687 #define MDIO_WC_REG_FX100_CTRL3                         0x8402
688 #define MDIO_WC_REG_CL82_USERB1_TX_CTRL5                0x8436
689 #define MDIO_WC_REG_CL82_USERB1_TX_CTRL6                0x8437
690 #define MDIO_WC_REG_CL82_USERB1_TX_CTRL7                0x8438
691 #define MDIO_WC_REG_CL82_USERB1_TX_CTRL9                0x8439
692 #define MDIO_WC_REG_CL82_USERB1_RX_CTRL10               0x843a
693 #define MDIO_WC_REG_CL82_USERB1_RX_CTRL11               0x843b
694 #define MDIO_WC_REG_ETA_CL73_OUI1                       0x8453
695 #define MDIO_WC_REG_ETA_CL73_OUI2                       0x8454
696 #define MDIO_WC_REG_ETA_CL73_OUI3                       0x8455
697 #define MDIO_WC_REG_ETA_CL73_LD_BAM_CODE                0x8456
698 #define MDIO_WC_REG_ETA_CL73_LD_UD_CODE                 0x8457
699 #define MDIO_WC_REG_MICROBLK_CMD                        0xffc2
700 #define MDIO_WC_REG_MICROBLK_DL_STATUS                  0xffc5
701 #define MDIO_WC_REG_MICROBLK_CMD3                       0xffcc
702
703 #define MDIO_WC_REG_AERBLK_AER                          0xffde
704 #define MDIO_WC_REG_COMBO_IEEE0_MIICTRL                 0xffe0
705 #define MDIO_WC_REG_COMBO_IEEE0_MIIISTAT                0xffe1
706
707 #define MDIO_WC0_XGXS_BLK2_LANE_RESET                   0x810A
708         #define MDIO_WC0_XGXS_BLK2_LANE_RESET_RX_BITSHIFT       0
709         #define MDIO_WC0_XGXS_BLK2_LANE_RESET_TX_BITSHIFT       4
710
711 #define MDIO_WC0_XGXS_BLK6_XGXS_X2_CONTROL2             0x8141
712
713 #define DIGITAL5_ACTUAL_SPEED_TX_MASK                   0x003f
714
715 /* 54618se */
716 #define MDIO_REG_GPHY_MII_STATUS                        0x1
717 #define MDIO_REG_GPHY_PHYID_LSB                         0x3
718 #define MDIO_REG_GPHY_CL45_ADDR_REG                     0xd
719         #define MDIO_REG_GPHY_CL45_REG_WRITE            0x4000
720         #define MDIO_REG_GPHY_CL45_REG_READ             0xc000
721 #define MDIO_REG_GPHY_CL45_DATA_REG                     0xe
722         #define MDIO_REG_GPHY_EEE_RESOLVED              0x803e
723 #define MDIO_REG_GPHY_EXP_ACCESS_GATE                   0x15
724 #define MDIO_REG_GPHY_EXP_ACCESS                        0x17
725         #define MDIO_REG_GPHY_EXP_ACCESS_TOP            0xd00
726         #define MDIO_REG_GPHY_EXP_TOP_2K_BUF            0x40
727 #define MDIO_REG_GPHY_AUX_STATUS                        0x19
728 #define MDIO_REG_INTR_STATUS                            0x1a
729 #define MDIO_REG_INTR_MASK                              0x1b
730         #define MDIO_REG_INTR_MASK_LINK_STATUS                  (0x1 << 1)
731 #define MDIO_REG_GPHY_SHADOW                            0x1c
732         #define MDIO_REG_GPHY_SHADOW_LED_SEL1                   (0x0d << 10)
733         #define MDIO_REG_GPHY_SHADOW_LED_SEL2                   (0x0e << 10)
734         #define MDIO_REG_GPHY_SHADOW_WR_ENA                     (0x1 << 15)
735         #define MDIO_REG_GPHY_SHADOW_AUTO_DET_MED               (0x1e << 10)
736         #define MDIO_REG_GPHY_SHADOW_INVERT_FIB_SD              (0x1 << 8)
737
738
739 typedef elink_status_t (*read_sfp_module_eeprom_func_p)(struct elink_phy *phy,
740                                              struct elink_params *params,
741                                              uint8_t dev_addr, uint16_t addr, uint8_t byte_cnt,
742                                              uint8_t *o_buf, uint8_t);
743 /********************************************************/
744 #define ELINK_ETH_HLEN                  14
745 /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
746 #define ELINK_ETH_OVREHEAD                      (ELINK_ETH_HLEN + 8 + 8)
747 #define ELINK_ETH_MIN_PACKET_SIZE               60
748 #define ELINK_ETH_MAX_PACKET_SIZE               1500
749 #define ELINK_ETH_MAX_JUMBO_PACKET_SIZE 9600
750 #define ELINK_MDIO_ACCESS_TIMEOUT               1000
751 #define WC_LANE_MAX                     4
752 #define I2C_SWITCH_WIDTH                2
753 #define I2C_BSC0                        0
754 #define I2C_BSC1                        1
755 #define I2C_WA_RETRY_CNT                3
756 #define I2C_WA_PWR_ITER                 (I2C_WA_RETRY_CNT - 1)
757 #define MCPR_IMC_COMMAND_READ_OP        1
758 #define MCPR_IMC_COMMAND_WRITE_OP       2
759
760 /* LED Blink rate that will achieve ~15.9Hz */
761 #define LED_BLINK_RATE_VAL_E3           354
762 #define LED_BLINK_RATE_VAL_E1X_E2       480
763 /***********************************************************/
764 /*                      Shortcut definitions               */
765 /***********************************************************/
766
767 #define ELINK_NIG_LATCH_BC_ENABLE_MI_INT 0
768
769 #define ELINK_NIG_STATUS_EMAC0_MI_INT \
770                 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_EMAC0_MISC_MI_INT
771 #define ELINK_NIG_STATUS_XGXS0_LINK10G \
772                 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G
773 #define ELINK_NIG_STATUS_XGXS0_LINK_STATUS \
774                 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS
775 #define ELINK_NIG_STATUS_XGXS0_LINK_STATUS_SIZE \
776                 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS_SIZE
777 #define ELINK_NIG_STATUS_SERDES0_LINK_STATUS \
778                 NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS
779 #define ELINK_NIG_MASK_MI_INT \
780                 NIG_MASK_INTERRUPT_PORT0_REG_MASK_EMAC0_MISC_MI_INT
781 #define ELINK_NIG_MASK_XGXS0_LINK10G \
782                 NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK10G
783 #define ELINK_NIG_MASK_XGXS0_LINK_STATUS \
784                 NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK_STATUS
785 #define ELINK_NIG_MASK_SERDES0_LINK_STATUS \
786                 NIG_MASK_INTERRUPT_PORT0_REG_MASK_SERDES0_LINK_STATUS
787
788 #define ELINK_MDIO_AN_CL73_OR_37_COMPLETE \
789                 (MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE | \
790                  MDIO_GP_STATUS_TOP_AN_STATUS1_CL37_AUTONEG_COMPLETE)
791
792 #define ELINK_XGXS_RESET_BITS \
793         (MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_RSTB_HW |   \
794          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_IDDQ |      \
795          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN |    \
796          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN_SD | \
797          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_TXD_FIFO_RSTB)
798
799 #define ELINK_SERDES_RESET_BITS \
800         (MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_RSTB_HW | \
801          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_IDDQ |    \
802          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN |  \
803          MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN_SD)
804
805 #define ELINK_AUTONEG_CL37              SHARED_HW_CFG_AN_ENABLE_CL37
806 #define ELINK_AUTONEG_CL73              SHARED_HW_CFG_AN_ENABLE_CL73
807 #define ELINK_AUTONEG_BAM               SHARED_HW_CFG_AN_ENABLE_BAM
808 #define ELINK_AUTONEG_PARALLEL \
809                                 SHARED_HW_CFG_AN_ENABLE_PARALLEL_DETECTION
810 #define ELINK_AUTONEG_SGMII_FIBER_AUTODET \
811                                 SHARED_HW_CFG_AN_EN_SGMII_FIBER_AUTO_DETECT
812 #define ELINK_AUTONEG_REMOTE_PHY        SHARED_HW_CFG_AN_ENABLE_REMOTE_PHY
813
814 #define ELINK_GP_STATUS_PAUSE_RSOLUTION_TXSIDE \
815                         MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_TXSIDE
816 #define ELINK_GP_STATUS_PAUSE_RSOLUTION_RXSIDE \
817                         MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_RXSIDE
818 #define ELINK_GP_STATUS_SPEED_MASK \
819                         MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_MASK
820 #define ELINK_GP_STATUS_10M     MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M
821 #define ELINK_GP_STATUS_100M    MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M
822 #define ELINK_GP_STATUS_1G      MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G
823 #define ELINK_GP_STATUS_2_5G    MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G
824 #define ELINK_GP_STATUS_5G      MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_5G
825 #define ELINK_GP_STATUS_6G      MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_6G
826 #define ELINK_GP_STATUS_10G_HIG \
827                         MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_HIG
828 #define ELINK_GP_STATUS_10G_CX4 \
829                         MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_CX4
830 #define ELINK_GP_STATUS_1G_KX MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G_KX
831 #define ELINK_GP_STATUS_10G_KX4 \
832                         MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KX4
833 #define ELINK_GP_STATUS_10G_KR MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KR
834 #define ELINK_GP_STATUS_10G_XFI   MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_XFI
835 #define ELINK_GP_STATUS_20G_DXGXS MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_DXGXS
836 #define ELINK_GP_STATUS_10G_SFI   MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_SFI
837 #define ELINK_GP_STATUS_20G_KR2 MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_20G_KR2
838 #define ELINK_LINK_10THD                LINK_STATUS_SPEED_AND_DUPLEX_10THD
839 #define ELINK_LINK_10TFD                LINK_STATUS_SPEED_AND_DUPLEX_10TFD
840 #define ELINK_LINK_100TXHD              LINK_STATUS_SPEED_AND_DUPLEX_100TXHD
841 #define ELINK_LINK_100T4                LINK_STATUS_SPEED_AND_DUPLEX_100T4
842 #define ELINK_LINK_100TXFD              LINK_STATUS_SPEED_AND_DUPLEX_100TXFD
843 #define ELINK_LINK_1000THD              LINK_STATUS_SPEED_AND_DUPLEX_1000THD
844 #define ELINK_LINK_1000TFD              LINK_STATUS_SPEED_AND_DUPLEX_1000TFD
845 #define ELINK_LINK_1000XFD              LINK_STATUS_SPEED_AND_DUPLEX_1000XFD
846 #define ELINK_LINK_2500THD              LINK_STATUS_SPEED_AND_DUPLEX_2500THD
847 #define ELINK_LINK_2500TFD              LINK_STATUS_SPEED_AND_DUPLEX_2500TFD
848 #define ELINK_LINK_2500XFD              LINK_STATUS_SPEED_AND_DUPLEX_2500XFD
849 #define ELINK_LINK_10GTFD               LINK_STATUS_SPEED_AND_DUPLEX_10GTFD
850 #define ELINK_LINK_10GXFD               LINK_STATUS_SPEED_AND_DUPLEX_10GXFD
851 #define ELINK_LINK_20GTFD               LINK_STATUS_SPEED_AND_DUPLEX_20GTFD
852 #define ELINK_LINK_20GXFD               LINK_STATUS_SPEED_AND_DUPLEX_20GXFD
853
854 #define ELINK_LINK_UPDATE_MASK \
855                         (LINK_STATUS_SPEED_AND_DUPLEX_MASK | \
856                          LINK_STATUS_LINK_UP | \
857                          LINK_STATUS_PHYSICAL_LINK_FLAG | \
858                          LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | \
859                          LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | \
860                          LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | \
861                          LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK | \
862                          LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE | \
863                          LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE)
864
865 #define ELINK_SFP_EEPROM_CON_TYPE_ADDR          0x2
866         #define ELINK_SFP_EEPROM_CON_TYPE_VAL_LC        0x7
867         #define ELINK_SFP_EEPROM_CON_TYPE_VAL_COPPER    0x21
868         #define ELINK_SFP_EEPROM_CON_TYPE_VAL_RJ45      0x22
869
870
871 #define ELINK_SFP_EEPROM_COMP_CODE_ADDR         0x3
872         #define ELINK_SFP_EEPROM_COMP_CODE_SR_MASK      (1<<4)
873         #define ELINK_SFP_EEPROM_COMP_CODE_LR_MASK      (1<<5)
874         #define ELINK_SFP_EEPROM_COMP_CODE_LRM_MASK     (1<<6)
875
876 #define ELINK_SFP_EEPROM_FC_TX_TECH_ADDR                0x8
877         #define ELINK_SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE 0x4
878         #define ELINK_SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_ACTIVE  0x8
879
880 #define ELINK_SFP_EEPROM_OPTIONS_ADDR                   0x40
881         #define ELINK_SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK 0x1
882 #define ELINK_SFP_EEPROM_OPTIONS_SIZE                   2
883
884 #define ELINK_EDC_MODE_LINEAR                           0x0022
885 #define ELINK_EDC_MODE_LIMITING                         0x0044
886 #define ELINK_EDC_MODE_PASSIVE_DAC                      0x0055
887 #define ELINK_EDC_MODE_ACTIVE_DAC                       0x0066
888
889 /* ETS defines*/
890 #define DCBX_INVALID_COS                                        (0xFF)
891
892 #define ELINK_ETS_BW_LIMIT_CREDIT_UPPER_BOUND           (0x5000)
893 #define ELINK_ETS_BW_LIMIT_CREDIT_WEIGHT                (0x5000)
894 #define ELINK_ETS_E3B0_NIG_MIN_W_VAL_UP_TO_10GBPS               (1360)
895 #define ELINK_ETS_E3B0_NIG_MIN_W_VAL_20GBPS                     (2720)
896 #define ELINK_ETS_E3B0_PBF_MIN_W_VAL                            (10000)
897
898 #define ELINK_MAX_PACKET_SIZE                                   (9700)
899 #define MAX_KR_LINK_RETRY                               4
900
901 /**********************************************************/
902 /*                     INTERFACE                          */
903 /**********************************************************/
904
905 #define CL22_WR_OVER_CL45(_sc, _phy, _bank, _addr, _val) \
906         elink_cl45_write(_sc, _phy, \
907                 (_phy)->def_md_devad, \
908                 (_bank + (_addr & 0xf)), \
909                 _val)
910
911 #define CL22_RD_OVER_CL45(_sc, _phy, _bank, _addr, _val) \
912         elink_cl45_read(_sc, _phy, \
913                 (_phy)->def_md_devad, \
914                 (_bank + (_addr & 0xf)), \
915                 _val)
916
917 static uint32_t elink_bits_en(struct bxe_adapter *sc, uint32_t reg, uint32_t bits)
918 {
919         uint32_t val = REG_RD(sc, reg);
920
921         val |= bits;
922         REG_WR(sc, reg, val);
923         return val;
924 }
925
926 static uint32_t elink_bits_dis(struct bxe_adapter *sc, uint32_t reg, uint32_t bits)
927 {
928         uint32_t val = REG_RD(sc, reg);
929
930         val &= ~bits;
931         REG_WR(sc, reg, val);
932         return val;
933 }
934
935 /*
936  * elink_check_lfa - This function checks if link reinitialization is required,
937  *                   or link flap can be avoided.
938  *
939  * @params:     link parameters
940  * Returns 0 if Link Flap Avoidance conditions are met otherwise, the failed
941  *         condition code.
942  */
943 static int elink_check_lfa(struct elink_params *params)
944 {
945         uint32_t link_status, cfg_idx, lfa_mask, cfg_size;
946         uint32_t cur_speed_cap_mask, cur_req_fc_auto_adv, additional_config;
947         uint32_t saved_val, req_val, eee_status;
948         struct bxe_adapter *sc = params->sc;
949
950         additional_config =
951                 REG_RD(sc, params->lfa_base +
952                            offsetof(struct shmem_lfa, additional_config));
953
954         /* NOTE: must be first condition checked -
955         * to verify DCC bit is cleared in any case!
956         */
957         if (additional_config & NO_LFA_DUE_TO_DCC_MASK) {
958                 ELINK_DEBUG_P0(sc, "No LFA due to DCC flap after clp exit\n");
959                 REG_WR(sc, params->lfa_base +
960                            offsetof(struct shmem_lfa, additional_config),
961                        additional_config & ~NO_LFA_DUE_TO_DCC_MASK);
962                 return LFA_DCC_LFA_DISABLED;
963         }
964
965         /* Verify that link is up */
966         link_status = REG_RD(sc, params->shmem_base +
967                              offsetof(struct shmem_region,
968                                       port_mb[params->port].link_status));
969         if (!(link_status & LINK_STATUS_LINK_UP))
970                 return LFA_LINK_DOWN;
971
972         /* if loaded after BOOT from SAN, don't flap the link in any case and
973          * rely on link set by preboot driver
974          */
975         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_BOOT_FROM_SAN)
976                 return 0;
977
978         /* Verify that loopback mode is not set */
979         if (params->loopback_mode)
980                 return LFA_LOOPBACK_ENABLED;
981
982         /* Verify that MFW supports LFA */
983         if (!params->lfa_base)
984                 return LFA_MFW_IS_TOO_OLD;
985
986         if (params->num_phys == 3) {
987                 cfg_size = 2;
988                 lfa_mask = 0xffffffff;
989         } else {
990                 cfg_size = 1;
991                 lfa_mask = 0xffff;
992         }
993
994         /* Compare Duplex */
995         saved_val = REG_RD(sc, params->lfa_base +
996                            offsetof(struct shmem_lfa, req_duplex));
997         req_val = params->req_duplex[0] | (params->req_duplex[1] << 16);
998         if ((saved_val & lfa_mask) != (req_val & lfa_mask)) {
999                 ELINK_DEBUG_P2(sc, "Duplex mismatch %x vs. %x\n",
1000                                (saved_val & lfa_mask), (req_val & lfa_mask));
1001                 return LFA_DUPLEX_MISMATCH;
1002         }
1003         /* Compare Flow Control */
1004         saved_val = REG_RD(sc, params->lfa_base +
1005                            offsetof(struct shmem_lfa, req_flow_ctrl));
1006         req_val = params->req_flow_ctrl[0] | (params->req_flow_ctrl[1] << 16);
1007         if ((saved_val & lfa_mask) != (req_val & lfa_mask)) {
1008                 ELINK_DEBUG_P2(sc, "Flow control mismatch %x vs. %x\n",
1009                                (saved_val & lfa_mask), (req_val & lfa_mask));
1010                 return LFA_FLOW_CTRL_MISMATCH;
1011         }
1012         /* Compare Link Speed */
1013         saved_val = REG_RD(sc, params->lfa_base +
1014                            offsetof(struct shmem_lfa, req_line_speed));
1015         req_val = params->req_line_speed[0] | (params->req_line_speed[1] << 16);
1016         if ((saved_val & lfa_mask) != (req_val & lfa_mask)) {
1017                 ELINK_DEBUG_P2(sc, "Link speed mismatch %x vs. %x\n",
1018                                (saved_val & lfa_mask), (req_val & lfa_mask));
1019                 return LFA_LINK_SPEED_MISMATCH;
1020         }
1021
1022         for (cfg_idx = 0; cfg_idx < cfg_size; cfg_idx++) {
1023                 cur_speed_cap_mask = REG_RD(sc, params->lfa_base +
1024                                             offsetof(struct shmem_lfa,
1025                                                      speed_cap_mask[cfg_idx]));
1026
1027                 if (cur_speed_cap_mask != params->speed_cap_mask[cfg_idx]) {
1028                         ELINK_DEBUG_P2(sc, "Speed Cap mismatch %x vs. %x\n",
1029                                        cur_speed_cap_mask,
1030                                        params->speed_cap_mask[cfg_idx]);
1031                         return LFA_SPEED_CAP_MISMATCH;
1032                 }
1033         }
1034
1035         cur_req_fc_auto_adv =
1036                 REG_RD(sc, params->lfa_base +
1037                        offsetof(struct shmem_lfa, additional_config)) &
1038                 REQ_FC_AUTO_ADV_MASK;
1039
1040         if ((uint16_t)cur_req_fc_auto_adv != params->req_fc_auto_adv) {
1041                 ELINK_DEBUG_P2(sc, "Flow Ctrl AN mismatch %x vs. %x\n",
1042                                cur_req_fc_auto_adv, params->req_fc_auto_adv);
1043                 return LFA_FLOW_CTRL_MISMATCH;
1044         }
1045
1046         eee_status = REG_RD(sc, params->shmem2_base +
1047                             offsetof(struct shmem2_region,
1048                                      eee_status[params->port]));
1049
1050         if (((eee_status & SHMEM_EEE_LPI_REQUESTED_BIT) ^
1051              (params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI)) ||
1052             ((eee_status & SHMEM_EEE_REQUESTED_BIT) ^
1053              (params->eee_mode & ELINK_EEE_MODE_ADV_LPI))) {
1054                 ELINK_DEBUG_P2(sc, "EEE mismatch %x vs. %x\n", params->eee_mode,
1055                                eee_status);
1056                 return LFA_EEE_MISMATCH;
1057         }
1058
1059         /* LFA conditions are met */
1060         return 0;
1061 }
1062 /******************************************************************/
1063 /*                      EPIO/GPIO section                         */
1064 /******************************************************************/
1065 static void elink_get_epio(struct bxe_adapter *sc, uint32_t epio_pin, uint32_t *en)
1066 {
1067         uint32_t epio_mask, gp_oenable;
1068         *en = 0;
1069         /* Sanity check */
1070         if (epio_pin > 31) {
1071                 ELINK_DEBUG_P1(sc, "Invalid EPIO pin %d to get\n", epio_pin);
1072                 return;
1073         }
1074
1075         epio_mask = 1 << epio_pin;
1076         /* Set this EPIO to output */
1077         gp_oenable = REG_RD(sc, MCP_REG_MCPR_GP_OENABLE);
1078         REG_WR(sc, MCP_REG_MCPR_GP_OENABLE, gp_oenable & ~epio_mask);
1079
1080         *en = (REG_RD(sc, MCP_REG_MCPR_GP_INPUTS) & epio_mask) >> epio_pin;
1081 }
1082 static void elink_set_epio(struct bxe_adapter *sc, uint32_t epio_pin, uint32_t en)
1083 {
1084         uint32_t epio_mask, gp_output, gp_oenable;
1085
1086         /* Sanity check */
1087         if (epio_pin > 31) {
1088                 ELINK_DEBUG_P1(sc, "Invalid EPIO pin %d to set\n", epio_pin);
1089                 return;
1090         }
1091         ELINK_DEBUG_P2(sc, "Setting EPIO pin %d to %d\n", epio_pin, en);
1092         epio_mask = 1 << epio_pin;
1093         /* Set this EPIO to output */
1094         gp_output = REG_RD(sc, MCP_REG_MCPR_GP_OUTPUTS);
1095         if (en)
1096                 gp_output |= epio_mask;
1097         else
1098                 gp_output &= ~epio_mask;
1099
1100         REG_WR(sc, MCP_REG_MCPR_GP_OUTPUTS, gp_output);
1101
1102         /* Set the value for this EPIO */
1103         gp_oenable = REG_RD(sc, MCP_REG_MCPR_GP_OENABLE);
1104         REG_WR(sc, MCP_REG_MCPR_GP_OENABLE, gp_oenable | epio_mask);
1105 }
1106
1107 static void elink_set_cfg_pin(struct bxe_adapter *sc, uint32_t pin_cfg, uint32_t val)
1108 {
1109         if (pin_cfg == PIN_CFG_NA)
1110                 return;
1111         if (pin_cfg >= PIN_CFG_EPIO0) {
1112                 elink_set_epio(sc, pin_cfg - PIN_CFG_EPIO0, val);
1113         } else {
1114                 uint8_t gpio_num = (pin_cfg - PIN_CFG_GPIO0_P0) & 0x3;
1115                 uint8_t gpio_port = (pin_cfg - PIN_CFG_GPIO0_P0) >> 2;
1116                 elink_cb_gpio_write(sc, gpio_num, (uint8_t)val, gpio_port);
1117         }
1118 }
1119
1120 static uint32_t elink_get_cfg_pin(struct bxe_adapter *sc, uint32_t pin_cfg, uint32_t *val)
1121 {
1122         if (pin_cfg == PIN_CFG_NA)
1123                 return ELINK_STATUS_ERROR;
1124         if (pin_cfg >= PIN_CFG_EPIO0) {
1125                 elink_get_epio(sc, pin_cfg - PIN_CFG_EPIO0, val);
1126         } else {
1127                 uint8_t gpio_num = (pin_cfg - PIN_CFG_GPIO0_P0) & 0x3;
1128                 uint8_t gpio_port = (pin_cfg - PIN_CFG_GPIO0_P0) >> 2;
1129                 *val = elink_cb_gpio_read(sc, gpio_num, gpio_port);
1130         }
1131         return ELINK_STATUS_OK;
1132
1133 }
1134 /******************************************************************/
1135 /*                              ETS section                       */
1136 /******************************************************************/
1137 static void elink_ets_e2e3a0_disabled(struct elink_params *params)
1138 {
1139         /* ETS disabled configuration*/
1140         struct bxe_adapter *sc = params->sc;
1141
1142         ELINK_DEBUG_P0(sc, "ETS E2E3 disabled configuration\n");
1143
1144         /* mapping between entry  priority to client number (0,1,2 -debug and
1145          * management clients, 3 - COS0 client, 4 - COS client)(HIGHEST)
1146          * 3bits client num.
1147          *   PRI4    |    PRI3    |    PRI2    |    PRI1    |    PRI0
1148          * cos1-100     cos0-011     dbg1-010     dbg0-001     MCP-000
1149          */
1150
1151         REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT, 0x4688);
1152         /* Bitmap of 5bits length. Each bit specifies whether the entry behaves
1153          * as strict.  Bits 0,1,2 - debug and management entries, 3 -
1154          * COS0 entry, 4 - COS1 entry.
1155          * COS1 | COS0 | DEBUG1 | DEBUG0 | MGMT
1156          * bit4   bit3    bit2   bit1     bit0
1157          * MCP and debug are strict
1158          */
1159
1160         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_STRICT, 0x7);
1161         /* defines which entries (clients) are subjected to WFQ arbitration */
1162         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_SUBJECT2WFQ, 0);
1163         /* For strict priority entries defines the number of consecutive
1164          * slots for the highest priority.
1165          */
1166         REG_WR(sc, NIG_REG_P0_TX_ARB_NUM_STRICT_ARB_SLOTS, 0x100);
1167         /* mapping between the CREDIT_WEIGHT registers and actual client
1168          * numbers
1169          */
1170         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_CREDIT_MAP, 0);
1171         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_0, 0);
1172         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_1, 0);
1173
1174         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_0, 0);
1175         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_1, 0);
1176         REG_WR(sc, PBF_REG_HIGH_PRIORITY_COS_NUM, 0);
1177         /* ETS mode disable */
1178         REG_WR(sc, PBF_REG_ETS_ENABLED, 0);
1179         /* If ETS mode is enabled (there is no strict priority) defines a WFQ
1180          * weight for COS0/COS1.
1181          */
1182         REG_WR(sc, PBF_REG_COS0_WEIGHT, 0x2710);
1183         REG_WR(sc, PBF_REG_COS1_WEIGHT, 0x2710);
1184         /* Upper bound that COS0_WEIGHT can reach in the WFQ arbiter */
1185         REG_WR(sc, PBF_REG_COS0_UPPER_BOUND, 0x989680);
1186         REG_WR(sc, PBF_REG_COS1_UPPER_BOUND, 0x989680);
1187         /* Defines the number of consecutive slots for the strict priority */
1188         REG_WR(sc, PBF_REG_NUM_STRICT_ARB_SLOTS, 0);
1189 }
1190 /******************************************************************************
1191 * Description:
1192 *       Getting min_w_val will be set according to line speed .
1193 *.
1194 ******************************************************************************/
1195 static uint32_t elink_ets_get_min_w_val_nig(const struct elink_vars *vars)
1196 {
1197         uint32_t min_w_val = 0;
1198         /* Calculate min_w_val.*/
1199         if (vars->link_up) {
1200                 if (vars->line_speed == ELINK_SPEED_20000)
1201                         min_w_val = ELINK_ETS_E3B0_NIG_MIN_W_VAL_20GBPS;
1202                 else
1203                         min_w_val = ELINK_ETS_E3B0_NIG_MIN_W_VAL_UP_TO_10GBPS;
1204         } else
1205                 min_w_val = ELINK_ETS_E3B0_NIG_MIN_W_VAL_20GBPS;
1206         /* If the link isn't up (static configuration for example ) The
1207          * link will be according to 20GBPS.
1208          */
1209         return min_w_val;
1210 }
1211 /******************************************************************************
1212 * Description:
1213 *       Getting credit upper bound form min_w_val.
1214 *.
1215 ******************************************************************************/
1216 static uint32_t elink_ets_get_credit_upper_bound(const uint32_t min_w_val)
1217 {
1218         const uint32_t credit_upper_bound = (uint32_t)ELINK_MAXVAL((150 * min_w_val),
1219                                                 ELINK_MAX_PACKET_SIZE);
1220         return credit_upper_bound;
1221 }
1222 /******************************************************************************
1223 * Description:
1224 *       Set credit upper bound for NIG.
1225 *.
1226 ******************************************************************************/
1227 static void elink_ets_e3b0_set_credit_upper_bound_nig(
1228         const struct elink_params *params,
1229         const uint32_t min_w_val)
1230 {
1231         struct bxe_adapter *sc = params->sc;
1232         const uint8_t port = params->port;
1233         const uint32_t credit_upper_bound =
1234             elink_ets_get_credit_upper_bound(min_w_val);
1235
1236         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_0 :
1237                 NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_0, credit_upper_bound);
1238         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_1 :
1239                    NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_1, credit_upper_bound);
1240         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_2 :
1241                    NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_2, credit_upper_bound);
1242         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_3 :
1243                    NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_3, credit_upper_bound);
1244         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_4 :
1245                    NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_4, credit_upper_bound);
1246         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_UPPER_BOUND_5 :
1247                    NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_5, credit_upper_bound);
1248
1249         if (!port) {
1250                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_6,
1251                         credit_upper_bound);
1252                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_7,
1253                         credit_upper_bound);
1254                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_8,
1255                         credit_upper_bound);
1256         }
1257 }
1258 /******************************************************************************
1259 * Description:
1260 *       Will return the NIG ETS registers to init values.Except
1261 *       credit_upper_bound.
1262 *       That isn't used in this configuration (No WFQ is enabled) and will be
1263 *       configured acording to spec
1264 *.
1265 ******************************************************************************/
1266 static void elink_ets_e3b0_nig_disabled(const struct elink_params *params,
1267                                         const struct elink_vars *vars)
1268 {
1269         struct bxe_adapter *sc = params->sc;
1270         const uint8_t port = params->port;
1271         const uint32_t min_w_val = elink_ets_get_min_w_val_nig(vars);
1272         /* Mapping between entry  priority to client number (0,1,2 -debug and
1273          * management clients, 3 - COS0 client, 4 - COS1, ... 8 -
1274          * COS5)(HIGHEST) 4bits client num.TODO_ETS - Should be done by
1275          * reset value or init tool
1276          */
1277         if (port) {
1278                 REG_WR(sc, NIG_REG_P1_TX_ARB_PRIORITY_CLIENT2_LSB, 0x543210);
1279                 REG_WR(sc, NIG_REG_P1_TX_ARB_PRIORITY_CLIENT2_MSB, 0x0);
1280         } else {
1281                 REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_LSB, 0x76543210);
1282                 REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_MSB, 0x8);
1283         }
1284         /* For strict priority entries defines the number of consecutive
1285          * slots for the highest priority.
1286          */
1287         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_NUM_STRICT_ARB_SLOTS :
1288                    NIG_REG_P1_TX_ARB_NUM_STRICT_ARB_SLOTS, 0x100);
1289         /* Mapping between the CREDIT_WEIGHT registers and actual client
1290          * numbers
1291          */
1292         if (port) {
1293                 /*Port 1 has 6 COS*/
1294                 REG_WR(sc, NIG_REG_P1_TX_ARB_CLIENT_CREDIT_MAP2_LSB, 0x210543);
1295                 REG_WR(sc, NIG_REG_P1_TX_ARB_CLIENT_CREDIT_MAP2_MSB, 0x0);
1296         } else {
1297                 /*Port 0 has 9 COS*/
1298                 REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_CREDIT_MAP2_LSB,
1299                        0x43210876);
1300                 REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_CREDIT_MAP2_MSB, 0x5);
1301         }
1302
1303         /* Bitmap of 5bits length. Each bit specifies whether the entry behaves
1304          * as strict.  Bits 0,1,2 - debug and management entries, 3 -
1305          * COS0 entry, 4 - COS1 entry.
1306          * COS1 | COS0 | DEBUG1 | DEBUG0 | MGMT
1307          * bit4   bit3    bit2   bit1     bit0
1308          * MCP and debug are strict
1309          */
1310         if (port)
1311                 REG_WR(sc, NIG_REG_P1_TX_ARB_CLIENT_IS_STRICT, 0x3f);
1312         else
1313                 REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_STRICT, 0x1ff);
1314         /* defines which entries (clients) are subjected to WFQ arbitration */
1315         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CLIENT_IS_SUBJECT2WFQ :
1316                    NIG_REG_P0_TX_ARB_CLIENT_IS_SUBJECT2WFQ, 0);
1317
1318         /* Please notice the register address are note continuous and a
1319          * for here is note appropriate.In 2 port mode port0 only COS0-5
1320          * can be used. DEBUG1,DEBUG1,MGMT are never used for WFQ* In 4
1321          * port mode port1 only COS0-2 can be used. DEBUG1,DEBUG1,MGMT
1322          * are never used for WFQ
1323          */
1324         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_0 :
1325                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_0, 0x0);
1326         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_1 :
1327                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_1, 0x0);
1328         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_2 :
1329                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_2, 0x0);
1330         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_3 :
1331                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_3, 0x0);
1332         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_4 :
1333                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_4, 0x0);
1334         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_5 :
1335                    NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_5, 0x0);
1336         if (!port) {
1337                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_6, 0x0);
1338                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_7, 0x0);
1339                 REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_8, 0x0);
1340         }
1341
1342         elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val);
1343 }
1344 /******************************************************************************
1345 * Description:
1346 *       Set credit upper bound for PBF.
1347 *.
1348 ******************************************************************************/
1349 static void elink_ets_e3b0_set_credit_upper_bound_pbf(
1350         const struct elink_params *params,
1351         const uint32_t min_w_val)
1352 {
1353         struct bxe_adapter *sc = params->sc;
1354         const uint32_t credit_upper_bound =
1355             elink_ets_get_credit_upper_bound(min_w_val);
1356         const uint8_t port = params->port;
1357         uint32_t base_upper_bound = 0;
1358         uint8_t max_cos = 0;
1359         uint8_t i = 0;
1360         /* In 2 port mode port0 has COS0-5 that can be used for WFQ.In 4
1361          * port mode port1 has COS0-2 that can be used for WFQ.
1362          */
1363         if (!port) {
1364                 base_upper_bound = PBF_REG_COS0_UPPER_BOUND_P0;
1365                 max_cos = ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0;
1366         } else {
1367                 base_upper_bound = PBF_REG_COS0_UPPER_BOUND_P1;
1368                 max_cos = ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1;
1369         }
1370
1371         for (i = 0; i < max_cos; i++)
1372                 REG_WR(sc, base_upper_bound + (i << 2), credit_upper_bound);
1373 }
1374
1375 /******************************************************************************
1376 * Description:
1377 *       Will return the PBF ETS registers to init values.Except
1378 *       credit_upper_bound.
1379 *       That isn't used in this configuration (No WFQ is enabled) and will be
1380 *       configured acording to spec
1381 *.
1382 ******************************************************************************/
1383 static void elink_ets_e3b0_pbf_disabled(const struct elink_params *params)
1384 {
1385         struct bxe_adapter *sc = params->sc;
1386         const uint8_t port = params->port;
1387         const uint32_t min_w_val_pbf = ELINK_ETS_E3B0_PBF_MIN_W_VAL;
1388         uint8_t i = 0;
1389         uint32_t base_weight = 0;
1390         uint8_t max_cos = 0;
1391
1392         /* Mapping between entry  priority to client number 0 - COS0
1393          * client, 2 - COS1, ... 5 - COS5)(HIGHEST) 4bits client num.
1394          * TODO_ETS - Should be done by reset value or init tool
1395          */
1396         if (port)
1397                 /*  0x688 (|011|0 10|00 1|000) */
1398                 REG_WR(sc, PBF_REG_ETS_ARB_PRIORITY_CLIENT_P1 , 0x688);
1399         else
1400                 /*  (10 1|100 |011|0 10|00 1|000) */
1401                 REG_WR(sc, PBF_REG_ETS_ARB_PRIORITY_CLIENT_P0 , 0x2C688);
1402
1403         /* TODO_ETS - Should be done by reset value or init tool */
1404         if (port)
1405                 /* 0x688 (|011|0 10|00 1|000)*/
1406                 REG_WR(sc, PBF_REG_ETS_ARB_CLIENT_CREDIT_MAP_P1, 0x688);
1407         else
1408         /* 0x2C688 (10 1|100 |011|0 10|00 1|000) */
1409         REG_WR(sc, PBF_REG_ETS_ARB_CLIENT_CREDIT_MAP_P0, 0x2C688);
1410
1411         REG_WR(sc, (port) ? PBF_REG_ETS_ARB_NUM_STRICT_ARB_SLOTS_P1 :
1412                    PBF_REG_ETS_ARB_NUM_STRICT_ARB_SLOTS_P0 , 0x100);
1413
1414
1415         REG_WR(sc, (port) ? PBF_REG_ETS_ARB_CLIENT_IS_STRICT_P1 :
1416                    PBF_REG_ETS_ARB_CLIENT_IS_STRICT_P0 , 0);
1417
1418         REG_WR(sc, (port) ? PBF_REG_ETS_ARB_CLIENT_IS_SUBJECT2WFQ_P1 :
1419                    PBF_REG_ETS_ARB_CLIENT_IS_SUBJECT2WFQ_P0 , 0);
1420         /* In 2 port mode port0 has COS0-5 that can be used for WFQ.
1421          * In 4 port mode port1 has COS0-2 that can be used for WFQ.
1422          */
1423         if (!port) {
1424                 base_weight = PBF_REG_COS0_WEIGHT_P0;
1425                 max_cos = ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0;
1426         } else {
1427                 base_weight = PBF_REG_COS0_WEIGHT_P1;
1428                 max_cos = ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1;
1429         }
1430
1431         for (i = 0; i < max_cos; i++)
1432                 REG_WR(sc, base_weight + (0x4 * i), 0);
1433
1434         elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf);
1435 }
1436 /******************************************************************************
1437 * Description:
1438 *       E3B0 disable will return basicly the values to init values.
1439 *.
1440 ******************************************************************************/
1441 static elink_status_t elink_ets_e3b0_disabled(const struct elink_params *params,
1442                                    const struct elink_vars *vars)
1443 {
1444         struct bxe_adapter *sc = params->sc;
1445
1446         if (!CHIP_IS_E3B0(sc)) {
1447                 ELINK_DEBUG_P0(sc,
1448                    "elink_ets_e3b0_disabled the chip isn't E3B0\n");
1449                 return ELINK_STATUS_ERROR;
1450         }
1451
1452         elink_ets_e3b0_nig_disabled(params, vars);
1453
1454         elink_ets_e3b0_pbf_disabled(params);
1455
1456         return ELINK_STATUS_OK;
1457 }
1458
1459 /******************************************************************************
1460 * Description:
1461 *       Disable will return basicly the values to init values.
1462 *
1463 ******************************************************************************/
1464 elink_status_t elink_ets_disabled(struct elink_params *params,
1465                       struct elink_vars *vars)
1466 {
1467         struct bxe_adapter *sc = params->sc;
1468         elink_status_t elink_status = ELINK_STATUS_OK;
1469
1470         if ((CHIP_IS_E2(sc)) || (CHIP_IS_E3A0(sc)))
1471                 elink_ets_e2e3a0_disabled(params);
1472         else if (CHIP_IS_E3B0(sc))
1473                 elink_status = elink_ets_e3b0_disabled(params, vars);
1474         else {
1475                 ELINK_DEBUG_P0(sc, "elink_ets_disabled - chip not supported\n");
1476                 return ELINK_STATUS_ERROR;
1477         }
1478
1479         return elink_status;
1480 }
1481
1482 /******************************************************************************
1483 * Description
1484 *       Set the COS mappimg to SP and BW until this point all the COS are not
1485 *       set as SP or BW.
1486 ******************************************************************************/
1487 static elink_status_t elink_ets_e3b0_cli_map(const struct elink_params *params,
1488                                   const struct elink_ets_params *ets_params,
1489                                   const uint8_t cos_sp_bitmap,
1490                                   const uint8_t cos_bw_bitmap)
1491 {
1492         struct bxe_adapter *sc = params->sc;
1493         const uint8_t port = params->port;
1494         const uint8_t nig_cli_sp_bitmap = 0x7 | (cos_sp_bitmap << 3);
1495         const uint8_t pbf_cli_sp_bitmap = cos_sp_bitmap;
1496         const uint8_t nig_cli_subject2wfq_bitmap = cos_bw_bitmap << 3;
1497         const uint8_t pbf_cli_subject2wfq_bitmap = cos_bw_bitmap;
1498
1499         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CLIENT_IS_STRICT :
1500                NIG_REG_P0_TX_ARB_CLIENT_IS_STRICT, nig_cli_sp_bitmap);
1501
1502         REG_WR(sc, (port) ? PBF_REG_ETS_ARB_CLIENT_IS_STRICT_P1 :
1503                PBF_REG_ETS_ARB_CLIENT_IS_STRICT_P0 , pbf_cli_sp_bitmap);
1504
1505         REG_WR(sc, (port) ? NIG_REG_P1_TX_ARB_CLIENT_IS_SUBJECT2WFQ :
1506                NIG_REG_P0_TX_ARB_CLIENT_IS_SUBJECT2WFQ,
1507                nig_cli_subject2wfq_bitmap);
1508
1509         REG_WR(sc, (port) ? PBF_REG_ETS_ARB_CLIENT_IS_SUBJECT2WFQ_P1 :
1510                PBF_REG_ETS_ARB_CLIENT_IS_SUBJECT2WFQ_P0,
1511                pbf_cli_subject2wfq_bitmap);
1512
1513         return ELINK_STATUS_OK;
1514 }
1515
1516 /******************************************************************************
1517 * Description:
1518 *       This function is needed because NIG ARB_CREDIT_WEIGHT_X are
1519 *       not continues and ARB_CREDIT_WEIGHT_0 + offset is suitable.
1520 ******************************************************************************/
1521 static elink_status_t elink_ets_e3b0_set_cos_bw(struct bxe_adapter *sc,
1522                                      const uint8_t cos_entry,
1523                                      const uint32_t min_w_val_nig,
1524                                      const uint32_t min_w_val_pbf,
1525                                      const uint16_t total_bw,
1526                                      const uint8_t bw,
1527                                      const uint8_t port)
1528 {
1529         uint32_t nig_reg_adress_crd_weight = 0;
1530         uint32_t pbf_reg_adress_crd_weight = 0;
1531         /* Calculate and set BW for this COS - use 1 instead of 0 for BW */
1532         const uint32_t cos_bw_nig = ((bw ? bw : 1) * min_w_val_nig) / total_bw;
1533         const uint32_t cos_bw_pbf = ((bw ? bw : 1) * min_w_val_pbf) / total_bw;
1534
1535         switch (cos_entry) {
1536         case 0:
1537             nig_reg_adress_crd_weight =
1538                  (port) ? NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_0 :
1539                      NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_0;
1540              pbf_reg_adress_crd_weight = (port) ?
1541                  PBF_REG_COS0_WEIGHT_P1 : PBF_REG_COS0_WEIGHT_P0;
1542              break;
1543         case 1:
1544              nig_reg_adress_crd_weight = (port) ?
1545                  NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_1 :
1546                  NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_1;
1547              pbf_reg_adress_crd_weight = (port) ?
1548                  PBF_REG_COS1_WEIGHT_P1 : PBF_REG_COS1_WEIGHT_P0;
1549              break;
1550         case 2:
1551              nig_reg_adress_crd_weight = (port) ?
1552                  NIG_REG_P1_TX_ARB_CREDIT_WEIGHT_2 :
1553                  NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_2;
1554
1555                  pbf_reg_adress_crd_weight = (port) ?
1556                      PBF_REG_COS2_WEIGHT_P1 : PBF_REG_COS2_WEIGHT_P0;
1557              break;
1558         case 3:
1559             if (port)
1560                         return ELINK_STATUS_ERROR;
1561              nig_reg_adress_crd_weight =
1562                  NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_3;
1563              pbf_reg_adress_crd_weight =
1564                  PBF_REG_COS3_WEIGHT_P0;
1565              break;
1566         case 4:
1567             if (port)
1568                 return ELINK_STATUS_ERROR;
1569              nig_reg_adress_crd_weight =
1570                  NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_4;
1571              pbf_reg_adress_crd_weight = PBF_REG_COS4_WEIGHT_P0;
1572              break;
1573         case 5:
1574             if (port)
1575                 return ELINK_STATUS_ERROR;
1576              nig_reg_adress_crd_weight =
1577                  NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_5;
1578              pbf_reg_adress_crd_weight = PBF_REG_COS5_WEIGHT_P0;
1579              break;
1580         }
1581
1582         REG_WR(sc, nig_reg_adress_crd_weight, cos_bw_nig);
1583
1584         REG_WR(sc, pbf_reg_adress_crd_weight, cos_bw_pbf);
1585
1586         return ELINK_STATUS_OK;
1587 }
1588 /******************************************************************************
1589 * Description:
1590 *       Calculate the total BW.A value of 0 isn't legal.
1591 *
1592 ******************************************************************************/
1593 static elink_status_t elink_ets_e3b0_get_total_bw(
1594         const struct elink_params *params,
1595         struct elink_ets_params *ets_params,
1596         uint16_t *total_bw)
1597 {
1598         struct bxe_adapter *sc = params->sc;
1599         uint8_t cos_idx = 0;
1600         uint8_t is_bw_cos_exist = 0;
1601
1602         *total_bw = 0 ;
1603         /* Calculate total BW requested */
1604         for (cos_idx = 0; cos_idx < ets_params->num_of_cos; cos_idx++) {
1605                 if (ets_params->cos[cos_idx].state == elink_cos_state_bw) {
1606                         is_bw_cos_exist = 1;
1607                         if (!ets_params->cos[cos_idx].params.bw_params.bw) {
1608                                 ELINK_DEBUG_P0(sc, "elink_ets_E3B0_config BW"
1609                                                    "was set to 0\n");
1610                                 /* This is to prevent a state when ramrods
1611                                  * can't be sent
1612                                  */
1613                                 ets_params->cos[cos_idx].params.bw_params.bw
1614                                          = 1;
1615                         }
1616                         *total_bw +=
1617                                 ets_params->cos[cos_idx].params.bw_params.bw;
1618                 }
1619         }
1620
1621         /* Check total BW is valid */
1622         if ((is_bw_cos_exist == 1) && (*total_bw != 100)) {
1623                 if (*total_bw == 0) {
1624                         ELINK_DEBUG_P0(sc,
1625                            "elink_ets_E3B0_config total BW shouldn't be 0\n");
1626                         return ELINK_STATUS_ERROR;
1627                 }
1628                 ELINK_DEBUG_P0(sc,
1629                    "elink_ets_E3B0_config total BW should be 100\n");
1630                 /* We can handle a case whre the BW isn't 100 this can happen
1631                  * if the TC are joined.
1632                  */
1633         }
1634         return ELINK_STATUS_OK;
1635 }
1636
1637 /******************************************************************************
1638 * Description:
1639 *       Invalidate all the sp_pri_to_cos.
1640 *
1641 ******************************************************************************/
1642 static void elink_ets_e3b0_sp_pri_to_cos_init(uint8_t *sp_pri_to_cos)
1643 {
1644         uint8_t pri = 0;
1645         for (pri = 0; pri < ELINK_DCBX_MAX_NUM_COS; pri++)
1646                 sp_pri_to_cos[pri] = DCBX_INVALID_COS;
1647 }
1648 /******************************************************************************
1649 * Description:
1650 *       Calculate and set the SP (ARB_PRIORITY_CLIENT) NIG and PBF registers
1651 *       according to sp_pri_to_cos.
1652 *
1653 ******************************************************************************/
1654 static elink_status_t elink_ets_e3b0_sp_pri_to_cos_set(const struct elink_params *params,
1655                                             uint8_t *sp_pri_to_cos, const uint8_t pri,
1656                                             const uint8_t cos_entry)
1657 {
1658         struct bxe_adapter *sc = params->sc;
1659         const uint8_t port = params->port;
1660         const uint8_t max_num_of_cos = (port) ? ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1 :
1661                 ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0;
1662
1663         if (pri >= max_num_of_cos) {
1664                 ELINK_DEBUG_P0(sc, "elink_ets_e3b0_sp_pri_to_cos_set invalid "
1665                    "parameter Illegal strict priority\n");
1666             return ELINK_STATUS_ERROR;
1667         }
1668
1669         if (sp_pri_to_cos[pri] != DCBX_INVALID_COS) {
1670                 ELINK_DEBUG_P0(sc, "elink_ets_e3b0_sp_pri_to_cos_set invalid "
1671                                    "parameter There can't be two COS's with "
1672                                    "the same strict pri\n");
1673                 return ELINK_STATUS_ERROR;
1674         }
1675
1676         sp_pri_to_cos[pri] = cos_entry;
1677         return ELINK_STATUS_OK;
1678
1679 }
1680
1681 /******************************************************************************
1682 * Description:
1683 *       Returns the correct value according to COS and priority in
1684 *       the sp_pri_cli register.
1685 *
1686 ******************************************************************************/
1687 static uint64_t elink_e3b0_sp_get_pri_cli_reg(const uint8_t cos, const uint8_t cos_offset,
1688                                          const uint8_t pri_set,
1689                                          const uint8_t pri_offset,
1690                                          const uint8_t entry_size)
1691 {
1692         uint64_t pri_cli_nig = 0;
1693         pri_cli_nig = ((uint64_t)(cos + cos_offset)) << (entry_size *
1694                                                     (pri_set + pri_offset));
1695
1696         return pri_cli_nig;
1697 }
1698 /******************************************************************************
1699 * Description:
1700 *       Returns the correct value according to COS and priority in the
1701 *       sp_pri_cli register for NIG.
1702 *
1703 ******************************************************************************/
1704 static uint64_t elink_e3b0_sp_get_pri_cli_reg_nig(const uint8_t cos, const uint8_t pri_set)
1705 {
1706         /* MCP Dbg0 and dbg1 are always with higher strict pri*/
1707         const uint8_t nig_cos_offset = 3;
1708         const uint8_t nig_pri_offset = 3;
1709
1710         return elink_e3b0_sp_get_pri_cli_reg(cos, nig_cos_offset, pri_set,
1711                 nig_pri_offset, 4);
1712
1713 }
1714 /******************************************************************************
1715 * Description:
1716 *       Returns the correct value according to COS and priority in the
1717 *       sp_pri_cli register for PBF.
1718 *
1719 ******************************************************************************/
1720 static uint64_t elink_e3b0_sp_get_pri_cli_reg_pbf(const uint8_t cos, const uint8_t pri_set)
1721 {
1722         const uint8_t pbf_cos_offset = 0;
1723         const uint8_t pbf_pri_offset = 0;
1724
1725         return elink_e3b0_sp_get_pri_cli_reg(cos, pbf_cos_offset, pri_set,
1726                 pbf_pri_offset, 3);
1727
1728 }
1729
1730 /******************************************************************************
1731 * Description:
1732 *       Calculate and set the SP (ARB_PRIORITY_CLIENT) NIG and PBF registers
1733 *       according to sp_pri_to_cos.(which COS has higher priority)
1734 *
1735 ******************************************************************************/
1736 static elink_status_t elink_ets_e3b0_sp_set_pri_cli_reg(const struct elink_params *params,
1737                                              uint8_t *sp_pri_to_cos)
1738 {
1739         struct bxe_adapter *sc = params->sc;
1740         uint8_t i = 0;
1741         const uint8_t port = params->port;
1742         /* MCP Dbg0 and dbg1 are always with higher strict pri*/
1743         uint64_t pri_cli_nig = 0x210;
1744         uint32_t pri_cli_pbf = 0x0;
1745         uint8_t pri_set = 0;
1746         uint8_t pri_bitmask = 0;
1747         const uint8_t max_num_of_cos = (port) ? ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1 :
1748                 ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0;
1749
1750         uint8_t cos_bit_to_set = (1 << max_num_of_cos) - 1;
1751
1752         /* Set all the strict priority first */
1753         for (i = 0; i < max_num_of_cos; i++) {
1754                 if (sp_pri_to_cos[i] != DCBX_INVALID_COS) {
1755                         if (sp_pri_to_cos[i] >= ELINK_DCBX_MAX_NUM_COS) {
1756                                 ELINK_DEBUG_P0(sc,
1757                                            "elink_ets_e3b0_sp_set_pri_cli_reg "
1758                                            "invalid cos entry\n");
1759                                 return ELINK_STATUS_ERROR;
1760                         }
1761
1762                         pri_cli_nig |= elink_e3b0_sp_get_pri_cli_reg_nig(
1763                             sp_pri_to_cos[i], pri_set);
1764
1765                         pri_cli_pbf |= elink_e3b0_sp_get_pri_cli_reg_pbf(
1766                             sp_pri_to_cos[i], pri_set);
1767                         pri_bitmask = 1 << sp_pri_to_cos[i];
1768                         /* COS is used remove it from bitmap.*/
1769                         if (!(pri_bitmask & cos_bit_to_set)) {
1770                                 ELINK_DEBUG_P0(sc,
1771                                         "elink_ets_e3b0_sp_set_pri_cli_reg "
1772                                         "invalid There can't be two COS's with"
1773                                         " the same strict pri\n");
1774                                 return ELINK_STATUS_ERROR;
1775                         }
1776                         cos_bit_to_set &= ~pri_bitmask;
1777                         pri_set++;
1778                 }
1779         }
1780
1781         /* Set all the Non strict priority i= COS*/
1782         for (i = 0; i < max_num_of_cos; i++) {
1783                 pri_bitmask = 1 << i;
1784                 /* Check if COS was already used for SP */
1785                 if (pri_bitmask & cos_bit_to_set) {
1786                         /* COS wasn't used for SP */
1787                         pri_cli_nig |= elink_e3b0_sp_get_pri_cli_reg_nig(
1788                             i, pri_set);
1789
1790                         pri_cli_pbf |= elink_e3b0_sp_get_pri_cli_reg_pbf(
1791                             i, pri_set);
1792                         /* COS is used remove it from bitmap.*/
1793                         cos_bit_to_set &= ~pri_bitmask;
1794                         pri_set++;
1795                 }
1796         }
1797
1798         if (pri_set != max_num_of_cos) {
1799                 ELINK_DEBUG_P0(sc, "elink_ets_e3b0_sp_set_pri_cli_reg not all "
1800                                    "entries were set\n");
1801                 return ELINK_STATUS_ERROR;
1802         }
1803
1804         if (port) {
1805                 /* Only 6 usable clients*/
1806                 REG_WR(sc, NIG_REG_P1_TX_ARB_PRIORITY_CLIENT2_LSB,
1807                        (uint32_t)pri_cli_nig);
1808
1809                 REG_WR(sc, PBF_REG_ETS_ARB_PRIORITY_CLIENT_P1 , pri_cli_pbf);
1810         } else {
1811                 /* Only 9 usable clients*/
1812                 const uint32_t pri_cli_nig_lsb = (uint32_t) (pri_cli_nig);
1813                 const uint32_t pri_cli_nig_msb = (uint32_t) ((pri_cli_nig >> 32) & 0xF);
1814
1815                 REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_LSB,
1816                        pri_cli_nig_lsb);
1817                 REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT2_MSB,
1818                        pri_cli_nig_msb);
1819
1820                 REG_WR(sc, PBF_REG_ETS_ARB_PRIORITY_CLIENT_P0 , pri_cli_pbf);
1821         }
1822         return ELINK_STATUS_OK;
1823 }
1824
1825 /******************************************************************************
1826 * Description:
1827 *       Configure the COS to ETS according to BW and SP settings.
1828 ******************************************************************************/
1829 elink_status_t elink_ets_e3b0_config(const struct elink_params *params,
1830                          const struct elink_vars *vars,
1831                          struct elink_ets_params *ets_params)
1832 {
1833         struct bxe_adapter *sc = params->sc;
1834         elink_status_t elink_status = ELINK_STATUS_OK;
1835         const uint8_t port = params->port;
1836         uint16_t total_bw = 0;
1837         const uint32_t min_w_val_nig = elink_ets_get_min_w_val_nig(vars);
1838         const uint32_t min_w_val_pbf = ELINK_ETS_E3B0_PBF_MIN_W_VAL;
1839         uint8_t cos_bw_bitmap = 0;
1840         uint8_t cos_sp_bitmap = 0;
1841         uint8_t sp_pri_to_cos[ELINK_DCBX_MAX_NUM_COS] = {0};
1842         const uint8_t max_num_of_cos = (port) ? ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1 :
1843                 ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0;
1844         uint8_t cos_entry = 0;
1845
1846         if (!CHIP_IS_E3B0(sc)) {
1847                 ELINK_DEBUG_P0(sc,
1848                    "elink_ets_e3b0_disabled the chip isn't E3B0\n");
1849                 return ELINK_STATUS_ERROR;
1850         }
1851
1852         if ((ets_params->num_of_cos > max_num_of_cos)) {
1853                 ELINK_DEBUG_P0(sc, "elink_ets_E3B0_config the number of COS "
1854                                    "isn't supported\n");
1855                 return ELINK_STATUS_ERROR;
1856         }
1857
1858         /* Prepare sp strict priority parameters*/
1859         elink_ets_e3b0_sp_pri_to_cos_init(sp_pri_to_cos);
1860
1861         /* Prepare BW parameters*/
1862         elink_status = elink_ets_e3b0_get_total_bw(params, ets_params,
1863                                                    &total_bw);
1864         if (elink_status != ELINK_STATUS_OK) {
1865                 ELINK_DEBUG_P0(sc,
1866                    "elink_ets_E3B0_config get_total_bw failed\n");
1867                 return ELINK_STATUS_ERROR;
1868         }
1869
1870         /* Upper bound is set according to current link speed (min_w_val
1871          * should be the same for upper bound and COS credit val).
1872          */
1873         elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val_nig);
1874         elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf);
1875
1876
1877         for (cos_entry = 0; cos_entry < ets_params->num_of_cos; cos_entry++) {
1878                 if (elink_cos_state_bw == ets_params->cos[cos_entry].state) {
1879                         cos_bw_bitmap |= (1 << cos_entry);
1880                         /* The function also sets the BW in HW(not the mappin
1881                          * yet)
1882                          */
1883                         elink_status = elink_ets_e3b0_set_cos_bw(
1884                                 sc, cos_entry, min_w_val_nig, min_w_val_pbf,
1885                                 total_bw,
1886                                 ets_params->cos[cos_entry].params.bw_params.bw,
1887                                  port);
1888                 } else if (elink_cos_state_strict ==
1889                         ets_params->cos[cos_entry].state){
1890                         cos_sp_bitmap |= (1 << cos_entry);
1891
1892                         elink_status = elink_ets_e3b0_sp_pri_to_cos_set(
1893                                 params,
1894                                 sp_pri_to_cos,
1895                                 ets_params->cos[cos_entry].params.sp_params.pri,
1896                                 cos_entry);
1897
1898                 } else {
1899                         ELINK_DEBUG_P0(sc,
1900                            "elink_ets_e3b0_config cos state not valid\n");
1901                         return ELINK_STATUS_ERROR;
1902                 }
1903                 if (elink_status != ELINK_STATUS_OK) {
1904                         ELINK_DEBUG_P0(sc,
1905                            "elink_ets_e3b0_config set cos bw failed\n");
1906                         return elink_status;
1907                 }
1908         }
1909
1910         /* Set SP register (which COS has higher priority) */
1911         elink_status = elink_ets_e3b0_sp_set_pri_cli_reg(params,
1912                                                          sp_pri_to_cos);
1913
1914         if (elink_status != ELINK_STATUS_OK) {
1915                 ELINK_DEBUG_P0(sc,
1916                    "elink_ets_E3B0_config set_pri_cli_reg failed\n");
1917                 return elink_status;
1918         }
1919
1920         /* Set client mapping of BW and strict */
1921         elink_status = elink_ets_e3b0_cli_map(params, ets_params,
1922                                               cos_sp_bitmap,
1923                                               cos_bw_bitmap);
1924
1925         if (elink_status != ELINK_STATUS_OK) {
1926                 ELINK_DEBUG_P0(sc, "elink_ets_E3B0_config SP failed\n");
1927                 return elink_status;
1928         }
1929         return ELINK_STATUS_OK;
1930 }
1931 static void elink_ets_bw_limit_common(const struct elink_params *params)
1932 {
1933         /* ETS disabled configuration */
1934         struct bxe_adapter *sc = params->sc;
1935         ELINK_DEBUG_P0(sc, "ETS enabled BW limit configuration\n");
1936         /* Defines which entries (clients) are subjected to WFQ arbitration
1937          * COS0 0x8
1938          * COS1 0x10
1939          */
1940         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_SUBJECT2WFQ, 0x18);
1941         /* Mapping between the ARB_CREDIT_WEIGHT registers and actual
1942          * client numbers (WEIGHT_0 does not actually have to represent
1943          * client 0)
1944          *    PRI4    |    PRI3    |    PRI2    |    PRI1    |    PRI0
1945          *  cos1-001     cos0-000     dbg1-100     dbg0-011     MCP-010
1946          */
1947         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_CREDIT_MAP, 0x111A);
1948
1949         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_0,
1950                ELINK_ETS_BW_LIMIT_CREDIT_UPPER_BOUND);
1951         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_UPPER_BOUND_1,
1952                ELINK_ETS_BW_LIMIT_CREDIT_UPPER_BOUND);
1953
1954         /* ETS mode enabled*/
1955         REG_WR(sc, PBF_REG_ETS_ENABLED, 1);
1956
1957         /* Defines the number of consecutive slots for the strict priority */
1958         REG_WR(sc, PBF_REG_NUM_STRICT_ARB_SLOTS, 0);
1959         /* Bitmap of 5bits length. Each bit specifies whether the entry behaves
1960          * as strict.  Bits 0,1,2 - debug and management entries, 3 - COS0
1961          * entry, 4 - COS1 entry.
1962          * COS1 | COS0 | DEBUG21 | DEBUG0 | MGMT
1963          * bit4   bit3    bit2     bit1    bit0
1964          * MCP and debug are strict
1965          */
1966         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_STRICT, 0x7);
1967
1968         /* Upper bound that COS0_WEIGHT can reach in the WFQ arbiter.*/
1969         REG_WR(sc, PBF_REG_COS0_UPPER_BOUND,
1970                ELINK_ETS_BW_LIMIT_CREDIT_UPPER_BOUND);
1971         REG_WR(sc, PBF_REG_COS1_UPPER_BOUND,
1972                ELINK_ETS_BW_LIMIT_CREDIT_UPPER_BOUND);
1973 }
1974
1975 void elink_ets_bw_limit(const struct elink_params *params, const uint32_t cos0_bw,
1976                         const uint32_t cos1_bw)
1977 {
1978         /* ETS disabled configuration*/
1979         struct bxe_adapter *sc = params->sc;
1980         const uint32_t total_bw = cos0_bw + cos1_bw;
1981         uint32_t cos0_credit_weight = 0;
1982         uint32_t cos1_credit_weight = 0;
1983
1984         ELINK_DEBUG_P0(sc, "ETS enabled BW limit configuration\n");
1985
1986         if ((!total_bw) ||
1987             (!cos0_bw) ||
1988             (!cos1_bw)) {
1989                 ELINK_DEBUG_P0(sc, "Total BW can't be zero\n");
1990                 return;
1991         }
1992
1993         cos0_credit_weight = (cos0_bw * ELINK_ETS_BW_LIMIT_CREDIT_WEIGHT)/
1994                 total_bw;
1995         cos1_credit_weight = (cos1_bw * ELINK_ETS_BW_LIMIT_CREDIT_WEIGHT)/
1996                 total_bw;
1997
1998         elink_ets_bw_limit_common(params);
1999
2000         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_0, cos0_credit_weight);
2001         REG_WR(sc, NIG_REG_P0_TX_ARB_CREDIT_WEIGHT_1, cos1_credit_weight);
2002
2003         REG_WR(sc, PBF_REG_COS0_WEIGHT, cos0_credit_weight);
2004         REG_WR(sc, PBF_REG_COS1_WEIGHT, cos1_credit_weight);
2005 }
2006
2007 elink_status_t elink_ets_strict(const struct elink_params *params, const uint8_t strict_cos)
2008 {
2009         /* ETS disabled configuration*/
2010         struct bxe_adapter *sc = params->sc;
2011         uint32_t val    = 0;
2012
2013         ELINK_DEBUG_P0(sc, "ETS enabled strict configuration\n");
2014         /* Bitmap of 5bits length. Each bit specifies whether the entry behaves
2015          * as strict.  Bits 0,1,2 - debug and management entries,
2016          * 3 - COS0 entry, 4 - COS1 entry.
2017          *  COS1 | COS0 | DEBUG21 | DEBUG0 | MGMT
2018          *  bit4   bit3   bit2      bit1     bit0
2019          * MCP and debug are strict
2020          */
2021         REG_WR(sc, NIG_REG_P0_TX_ARB_CLIENT_IS_STRICT, 0x1F);
2022         /* For strict priority entries defines the number of consecutive slots
2023          * for the highest priority.
2024          */
2025         REG_WR(sc, NIG_REG_P0_TX_ARB_NUM_STRICT_ARB_SLOTS, 0x100);
2026         /* ETS mode disable */
2027         REG_WR(sc, PBF_REG_ETS_ENABLED, 0);
2028         /* Defines the number of consecutive slots for the strict priority */
2029         REG_WR(sc, PBF_REG_NUM_STRICT_ARB_SLOTS, 0x100);
2030
2031         /* Defines the number of consecutive slots for the strict priority */
2032         REG_WR(sc, PBF_REG_HIGH_PRIORITY_COS_NUM, strict_cos);
2033
2034         /* Mapping between entry  priority to client number (0,1,2 -debug and
2035          * management clients, 3 - COS0 client, 4 - COS client)(HIGHEST)
2036          * 3bits client num.
2037          *   PRI4    |    PRI3    |    PRI2    |    PRI1    |    PRI0
2038          * dbg0-010     dbg1-001     cos1-100     cos0-011     MCP-000
2039          * dbg0-010     dbg1-001     cos0-011     cos1-100     MCP-000
2040          */
2041         val = (!strict_cos) ? 0x2318 : 0x22E0;
2042         REG_WR(sc, NIG_REG_P0_TX_ARB_PRIORITY_CLIENT, val);
2043
2044         return ELINK_STATUS_OK;
2045 }
2046
2047 /******************************************************************/
2048 /*                      PFC section                               */
2049 /******************************************************************/
2050 static void elink_update_pfc_xmac(struct elink_params *params,
2051                                   struct elink_vars *vars,
2052                                   uint8_t is_lb)
2053 {
2054         struct bxe_adapter *sc = params->sc;
2055         uint32_t xmac_base;
2056         uint32_t pause_val, pfc0_val, pfc1_val;
2057
2058         /* XMAC base adrr */
2059         xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
2060
2061         /* Initialize pause and pfc registers */
2062         pause_val = 0x18000;
2063         pfc0_val = 0xFFFF8000;
2064         pfc1_val = 0x2;
2065
2066         /* No PFC support */
2067         if (!(params->feature_config_flags &
2068               ELINK_FEATURE_CONFIG_PFC_ENABLED)) {
2069
2070                 /* RX flow control - Process pause frame in receive direction
2071                  */
2072                 if (vars->flow_ctrl & ELINK_FLOW_CTRL_RX)
2073                         pause_val |= XMAC_PAUSE_CTRL_REG_RX_PAUSE_EN;
2074
2075                 /* TX flow control - Send pause packet when buffer is full */
2076                 if (vars->flow_ctrl & ELINK_FLOW_CTRL_TX)
2077                         pause_val |= XMAC_PAUSE_CTRL_REG_TX_PAUSE_EN;
2078         } else {/* PFC support */
2079                 pfc1_val |= XMAC_PFC_CTRL_HI_REG_PFC_REFRESH_EN |
2080                         XMAC_PFC_CTRL_HI_REG_PFC_STATS_EN |
2081                         XMAC_PFC_CTRL_HI_REG_RX_PFC_EN |
2082                         XMAC_PFC_CTRL_HI_REG_TX_PFC_EN |
2083                         XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON;
2084                 /* Write pause and PFC registers */
2085                 REG_WR(sc, xmac_base + XMAC_REG_PAUSE_CTRL, pause_val);
2086                 REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL, pfc0_val);
2087                 REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL_HI, pfc1_val);
2088                 pfc1_val &= ~XMAC_PFC_CTRL_HI_REG_FORCE_PFC_XON;
2089
2090         }
2091
2092         /* Write pause and PFC registers */
2093         REG_WR(sc, xmac_base + XMAC_REG_PAUSE_CTRL, pause_val);
2094         REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL, pfc0_val);
2095         REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL_HI, pfc1_val);
2096
2097
2098         /* Set MAC address for source TX Pause/PFC frames */
2099         REG_WR(sc, xmac_base + XMAC_REG_CTRL_SA_LO,
2100                ((params->mac_addr[2] << 24) |
2101                 (params->mac_addr[3] << 16) |
2102                 (params->mac_addr[4] << 8) |
2103                 (params->mac_addr[5])));
2104         REG_WR(sc, xmac_base + XMAC_REG_CTRL_SA_HI,
2105                ((params->mac_addr[0] << 8) |
2106                 (params->mac_addr[1])));
2107
2108         DELAY(30);
2109 }
2110
2111
2112 static void elink_emac_get_pfc_stat(struct elink_params *params,
2113                                     uint32_t pfc_frames_sent[2],
2114                                     uint32_t pfc_frames_received[2])
2115 {
2116         /* Read pfc statistic */
2117         struct bxe_adapter *sc = params->sc;
2118         uint32_t emac_base = params->port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
2119         uint32_t val_xon = 0;
2120         uint32_t val_xoff = 0;
2121
2122         ELINK_DEBUG_P0(sc, "pfc statistic read from EMAC\n");
2123
2124         /* PFC received frames */
2125         val_xoff = REG_RD(sc, emac_base +
2126                                 EMAC_REG_RX_PFC_STATS_XOFF_RCVD);
2127         val_xoff &= EMAC_REG_RX_PFC_STATS_XOFF_RCVD_COUNT;
2128         val_xon = REG_RD(sc, emac_base + EMAC_REG_RX_PFC_STATS_XON_RCVD);
2129         val_xon &= EMAC_REG_RX_PFC_STATS_XON_RCVD_COUNT;
2130
2131         pfc_frames_received[0] = val_xon + val_xoff;
2132
2133         /* PFC received sent */
2134         val_xoff = REG_RD(sc, emac_base +
2135                                 EMAC_REG_RX_PFC_STATS_XOFF_SENT);
2136         val_xoff &= EMAC_REG_RX_PFC_STATS_XOFF_SENT_COUNT;
2137         val_xon = REG_RD(sc, emac_base + EMAC_REG_RX_PFC_STATS_XON_SENT);
2138         val_xon &= EMAC_REG_RX_PFC_STATS_XON_SENT_COUNT;
2139
2140         pfc_frames_sent[0] = val_xon + val_xoff;
2141 }
2142
2143 /* Read pfc statistic*/
2144 void elink_pfc_statistic(struct elink_params *params, struct elink_vars *vars,
2145                          uint32_t pfc_frames_sent[2],
2146                          uint32_t pfc_frames_received[2])
2147 {
2148         /* Read pfc statistic */
2149         struct bxe_adapter *sc = params->sc;
2150
2151         ELINK_DEBUG_P0(sc, "pfc statistic\n");
2152
2153         if (!vars->link_up)
2154                 return;
2155
2156         if (vars->mac_type == ELINK_MAC_TYPE_EMAC) {
2157                 ELINK_DEBUG_P0(sc, "About to read PFC stats from EMAC\n");
2158                 elink_emac_get_pfc_stat(params, pfc_frames_sent,
2159                                         pfc_frames_received);
2160         }
2161 }
2162 /******************************************************************/
2163 /*                      MAC/PBF section                           */
2164 /******************************************************************/
2165 static void elink_set_mdio_clk(struct bxe_adapter *sc, uint32_t chip_id,
2166                                uint32_t emac_base)
2167 {
2168         uint32_t new_mode, cur_mode;
2169         uint32_t clc_cnt;
2170         /* Set clause 45 mode, slow down the MDIO clock to 2.5MHz
2171          * (a value of 49==0x31) and make sure that the AUTO poll is off
2172          */
2173         cur_mode = REG_RD(sc, emac_base + EMAC_REG_EMAC_MDIO_MODE);
2174
2175         if (USES_WARPCORE(sc))
2176                 clc_cnt = 74L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT;
2177         else
2178                 clc_cnt = 49L << EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT;
2179
2180         if (((cur_mode & EMAC_MDIO_MODE_CLOCK_CNT) == clc_cnt) &&
2181             (cur_mode & (EMAC_MDIO_MODE_CLAUSE_45)))
2182                 return;
2183
2184         new_mode = cur_mode &
2185                 ~(EMAC_MDIO_MODE_AUTO_POLL | EMAC_MDIO_MODE_CLOCK_CNT);
2186         new_mode |= clc_cnt;
2187         new_mode |= (EMAC_MDIO_MODE_CLAUSE_45);
2188
2189         ELINK_DEBUG_P2(sc, "Changing emac_mode from 0x%x to 0x%x\n",
2190            cur_mode, new_mode);
2191         REG_WR(sc, emac_base + EMAC_REG_EMAC_MDIO_MODE, new_mode);
2192         DELAY(40);
2193 }
2194
2195 static void elink_set_mdio_emac_per_phy(struct bxe_adapter *sc,
2196                                         struct elink_params *params)
2197 {
2198         uint8_t phy_index;
2199         /* Set mdio clock per phy */
2200         for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys;
2201               phy_index++)
2202                 elink_set_mdio_clk(sc, params->chip_id,
2203                                    params->phy[phy_index].mdio_ctrl);
2204 }
2205
2206 static uint8_t elink_is_4_port_mode(struct bxe_adapter *sc)
2207 {
2208         uint32_t port4mode_ovwr_val;
2209         /* Check 4-port override enabled */
2210         port4mode_ovwr_val = REG_RD(sc, MISC_REG_PORT4MODE_EN_OVWR);
2211         if (port4mode_ovwr_val & (1<<0)) {
2212                 /* Return 4-port mode override value */
2213                 return ((port4mode_ovwr_val & (1<<1)) == (1<<1));
2214         }
2215         /* Return 4-port mode from input pin */
2216         return (uint8_t)REG_RD(sc, MISC_REG_PORT4MODE_EN);
2217 }
2218
2219 static void elink_emac_init(struct elink_params *params,
2220                             struct elink_vars *vars)
2221 {
2222         /* reset and unreset the emac core */
2223         struct bxe_adapter *sc = params->sc;
2224         uint8_t port = params->port;
2225         uint32_t emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
2226         uint32_t val;
2227         uint16_t timeout;
2228
2229         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
2230                (MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE << port));
2231         DELAY(5);
2232         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
2233                (MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE << port));
2234
2235         /* init emac - use read-modify-write */
2236         /* self clear reset */
2237         val = REG_RD(sc, emac_base + EMAC_REG_EMAC_MODE);
2238         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_MODE, (val | EMAC_MODE_RESET));
2239
2240         timeout = 200;
2241         do {
2242                 val = REG_RD(sc, emac_base + EMAC_REG_EMAC_MODE);
2243                 ELINK_DEBUG_P1(sc, "EMAC reset reg is %u\n", val);
2244                 if (!timeout) {
2245                         ELINK_DEBUG_P0(sc, "EMAC timeout!\n");
2246                         return;
2247                 }
2248                 timeout--;
2249         } while (val & EMAC_MODE_RESET);
2250
2251         elink_set_mdio_emac_per_phy(sc, params);
2252         /* Set mac address */
2253         val = ((params->mac_addr[0] << 8) |
2254                 params->mac_addr[1]);
2255         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_MAC_MATCH, val);
2256
2257         val = ((params->mac_addr[2] << 24) |
2258                (params->mac_addr[3] << 16) |
2259                (params->mac_addr[4] << 8) |
2260                 params->mac_addr[5]);
2261         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_MAC_MATCH + 4, val);
2262 }
2263
2264 static void elink_set_xumac_nig(struct elink_params *params,
2265                                 uint16_t tx_pause_en,
2266                                 uint8_t enable)
2267 {
2268         struct bxe_adapter *sc = params->sc;
2269
2270         REG_WR(sc, params->port ? NIG_REG_P1_MAC_IN_EN : NIG_REG_P0_MAC_IN_EN,
2271                enable);
2272         REG_WR(sc, params->port ? NIG_REG_P1_MAC_OUT_EN : NIG_REG_P0_MAC_OUT_EN,
2273                enable);
2274         REG_WR(sc, params->port ? NIG_REG_P1_MAC_PAUSE_OUT_EN :
2275                NIG_REG_P0_MAC_PAUSE_OUT_EN, tx_pause_en);
2276 }
2277
2278 static void elink_set_umac_rxtx(struct elink_params *params, uint8_t en)
2279 {
2280         uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0;
2281         uint32_t val;
2282         struct bxe_adapter *sc = params->sc;
2283         if (!(REG_RD(sc, MISC_REG_RESET_REG_2) &
2284                    (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)))
2285                 return;
2286         val = REG_RD(sc, umac_base + UMAC_REG_COMMAND_CONFIG);
2287         if (en)
2288                 val |= (UMAC_COMMAND_CONFIG_REG_TX_ENA |
2289                         UMAC_COMMAND_CONFIG_REG_RX_ENA);
2290         else
2291                 val &= ~(UMAC_COMMAND_CONFIG_REG_TX_ENA |
2292                          UMAC_COMMAND_CONFIG_REG_RX_ENA);
2293         /* Disable RX and TX */
2294         REG_WR(sc, umac_base + UMAC_REG_COMMAND_CONFIG, val);
2295 }
2296
2297 static void elink_umac_enable(struct elink_params *params,
2298                             struct elink_vars *vars, uint8_t lb)
2299 {
2300         uint32_t val;
2301         uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0;
2302         struct bxe_adapter *sc = params->sc;
2303         /* Reset UMAC */
2304         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
2305                (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port));
2306         DELAY(1000 * 1);
2307
2308         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
2309                (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port));
2310
2311         ELINK_DEBUG_P0(sc, "enabling UMAC\n");
2312
2313         /* This register opens the gate for the UMAC despite its name */
2314         REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 1);
2315
2316         val = UMAC_COMMAND_CONFIG_REG_PROMIS_EN |
2317                 UMAC_COMMAND_CONFIG_REG_PAD_EN |
2318                 UMAC_COMMAND_CONFIG_REG_SW_RESET |
2319                 UMAC_COMMAND_CONFIG_REG_NO_LGTH_CHECK;
2320         switch (vars->line_speed) {
2321         case ELINK_SPEED_10:
2322                 val |= (0<<2);
2323                 break;
2324         case ELINK_SPEED_100:
2325                 val |= (1<<2);
2326                 break;
2327         case ELINK_SPEED_1000:
2328                 val |= (2<<2);
2329                 break;
2330         case ELINK_SPEED_2500:
2331                 val |= (3<<2);
2332                 break;
2333         default:
2334                 ELINK_DEBUG_P1(sc, "Invalid speed for UMAC %d\n",
2335                                vars->line_speed);
2336                 break;
2337         }
2338         if (!(vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
2339                 val |= UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE;
2340
2341         if (!(vars->flow_ctrl & ELINK_FLOW_CTRL_RX))
2342                 val |= UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE;
2343
2344         if (vars->duplex == DUPLEX_HALF)
2345                 val |= UMAC_COMMAND_CONFIG_REG_HD_ENA;
2346
2347         REG_WR(sc, umac_base + UMAC_REG_COMMAND_CONFIG, val);
2348         DELAY(50);
2349
2350         /* Configure UMAC for EEE */
2351         if (vars->eee_status & SHMEM_EEE_ADV_STATUS_MASK) {
2352                 ELINK_DEBUG_P0(sc, "configured UMAC for EEE\n");
2353                 REG_WR(sc, umac_base + UMAC_REG_UMAC_EEE_CTRL,
2354                        UMAC_UMAC_EEE_CTRL_REG_EEE_EN);
2355                 REG_WR(sc, umac_base + UMAC_REG_EEE_WAKE_TIMER, 0x11);
2356         } else {
2357                 REG_WR(sc, umac_base + UMAC_REG_UMAC_EEE_CTRL, 0x0);
2358         }
2359
2360         /* Set MAC address for source TX Pause/PFC frames (under SW reset) */
2361         REG_WR(sc, umac_base + UMAC_REG_MAC_ADDR0,
2362                ((params->mac_addr[2] << 24) |
2363                 (params->mac_addr[3] << 16) |
2364                 (params->mac_addr[4] << 8) |
2365                 (params->mac_addr[5])));
2366         REG_WR(sc, umac_base + UMAC_REG_MAC_ADDR1,
2367                ((params->mac_addr[0] << 8) |
2368                 (params->mac_addr[1])));
2369
2370         /* Enable RX and TX */
2371         val &= ~UMAC_COMMAND_CONFIG_REG_PAD_EN;
2372         val |= UMAC_COMMAND_CONFIG_REG_TX_ENA |
2373                 UMAC_COMMAND_CONFIG_REG_RX_ENA;
2374         REG_WR(sc, umac_base + UMAC_REG_COMMAND_CONFIG, val);
2375         DELAY(50);
2376
2377         /* Remove SW Reset */
2378         val &= ~UMAC_COMMAND_CONFIG_REG_SW_RESET;
2379
2380         /* Check loopback mode */
2381         if (lb)
2382                 val |= UMAC_COMMAND_CONFIG_REG_LOOP_ENA;
2383         REG_WR(sc, umac_base + UMAC_REG_COMMAND_CONFIG, val);
2384
2385         /* Maximum Frame Length (RW). Defines a 14-Bit maximum frame
2386          * length used by the MAC receive logic to check frames.
2387          */
2388         REG_WR(sc, umac_base + UMAC_REG_MAXFR, 0x2710);
2389         elink_set_xumac_nig(params,
2390                             ((vars->flow_ctrl & ELINK_FLOW_CTRL_TX) != 0), 1);
2391         vars->mac_type = ELINK_MAC_TYPE_UMAC;
2392
2393 }
2394
2395 /* Define the XMAC mode */
2396 static void elink_xmac_init(struct elink_params *params, uint32_t max_speed)
2397 {
2398         struct bxe_adapter *sc = params->sc;
2399         uint32_t is_port4mode = elink_is_4_port_mode(sc);
2400
2401         /* In 4-port mode, need to set the mode only once, so if XMAC is
2402          * already out of reset, it means the mode has already been set,
2403          * and it must not* reset the XMAC again, since it controls both
2404          * ports of the path
2405          */
2406
2407         if (((CHIP_NUM(sc) == CHIP_NUM_57840_4_10) ||
2408              (CHIP_NUM(sc) == CHIP_NUM_57840_2_20) ||
2409              (CHIP_NUM(sc) == CHIP_NUM_57840_OBS)) &&
2410             is_port4mode &&
2411             (REG_RD(sc, MISC_REG_RESET_REG_2) &
2412              MISC_REGISTERS_RESET_REG_2_XMAC)) {
2413                 ELINK_DEBUG_P0(sc,
2414                    "XMAC already out of reset in 4-port mode\n");
2415                 return;
2416         }
2417
2418         /* Hard reset */
2419         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
2420                MISC_REGISTERS_RESET_REG_2_XMAC);
2421         DELAY(1000 * 1);
2422
2423         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
2424                MISC_REGISTERS_RESET_REG_2_XMAC);
2425         if (is_port4mode) {
2426                 ELINK_DEBUG_P0(sc, "Init XMAC to 2 ports x 10G per path\n");
2427
2428                 /* Set the number of ports on the system side to up to 2 */
2429                 REG_WR(sc, MISC_REG_XMAC_CORE_PORT_MODE, 1);
2430
2431                 /* Set the number of ports on the Warp Core to 10G */
2432                 REG_WR(sc, MISC_REG_XMAC_PHY_PORT_MODE, 3);
2433         } else {
2434                 /* Set the number of ports on the system side to 1 */
2435                 REG_WR(sc, MISC_REG_XMAC_CORE_PORT_MODE, 0);
2436                 if (max_speed == ELINK_SPEED_10000) {
2437                         ELINK_DEBUG_P0(sc,
2438                            "Init XMAC to 10G x 1 port per path\n");
2439                         /* Set the number of ports on the Warp Core to 10G */
2440                         REG_WR(sc, MISC_REG_XMAC_PHY_PORT_MODE, 3);
2441                 } else {
2442                         ELINK_DEBUG_P0(sc,
2443                            "Init XMAC to 20G x 2 ports per path\n");
2444                         /* Set the number of ports on the Warp Core to 20G */
2445                         REG_WR(sc, MISC_REG_XMAC_PHY_PORT_MODE, 1);
2446                 }
2447         }
2448         /* Soft reset */
2449         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
2450                MISC_REGISTERS_RESET_REG_2_XMAC_SOFT);
2451         DELAY(1000 * 1);
2452
2453         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
2454                MISC_REGISTERS_RESET_REG_2_XMAC_SOFT);
2455
2456 }
2457
2458 static void elink_set_xmac_rxtx(struct elink_params *params, uint8_t en)
2459 {
2460         uint8_t port = params->port;
2461         struct bxe_adapter *sc = params->sc;
2462         uint32_t pfc_ctrl, xmac_base = (port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
2463         uint32_t val;
2464
2465         if (REG_RD(sc, MISC_REG_RESET_REG_2) &
2466             MISC_REGISTERS_RESET_REG_2_XMAC) {
2467                 /* Send an indication to change the state in the NIG back to XON
2468                  * Clearing this bit enables the next set of this bit to get
2469                  * rising edge
2470                  */
2471                 pfc_ctrl = REG_RD(sc, xmac_base + XMAC_REG_PFC_CTRL_HI);
2472                 REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL_HI,
2473                        (pfc_ctrl & ~(1<<1)));
2474                 REG_WR(sc, xmac_base + XMAC_REG_PFC_CTRL_HI,
2475                        (pfc_ctrl | (1<<1)));
2476                 ELINK_DEBUG_P1(sc, "Disable XMAC on port %x\n", port);
2477                 val = REG_RD(sc, xmac_base + XMAC_REG_CTRL);
2478                 if (en)
2479                         val |= (XMAC_CTRL_REG_TX_EN | XMAC_CTRL_REG_RX_EN);
2480                 else
2481                         val &= ~(XMAC_CTRL_REG_TX_EN | XMAC_CTRL_REG_RX_EN);
2482                 REG_WR(sc, xmac_base + XMAC_REG_CTRL, val);
2483         }
2484 }
2485
2486 static elink_status_t elink_xmac_enable(struct elink_params *params,
2487                              struct elink_vars *vars, uint8_t lb)
2488 {
2489         uint32_t val, xmac_base;
2490         struct bxe_adapter *sc = params->sc;
2491         ELINK_DEBUG_P0(sc, "enabling XMAC\n");
2492
2493         xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0;
2494
2495         elink_xmac_init(params, vars->line_speed);
2496
2497         /* This register determines on which events the MAC will assert
2498          * error on the i/f to the NIG along w/ EOP.
2499          */
2500
2501         /* This register tells the NIG whether to send traffic to UMAC
2502          * or XMAC
2503          */
2504         REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 0);
2505
2506         /* When XMAC is in XLGMII mode, disable sending idles for fault
2507          * detection.
2508          */
2509         if (!(params->phy[ELINK_INT_PHY].flags & ELINK_FLAGS_TX_ERROR_CHECK)) {
2510                 REG_WR(sc, xmac_base + XMAC_REG_RX_LSS_CTRL,
2511                        (XMAC_RX_LSS_CTRL_REG_LOCAL_FAULT_DISABLE |
2512                         XMAC_RX_LSS_CTRL_REG_REMOTE_FAULT_DISABLE));
2513                 REG_WR(sc, xmac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, 0);
2514                 REG_WR(sc, xmac_base + XMAC_REG_CLEAR_RX_LSS_STATUS,
2515                        XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_LOCAL_FAULT_STATUS |
2516                        XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_REMOTE_FAULT_STATUS);
2517         }
2518         /* Set Max packet size */
2519         REG_WR(sc, xmac_base + XMAC_REG_RX_MAX_SIZE, 0x2710);
2520
2521         /* CRC append for Tx packets */
2522         REG_WR(sc, xmac_base + XMAC_REG_TX_CTRL, 0xC800);
2523
2524         /* update PFC */
2525         elink_update_pfc_xmac(params, vars, 0);
2526
2527         if (vars->eee_status & SHMEM_EEE_ADV_STATUS_MASK) {
2528                 ELINK_DEBUG_P0(sc, "Setting XMAC for EEE\n");
2529                 REG_WR(sc, xmac_base + XMAC_REG_EEE_TIMERS_HI, 0x1380008);
2530                 REG_WR(sc, xmac_base + XMAC_REG_EEE_CTRL, 0x1);
2531         } else {
2532                 REG_WR(sc, xmac_base + XMAC_REG_EEE_CTRL, 0x0);
2533         }
2534
2535         /* Enable TX and RX */
2536         val = XMAC_CTRL_REG_TX_EN | XMAC_CTRL_REG_RX_EN;
2537
2538         /* Set MAC in XLGMII mode for dual-mode */
2539         if ((vars->line_speed == ELINK_SPEED_20000) &&
2540             (params->phy[ELINK_INT_PHY].supported &
2541              ELINK_SUPPORTED_20000baseKR2_Full))
2542                 val |= XMAC_CTRL_REG_XLGMII_ALIGN_ENB;
2543
2544         /* Check loopback mode */
2545         if (lb)
2546                 val |= XMAC_CTRL_REG_LINE_LOCAL_LPBK;
2547         REG_WR(sc, xmac_base + XMAC_REG_CTRL, val);
2548         elink_set_xumac_nig(params,
2549                             ((vars->flow_ctrl & ELINK_FLOW_CTRL_TX) != 0), 1);
2550
2551         vars->mac_type = ELINK_MAC_TYPE_XMAC;
2552
2553         return ELINK_STATUS_OK;
2554 }
2555
2556 static elink_status_t elink_emac_enable(struct elink_params *params,
2557                              struct elink_vars *vars, uint8_t lb)
2558 {
2559         struct bxe_adapter *sc = params->sc;
2560         uint8_t port = params->port;
2561         uint32_t emac_base = port ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
2562         uint32_t val;
2563
2564         ELINK_DEBUG_P0(sc, "enabling EMAC\n");
2565
2566         /* Disable BMAC */
2567         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
2568                (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
2569
2570         /* enable emac and not bmac */
2571         REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + port*4, 1);
2572
2573 #ifdef ELINK_INCLUDE_EMUL
2574         /* for paladium */
2575         if (CHIP_REV_IS_EMUL(sc)) {
2576                 /* Use lane 1 (of lanes 0-3) */
2577                 REG_WR(sc, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 1);
2578                 REG_WR(sc, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 1);
2579         }
2580         /* for fpga */
2581         else
2582 #endif
2583 #ifdef ELINK_INCLUDE_FPGA
2584         if (CHIP_REV_IS_FPGA(sc)) {
2585                 /* Use lane 1 (of lanes 0-3) */
2586                 ELINK_DEBUG_P0(sc, "elink_emac_enable: Setting FPGA\n");
2587
2588                 REG_WR(sc, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 1);
2589                 REG_WR(sc, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 0);
2590         } else
2591 #endif
2592         /* ASIC */
2593         if (vars->phy_flags & PHY_XGXS_FLAG) {
2594                 uint32_t ser_lane = ((params->lane_config &
2595                                  PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK) >>
2596                                 PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT);
2597
2598                 ELINK_DEBUG_P0(sc, "XGXS\n");
2599                 /* select the master lanes (out of 0-3) */
2600                 REG_WR(sc, NIG_REG_XGXS_LANE_SEL_P0 + port*4, ser_lane);
2601                 /* select XGXS */
2602                 REG_WR(sc, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 1);
2603
2604         } else { /* SerDes */
2605                 ELINK_DEBUG_P0(sc, "SerDes\n");
2606                 /* select SerDes */
2607                 REG_WR(sc, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 0);
2608         }
2609
2610         elink_bits_en(sc, emac_base + EMAC_REG_EMAC_RX_MODE,
2611                       EMAC_RX_MODE_RESET);
2612         elink_bits_en(sc, emac_base + EMAC_REG_EMAC_TX_MODE,
2613                       EMAC_TX_MODE_RESET);
2614
2615 #if defined(ELINK_INCLUDE_EMUL) || defined(ELINK_INCLUDE_FPGA)
2616         if (CHIP_REV_IS_SLOW(sc)) {
2617                 /* config GMII mode */
2618                 val = REG_RD(sc, emac_base + EMAC_REG_EMAC_MODE);
2619                 elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_MODE, (val | EMAC_MODE_PORT_GMII));
2620         } else { /* ASIC */
2621 #endif
2622                 /* pause enable/disable */
2623                 elink_bits_dis(sc, emac_base + EMAC_REG_EMAC_RX_MODE,
2624                                EMAC_RX_MODE_FLOW_EN);
2625
2626                 elink_bits_dis(sc,  emac_base + EMAC_REG_EMAC_TX_MODE,
2627                                (EMAC_TX_MODE_EXT_PAUSE_EN |
2628                                 EMAC_TX_MODE_FLOW_EN));
2629                 if (!(params->feature_config_flags &
2630                       ELINK_FEATURE_CONFIG_PFC_ENABLED)) {
2631                         if (vars->flow_ctrl & ELINK_FLOW_CTRL_RX)
2632                                 elink_bits_en(sc, emac_base +
2633                                               EMAC_REG_EMAC_RX_MODE,
2634                                               EMAC_RX_MODE_FLOW_EN);
2635
2636                         if (vars->flow_ctrl & ELINK_FLOW_CTRL_TX)
2637                                 elink_bits_en(sc, emac_base +
2638                                               EMAC_REG_EMAC_TX_MODE,
2639                                               (EMAC_TX_MODE_EXT_PAUSE_EN |
2640                                                EMAC_TX_MODE_FLOW_EN));
2641                 } else
2642                         elink_bits_en(sc, emac_base + EMAC_REG_EMAC_TX_MODE,
2643                                       EMAC_TX_MODE_FLOW_EN);
2644 #if defined(ELINK_INCLUDE_EMUL) || defined(ELINK_INCLUDE_FPGA)
2645         }
2646 #endif
2647
2648         /* KEEP_VLAN_TAG, promiscuous */
2649         val = REG_RD(sc, emac_base + EMAC_REG_EMAC_RX_MODE);
2650         val |= EMAC_RX_MODE_KEEP_VLAN_TAG | EMAC_RX_MODE_PROMISCUOUS;
2651
2652         /* Setting this bit causes MAC control frames (except for pause
2653          * frames) to be passed on for processing. This setting has no
2654          * affect on the operation of the pause frames. This bit effects
2655          * all packets regardless of RX Parser packet sorting logic.
2656          * Turn the PFC off to make sure we are in Xon state before
2657          * enabling it.
2658          */
2659         elink_cb_reg_write(sc, emac_base + EMAC_REG_RX_PFC_MODE, 0);
2660         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) {
2661                 ELINK_DEBUG_P0(sc, "PFC is enabled\n");
2662                 /* Enable PFC again */
2663                 elink_cb_reg_write(sc, emac_base + EMAC_REG_RX_PFC_MODE,
2664                         EMAC_REG_RX_PFC_MODE_RX_EN |
2665                         EMAC_REG_RX_PFC_MODE_TX_EN |
2666                         EMAC_REG_RX_PFC_MODE_PRIORITIES);
2667
2668                 elink_cb_reg_write(sc, emac_base + EMAC_REG_RX_PFC_PARAM,
2669                         ((0x0101 <<
2670                           EMAC_REG_RX_PFC_PARAM_OPCODE_BITSHIFT) |
2671                          (0x00ff <<
2672                           EMAC_REG_RX_PFC_PARAM_PRIORITY_EN_BITSHIFT)));
2673                 val |= EMAC_RX_MODE_KEEP_MAC_CONTROL;
2674         }
2675         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_RX_MODE, val);
2676
2677         /* Set Loopback */
2678         val = REG_RD(sc, emac_base + EMAC_REG_EMAC_MODE);
2679         if (lb)
2680                 val |= 0x810;
2681         else
2682                 val &= ~0x810;
2683         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_MODE, val);
2684
2685         /* Enable emac */
2686         REG_WR(sc, NIG_REG_NIG_EMAC0_EN + port*4, 1);
2687
2688         /* Enable emac for jumbo packets */
2689         elink_cb_reg_write(sc, emac_base + EMAC_REG_EMAC_RX_MTU_SIZE,
2690                 (EMAC_RX_MTU_SIZE_JUMBO_ENA |
2691                  (ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD)));
2692
2693         /* Strip CRC */
2694         REG_WR(sc, NIG_REG_NIG_INGRESS_EMAC0_NO_CRC + port*4, 0x1);
2695
2696         /* Disable the NIG in/out to the bmac */
2697         REG_WR(sc, NIG_REG_BMAC0_IN_EN + port*4, 0x0);
2698         REG_WR(sc, NIG_REG_BMAC0_PAUSE_OUT_EN + port*4, 0x0);
2699         REG_WR(sc, NIG_REG_BMAC0_OUT_EN + port*4, 0x0);
2700
2701         /* Enable the NIG in/out to the emac */
2702         REG_WR(sc, NIG_REG_EMAC0_IN_EN + port*4, 0x1);
2703         val = 0;
2704         if ((params->feature_config_flags &
2705               ELINK_FEATURE_CONFIG_PFC_ENABLED) ||
2706             (vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
2707                 val = 1;
2708
2709         REG_WR(sc, NIG_REG_EMAC0_PAUSE_OUT_EN + port*4, val);
2710         REG_WR(sc, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0x1);
2711
2712 #ifdef ELINK_INCLUDE_EMUL
2713         if (CHIP_REV_IS_EMUL(sc)) {
2714                 /* Take the BigMac out of reset */
2715                 REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
2716                        (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
2717
2718                 /* Enable access for bmac registers */
2719                 REG_WR(sc, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1);
2720         } else
2721 #endif
2722         REG_WR(sc, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x0);
2723
2724         vars->mac_type = ELINK_MAC_TYPE_EMAC;
2725         return ELINK_STATUS_OK;
2726 }
2727
2728 static void elink_update_pfc_bmac1(struct elink_params *params,
2729                                    struct elink_vars *vars)
2730 {
2731         uint32_t wb_data[2];
2732         struct bxe_adapter *sc = params->sc;
2733         uint32_t bmac_addr =  params->port ? NIG_REG_INGRESS_BMAC1_MEM :
2734                 NIG_REG_INGRESS_BMAC0_MEM;
2735
2736         uint32_t val = 0x14;
2737         if ((!(params->feature_config_flags &
2738               ELINK_FEATURE_CONFIG_PFC_ENABLED)) &&
2739                 (vars->flow_ctrl & ELINK_FLOW_CTRL_RX))
2740                 /* Enable BigMAC to react on received Pause packets */
2741                 val |= (1<<5);
2742         wb_data[0] = val;
2743         wb_data[1] = 0;
2744         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_RX_CONTROL, wb_data, 2);
2745
2746         /* TX control */
2747         val = 0xc0;
2748         if (!(params->feature_config_flags &
2749               ELINK_FEATURE_CONFIG_PFC_ENABLED) &&
2750                 (vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
2751                 val |= 0x800000;
2752         wb_data[0] = val;
2753         wb_data[1] = 0;
2754         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_TX_CONTROL, wb_data, 2);
2755 }
2756
2757 static void elink_update_pfc_bmac2(struct elink_params *params,
2758                                    struct elink_vars *vars,
2759                                    uint8_t is_lb)
2760 {
2761         /* Set rx control: Strip CRC and enable BigMAC to relay
2762          * control packets to the system as well
2763          */
2764         uint32_t wb_data[2];
2765         struct bxe_adapter *sc = params->sc;
2766         uint32_t bmac_addr = params->port ? NIG_REG_INGRESS_BMAC1_MEM :
2767                 NIG_REG_INGRESS_BMAC0_MEM;
2768         uint32_t val = 0x14;
2769
2770         if ((!(params->feature_config_flags &
2771               ELINK_FEATURE_CONFIG_PFC_ENABLED)) &&
2772                 (vars->flow_ctrl & ELINK_FLOW_CTRL_RX))
2773                 /* Enable BigMAC to react on received Pause packets */
2774                 val |= (1<<5);
2775         wb_data[0] = val;
2776         wb_data[1] = 0;
2777         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_RX_CONTROL, wb_data, 2);
2778         DELAY(30);
2779
2780         /* Tx control */
2781         val = 0xc0;
2782         if (!(params->feature_config_flags &
2783                                 ELINK_FEATURE_CONFIG_PFC_ENABLED) &&
2784             (vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
2785                 val |= 0x800000;
2786         wb_data[0] = val;
2787         wb_data[1] = 0;
2788         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_TX_CONTROL, wb_data, 2);
2789
2790         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) {
2791                 ELINK_DEBUG_P0(sc, "PFC is enabled\n");
2792                 /* Enable PFC RX & TX & STATS and set 8 COS  */
2793                 wb_data[0] = 0x0;
2794                 wb_data[0] |= (1<<0);  /* RX */
2795                 wb_data[0] |= (1<<1);  /* TX */
2796                 wb_data[0] |= (1<<2);  /* Force initial Xon */
2797                 wb_data[0] |= (1<<3);  /* 8 cos */
2798                 wb_data[0] |= (1<<5);  /* STATS */
2799                 wb_data[1] = 0;
2800                 REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_PFC_CONTROL,
2801                             wb_data, 2);
2802                 /* Clear the force Xon */
2803                 wb_data[0] &= ~(1<<2);
2804         } else {
2805                 ELINK_DEBUG_P0(sc, "PFC is disabled\n");
2806                 /* Disable PFC RX & TX & STATS and set 8 COS */
2807                 wb_data[0] = 0x8;
2808                 wb_data[1] = 0;
2809         }
2810
2811         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_PFC_CONTROL, wb_data, 2);
2812
2813         /* Set Time (based unit is 512 bit time) between automatic
2814          * re-sending of PP packets amd enable automatic re-send of
2815          * Per-Priroity Packet as long as pp_gen is asserted and
2816          * pp_disable is low.
2817          */
2818         val = 0x8000;
2819         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED)
2820                 val |= (1<<16); /* enable automatic re-send */
2821
2822         wb_data[0] = val;
2823         wb_data[1] = 0;
2824         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_TX_PAUSE_CONTROL,
2825                     wb_data, 2);
2826
2827         /* mac control */
2828         val = 0x3; /* Enable RX and TX */
2829         if (is_lb) {
2830                 val |= 0x4; /* Local loopback */
2831                 ELINK_DEBUG_P0(sc, "enable bmac loopback\n");
2832         }
2833         /* When PFC enabled, Pass pause frames towards the NIG. */
2834         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED)
2835                 val |= ((1<<6)|(1<<5));
2836
2837         wb_data[0] = val;
2838         wb_data[1] = 0;
2839         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_BMAC_CONTROL, wb_data, 2);
2840 }
2841
2842 /******************************************************************************
2843 * Description:
2844 *  This function is needed because NIG ARB_CREDIT_WEIGHT_X are
2845 *  not continues and ARB_CREDIT_WEIGHT_0 + offset is suitable.
2846 ******************************************************************************/
2847 static elink_status_t elink_pfc_nig_rx_priority_mask(struct bxe_adapter *sc,
2848                                            uint8_t cos_entry,
2849                                            uint32_t priority_mask, uint8_t port)
2850 {
2851         uint32_t nig_reg_rx_priority_mask_add = 0;
2852
2853         switch (cos_entry) {
2854         case 0:
2855              nig_reg_rx_priority_mask_add = (port) ?
2856                  NIG_REG_P1_RX_COS0_PRIORITY_MASK :
2857                  NIG_REG_P0_RX_COS0_PRIORITY_MASK;
2858              break;
2859         case 1:
2860             nig_reg_rx_priority_mask_add = (port) ?
2861                 NIG_REG_P1_RX_COS1_PRIORITY_MASK :
2862                 NIG_REG_P0_RX_COS1_PRIORITY_MASK;
2863             break;
2864         case 2:
2865             nig_reg_rx_priority_mask_add = (port) ?
2866                 NIG_REG_P1_RX_COS2_PRIORITY_MASK :
2867                 NIG_REG_P0_RX_COS2_PRIORITY_MASK;
2868             break;
2869         case 3:
2870             if (port)
2871                 return ELINK_STATUS_ERROR;
2872             nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS3_PRIORITY_MASK;
2873             break;
2874         case 4:
2875             if (port)
2876                 return ELINK_STATUS_ERROR;
2877             nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS4_PRIORITY_MASK;
2878             break;
2879         case 5:
2880             if (port)
2881                 return ELINK_STATUS_ERROR;
2882             nig_reg_rx_priority_mask_add = NIG_REG_P0_RX_COS5_PRIORITY_MASK;
2883             break;
2884         }
2885
2886         REG_WR(sc, nig_reg_rx_priority_mask_add, priority_mask);
2887
2888         return ELINK_STATUS_OK;
2889 }
2890 static void elink_update_mng(struct elink_params *params, uint32_t link_status)
2891 {
2892         struct bxe_adapter *sc = params->sc;
2893
2894         REG_WR(sc, params->shmem_base +
2895                offsetof(struct shmem_region,
2896                         port_mb[params->port].link_status), link_status);
2897 }
2898
2899 static void elink_update_link_attr(struct elink_params *params, uint32_t link_attr)
2900 {
2901         struct bxe_adapter *sc = params->sc;
2902
2903         if (SHMEM2_HAS(sc, link_attr_sync))
2904                 REG_WR(sc, params->shmem2_base +
2905                        offsetof(struct shmem2_region,
2906                                 link_attr_sync[params->port]), link_attr);
2907 }
2908
2909 static void elink_update_pfc_nig(struct elink_params *params,
2910                 struct elink_vars *vars,
2911                 struct elink_nig_brb_pfc_port_params *nig_params)
2912 {
2913         uint32_t xcm_mask = 0, ppp_enable = 0, pause_enable = 0, llfc_out_en = 0;
2914         uint32_t llfc_enable = 0, xcm_out_en = 0, hwpfc_enable = 0;
2915         uint32_t pkt_priority_to_cos = 0;
2916         struct bxe_adapter *sc = params->sc;
2917         uint8_t port = params->port;
2918
2919         int set_pfc = params->feature_config_flags &
2920                 ELINK_FEATURE_CONFIG_PFC_ENABLED;
2921         ELINK_DEBUG_P0(sc, "updating pfc nig parameters\n");
2922
2923         /* When NIG_LLH0_XCM_MASK_REG_LLHX_XCM_MASK_BCN bit is set
2924          * MAC control frames (that are not pause packets)
2925          * will be forwarded to the XCM.
2926          */
2927         xcm_mask = REG_RD(sc, port ? NIG_REG_LLH1_XCM_MASK :
2928                           NIG_REG_LLH0_XCM_MASK);
2929         /* NIG params will override non PFC params, since it's possible to
2930          * do transition from PFC to SAFC
2931          */
2932         if (set_pfc) {
2933                 pause_enable = 0;
2934                 llfc_out_en = 0;
2935                 llfc_enable = 0;
2936                 if (CHIP_IS_E3(sc))
2937                         ppp_enable = 0;
2938                 else
2939                         ppp_enable = 1;
2940                 xcm_mask &= ~(port ? NIG_LLH1_XCM_MASK_REG_LLH1_XCM_MASK_BCN :
2941                                      NIG_LLH0_XCM_MASK_REG_LLH0_XCM_MASK_BCN);
2942                 xcm_out_en = 0;
2943                 hwpfc_enable = 1;
2944         } else  {
2945                 if (nig_params) {
2946                         llfc_out_en = nig_params->llfc_out_en;
2947                         llfc_enable = nig_params->llfc_enable;
2948                         pause_enable = nig_params->pause_enable;
2949                 } else  /* Default non PFC mode - PAUSE */
2950                         pause_enable = 1;
2951
2952                 xcm_mask |= (port ? NIG_LLH1_XCM_MASK_REG_LLH1_XCM_MASK_BCN :
2953                         NIG_LLH0_XCM_MASK_REG_LLH0_XCM_MASK_BCN);
2954                 xcm_out_en = 1;
2955         }
2956
2957         if (CHIP_IS_E3(sc))
2958                 REG_WR(sc, port ? NIG_REG_BRB1_PAUSE_IN_EN :
2959                        NIG_REG_BRB0_PAUSE_IN_EN, pause_enable);
2960         REG_WR(sc, port ? NIG_REG_LLFC_OUT_EN_1 :
2961                NIG_REG_LLFC_OUT_EN_0, llfc_out_en);
2962         REG_WR(sc, port ? NIG_REG_LLFC_ENABLE_1 :
2963                NIG_REG_LLFC_ENABLE_0, llfc_enable);
2964         REG_WR(sc, port ? NIG_REG_PAUSE_ENABLE_1 :
2965                NIG_REG_PAUSE_ENABLE_0, pause_enable);
2966
2967         REG_WR(sc, port ? NIG_REG_PPP_ENABLE_1 :
2968                NIG_REG_PPP_ENABLE_0, ppp_enable);
2969
2970         REG_WR(sc, port ? NIG_REG_LLH1_XCM_MASK :
2971                NIG_REG_LLH0_XCM_MASK, xcm_mask);
2972
2973         REG_WR(sc, port ? NIG_REG_LLFC_EGRESS_SRC_ENABLE_1 :
2974                NIG_REG_LLFC_EGRESS_SRC_ENABLE_0, 0x7);
2975
2976         /* Output enable for RX_XCM # IF */
2977         REG_WR(sc, port ? NIG_REG_XCM1_OUT_EN :
2978                NIG_REG_XCM0_OUT_EN, xcm_out_en);
2979
2980         /* HW PFC TX enable */
2981         REG_WR(sc, port ? NIG_REG_P1_HWPFC_ENABLE :
2982                NIG_REG_P0_HWPFC_ENABLE, hwpfc_enable);
2983
2984         if (nig_params) {
2985                 uint8_t i = 0;
2986                 pkt_priority_to_cos = nig_params->pkt_priority_to_cos;
2987
2988                 for (i = 0; i < nig_params->num_of_rx_cos_priority_mask; i++)
2989                         elink_pfc_nig_rx_priority_mask(sc, i,
2990                 nig_params->rx_cos_priority_mask[i], port);
2991
2992                 REG_WR(sc, port ? NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_1 :
2993                        NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_0,
2994                        nig_params->llfc_high_priority_classes);
2995
2996                 REG_WR(sc, port ? NIG_REG_LLFC_LOW_PRIORITY_CLASSES_1 :
2997                        NIG_REG_LLFC_LOW_PRIORITY_CLASSES_0,
2998                        nig_params->llfc_low_priority_classes);
2999         }
3000         REG_WR(sc, port ? NIG_REG_P1_PKT_PRIORITY_TO_COS :
3001                NIG_REG_P0_PKT_PRIORITY_TO_COS,
3002                pkt_priority_to_cos);
3003 }
3004
3005 elink_status_t elink_update_pfc(struct elink_params *params,
3006                       struct elink_vars *vars,
3007                       struct elink_nig_brb_pfc_port_params *pfc_params)
3008 {
3009         /* The PFC and pause are orthogonal to one another, meaning when
3010          * PFC is enabled, the pause are disabled, and when PFC is
3011          * disabled, pause are set according to the pause result.
3012          */
3013         uint32_t val;
3014         struct bxe_adapter *sc = params->sc;
3015         elink_status_t elink_status = ELINK_STATUS_OK;
3016         uint8_t bmac_loopback = (params->loopback_mode == ELINK_LOOPBACK_BMAC);
3017
3018         if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED)
3019                 vars->link_status |= LINK_STATUS_PFC_ENABLED;
3020         else
3021                 vars->link_status &= ~LINK_STATUS_PFC_ENABLED;
3022
3023         elink_update_mng(params, vars->link_status);
3024
3025         /* Update NIG params */
3026         elink_update_pfc_nig(params, vars, pfc_params);
3027
3028         if (!vars->link_up)
3029                 return elink_status;
3030
3031         ELINK_DEBUG_P0(sc, "About to update PFC in BMAC\n");
3032
3033         if (CHIP_IS_E3(sc)) {
3034                 if (vars->mac_type == ELINK_MAC_TYPE_XMAC)
3035                         elink_update_pfc_xmac(params, vars, 0);
3036         } else {
3037                 val = REG_RD(sc, MISC_REG_RESET_REG_2);
3038                 if ((val &
3039                      (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port))
3040                     == 0) {
3041                         ELINK_DEBUG_P0(sc, "About to update PFC in EMAC\n");
3042                         elink_emac_enable(params, vars, 0);
3043                         return elink_status;
3044                 }
3045                 if (CHIP_IS_E2(sc))
3046                         elink_update_pfc_bmac2(params, vars, bmac_loopback);
3047                 else
3048                         elink_update_pfc_bmac1(params, vars);
3049
3050                 val = 0;
3051                 if ((params->feature_config_flags &
3052                      ELINK_FEATURE_CONFIG_PFC_ENABLED) ||
3053                     (vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
3054                         val = 1;
3055                 REG_WR(sc, NIG_REG_BMAC0_PAUSE_OUT_EN + params->port*4, val);
3056         }
3057         return elink_status;
3058 }
3059
3060 static elink_status_t elink_bmac1_enable(struct elink_params *params,
3061                               struct elink_vars *vars,
3062                               uint8_t is_lb)
3063 {
3064         struct bxe_adapter *sc = params->sc;
3065         uint8_t port = params->port;
3066         uint32_t bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM :
3067                                NIG_REG_INGRESS_BMAC0_MEM;
3068         uint32_t wb_data[2];
3069         uint32_t val;
3070
3071         ELINK_DEBUG_P0(sc, "Enabling BigMAC1\n");
3072
3073         /* XGXS control */
3074         wb_data[0] = 0x3c;
3075         wb_data[1] = 0;
3076         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_BMAC_XGXS_CONTROL,
3077                     wb_data, 2);
3078
3079         /* TX MAC SA */
3080         wb_data[0] = ((params->mac_addr[2] << 24) |
3081                        (params->mac_addr[3] << 16) |
3082                        (params->mac_addr[4] << 8) |
3083                         params->mac_addr[5]);
3084         wb_data[1] = ((params->mac_addr[0] << 8) |
3085                         params->mac_addr[1]);
3086         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_TX_SOURCE_ADDR, wb_data, 2);
3087
3088         /* MAC control */
3089         val = 0x3;
3090         if (is_lb) {
3091                 val |= 0x4;
3092                 ELINK_DEBUG_P0(sc,  "enable bmac loopback\n");
3093         }
3094         wb_data[0] = val;
3095         wb_data[1] = 0;
3096         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_BMAC_CONTROL, wb_data, 2);
3097
3098         /* Set rx mtu */
3099         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD;
3100         wb_data[1] = 0;
3101         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_RX_MAX_SIZE, wb_data, 2);
3102
3103         elink_update_pfc_bmac1(params, vars);
3104
3105         /* Set tx mtu */
3106         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD;
3107         wb_data[1] = 0;
3108         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_TX_MAX_SIZE, wb_data, 2);
3109
3110         /* Set cnt max size */
3111         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD;
3112         wb_data[1] = 0;
3113         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_CNT_MAX_SIZE, wb_data, 2);
3114
3115         /* Configure SAFC */
3116         wb_data[0] = 0x1000200;
3117         wb_data[1] = 0;
3118         REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_RX_LLFC_MSG_FLDS,
3119                     wb_data, 2);
3120 #ifdef ELINK_INCLUDE_EMUL
3121         /* Fix for emulation */
3122         if (CHIP_REV_IS_EMUL(sc)) {
3123                 wb_data[0] = 0xf000;
3124                 wb_data[1] = 0;
3125                 REG_WR_DMAE(sc, bmac_addr + BIGMAC_REGISTER_TX_PAUSE_THRESHOLD,
3126                             wb_data, 2);
3127         }
3128 #endif
3129
3130         return ELINK_STATUS_OK;
3131 }
3132
3133 static elink_status_t elink_bmac2_enable(struct elink_params *params,
3134                               struct elink_vars *vars,
3135                               uint8_t is_lb)
3136 {
3137         struct bxe_adapter *sc = params->sc;
3138         uint8_t port = params->port;
3139         uint32_t bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM :
3140                                NIG_REG_INGRESS_BMAC0_MEM;
3141         uint32_t wb_data[2];
3142
3143         ELINK_DEBUG_P0(sc, "Enabling BigMAC2\n");
3144
3145         wb_data[0] = 0;
3146         wb_data[1] = 0;
3147         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_BMAC_CONTROL, wb_data, 2);
3148         DELAY(30);
3149
3150         /* XGXS control: Reset phy HW, MDIO registers, PHY PLL and BMAC */
3151         wb_data[0] = 0x3c;
3152         wb_data[1] = 0;
3153         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_BMAC_XGXS_CONTROL,
3154                     wb_data, 2);
3155
3156         DELAY(30);
3157
3158         /* TX MAC SA */
3159         wb_data[0] = ((params->mac_addr[2] << 24) |
3160                        (params->mac_addr[3] << 16) |
3161                        (params->mac_addr[4] << 8) |
3162                         params->mac_addr[5]);
3163         wb_data[1] = ((params->mac_addr[0] << 8) |
3164                         params->mac_addr[1]);
3165         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_TX_SOURCE_ADDR,
3166                     wb_data, 2);
3167
3168         DELAY(30);
3169
3170         /* Configure SAFC */
3171         wb_data[0] = 0x1000200;
3172         wb_data[1] = 0;
3173         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_RX_LLFC_MSG_FLDS,
3174                     wb_data, 2);
3175         DELAY(30);
3176
3177         /* Set RX MTU */
3178         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD;
3179         wb_data[1] = 0;
3180         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_RX_MAX_SIZE, wb_data, 2);
3181         DELAY(30);
3182
3183         /* Set TX MTU */
3184         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD;
3185         wb_data[1] = 0;
3186         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_TX_MAX_SIZE, wb_data, 2);
3187         DELAY(30);
3188         /* Set cnt max size */
3189         wb_data[0] = ELINK_ETH_MAX_JUMBO_PACKET_SIZE + ELINK_ETH_OVREHEAD - 2;
3190         wb_data[1] = 0;
3191         REG_WR_DMAE(sc, bmac_addr + BIGMAC2_REGISTER_CNT_MAX_SIZE, wb_data, 2);
3192         DELAY(30);
3193         elink_update_pfc_bmac2(params, vars, is_lb);
3194
3195         return ELINK_STATUS_OK;
3196 }
3197
3198 static elink_status_t elink_bmac_enable(struct elink_params *params,
3199                              struct elink_vars *vars,
3200                              uint8_t is_lb, uint8_t reset_bmac)
3201 {
3202         elink_status_t rc = ELINK_STATUS_OK;
3203         uint8_t port = params->port;
3204         struct bxe_adapter *sc = params->sc;
3205         uint32_t val;
3206         /* Reset and unreset the BigMac */
3207         if (reset_bmac) {
3208                 REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR,
3209                        (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
3210                 DELAY(1000 * 1);
3211         }
3212
3213         REG_WR(sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_SET,
3214                (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port));
3215
3216         /* Enable access for bmac registers */
3217         REG_WR(sc, NIG_REG_BMAC0_REGS_OUT_EN + port*4, 0x1);
3218
3219         /* Enable BMAC according to BMAC type*/
3220         if (CHIP_IS_E2(sc))
3221                 rc = elink_bmac2_enable(params, vars, is_lb);
3222         else
3223                 rc = elink_bmac1_enable(params, vars, is_lb);
3224         REG_WR(sc, NIG_REG_XGXS_SERDES0_MODE_SEL + port*4, 0x1);
3225         REG_WR(sc, NIG_REG_XGXS_LANE_SEL_P0 + port*4, 0x0);
3226         REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + port*4, 0x0);
3227         val = 0;
3228         if ((params->feature_config_flags &
3229               ELINK_FEATURE_CONFIG_PFC_ENABLED) ||
3230             (vars->flow_ctrl & ELINK_FLOW_CTRL_TX))
3231                 val = 1;
3232         REG_WR(sc, NIG_REG_BMAC0_PAUSE_OUT_EN + port*4, val);
3233         REG_WR(sc, NIG_REG_EGRESS_EMAC0_OUT_EN + port*4, 0x0);
3234         REG_WR(sc, NIG_REG_EMAC0_IN_EN + port*4, 0x0);
3235         REG_WR(sc, NIG_REG_EMAC0_PAUSE_OUT_EN + port*4, 0x0);
3236         REG_WR(sc, NIG_REG_BMAC0_IN_EN + port*4, 0x1);
3237         REG_WR(sc, NIG_REG_BMAC0_OUT_EN + port*4, 0x1);
3238
3239         vars->mac_type = ELINK_MAC_TYPE_BMAC;
3240         return rc;
3241 }
3242
3243 static void elink_set_bmac_rx(struct bxe_adapter *sc, uint32_t chip_id, uint8_t port, uint8_t en)
3244 {
3245         uint32_t bmac_addr = port ? NIG_REG_INGRESS_BMAC1_MEM :
3246                         NIG_REG_INGRESS_BMAC0_MEM;
3247         uint32_t wb_data[2];
3248         uint32_t nig_bmac_enable = REG_RD(sc, NIG_REG_BMAC0_REGS_OUT_EN + port*4);
3249
3250         if (CHIP_IS_E2(sc))
3251                 bmac_addr += BIGMAC2_REGISTER_BMAC_CONTROL;
3252         else
3253                 bmac_addr += BIGMAC_REGISTER_BMAC_CONTROL;
3254         /* Only if the bmac is out of reset */
3255         if (REG_RD(sc, MISC_REG_RESET_REG_2) &
3256                         (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port) &&
3257             nig_bmac_enable) {
3258                 /* Clear Rx Enable bit in BMAC_CONTROL register */
3259                 REG_RD_DMAE(sc, bmac_addr, wb_data, 2);
3260                 if (en)
3261                         wb_data[0] |= ELINK_BMAC_CONTROL_RX_ENABLE;
3262                 else
3263                         wb_data[0] &= ~ELINK_BMAC_CONTROL_RX_ENABLE;
3264                 REG_WR_DMAE(sc, bmac_addr, wb_data, 2);
3265                 DELAY(1000 * 1);
3266         }
3267 }
3268
3269 static elink_status_t elink_pbf_update(struct elink_params *params, uint32_t flow_ctrl,
3270                             uint32_t line_speed)
3271 {
3272         struct bxe_adapter *sc = params->sc;
3273         uint8_t port = params->port;
3274         uint32_t init_crd, crd;
3275         uint32_t count = 1000;
3276
3277         /* Disable port */
3278         REG_WR(sc, PBF_REG_DISABLE_NEW_TASK_PROC_P0 + port*4, 0x1);
3279
3280         /* Wait for init credit */
3281         init_crd = REG_RD(sc, PBF_REG_P0_INIT_CRD + port*4);
3282         crd = REG_RD(sc, PBF_REG_P0_CREDIT + port*8);
3283         ELINK_DEBUG_P2(sc, "init_crd 0x%x  crd 0x%x\n", init_crd, crd);
3284
3285         while ((init_crd != crd) && count) {
3286                 DELAY(1000 * 5);
3287                 crd = REG_RD(sc, PBF_REG_P0_CREDIT + port*8);
3288                 count--;
3289         }
3290         crd = REG_RD(sc, PBF_REG_P0_CREDIT + port*8);
3291         if (init_crd != crd) {
3292                 ELINK_DEBUG_P2(sc, "BUG! init_crd 0x%x != crd 0x%x\n",
3293                           init_crd, crd);
3294                 return ELINK_STATUS_ERROR;
3295         }
3296
3297         if (flow_ctrl & ELINK_FLOW_CTRL_RX ||
3298             line_speed == ELINK_SPEED_10 ||
3299             line_speed == ELINK_SPEED_100 ||
3300             line_speed == ELINK_SPEED_1000 ||
3301             line_speed == ELINK_SPEED_2500) {
3302                 REG_WR(sc, PBF_REG_P0_PAUSE_ENABLE + port*4, 1);
3303                 /* Update threshold */
3304                 REG_WR(sc, PBF_REG_P0_ARB_THRSH + port*4, 0);
3305                 /* Update init credit */
3306                 init_crd = 778;         /* (800-18-4) */
3307
3308         } else {
3309                 uint32_t thresh = (ELINK_ETH_MAX_JUMBO_PACKET_SIZE +
3310                               ELINK_ETH_OVREHEAD)/16;
3311                 REG_WR(sc, PBF_REG_P0_PAUSE_ENABLE + port*4, 0);
3312                 /* Update threshold */
3313                 REG_WR(sc, PBF_REG_P0_ARB_THRSH + port*4, thresh);
3314                 /* Update init credit */
3315                 switch (line_speed) {
3316                 case ELINK_SPEED_10000:
3317                         init_crd = thresh + 553 - 22;
3318                         break;
3319                 default:
3320                         ELINK_DEBUG_P1(sc, "Invalid line_speed 0x%x\n",
3321                                   line_speed);
3322                         return ELINK_STATUS_ERROR;
3323                 }
3324         }
3325         REG_WR(sc, PBF_REG_P0_INIT_CRD + port*4, init_crd);
3326         ELINK_DEBUG_P2(sc, "PBF updated to speed %d credit %d\n",
3327                  line_speed, init_crd);
3328
3329         /* Probe the credit changes */
3330         REG_WR(sc, PBF_REG_INIT_P0 + port*4, 0x1);
3331         DELAY(1000 * 5);
3332         REG_WR(sc, PBF_REG_INIT_P0 + port*4, 0x0);
3333
3334         /* Enable port */
3335         REG_WR(sc, PBF_REG_DISABLE_NEW_TASK_PROC_P0 + port*4, 0x0);
3336         return ELINK_STATUS_OK;
3337 }
3338
3339 /**
3340  * elink_get_emac_base - retrive emac base address
3341  *
3342  * @bp:                 driver handle
3343  * @mdc_mdio_access:    access type
3344  * @port:               port id
3345  *
3346  * This function selects the MDC/MDIO access (through emac0 or
3347  * emac1) depend on the mdc_mdio_access, port, port swapped. Each
3348  * phy has a default access mode, which could also be overridden
3349  * by nvram configuration. This parameter, whether this is the
3350  * default phy configuration, or the nvram overrun
3351  * configuration, is passed here as mdc_mdio_access and selects
3352  * the emac_base for the CL45 read/writes operations
3353  */
3354 static uint32_t elink_get_emac_base(struct bxe_adapter *sc,
3355                                uint32_t mdc_mdio_access, uint8_t port)
3356 {
3357         uint32_t emac_base = 0;
3358         switch (mdc_mdio_access) {
3359         case SHARED_HW_CFG_MDC_MDIO_ACCESS1_PHY_TYPE:
3360                 break;
3361         case SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC0:
3362                 if (REG_RD(sc, NIG_REG_PORT_SWAP))
3363                         emac_base = GRCBASE_EMAC1;
3364                 else
3365                         emac_base = GRCBASE_EMAC0;
3366                 break;
3367         case SHARED_HW_CFG_MDC_MDIO_ACCESS1_EMAC1:
3368                 if (REG_RD(sc, NIG_REG_PORT_SWAP))
3369                         emac_base = GRCBASE_EMAC0;
3370                 else
3371                         emac_base = GRCBASE_EMAC1;
3372                 break;
3373         case SHARED_HW_CFG_MDC_MDIO_ACCESS1_BOTH:
3374                 emac_base = (port) ? GRCBASE_EMAC1 : GRCBASE_EMAC0;
3375                 break;
3376         case SHARED_HW_CFG_MDC_MDIO_ACCESS1_SWAPPED:
3377                 emac_base = (port) ? GRCBASE_EMAC0 : GRCBASE_EMAC1;
3378                 break;
3379         default:
3380                 break;
3381         }
3382         return emac_base;
3383
3384 }
3385
3386 /******************************************************************/
3387 /*                      CL22 access functions                     */
3388 /******************************************************************/
3389 static elink_status_t elink_cl22_write(struct bxe_adapter *sc,
3390                                        struct elink_phy *phy,
3391                                        uint16_t reg, uint16_t val)
3392 {
3393         uint32_t tmp, mode;
3394         uint8_t i;
3395         elink_status_t rc = ELINK_STATUS_OK;
3396         /* Switch to CL22 */
3397         mode = REG_RD(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
3398         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE,
3399                mode & ~EMAC_MDIO_MODE_CLAUSE_45);
3400
3401         /* Address */
3402         tmp = ((phy->addr << 21) | (reg << 16) | val |
3403                EMAC_MDIO_COMM_COMMAND_WRITE_22 |
3404                EMAC_MDIO_COMM_START_BUSY);
3405         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, tmp);
3406
3407         for (i = 0; i < 50; i++) {
3408                 DELAY(10);
3409
3410                 tmp = REG_RD(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM);
3411                 if (!(tmp & EMAC_MDIO_COMM_START_BUSY)) {
3412                         DELAY(5);
3413                         break;
3414                 }
3415         }
3416         if (tmp & EMAC_MDIO_COMM_START_BUSY) {
3417                 ELINK_DEBUG_P0(sc, "write phy register failed\n");
3418                 rc = ELINK_STATUS_TIMEOUT;
3419         }
3420         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, mode);
3421         return rc;
3422 }
3423
3424 static elink_status_t elink_cl22_read(struct bxe_adapter *sc,
3425                                       struct elink_phy *phy,
3426                                       uint16_t reg, uint16_t *ret_val)
3427 {
3428         uint32_t val, mode;
3429         uint16_t i;
3430         elink_status_t rc = ELINK_STATUS_OK;
3431
3432         /* Switch to CL22 */
3433         mode = REG_RD(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE);
3434         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE,
3435                mode & ~EMAC_MDIO_MODE_CLAUSE_45);
3436
3437         /* Address */
3438         val = ((phy->addr << 21) | (reg << 16) |
3439                EMAC_MDIO_COMM_COMMAND_READ_22 |
3440                EMAC_MDIO_COMM_START_BUSY);
3441         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, val);
3442
3443         for (i = 0; i < 50; i++) {
3444                 DELAY(10);
3445
3446                 val = REG_RD(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM);
3447                 if (!(val & EMAC_MDIO_COMM_START_BUSY)) {
3448                         *ret_val = (uint16_t)(val & EMAC_MDIO_COMM_DATA);
3449                         DELAY(5);
3450                         break;
3451                 }
3452         }
3453         if (val & EMAC_MDIO_COMM_START_BUSY) {
3454                 ELINK_DEBUG_P0(sc, "read phy register failed\n");
3455
3456                 *ret_val = 0;
3457                 rc = ELINK_STATUS_TIMEOUT;
3458         }
3459         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_MODE, mode);
3460         return rc;
3461 }
3462
3463 /******************************************************************/
3464 /*                      CL45 access functions                     */
3465 /******************************************************************/
3466 static elink_status_t elink_cl45_read(struct bxe_adapter *sc, struct elink_phy *phy,
3467                            uint8_t devad, uint16_t reg, uint16_t *ret_val)
3468 {
3469         uint32_t val;
3470         uint16_t i;
3471         elink_status_t rc = ELINK_STATUS_OK;
3472         uint32_t chip_id;
3473         if (phy->flags & ELINK_FLAGS_MDC_MDIO_WA_G) {
3474                 chip_id = (REG_RD(sc, MISC_REG_CHIP_NUM) << 16) |
3475                           ((REG_RD(sc, MISC_REG_CHIP_REV) & 0xf) << 12);
3476                 elink_set_mdio_clk(sc, chip_id, phy->mdio_ctrl);
3477         }
3478
3479         if (phy->flags & ELINK_FLAGS_MDC_MDIO_WA_B0)
3480                 elink_bits_en(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS,
3481                               EMAC_MDIO_STATUS_10MB);
3482         /* Address */
3483         val = ((phy->addr << 21) | (devad << 16) | reg |
3484                EMAC_MDIO_COMM_COMMAND_ADDRESS |
3485                EMAC_MDIO_COMM_START_BUSY);
3486         REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, val);
3487
3488         for (i = 0; i < 50; i++) {
3489                 DELAY(10);
3490
3491                 val = REG_RD(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM);
3492                 if (!(val & EMAC_MDIO_COMM_START_BUSY)) {
3493                         DELAY(5);
3494                         break;
3495                 }
3496         }
3497         if (val & EMAC_MDIO_COMM_START_BUSY) {
3498                 ELINK_DEBUG_P0(sc, "read phy register failed\n");
3499                 elink_cb_event_log(sc, ELINK_LOG_ID_MDIO_ACCESS_TIMEOUT); // "MDC/MDIO access timeout\n"
3500
3501                 *ret_val = 0;
3502                 rc = ELINK_STATUS_TIMEOUT;
3503         } else {
3504                 /* Data */
3505                 val = ((phy->addr << 21) | (devad << 16) |
3506                        EMAC_MDIO_COMM_COMMAND_READ_45 |
3507                        EMAC_MDIO_COMM_START_BUSY);
3508                 REG_WR(sc, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_COMM, val);
3509
3510                 for (i = 0; i < 50; i++) {
3511                         DELAY(10);
3512
3513                         val = REG_RD(sc, phy->mdio_ctrl +
3514                                      EMAC_REG_EMAC_MDIO_COMM);
3515                         if (!(val & EMAC_MDIO_COMM_START_BUSY)) {
3516                                 *ret_val = (uint16_t)(val & EMAC_MDIO_COMM_DATA);
3517                                 break;
3518                         }
3519                 }