1*49b49cdaSZbigniew Bodek /*-
2*49b49cdaSZbigniew Bodek *******************************************************************************
3*49b49cdaSZbigniew Bodek Copyright (C) 2015 Annapurna Labs Ltd.
4*49b49cdaSZbigniew Bodek
5*49b49cdaSZbigniew Bodek This file may be licensed under the terms of the Annapurna Labs Commercial
6*49b49cdaSZbigniew Bodek License Agreement.
7*49b49cdaSZbigniew Bodek
8*49b49cdaSZbigniew Bodek Alternatively, this file can be distributed under the terms of the GNU General
9*49b49cdaSZbigniew Bodek Public License V2 as published by the Free Software Foundation and can be
10*49b49cdaSZbigniew Bodek found at http://www.gnu.org/licenses/gpl-2.0.html
11*49b49cdaSZbigniew Bodek
12*49b49cdaSZbigniew Bodek Alternatively, redistribution and use in source and binary forms, with or
13*49b49cdaSZbigniew Bodek without modification, are permitted provided that the following conditions are
14*49b49cdaSZbigniew Bodek met:
15*49b49cdaSZbigniew Bodek
16*49b49cdaSZbigniew Bodek * Redistributions of source code must retain the above copyright notice,
17*49b49cdaSZbigniew Bodek this list of conditions and the following disclaimer.
18*49b49cdaSZbigniew Bodek
19*49b49cdaSZbigniew Bodek * Redistributions in binary form must reproduce the above copyright
20*49b49cdaSZbigniew Bodek notice, this list of conditions and the following disclaimer in
21*49b49cdaSZbigniew Bodek the documentation and/or other materials provided with the
22*49b49cdaSZbigniew Bodek distribution.
23*49b49cdaSZbigniew Bodek
24*49b49cdaSZbigniew Bodek THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
25*49b49cdaSZbigniew Bodek ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26*49b49cdaSZbigniew Bodek WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27*49b49cdaSZbigniew Bodek DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
28*49b49cdaSZbigniew Bodek ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29*49b49cdaSZbigniew Bodek (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*49b49cdaSZbigniew Bodek LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
31*49b49cdaSZbigniew Bodek ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32*49b49cdaSZbigniew Bodek (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*49b49cdaSZbigniew Bodek SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*49b49cdaSZbigniew Bodek
35*49b49cdaSZbigniew Bodek *******************************************************************************/
36*49b49cdaSZbigniew Bodek /**
37*49b49cdaSZbigniew Bodek * Ethernet
38*49b49cdaSZbigniew Bodek * @{
39*49b49cdaSZbigniew Bodek * @file al_hal_eth_kr.c
40*49b49cdaSZbigniew Bodek *
41*49b49cdaSZbigniew Bodek * @brief KR HAL driver for main functions (auto-neg, Link Training)
42*49b49cdaSZbigniew Bodek *
43*49b49cdaSZbigniew Bodek */
44*49b49cdaSZbigniew Bodek
45*49b49cdaSZbigniew Bodek #include "al_hal_eth_kr.h"
46*49b49cdaSZbigniew Bodek #include "al_hal_eth_mac_regs.h"
47*49b49cdaSZbigniew Bodek #include "al_hal_an_lt_wrapper_regs.h"
48*49b49cdaSZbigniew Bodek
49*49b49cdaSZbigniew Bodek enum al_eth_lt_unit_rev {
50*49b49cdaSZbigniew Bodek AL_ETH_LT_UNIT_REV_1 = 0,
51*49b49cdaSZbigniew Bodek AL_ETH_LT_UNIT_REV_2,
52*49b49cdaSZbigniew Bodek
53*49b49cdaSZbigniew Bodek AL_ETH_LT_UNIT_REV_MAX
54*49b49cdaSZbigniew Bodek };
55*49b49cdaSZbigniew Bodek
56*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs_ids {
57*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_CONTROL = 0,
58*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_STATUS,
59*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV0,
60*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1,
61*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2,
62*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_ADV0,
63*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_ADV1,
64*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_ADV2,
65*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_CONTROL,
66*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_STATUS,
67*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP,
68*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT,
69*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP,
70*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT,
71*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_XNP_ADV0,
72*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_XNP_ADV1,
73*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_XNP_ADV2,
74*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV0,
75*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV1,
76*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV2,
77*49b49cdaSZbigniew Bodek };
78*49b49cdaSZbigniew Bodek
79*49b49cdaSZbigniew Bodek static uint32_t al_eth_an_lt_regs_addr[][AL_ETH_LT_UNIT_REV_MAX] = {
80*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_CONTROL] = {0 , 0x0},
81*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_STATUS] = {1 , 0x4},
82*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_ADV0] = {16 , 0x8},
83*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_ADV1] = {17 , 0xc},
84*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_ADV2] = {18 , 0x10},
85*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_ADV0] = {19 , 0x14},
86*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_ADV1] = {20 , 0x18},
87*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_ADV2] = {21 , 0x1c},
88*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_CONTROL] = {150, 0x400},
89*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_STATUS] = {151, 0x404},
90*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_LP_COEF_UP] = {152, 0x408},
91*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_LP_STATUS_REPORT] = {153, 0x40c},
92*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_LD_COEF_UP] = {154, 0x410},
93*49b49cdaSZbigniew Bodek [AL_ETH_KR_PMD_LD_STATUS_REPORT] = {155, 0x414},
94*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_XNP_ADV0] = {22 , 0x24},
95*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_XNP_ADV1] = {23 , 0x28},
96*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_XNP_ADV2] = {24 , 0x2c},
97*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_XNP_ADV0] = {25 , 0x30},
98*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_XNP_ADV1] = {26 , 0x34},
99*49b49cdaSZbigniew Bodek [AL_ETH_KR_AN_REM_XNP_ADV2] = {27 , 0x38},
100*49b49cdaSZbigniew Bodek };
101*49b49cdaSZbigniew Bodek
102*49b49cdaSZbigniew Bodek
103*49b49cdaSZbigniew Bodek /*
104*49b49cdaSZbigniew Bodek * AN(Auto Negotiation) registers
105*49b49cdaSZbigniew Bodek * (read / write indirect with al_eth_an_reg_read/write)
106*49b49cdaSZbigniew Bodek */
107*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_CONTROL_RESTART AL_BIT(9)
108*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_CONTROL_ENABLE AL_BIT(12)
109*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_CONTROL_NP_ENABLE AL_BIT(13)
110*49b49cdaSZbigniew Bodek
111*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_STATUS_COMPLETED AL_BIT(5)
112*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_STATUS_BASE_PAGE_RECEIVED AL_BIT(6)
113*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_STATUS_CHECK_MASK 0xFF0A
114*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_STATUS_CHECK_NO_ERROR 0x0008
115*49b49cdaSZbigniew Bodek
116*49b49cdaSZbigniew Bodek /* AN advertising registers parsing */
117*49b49cdaSZbigniew Bodek /* register 1 */
118*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_SEL_FIELD_MASK 0x001f
119*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_SEL_FIELD_SHIFT 0
120*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_ECHOED_NONCE_MASK 0x03e0
121*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_ECHOED_NONCE_SHIFT 5
122*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_CAPABILITY_MASK 0x1c00
123*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_CAPABILITY_SHIFT 10
124*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_REM_FAULT_MASK 0x2000
125*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_REM_FAULT_SHIFT 13
126*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_ACK_MASK 0x4000
127*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_ACK_SHIFT 14
128*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_NEXT_PAGE_MASK 0x8000
129*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV1_NEXT_PAGE_SHIFT 15
130*49b49cdaSZbigniew Bodek /* register 2 */
131*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV2_TX_NONCE_MASK 0x001f
132*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV2_TX_NONCE_SHIFT 0
133*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV2_TECH_MASK 0xffe0
134*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV2_TECH_SHIFT 5
135*49b49cdaSZbigniew Bodek /* register 3 */
136*49b49cdaSZbigniew Bodek /* TECH field in the third register is extended to the field in the second
137*49b49cdaSZbigniew Bodek * register and it is currently reserved (should be always 0) */
138*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV3_TECH_MASK 0x1fff
139*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV3_TECH_SHIFT 0
140*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV3_FEC_MASK 0xc000
141*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_ADV3_FEC_SHIFT 14
142*49b49cdaSZbigniew Bodek
143*49b49cdaSZbigniew Bodek /* Next Page Fields */
144*49b49cdaSZbigniew Bodek /* register 1 */
145*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_DATA1_MASK 0x07ff
146*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_DATA1_SHIFT 0
147*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_TOGGLE_MASK 0x0800
148*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_TOGGLE_SHIFT 11
149*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_ACK2_MASK 0x1000
150*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_ACK2_SHIFT 12
151*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_MASK 0x2000
152*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_SHIFT 13
153*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_NP_MASK 0x8000
154*49b49cdaSZbigniew Bodek #define AL_ETH_KR_AN_NP_ADV1_NP_SHIFT 15
155*49b49cdaSZbigniew Bodek
156*49b49cdaSZbigniew Bodek /*
157*49b49cdaSZbigniew Bodek * LT(Link Training) registers
158*49b49cdaSZbigniew Bodek * (read / write indirect with al_eth_pma_reg_read/write)
159*49b49cdaSZbigniew Bodek */
160*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_CONTROL_RESTART 0
161*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_CONTROL_ENABLE 1
162*49b49cdaSZbigniew Bodek
163*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_STATUS_RECEIVER_COMPLETED_SHIFT 0
164*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_STATUS_RECEIVER_FRAME_LOCK_SHIFT 1
165*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_STATUS_RECEIVER_START_UP_PROTO_PROG_SHIFT 2
166*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_STATUS_FAILURE_SHIFT 3
167*49b49cdaSZbigniew Bodek
168*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_MINUS_MASK 0x0003
169*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_MINUS_SHIFT 0
170*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_ZERO_MASK 0x000C
171*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_ZERO_SHIFT 2
172*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_PLUS_MASK 0x0030
173*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_PLUS_SHIFT 4
174*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_INITIALIZE_SHIFT 12
175*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_COEF_UP_PRESET_SHIFT 13
176*49b49cdaSZbigniew Bodek
177*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_MINUS_MASK 0x0003
178*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_MINUS_SHIFT 0
179*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_ZERO_MASK 0x000C
180*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_ZERO_SHIFT 2
181*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_PLUS_MASK 0x0030
182*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_REPORT_PLUS_SHIFT 4
183*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LP_STATUS_RECEIVER_READY_SHIFT 15
184*49b49cdaSZbigniew Bodek
185*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_MINUS_MASK 0x0003
186*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_MINUS_SHIFT 0
187*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_ZERO_MASK 0x000C
188*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_ZERO_SHIFT 2
189*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_PLUS_MASK 0x0030
190*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_PLUS_SHIFT 4
191*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_INITIALIZE_SHIFT 12
192*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_COEF_UP_PRESET_SHIFT 13
193*49b49cdaSZbigniew Bodek
194*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_MINUS_MASK 0x0003
195*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_MINUS_SHIFT 0
196*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_ZERO_MASK 0x000C
197*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_ZERO_SHIFT 2
198*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_PLUS_MASK 0x0030
199*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_PLUS_SHIFT 4
200*49b49cdaSZbigniew Bodek #define AL_ETH_KR_PMD_LD_STATUS_REPORT_RECEIVER_READY_SHIFT 15
201*49b49cdaSZbigniew Bodek
202*49b49cdaSZbigniew Bodek
203*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs {
204*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS,
205*49b49cdaSZbigniew Bodek AL_ETH_LT_REGS,
206*49b49cdaSZbigniew Bodek };
207*49b49cdaSZbigniew Bodek
al_eth_an_lt_reg_read(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_regs_ids reg_id,enum al_eth_an_lt_regs an_lt,enum al_eth_an_lt_lane lane)208*49b49cdaSZbigniew Bodek static uint16_t al_eth_an_lt_reg_read(
209*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
210*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs_ids reg_id,
211*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs an_lt,
212*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
213*49b49cdaSZbigniew Bodek {
214*49b49cdaSZbigniew Bodek uint32_t val;
215*49b49cdaSZbigniew Bodek uint16_t reg_addr;
216*49b49cdaSZbigniew Bodek
217*49b49cdaSZbigniew Bodek if (adapter->rev_id < AL_ETH_REV_ID_3) {
218*49b49cdaSZbigniew Bodek al_assert(lane == AL_ETH_AN__LT_LANE_0);
219*49b49cdaSZbigniew Bodek
220*49b49cdaSZbigniew Bodek reg_addr = al_eth_an_lt_regs_addr[reg_id][AL_ETH_LT_UNIT_REV_1];
221*49b49cdaSZbigniew Bodek if (an_lt == AL_ETH_AN_REGS) {
222*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.an_addr, reg_addr);
223*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->kr.an_data);
224*49b49cdaSZbigniew Bodek } else {
225*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.pma_addr, reg_addr);
226*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->kr.pma_data);
227*49b49cdaSZbigniew Bodek }
228*49b49cdaSZbigniew Bodek } else {
229*49b49cdaSZbigniew Bodek struct al_an_lt_wrapper_regs *regs = NULL;
230*49b49cdaSZbigniew Bodek
231*49b49cdaSZbigniew Bodek reg_addr = al_eth_an_lt_regs_addr[reg_id][AL_ETH_LT_UNIT_REV_2];
232*49b49cdaSZbigniew Bodek
233*49b49cdaSZbigniew Bodek switch (lane) {
234*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_0:
235*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_addr,
236*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
237*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_data,
238*49b49cdaSZbigniew Bodek reg_addr);
239*49b49cdaSZbigniew Bodek
240*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_addr,
241*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
242*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->gen_v3.an_lt_0_data);
243*49b49cdaSZbigniew Bodek break;
244*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_1:
245*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_addr,
246*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
247*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_data,
248*49b49cdaSZbigniew Bodek reg_addr);
249*49b49cdaSZbigniew Bodek
250*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_addr,
251*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
252*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->gen_v3.an_lt_1_data);
253*49b49cdaSZbigniew Bodek break;
254*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_2:
255*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_addr,
256*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
257*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_data,
258*49b49cdaSZbigniew Bodek reg_addr);
259*49b49cdaSZbigniew Bodek
260*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_addr,
261*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
262*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->gen_v3.an_lt_2_data);
263*49b49cdaSZbigniew Bodek break;
264*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_3:
265*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_addr,
266*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
267*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_data,
268*49b49cdaSZbigniew Bodek reg_addr);
269*49b49cdaSZbigniew Bodek
270*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_addr,
271*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
272*49b49cdaSZbigniew Bodek val = al_reg_read32(&adapter->mac_regs_base->gen_v3.an_lt_3_data);
273*49b49cdaSZbigniew Bodek break;
274*49b49cdaSZbigniew Bodek default:
275*49b49cdaSZbigniew Bodek al_err("%s: Unknown Lane %d\n", __func__, lane);
276*49b49cdaSZbigniew Bodek return 0;
277*49b49cdaSZbigniew Bodek }
278*49b49cdaSZbigniew Bodek }
279*49b49cdaSZbigniew Bodek
280*49b49cdaSZbigniew Bodek
281*49b49cdaSZbigniew Bodek al_dbg("[%s]: %s - (%s) lane %d, reg %d, val 0x%x", adapter->name, __func__,
282*49b49cdaSZbigniew Bodek (an_lt == AL_ETH_AN_REGS) ? "AN" : "LT", lane, reg_addr, val);
283*49b49cdaSZbigniew Bodek
284*49b49cdaSZbigniew Bodek return (uint16_t)val;
285*49b49cdaSZbigniew Bodek }
286*49b49cdaSZbigniew Bodek
al_eth_an_lt_reg_write(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_regs_ids reg_id,enum al_eth_an_lt_regs an_lt,enum al_eth_an_lt_lane lane,uint16_t val)287*49b49cdaSZbigniew Bodek static void al_eth_an_lt_reg_write(
288*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
289*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs_ids reg_id,
290*49b49cdaSZbigniew Bodek enum al_eth_an_lt_regs an_lt,
291*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
292*49b49cdaSZbigniew Bodek uint16_t val)
293*49b49cdaSZbigniew Bodek {
294*49b49cdaSZbigniew Bodek uint16_t reg_addr;
295*49b49cdaSZbigniew Bodek
296*49b49cdaSZbigniew Bodek if (adapter->rev_id < AL_ETH_REV_ID_3) {
297*49b49cdaSZbigniew Bodek reg_addr = al_eth_an_lt_regs_addr[reg_id][AL_ETH_LT_UNIT_REV_1];
298*49b49cdaSZbigniew Bodek if (an_lt == AL_ETH_AN_REGS) {
299*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.an_addr, reg_addr);
300*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.an_data, val);
301*49b49cdaSZbigniew Bodek } else {
302*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.pma_addr, reg_addr);
303*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->kr.pma_data, val);
304*49b49cdaSZbigniew Bodek }
305*49b49cdaSZbigniew Bodek } else {
306*49b49cdaSZbigniew Bodek struct al_an_lt_wrapper_regs *regs = NULL;
307*49b49cdaSZbigniew Bodek
308*49b49cdaSZbigniew Bodek reg_addr = al_eth_an_lt_regs_addr[reg_id][AL_ETH_LT_UNIT_REV_2];
309*49b49cdaSZbigniew Bodek
310*49b49cdaSZbigniew Bodek switch (lane) {
311*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_0:
312*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_addr,
313*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
314*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_data,
315*49b49cdaSZbigniew Bodek reg_addr);
316*49b49cdaSZbigniew Bodek
317*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_addr,
318*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
319*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_data,
320*49b49cdaSZbigniew Bodek val);
321*49b49cdaSZbigniew Bodek break;
322*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_1:
323*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_addr,
324*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
325*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_data,
326*49b49cdaSZbigniew Bodek reg_addr);
327*49b49cdaSZbigniew Bodek
328*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_addr,
329*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
330*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_data,
331*49b49cdaSZbigniew Bodek val);
332*49b49cdaSZbigniew Bodek break;
333*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_2:
334*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_addr,
335*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
336*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_data,
337*49b49cdaSZbigniew Bodek reg_addr);
338*49b49cdaSZbigniew Bodek
339*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_addr,
340*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
341*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_data,
342*49b49cdaSZbigniew Bodek val);
343*49b49cdaSZbigniew Bodek break;
344*49b49cdaSZbigniew Bodek case AL_ETH_AN__LT_LANE_3:
345*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_addr,
346*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].addr);
347*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_data,
348*49b49cdaSZbigniew Bodek reg_addr);
349*49b49cdaSZbigniew Bodek
350*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_addr,
351*49b49cdaSZbigniew Bodek (uintptr_t)®s->an_lt[adapter->curr_lt_unit].data);
352*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_data,
353*49b49cdaSZbigniew Bodek val);
354*49b49cdaSZbigniew Bodek break;
355*49b49cdaSZbigniew Bodek default:
356*49b49cdaSZbigniew Bodek al_err("%s: Unknown Lane %d\n", __func__, lane);
357*49b49cdaSZbigniew Bodek return;
358*49b49cdaSZbigniew Bodek }
359*49b49cdaSZbigniew Bodek }
360*49b49cdaSZbigniew Bodek
361*49b49cdaSZbigniew Bodek
362*49b49cdaSZbigniew Bodek al_dbg("[%s]: %s - (%s) lane %d, reg %d, val 0x%x", adapter->name, __func__,
363*49b49cdaSZbigniew Bodek (an_lt == AL_ETH_AN_REGS) ? "AN" : "LT", lane, reg_addr, val);
364*49b49cdaSZbigniew Bodek }
365*49b49cdaSZbigniew Bodek
al_eth_an_lt_unit_config(struct al_hal_eth_adapter * adapter)366*49b49cdaSZbigniew Bodek static void al_eth_an_lt_unit_config(struct al_hal_eth_adapter *adapter)
367*49b49cdaSZbigniew Bodek {
368*49b49cdaSZbigniew Bodek struct al_an_lt_wrapper_regs *regs = NULL;
369*49b49cdaSZbigniew Bodek uint32_t cfg_lane_0 = (AN_LT_WRAPPER_GEN_CFG_BYPASS_RX | AN_LT_WRAPPER_GEN_CFG_BYPASS_TX);
370*49b49cdaSZbigniew Bodek uint32_t cfg_lane_1 = (AN_LT_WRAPPER_GEN_CFG_BYPASS_RX | AN_LT_WRAPPER_GEN_CFG_BYPASS_TX);
371*49b49cdaSZbigniew Bodek uint32_t cfg_lane_2 = (AN_LT_WRAPPER_GEN_CFG_BYPASS_RX | AN_LT_WRAPPER_GEN_CFG_BYPASS_TX);
372*49b49cdaSZbigniew Bodek uint32_t cfg_lane_3 = (AN_LT_WRAPPER_GEN_CFG_BYPASS_RX | AN_LT_WRAPPER_GEN_CFG_BYPASS_TX);
373*49b49cdaSZbigniew Bodek
374*49b49cdaSZbigniew Bodek switch (adapter->mac_mode) {
375*49b49cdaSZbigniew Bodek case AL_ETH_MAC_MODE_10GbE_Serial:
376*49b49cdaSZbigniew Bodek cfg_lane_0 = 0;
377*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
378*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
379*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
380*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_20_BIT);
381*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
382*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
383*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
384*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_20_BIT);
385*49b49cdaSZbigniew Bodek
386*49b49cdaSZbigniew Bodek adapter->curr_lt_unit = AL_ETH_AN_LT_UNIT_20_BIT;
387*49b49cdaSZbigniew Bodek
388*49b49cdaSZbigniew Bodek break;
389*49b49cdaSZbigniew Bodek case AL_ETH_MAC_MODE_KR_LL_25G:
390*49b49cdaSZbigniew Bodek cfg_lane_0 = 0;
391*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
392*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
393*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
394*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
395*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
396*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
397*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
398*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
399*49b49cdaSZbigniew Bodek
400*49b49cdaSZbigniew Bodek adapter->curr_lt_unit = AL_ETH_AN_LT_UNIT_32_BIT;
401*49b49cdaSZbigniew Bodek
402*49b49cdaSZbigniew Bodek break;
403*49b49cdaSZbigniew Bodek case AL_ETH_MAC_MODE_XLG_LL_40G:
404*49b49cdaSZbigniew Bodek cfg_lane_0 = 0;
405*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
406*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
407*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
408*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
409*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
410*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
411*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
412*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
413*49b49cdaSZbigniew Bodek
414*49b49cdaSZbigniew Bodek cfg_lane_1 = 0;
415*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_1,
416*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
417*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
418*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
419*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_1,
420*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
421*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
422*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
423*49b49cdaSZbigniew Bodek
424*49b49cdaSZbigniew Bodek cfg_lane_2 = 0;
425*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_2,
426*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
427*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
428*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
429*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_2,
430*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
431*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
432*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
433*49b49cdaSZbigniew Bodek
434*49b49cdaSZbigniew Bodek cfg_lane_3 = 0;
435*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_3,
436*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
437*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
438*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
439*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_3,
440*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
441*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
442*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_16_BIT);
443*49b49cdaSZbigniew Bodek
444*49b49cdaSZbigniew Bodek adapter->curr_lt_unit = AL_ETH_AN_LT_UNIT_16_BIT;
445*49b49cdaSZbigniew Bodek
446*49b49cdaSZbigniew Bodek break;
447*49b49cdaSZbigniew Bodek case AL_ETH_MAC_MODE_XLG_LL_50G:
448*49b49cdaSZbigniew Bodek cfg_lane_0 = 0;
449*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
450*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
451*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
452*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
453*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_0,
454*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
455*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
456*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
457*49b49cdaSZbigniew Bodek
458*49b49cdaSZbigniew Bodek cfg_lane_1 = 0;
459*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_1,
460*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_MASK,
461*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_RX_SHIFT,
462*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
463*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(cfg_lane_1,
464*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_MASK,
465*49b49cdaSZbigniew Bodek AN_LT_WRAPPER_GEN_CFG_AN_LT_SEL_TX_SHIFT,
466*49b49cdaSZbigniew Bodek AL_ETH_AN_LT_UNIT_32_BIT);
467*49b49cdaSZbigniew Bodek
468*49b49cdaSZbigniew Bodek adapter->curr_lt_unit = AL_ETH_AN_LT_UNIT_32_BIT;
469*49b49cdaSZbigniew Bodek
470*49b49cdaSZbigniew Bodek break;
471*49b49cdaSZbigniew Bodek default:
472*49b49cdaSZbigniew Bodek al_err("%s: Unknown mac_mode\n", __func__);
473*49b49cdaSZbigniew Bodek return;
474*49b49cdaSZbigniew Bodek }
475*49b49cdaSZbigniew Bodek
476*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_addr,
477*49b49cdaSZbigniew Bodek (uintptr_t)®s->gen.cfg);
478*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_0_data,
479*49b49cdaSZbigniew Bodek cfg_lane_0);
480*49b49cdaSZbigniew Bodek
481*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_addr,
482*49b49cdaSZbigniew Bodek (uintptr_t)®s->gen.cfg);
483*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_1_data,
484*49b49cdaSZbigniew Bodek cfg_lane_1);
485*49b49cdaSZbigniew Bodek
486*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_addr,
487*49b49cdaSZbigniew Bodek (uintptr_t)®s->gen.cfg);
488*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_2_data,
489*49b49cdaSZbigniew Bodek cfg_lane_2);
490*49b49cdaSZbigniew Bodek
491*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_addr,
492*49b49cdaSZbigniew Bodek (uintptr_t)®s->gen.cfg);
493*49b49cdaSZbigniew Bodek al_reg_write32(&adapter->mac_regs_base->gen_v3.an_lt_3_data,
494*49b49cdaSZbigniew Bodek cfg_lane_3);
495*49b49cdaSZbigniew Bodek }
496*49b49cdaSZbigniew Bodek
al_eth_lp_coeff_up_get(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,struct al_eth_kr_coef_up_data * lpcoeff)497*49b49cdaSZbigniew Bodek void al_eth_lp_coeff_up_get(
498*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
499*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
500*49b49cdaSZbigniew Bodek struct al_eth_kr_coef_up_data *lpcoeff)
501*49b49cdaSZbigniew Bodek {
502*49b49cdaSZbigniew Bodek uint16_t reg;
503*49b49cdaSZbigniew Bodek
504*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_LP_COEF_UP, AL_ETH_LT_REGS, lane);
505*49b49cdaSZbigniew Bodek
506*49b49cdaSZbigniew Bodek lpcoeff->preset =
507*49b49cdaSZbigniew Bodek (AL_REG_BIT_GET(
508*49b49cdaSZbigniew Bodek reg, AL_ETH_KR_PMD_LP_COEF_UP_PRESET_SHIFT) != 0);
509*49b49cdaSZbigniew Bodek
510*49b49cdaSZbigniew Bodek lpcoeff->initialize =
511*49b49cdaSZbigniew Bodek (AL_REG_BIT_GET(
512*49b49cdaSZbigniew Bodek reg, AL_ETH_KR_PMD_LP_COEF_UP_INITIALIZE_SHIFT) != 0);
513*49b49cdaSZbigniew Bodek
514*49b49cdaSZbigniew Bodek lpcoeff->c_minus = AL_REG_FIELD_GET(reg,
515*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_MINUS_MASK,
516*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_MINUS_SHIFT);
517*49b49cdaSZbigniew Bodek
518*49b49cdaSZbigniew Bodek lpcoeff->c_zero = AL_REG_FIELD_GET(reg,
519*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_ZERO_MASK,
520*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_ZERO_SHIFT);
521*49b49cdaSZbigniew Bodek
522*49b49cdaSZbigniew Bodek lpcoeff->c_plus = AL_REG_FIELD_GET(reg,
523*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_PLUS_MASK,
524*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_COEF_UP_PLUS_SHIFT);
525*49b49cdaSZbigniew Bodek }
526*49b49cdaSZbigniew Bodek
al_eth_lp_status_report_get(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,struct al_eth_kr_status_report_data * status)527*49b49cdaSZbigniew Bodek void al_eth_lp_status_report_get(
528*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
529*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
530*49b49cdaSZbigniew Bodek struct al_eth_kr_status_report_data *status)
531*49b49cdaSZbigniew Bodek {
532*49b49cdaSZbigniew Bodek uint16_t reg;
533*49b49cdaSZbigniew Bodek
534*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_LP_STATUS_REPORT, AL_ETH_LT_REGS, lane);
535*49b49cdaSZbigniew Bodek
536*49b49cdaSZbigniew Bodek status->c_minus = AL_REG_FIELD_GET(reg,
537*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_MINUS_MASK,
538*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_MINUS_SHIFT);
539*49b49cdaSZbigniew Bodek
540*49b49cdaSZbigniew Bodek status->c_zero = AL_REG_FIELD_GET(reg,
541*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_ZERO_MASK,
542*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_ZERO_SHIFT);
543*49b49cdaSZbigniew Bodek
544*49b49cdaSZbigniew Bodek status->c_plus = AL_REG_FIELD_GET(reg,
545*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_PLUS_MASK,
546*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LP_STATUS_REPORT_PLUS_SHIFT);
547*49b49cdaSZbigniew Bodek
548*49b49cdaSZbigniew Bodek status->receiver_ready =
549*49b49cdaSZbigniew Bodek (AL_REG_BIT_GET(
550*49b49cdaSZbigniew Bodek reg, AL_ETH_KR_PMD_LP_STATUS_RECEIVER_READY_SHIFT) != 0);
551*49b49cdaSZbigniew Bodek
552*49b49cdaSZbigniew Bodek }
553*49b49cdaSZbigniew Bodek
al_eth_ld_coeff_up_set(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,struct al_eth_kr_coef_up_data * ldcoeff)554*49b49cdaSZbigniew Bodek void al_eth_ld_coeff_up_set(
555*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
556*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
557*49b49cdaSZbigniew Bodek struct al_eth_kr_coef_up_data *ldcoeff)
558*49b49cdaSZbigniew Bodek {
559*49b49cdaSZbigniew Bodek uint16_t reg = 0;
560*49b49cdaSZbigniew Bodek
561*49b49cdaSZbigniew Bodek if (ldcoeff->preset)
562*49b49cdaSZbigniew Bodek AL_REG_BIT_SET(reg, AL_ETH_KR_PMD_LD_COEF_UP_PRESET_SHIFT);
563*49b49cdaSZbigniew Bodek
564*49b49cdaSZbigniew Bodek if (ldcoeff->initialize)
565*49b49cdaSZbigniew Bodek AL_REG_BIT_SET(reg, AL_ETH_KR_PMD_LD_COEF_UP_INITIALIZE_SHIFT);
566*49b49cdaSZbigniew Bodek
567*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
568*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_MINUS_MASK,
569*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_MINUS_SHIFT,
570*49b49cdaSZbigniew Bodek ldcoeff->c_minus);
571*49b49cdaSZbigniew Bodek
572*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
573*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_ZERO_MASK,
574*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_ZERO_SHIFT,
575*49b49cdaSZbigniew Bodek ldcoeff->c_zero);
576*49b49cdaSZbigniew Bodek
577*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
578*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_PLUS_MASK,
579*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_COEF_UP_PLUS_SHIFT,
580*49b49cdaSZbigniew Bodek ldcoeff->c_plus);
581*49b49cdaSZbigniew Bodek
582*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_LD_COEF_UP, AL_ETH_LT_REGS, lane, reg);
583*49b49cdaSZbigniew Bodek }
584*49b49cdaSZbigniew Bodek
al_eth_ld_status_report_set(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,struct al_eth_kr_status_report_data * status)585*49b49cdaSZbigniew Bodek void al_eth_ld_status_report_set(
586*49b49cdaSZbigniew Bodek struct al_hal_eth_adapter *adapter,
587*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
588*49b49cdaSZbigniew Bodek struct al_eth_kr_status_report_data *status)
589*49b49cdaSZbigniew Bodek {
590*49b49cdaSZbigniew Bodek uint16_t reg = 0;
591*49b49cdaSZbigniew Bodek
592*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
593*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_MINUS_MASK,
594*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_MINUS_SHIFT,
595*49b49cdaSZbigniew Bodek status->c_minus);
596*49b49cdaSZbigniew Bodek
597*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
598*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_ZERO_MASK,
599*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_ZERO_SHIFT,
600*49b49cdaSZbigniew Bodek status->c_zero);
601*49b49cdaSZbigniew Bodek
602*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg,
603*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_PLUS_MASK,
604*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_PLUS_SHIFT,
605*49b49cdaSZbigniew Bodek status->c_plus);
606*49b49cdaSZbigniew Bodek
607*49b49cdaSZbigniew Bodek if (status->receiver_ready)
608*49b49cdaSZbigniew Bodek AL_REG_BIT_SET(reg,
609*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_LD_STATUS_REPORT_RECEIVER_READY_SHIFT);
610*49b49cdaSZbigniew Bodek
611*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_LD_STATUS_REPORT, AL_ETH_LT_REGS, lane, reg);
612*49b49cdaSZbigniew Bodek }
613*49b49cdaSZbigniew Bodek
al_eth_kr_receiver_frame_lock_get(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)614*49b49cdaSZbigniew Bodek al_bool al_eth_kr_receiver_frame_lock_get(struct al_hal_eth_adapter *adapter,
615*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
616*49b49cdaSZbigniew Bodek {
617*49b49cdaSZbigniew Bodek uint16_t reg;
618*49b49cdaSZbigniew Bodek
619*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane);
620*49b49cdaSZbigniew Bodek
621*49b49cdaSZbigniew Bodek return (AL_REG_BIT_GET(reg,
622*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_STATUS_RECEIVER_FRAME_LOCK_SHIFT) != 0);
623*49b49cdaSZbigniew Bodek }
624*49b49cdaSZbigniew Bodek
al_eth_kr_startup_proto_prog_get(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)625*49b49cdaSZbigniew Bodek al_bool al_eth_kr_startup_proto_prog_get(struct al_hal_eth_adapter *adapter,
626*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
627*49b49cdaSZbigniew Bodek {
628*49b49cdaSZbigniew Bodek uint16_t reg;
629*49b49cdaSZbigniew Bodek
630*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane);
631*49b49cdaSZbigniew Bodek
632*49b49cdaSZbigniew Bodek return (AL_REG_BIT_GET(
633*49b49cdaSZbigniew Bodek reg, AL_ETH_KR_PMD_STATUS_RECEIVER_START_UP_PROTO_PROG_SHIFT) != 0);
634*49b49cdaSZbigniew Bodek }
635*49b49cdaSZbigniew Bodek
al_eth_kr_training_status_fail_get(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)636*49b49cdaSZbigniew Bodek al_bool al_eth_kr_training_status_fail_get(struct al_hal_eth_adapter *adapter,
637*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
638*49b49cdaSZbigniew Bodek {
639*49b49cdaSZbigniew Bodek uint16_t reg;
640*49b49cdaSZbigniew Bodek
641*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane);
642*49b49cdaSZbigniew Bodek
643*49b49cdaSZbigniew Bodek return (AL_REG_BIT_GET(reg, AL_ETH_KR_PMD_STATUS_FAILURE_SHIFT) != 0);
644*49b49cdaSZbigniew Bodek }
645*49b49cdaSZbigniew Bodek
al_eth_receiver_ready_set(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)646*49b49cdaSZbigniew Bodek void al_eth_receiver_ready_set(struct al_hal_eth_adapter *adapter,
647*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
648*49b49cdaSZbigniew Bodek {
649*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane, 1);
650*49b49cdaSZbigniew Bodek }
651*49b49cdaSZbigniew Bodek
652*49b49cdaSZbigniew Bodek /*************************** auto negotiation *********************************/
al_eth_kr_an_validate_adv(struct al_hal_eth_adapter * adapter,struct al_eth_an_adv * an_adv)653*49b49cdaSZbigniew Bodek static int al_eth_kr_an_validate_adv(struct al_hal_eth_adapter *adapter,
654*49b49cdaSZbigniew Bodek struct al_eth_an_adv *an_adv)
655*49b49cdaSZbigniew Bodek {
656*49b49cdaSZbigniew Bodek al_assert(adapter);
657*49b49cdaSZbigniew Bodek
658*49b49cdaSZbigniew Bodek if (an_adv == NULL)
659*49b49cdaSZbigniew Bodek return 0;
660*49b49cdaSZbigniew Bodek
661*49b49cdaSZbigniew Bodek if (an_adv->selector_field != 1) {
662*49b49cdaSZbigniew Bodek al_err("[%s]: %s failed on selector_field (%d)\n",
663*49b49cdaSZbigniew Bodek adapter->name, __func__, an_adv->selector_field);
664*49b49cdaSZbigniew Bodek return -EINVAL;
665*49b49cdaSZbigniew Bodek }
666*49b49cdaSZbigniew Bodek
667*49b49cdaSZbigniew Bodek if (an_adv->capability & AL_BIT(2)) {
668*49b49cdaSZbigniew Bodek al_err("[%s]: %s failed on capability bit 2 (%d)\n",
669*49b49cdaSZbigniew Bodek adapter->name, __func__, an_adv->capability);
670*49b49cdaSZbigniew Bodek return -EINVAL;
671*49b49cdaSZbigniew Bodek }
672*49b49cdaSZbigniew Bodek
673*49b49cdaSZbigniew Bodek if (an_adv->remote_fault) {
674*49b49cdaSZbigniew Bodek al_err("[%s]: %s failed on remote_fault (%d)\n",
675*49b49cdaSZbigniew Bodek adapter->name, __func__, an_adv->remote_fault);
676*49b49cdaSZbigniew Bodek return -EINVAL;
677*49b49cdaSZbigniew Bodek }
678*49b49cdaSZbigniew Bodek
679*49b49cdaSZbigniew Bodek if (an_adv->acknowledge) {
680*49b49cdaSZbigniew Bodek al_err("[%s]: %s failed on acknowledge (%d)\n",
681*49b49cdaSZbigniew Bodek adapter->name, __func__, an_adv->acknowledge);
682*49b49cdaSZbigniew Bodek return -EINVAL;
683*49b49cdaSZbigniew Bodek }
684*49b49cdaSZbigniew Bodek
685*49b49cdaSZbigniew Bodek return 0;
686*49b49cdaSZbigniew Bodek }
687*49b49cdaSZbigniew Bodek
al_eth_kr_an_write_adv(struct al_hal_eth_adapter * adapter,struct al_eth_an_adv * an_adv)688*49b49cdaSZbigniew Bodek static int al_eth_kr_an_write_adv(struct al_hal_eth_adapter *adapter,
689*49b49cdaSZbigniew Bodek struct al_eth_an_adv *an_adv)
690*49b49cdaSZbigniew Bodek {
691*49b49cdaSZbigniew Bodek uint16_t reg;
692*49b49cdaSZbigniew Bodek
693*49b49cdaSZbigniew Bodek if(an_adv == NULL)
694*49b49cdaSZbigniew Bodek return 0;
695*49b49cdaSZbigniew Bodek
696*49b49cdaSZbigniew Bodek reg = 0;
697*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV1_SEL_FIELD_MASK,
698*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_SEL_FIELD_SHIFT,
699*49b49cdaSZbigniew Bodek an_adv->selector_field);
700*49b49cdaSZbigniew Bodek
701*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV1_ECHOED_NONCE_MASK,
702*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_ECHOED_NONCE_SHIFT,
703*49b49cdaSZbigniew Bodek an_adv->echoed_nonce);
704*49b49cdaSZbigniew Bodek
705*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV1_CAPABILITY_MASK,
706*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_CAPABILITY_SHIFT,
707*49b49cdaSZbigniew Bodek an_adv->capability);
708*49b49cdaSZbigniew Bodek
709*49b49cdaSZbigniew Bodek AL_REG_BIT_VAL_SET(reg, AL_ETH_KR_AN_ADV1_REM_FAULT_SHIFT,
710*49b49cdaSZbigniew Bodek an_adv->remote_fault);
711*49b49cdaSZbigniew Bodek
712*49b49cdaSZbigniew Bodek AL_REG_BIT_VAL_SET(reg, AL_ETH_KR_AN_ADV1_ACK_SHIFT,
713*49b49cdaSZbigniew Bodek an_adv->acknowledge);
714*49b49cdaSZbigniew Bodek
715*49b49cdaSZbigniew Bodek AL_REG_BIT_VAL_SET(reg, AL_ETH_KR_AN_ADV1_NEXT_PAGE_SHIFT,
716*49b49cdaSZbigniew Bodek an_adv->next_page);
717*49b49cdaSZbigniew Bodek
718*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_ADV0, AL_ETH_AN_REGS,
719*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, reg);
720*49b49cdaSZbigniew Bodek
721*49b49cdaSZbigniew Bodek reg = 0;
722*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV2_TX_NONCE_MASK,
723*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TX_NONCE_SHIFT,
724*49b49cdaSZbigniew Bodek an_adv->transmitted_nonce);
725*49b49cdaSZbigniew Bodek
726*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV2_TECH_MASK,
727*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TECH_SHIFT,
728*49b49cdaSZbigniew Bodek an_adv->technology);
729*49b49cdaSZbigniew Bodek
730*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_ADV1, AL_ETH_AN_REGS,
731*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, reg);
732*49b49cdaSZbigniew Bodek
733*49b49cdaSZbigniew Bodek reg = 0;
734*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV3_TECH_MASK,
735*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_TECH_SHIFT,
736*49b49cdaSZbigniew Bodek an_adv->technology >> 11);
737*49b49cdaSZbigniew Bodek
738*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_ADV3_FEC_MASK,
739*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_FEC_SHIFT,
740*49b49cdaSZbigniew Bodek an_adv->fec_capability);
741*49b49cdaSZbigniew Bodek
742*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_ADV2, AL_ETH_AN_REGS,
743*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, reg);
744*49b49cdaSZbigniew Bodek
745*49b49cdaSZbigniew Bodek return 0;
746*49b49cdaSZbigniew Bodek }
747*49b49cdaSZbigniew Bodek
al_eth_kr_an_read_adv(struct al_hal_eth_adapter * adapter,struct al_eth_an_adv * an_adv)748*49b49cdaSZbigniew Bodek void al_eth_kr_an_read_adv(struct al_hal_eth_adapter *adapter,
749*49b49cdaSZbigniew Bodek struct al_eth_an_adv *an_adv)
750*49b49cdaSZbigniew Bodek {
751*49b49cdaSZbigniew Bodek int16_t reg;
752*49b49cdaSZbigniew Bodek
753*49b49cdaSZbigniew Bodek al_assert(an_adv != NULL);
754*49b49cdaSZbigniew Bodek
755*49b49cdaSZbigniew Bodek
756*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_AN_REM_ADV0,
757*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS, AL_ETH_AN__LT_LANE_0);
758*49b49cdaSZbigniew Bodek
759*49b49cdaSZbigniew Bodek an_adv->selector_field = AL_REG_FIELD_GET(reg,
760*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_SEL_FIELD_MASK,
761*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_SEL_FIELD_SHIFT);
762*49b49cdaSZbigniew Bodek
763*49b49cdaSZbigniew Bodek an_adv->echoed_nonce = AL_REG_FIELD_GET(reg,
764*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_ECHOED_NONCE_MASK,
765*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_ECHOED_NONCE_SHIFT);
766*49b49cdaSZbigniew Bodek
767*49b49cdaSZbigniew Bodek an_adv->capability = AL_REG_FIELD_GET(reg,
768*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_CAPABILITY_MASK,
769*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_CAPABILITY_SHIFT);
770*49b49cdaSZbigniew Bodek
771*49b49cdaSZbigniew Bodek an_adv->remote_fault = AL_REG_BIT_GET(reg,
772*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_REM_FAULT_SHIFT);
773*49b49cdaSZbigniew Bodek
774*49b49cdaSZbigniew Bodek an_adv->acknowledge = AL_REG_BIT_GET(reg,
775*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_ACK_SHIFT);
776*49b49cdaSZbigniew Bodek
777*49b49cdaSZbigniew Bodek an_adv->next_page = AL_REG_BIT_GET(reg,
778*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV1_NEXT_PAGE_SHIFT);
779*49b49cdaSZbigniew Bodek
780*49b49cdaSZbigniew Bodek
781*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_AN_REM_ADV1,
782*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS, AL_ETH_AN__LT_LANE_0);
783*49b49cdaSZbigniew Bodek
784*49b49cdaSZbigniew Bodek an_adv->transmitted_nonce = AL_REG_FIELD_GET(reg,
785*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TX_NONCE_MASK,
786*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TX_NONCE_SHIFT);
787*49b49cdaSZbigniew Bodek
788*49b49cdaSZbigniew Bodek an_adv->technology = AL_REG_FIELD_GET(reg,
789*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TECH_MASK,
790*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV2_TECH_SHIFT);
791*49b49cdaSZbigniew Bodek
792*49b49cdaSZbigniew Bodek
793*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_AN_REM_ADV2,
794*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS, AL_ETH_AN__LT_LANE_0);
795*49b49cdaSZbigniew Bodek
796*49b49cdaSZbigniew Bodek an_adv->technology |= (AL_REG_FIELD_GET(reg,
797*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_TECH_MASK,
798*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_TECH_SHIFT) << 11);
799*49b49cdaSZbigniew Bodek
800*49b49cdaSZbigniew Bodek an_adv->fec_capability = AL_REG_FIELD_GET(reg,
801*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_FEC_MASK,
802*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_ADV3_FEC_SHIFT);
803*49b49cdaSZbigniew Bodek }
804*49b49cdaSZbigniew Bodek
al_eth_kr_next_page_read(struct al_hal_eth_adapter * adapter,struct al_eth_an_np * np)805*49b49cdaSZbigniew Bodek int al_eth_kr_next_page_read(struct al_hal_eth_adapter *adapter,
806*49b49cdaSZbigniew Bodek struct al_eth_an_np *np)
807*49b49cdaSZbigniew Bodek {
808*49b49cdaSZbigniew Bodek uint16_t reg;
809*49b49cdaSZbigniew Bodek
810*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter,
811*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV0,
812*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS,
813*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0);
814*49b49cdaSZbigniew Bodek
815*49b49cdaSZbigniew Bodek np->unformatted_code_field = AL_REG_FIELD_GET(reg, AL_ETH_KR_AN_NP_ADV1_DATA1_MASK,
816*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_DATA1_SHIFT);
817*49b49cdaSZbigniew Bodek
818*49b49cdaSZbigniew Bodek np->toggle = AL_REG_FIELD_GET(reg, AL_ETH_KR_AN_NP_ADV1_TOGGLE_MASK,
819*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_TOGGLE_SHIFT);
820*49b49cdaSZbigniew Bodek
821*49b49cdaSZbigniew Bodek np->ack2 = AL_REG_FIELD_GET(reg, AL_ETH_KR_AN_NP_ADV1_ACK2_MASK,
822*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_ACK2_SHIFT);
823*49b49cdaSZbigniew Bodek
824*49b49cdaSZbigniew Bodek np->msg_page = AL_REG_FIELD_GET(reg, AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_MASK,
825*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_SHIFT);
826*49b49cdaSZbigniew Bodek
827*49b49cdaSZbigniew Bodek np->next_page = AL_REG_FIELD_GET(reg, AL_ETH_KR_AN_NP_ADV1_NP_MASK,
828*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_NP_SHIFT);
829*49b49cdaSZbigniew Bodek
830*49b49cdaSZbigniew Bodek np->unformatted_code_field1 = al_eth_an_lt_reg_read(adapter,
831*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV1,
832*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS,
833*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0);
834*49b49cdaSZbigniew Bodek np->unformatted_code_field2 = al_eth_an_lt_reg_read(adapter,
835*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_REM_XNP_ADV2,
836*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS,
837*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0);
838*49b49cdaSZbigniew Bodek
839*49b49cdaSZbigniew Bodek return 0;
840*49b49cdaSZbigniew Bodek }
841*49b49cdaSZbigniew Bodek
al_eth_kr_next_page_write(struct al_hal_eth_adapter * adapter,struct al_eth_an_np * np)842*49b49cdaSZbigniew Bodek int al_eth_kr_next_page_write(struct al_hal_eth_adapter *adapter,
843*49b49cdaSZbigniew Bodek struct al_eth_an_np *np)
844*49b49cdaSZbigniew Bodek {
845*49b49cdaSZbigniew Bodek uint16_t reg = 0;
846*49b49cdaSZbigniew Bodek
847*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_NP_ADV1_DATA1_MASK,
848*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_DATA1_SHIFT,
849*49b49cdaSZbigniew Bodek np->unformatted_code_field);
850*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_NP_ADV1_TOGGLE_MASK,
851*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_TOGGLE_SHIFT,
852*49b49cdaSZbigniew Bodek np->toggle);
853*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_NP_ADV1_ACK2_MASK,
854*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_ACK2_SHIFT,
855*49b49cdaSZbigniew Bodek np->ack2);
856*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_MASK,
857*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_MSG_PAGE_SHIFT,
858*49b49cdaSZbigniew Bodek np->msg_page);
859*49b49cdaSZbigniew Bodek AL_REG_FIELD_SET(reg, AL_ETH_KR_AN_NP_ADV1_NP_MASK,
860*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_NP_ADV1_NP_SHIFT,
861*49b49cdaSZbigniew Bodek np->next_page);
862*49b49cdaSZbigniew Bodek
863*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_XNP_ADV0, AL_ETH_AN_REGS,
864*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, reg);
865*49b49cdaSZbigniew Bodek
866*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_XNP_ADV1, AL_ETH_AN_REGS,
867*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, np->unformatted_code_field1);
868*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_XNP_ADV2, AL_ETH_AN_REGS,
869*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, np->unformatted_code_field2);
870*49b49cdaSZbigniew Bodek
871*49b49cdaSZbigniew Bodek return 0;
872*49b49cdaSZbigniew Bodek }
873*49b49cdaSZbigniew Bodek
al_eth_kr_an_init(struct al_hal_eth_adapter * adapter,struct al_eth_an_adv * an_adv)874*49b49cdaSZbigniew Bodek int al_eth_kr_an_init(struct al_hal_eth_adapter *adapter,
875*49b49cdaSZbigniew Bodek struct al_eth_an_adv *an_adv)
876*49b49cdaSZbigniew Bodek {
877*49b49cdaSZbigniew Bodek int rc;
878*49b49cdaSZbigniew Bodek
879*49b49cdaSZbigniew Bodek if (adapter->rev_id > AL_ETH_REV_ID_2)
880*49b49cdaSZbigniew Bodek al_eth_an_lt_unit_config(adapter);
881*49b49cdaSZbigniew Bodek
882*49b49cdaSZbigniew Bodek rc = al_eth_kr_an_validate_adv(adapter, an_adv);
883*49b49cdaSZbigniew Bodek if (rc)
884*49b49cdaSZbigniew Bodek return rc;
885*49b49cdaSZbigniew Bodek
886*49b49cdaSZbigniew Bodek rc = al_eth_kr_an_write_adv(adapter, an_adv);
887*49b49cdaSZbigniew Bodek if (rc)
888*49b49cdaSZbigniew Bodek return rc;
889*49b49cdaSZbigniew Bodek
890*49b49cdaSZbigniew Bodek /* clear status */
891*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_read(adapter, AL_ETH_KR_AN_STATUS, AL_ETH_AN_REGS, AL_ETH_AN__LT_LANE_0);
892*49b49cdaSZbigniew Bodek
893*49b49cdaSZbigniew Bodek al_dbg("[%s]: autonegotiation initialized successfully", adapter->name);
894*49b49cdaSZbigniew Bodek return 0;
895*49b49cdaSZbigniew Bodek }
896*49b49cdaSZbigniew Bodek
al_eth_kr_an_start(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,al_bool next_page_enable,al_bool lt_enable)897*49b49cdaSZbigniew Bodek int al_eth_kr_an_start(struct al_hal_eth_adapter *adapter,
898*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
899*49b49cdaSZbigniew Bodek al_bool next_page_enable,
900*49b49cdaSZbigniew Bodek al_bool lt_enable)
901*49b49cdaSZbigniew Bodek {
902*49b49cdaSZbigniew Bodek uint16_t control = AL_ETH_KR_AN_CONTROL_ENABLE | AL_ETH_KR_AN_CONTROL_RESTART;
903*49b49cdaSZbigniew Bodek
904*49b49cdaSZbigniew Bodek al_dbg("Eth [%s]: enable autonegotiation. lt_en %s",
905*49b49cdaSZbigniew Bodek adapter->name, (lt_enable == AL_TRUE) ? "yes" : "no");
906*49b49cdaSZbigniew Bodek
907*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_CONTROL, AL_ETH_LT_REGS,
908*49b49cdaSZbigniew Bodek lane, AL_BIT(AL_ETH_KR_PMD_CONTROL_RESTART));
909*49b49cdaSZbigniew Bodek
910*49b49cdaSZbigniew Bodek if (next_page_enable == AL_TRUE)
911*49b49cdaSZbigniew Bodek control |= AL_ETH_KR_AN_CONTROL_NP_ENABLE;
912*49b49cdaSZbigniew Bodek
913*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_CONTROL, AL_ETH_AN_REGS,
914*49b49cdaSZbigniew Bodek lane, control);
915*49b49cdaSZbigniew Bodek
916*49b49cdaSZbigniew Bodek if (lt_enable == AL_TRUE) {
917*49b49cdaSZbigniew Bodek al_eth_kr_lt_initialize(adapter, lane);
918*49b49cdaSZbigniew Bodek }
919*49b49cdaSZbigniew Bodek
920*49b49cdaSZbigniew Bodek return 0;
921*49b49cdaSZbigniew Bodek }
922*49b49cdaSZbigniew Bodek
al_eth_kr_an_stop(struct al_hal_eth_adapter * adapter)923*49b49cdaSZbigniew Bodek void al_eth_kr_an_stop(struct al_hal_eth_adapter *adapter)
924*49b49cdaSZbigniew Bodek {
925*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_AN_CONTROL, AL_ETH_AN_REGS,
926*49b49cdaSZbigniew Bodek AL_ETH_AN__LT_LANE_0, 0);
927*49b49cdaSZbigniew Bodek }
928*49b49cdaSZbigniew Bodek
al_eth_kr_an_status_check(struct al_hal_eth_adapter * adapter,al_bool * page_received,al_bool * an_completed,al_bool * error)929*49b49cdaSZbigniew Bodek void al_eth_kr_an_status_check(struct al_hal_eth_adapter *adapter,
930*49b49cdaSZbigniew Bodek al_bool *page_received,
931*49b49cdaSZbigniew Bodek al_bool *an_completed,
932*49b49cdaSZbigniew Bodek al_bool *error)
933*49b49cdaSZbigniew Bodek {
934*49b49cdaSZbigniew Bodek uint16_t reg;
935*49b49cdaSZbigniew Bodek
936*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_AN_STATUS,
937*49b49cdaSZbigniew Bodek AL_ETH_AN_REGS, AL_ETH_AN__LT_LANE_0);
938*49b49cdaSZbigniew Bodek
939*49b49cdaSZbigniew Bodek if ((reg & AL_ETH_KR_AN_STATUS_CHECK_MASK) !=
940*49b49cdaSZbigniew Bodek AL_ETH_KR_AN_STATUS_CHECK_NO_ERROR) {
941*49b49cdaSZbigniew Bodek al_err("[%s]: %s AN_STATUS (0x%x) indicated error\n",
942*49b49cdaSZbigniew Bodek adapter->name, __func__, reg);
943*49b49cdaSZbigniew Bodek
944*49b49cdaSZbigniew Bodek *error = AL_TRUE;
945*49b49cdaSZbigniew Bodek }
946*49b49cdaSZbigniew Bodek
947*49b49cdaSZbigniew Bodek if (reg & AL_ETH_KR_AN_STATUS_BASE_PAGE_RECEIVED)
948*49b49cdaSZbigniew Bodek *page_received = AL_TRUE;
949*49b49cdaSZbigniew Bodek else
950*49b49cdaSZbigniew Bodek *page_received = AL_FALSE;
951*49b49cdaSZbigniew Bodek
952*49b49cdaSZbigniew Bodek if (reg & AL_ETH_KR_AN_STATUS_COMPLETED)
953*49b49cdaSZbigniew Bodek *an_completed = AL_TRUE;
954*49b49cdaSZbigniew Bodek else
955*49b49cdaSZbigniew Bodek *an_completed = AL_FALSE;
956*49b49cdaSZbigniew Bodek }
957*49b49cdaSZbigniew Bodek
958*49b49cdaSZbigniew Bodek
959*49b49cdaSZbigniew Bodek /****************************** KR Link Training *****************************/
al_eth_kr_lt_restart(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)960*49b49cdaSZbigniew Bodek void al_eth_kr_lt_restart(struct al_hal_eth_adapter *adapter,
961*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
962*49b49cdaSZbigniew Bodek {
963*49b49cdaSZbigniew Bodek al_dbg("[%s]: KR LT Restart Link Training.\n", adapter->name);
964*49b49cdaSZbigniew Bodek
965*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_CONTROL, AL_ETH_LT_REGS,
966*49b49cdaSZbigniew Bodek lane, (AL_BIT(AL_ETH_KR_PMD_CONTROL_ENABLE) |
967*49b49cdaSZbigniew Bodek AL_BIT(AL_ETH_KR_PMD_CONTROL_RESTART)));
968*49b49cdaSZbigniew Bodek }
969*49b49cdaSZbigniew Bodek
al_eth_kr_lt_stop(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)970*49b49cdaSZbigniew Bodek void al_eth_kr_lt_stop(struct al_hal_eth_adapter *adapter,
971*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
972*49b49cdaSZbigniew Bodek {
973*49b49cdaSZbigniew Bodek al_dbg("[%s]: KR LT Stop Link Training.\n", adapter->name);
974*49b49cdaSZbigniew Bodek
975*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_CONTROL, AL_ETH_LT_REGS,
976*49b49cdaSZbigniew Bodek lane, AL_BIT(AL_ETH_KR_PMD_CONTROL_RESTART));
977*49b49cdaSZbigniew Bodek }
978*49b49cdaSZbigniew Bodek
al_eth_kr_lt_initialize(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane)979*49b49cdaSZbigniew Bodek void al_eth_kr_lt_initialize(struct al_hal_eth_adapter *adapter,
980*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane)
981*49b49cdaSZbigniew Bodek {
982*49b49cdaSZbigniew Bodek al_dbg("[%s]: KR LT Initialize.\n", adapter->name);
983*49b49cdaSZbigniew Bodek
984*49b49cdaSZbigniew Bodek /* Reset LT state machine */
985*49b49cdaSZbigniew Bodek al_eth_kr_lt_stop(adapter, lane);
986*49b49cdaSZbigniew Bodek
987*49b49cdaSZbigniew Bodek /* clear receiver status */
988*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane, 0);
989*49b49cdaSZbigniew Bodek
990*49b49cdaSZbigniew Bodek /* Coefficient Update to all zero (no command, hold) */
991*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_LD_COEF_UP, AL_ETH_LT_REGS, lane, 0);
992*49b49cdaSZbigniew Bodek /* Coefficient Status to all zero (not_updated) */
993*49b49cdaSZbigniew Bodek al_eth_an_lt_reg_write(adapter, AL_ETH_KR_PMD_LD_STATUS_REPORT, AL_ETH_LT_REGS, lane, 0);
994*49b49cdaSZbigniew Bodek
995*49b49cdaSZbigniew Bodek /* start */
996*49b49cdaSZbigniew Bodek al_eth_kr_lt_restart(adapter, lane);
997*49b49cdaSZbigniew Bodek }
998*49b49cdaSZbigniew Bodek
al_eth_kr_lt_frame_lock_wait(struct al_hal_eth_adapter * adapter,enum al_eth_an_lt_lane lane,uint32_t timeout)999*49b49cdaSZbigniew Bodek al_bool al_eth_kr_lt_frame_lock_wait(struct al_hal_eth_adapter *adapter,
1000*49b49cdaSZbigniew Bodek enum al_eth_an_lt_lane lane,
1001*49b49cdaSZbigniew Bodek uint32_t timeout)
1002*49b49cdaSZbigniew Bodek {
1003*49b49cdaSZbigniew Bodek uint32_t loop;
1004*49b49cdaSZbigniew Bodek uint16_t reg = 0;
1005*49b49cdaSZbigniew Bodek
1006*49b49cdaSZbigniew Bodek for (loop = 0; loop < timeout; loop++) {
1007*49b49cdaSZbigniew Bodek reg = al_eth_an_lt_reg_read(adapter, AL_ETH_KR_PMD_STATUS, AL_ETH_LT_REGS, lane);
1008*49b49cdaSZbigniew Bodek
1009*49b49cdaSZbigniew Bodek if (AL_REG_BIT_GET(reg, AL_ETH_KR_PMD_STATUS_FAILURE_SHIFT)) {
1010*49b49cdaSZbigniew Bodek al_info("[%s]: Failed on Training Failure."
1011*49b49cdaSZbigniew Bodek " loops %d PMD STATUS 0x%04x\n",
1012*49b49cdaSZbigniew Bodek adapter->name, loop, reg);
1013*49b49cdaSZbigniew Bodek
1014*49b49cdaSZbigniew Bodek return AL_FALSE;
1015*49b49cdaSZbigniew Bodek }
1016*49b49cdaSZbigniew Bodek if (AL_REG_BIT_GET(reg,
1017*49b49cdaSZbigniew Bodek AL_ETH_KR_PMD_STATUS_RECEIVER_FRAME_LOCK_SHIFT)) {
1018*49b49cdaSZbigniew Bodek al_dbg("[%s]: Frame lock received."
1019*49b49cdaSZbigniew Bodek " loops %d PMD STATUS 0x%04x\n",
1020*49b49cdaSZbigniew Bodek adapter->name, loop, reg);
1021*49b49cdaSZbigniew Bodek
1022*49b49cdaSZbigniew Bodek return AL_TRUE;
1023*49b49cdaSZbigniew Bodek }
1024*49b49cdaSZbigniew Bodek al_udelay(1);
1025*49b49cdaSZbigniew Bodek }
1026*49b49cdaSZbigniew Bodek al_info("[%s]: Failed on timeout. PMD STATUS 0x%04x\n",
1027*49b49cdaSZbigniew Bodek adapter->name, reg);
1028*49b49cdaSZbigniew Bodek
1029*49b49cdaSZbigniew Bodek return AL_FALSE;
1030*49b49cdaSZbigniew Bodek }
1031