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