1 /*
2 * AMD 10Gb Ethernet driver
3 *
4 * Copyright (c) 2020 Advanced Micro Devices, Inc.
5 *
6 * This file is available to you under your choice of the following two
7 * licenses:
8 *
9 * License 1: GPLv2
10 *
11 * This file is free software; you may copy, redistribute and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation, either version 2 of the License, or (at
14 * your option) any later version.
15 *
16 * This file is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 *
24 * This file incorporates work covered by the following copyright and
25 * permission notice:
26 * The Synopsys DWC ETHER XGMAC Software Driver and documentation
27 * (hereinafter "Software") is an unsupported proprietary work of Synopsys,
28 * Inc. unless otherwise expressly agreed to in writing between Synopsys
29 * and you.
30 *
31 * The Software IS NOT an item of Licensed Software or Licensed Product
32 * under any End User Software License Agreement or Agreement for Licensed
33 * Product with Synopsys or any supplement thereto. Permission is hereby
34 * granted, free of charge, to any person obtaining a copy of this software
35 * annotated with this license and the Software, to deal in the Software
36 * without restriction, including without limitation the rights to use,
37 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies
38 * of the Software, and to permit persons to whom the Software is furnished
39 * to do so, subject to the following conditions:
40 *
41 * The above copyright notice and this permission notice shall be included
42 * in all copies or substantial portions of the Software.
43 *
44 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
45 * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
46 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
47 * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
48 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
49 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
50 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
51 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
52 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
53 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
54 * THE POSSIBILITY OF SUCH DAMAGE.
55 *
56 *
57 * License 2: Modified BSD
58 *
59 * Redistribution and use in source and binary forms, with or without
60 * modification, are permitted provided that the following conditions are met:
61 * * Redistributions of source code must retain the above copyright
62 * notice, this list of conditions and the following disclaimer.
63 * * Redistributions in binary form must reproduce the above copyright
64 * notice, this list of conditions and the following disclaimer in the
65 * documentation and/or other materials provided with the distribution.
66 * * Neither the name of Advanced Micro Devices, Inc. nor the
67 * names of its contributors may be used to endorse or promote products
68 * derived from this software without specific prior written permission.
69 *
70 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
71 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
72 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
73 * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
74 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
75 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
76 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
77 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
78 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
79 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
80 *
81 * This file incorporates work covered by the following copyright and
82 * permission notice:
83 * The Synopsys DWC ETHER XGMAC Software Driver and documentation
84 * (hereinafter "Software") is an unsupported proprietary work of Synopsys,
85 * Inc. unless otherwise expressly agreed to in writing between Synopsys
86 * and you.
87 *
88 * The Software IS NOT an item of Licensed Software or Licensed Product
89 * under any End User Software License Agreement or Agreement for Licensed
90 * Product with Synopsys or any supplement thereto. Permission is hereby
91 * granted, free of charge, to any person obtaining a copy of this software
92 * annotated with this license and the Software, to deal in the Software
93 * without restriction, including without limitation the rights to use,
94 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies
95 * of the Software, and to permit persons to whom the Software is furnished
96 * to do so, subject to the following conditions:
97 *
98 * The above copyright notice and this permission notice shall be included
99 * in all copies or substantial portions of the Software.
100 *
101 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
102 * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
103 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
104 * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
105 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
106 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
107 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
108 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
109 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
110 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
111 * THE POSSIBILITY OF SUCH DAMAGE.
112 */
113
114 #include <sys/cdefs.h>
115 __FBSDID("$FreeBSD$");
116
117 #include "xgbe.h"
118 #include "xgbe-common.h"
119
120 struct mtx xgbe_phy_comm_lock;
121
122 #define XGBE_PHY_PORT_SPEED_100 BIT(0)
123 #define XGBE_PHY_PORT_SPEED_1000 BIT(1)
124 #define XGBE_PHY_PORT_SPEED_2500 BIT(2)
125 #define XGBE_PHY_PORT_SPEED_10000 BIT(3)
126
127 #define XGBE_MUTEX_RELEASE 0x80000000
128
129 #define XGBE_SFP_DIRECT 7
130 #define GPIO_MASK_WIDTH 4
131
132 /* I2C target addresses */
133 #define XGBE_SFP_SERIAL_ID_ADDRESS 0x50
134 #define XGBE_SFP_DIAG_INFO_ADDRESS 0x51
135 #define XGBE_SFP_PHY_ADDRESS 0x56
136 #define XGBE_GPIO_ADDRESS_PCA9555 0x20
137
138 /* SFP sideband signal indicators */
139 #define XGBE_GPIO_NO_TX_FAULT BIT(0)
140 #define XGBE_GPIO_NO_RATE_SELECT BIT(1)
141 #define XGBE_GPIO_NO_MOD_ABSENT BIT(2)
142 #define XGBE_GPIO_NO_RX_LOS BIT(3)
143
144 /* Rate-change complete wait/retry count */
145 #define XGBE_RATECHANGE_COUNT 500
146
147 /* CDR delay values for KR support (in usec) */
148 #define XGBE_CDR_DELAY_INIT 10000
149 #define XGBE_CDR_DELAY_INC 10000
150 #define XGBE_CDR_DELAY_MAX 100000
151
152 /* RRC frequency during link status check */
153 #define XGBE_RRC_FREQUENCY 10
154
155 enum xgbe_port_mode {
156 XGBE_PORT_MODE_RSVD = 0,
157 XGBE_PORT_MODE_BACKPLANE,
158 XGBE_PORT_MODE_BACKPLANE_2500,
159 XGBE_PORT_MODE_1000BASE_T,
160 XGBE_PORT_MODE_1000BASE_X,
161 XGBE_PORT_MODE_NBASE_T,
162 XGBE_PORT_MODE_10GBASE_T,
163 XGBE_PORT_MODE_10GBASE_R,
164 XGBE_PORT_MODE_SFP,
165 XGBE_PORT_MODE_MAX,
166 };
167
168 enum xgbe_conn_type {
169 XGBE_CONN_TYPE_NONE = 0,
170 XGBE_CONN_TYPE_SFP,
171 XGBE_CONN_TYPE_MDIO,
172 XGBE_CONN_TYPE_RSVD1,
173 XGBE_CONN_TYPE_BACKPLANE,
174 XGBE_CONN_TYPE_MAX,
175 };
176
177 /* SFP/SFP+ related definitions */
178 enum xgbe_sfp_comm {
179 XGBE_SFP_COMM_DIRECT = 0,
180 XGBE_SFP_COMM_PCA9545,
181 };
182
183 enum xgbe_sfp_cable {
184 XGBE_SFP_CABLE_UNKNOWN = 0,
185 XGBE_SFP_CABLE_ACTIVE,
186 XGBE_SFP_CABLE_PASSIVE,
187 };
188
189 enum xgbe_sfp_base {
190 XGBE_SFP_BASE_UNKNOWN = 0,
191 XGBE_SFP_BASE_1000_T,
192 XGBE_SFP_BASE_1000_SX,
193 XGBE_SFP_BASE_1000_LX,
194 XGBE_SFP_BASE_1000_CX,
195 XGBE_SFP_BASE_10000_SR,
196 XGBE_SFP_BASE_10000_LR,
197 XGBE_SFP_BASE_10000_LRM,
198 XGBE_SFP_BASE_10000_ER,
199 XGBE_SFP_BASE_10000_CR,
200 };
201
202 enum xgbe_sfp_speed {
203 XGBE_SFP_SPEED_UNKNOWN = 0,
204 XGBE_SFP_SPEED_100_1000,
205 XGBE_SFP_SPEED_1000,
206 XGBE_SFP_SPEED_10000,
207 };
208
209 /* SFP Serial ID Base ID values relative to an offset of 0 */
210 #define XGBE_SFP_BASE_ID 0
211 #define XGBE_SFP_ID_SFP 0x03
212
213 #define XGBE_SFP_BASE_EXT_ID 1
214 #define XGBE_SFP_EXT_ID_SFP 0x04
215
216 #define XGBE_SFP_BASE_CV 2
217 #define XGBE_SFP_BASE_CV_CP 0x21
218
219 #define XGBE_SFP_BASE_10GBE_CC 3
220 #define XGBE_SFP_BASE_10GBE_CC_SR BIT(4)
221 #define XGBE_SFP_BASE_10GBE_CC_LR BIT(5)
222 #define XGBE_SFP_BASE_10GBE_CC_LRM BIT(6)
223 #define XGBE_SFP_BASE_10GBE_CC_ER BIT(7)
224
225 #define XGBE_SFP_BASE_1GBE_CC 6
226 #define XGBE_SFP_BASE_1GBE_CC_SX BIT(0)
227 #define XGBE_SFP_BASE_1GBE_CC_LX BIT(1)
228 #define XGBE_SFP_BASE_1GBE_CC_CX BIT(2)
229 #define XGBE_SFP_BASE_1GBE_CC_T BIT(3)
230
231 #define XGBE_SFP_BASE_CABLE 8
232 #define XGBE_SFP_BASE_CABLE_PASSIVE BIT(2)
233 #define XGBE_SFP_BASE_CABLE_ACTIVE BIT(3)
234
235 #define XGBE_SFP_BASE_BR 12
236 #define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
237 #define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
238 #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
239 #define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
240
241 #define XGBE_SFP_BASE_CU_CABLE_LEN 18
242
243 #define XGBE_SFP_BASE_VENDOR_NAME 20
244 #define XGBE_SFP_BASE_VENDOR_NAME_LEN 16
245 #define XGBE_SFP_BASE_VENDOR_PN 40
246 #define XGBE_SFP_BASE_VENDOR_PN_LEN 16
247 #define XGBE_SFP_BASE_VENDOR_REV 56
248 #define XGBE_SFP_BASE_VENDOR_REV_LEN 4
249
250 #define XGBE_SFP_BASE_CC 63
251
252 /* SFP Serial ID Extended ID values relative to an offset of 64 */
253 #define XGBE_SFP_BASE_VENDOR_SN 4
254 #define XGBE_SFP_BASE_VENDOR_SN_LEN 16
255
256 #define XGBE_SFP_EXTD_OPT1 1
257 #define XGBE_SFP_EXTD_OPT1_RX_LOS BIT(1)
258 #define XGBE_SFP_EXTD_OPT1_TX_FAULT BIT(3)
259
260 #define XGBE_SFP_EXTD_DIAG 28
261 #define XGBE_SFP_EXTD_DIAG_ADDR_CHANGE BIT(2)
262
263 #define XGBE_SFP_EXTD_SFF_8472 30
264
265 #define XGBE_SFP_EXTD_CC 31
266
267 struct xgbe_sfp_eeprom {
268 uint8_t base[64];
269 uint8_t extd[32];
270 uint8_t vendor[32];
271 };
272
273 #define XGBE_SFP_DIAGS_SUPPORTED(_x) \
274 ((_x)->extd[XGBE_SFP_EXTD_SFF_8472] && \
275 !((_x)->extd[XGBE_SFP_EXTD_DIAG] & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
276
277 #define XGBE_SFP_EEPROM_BASE_LEN 256
278 #define XGBE_SFP_EEPROM_DIAG_LEN 256
279 #define XGBE_SFP_EEPROM_MAX (XGBE_SFP_EEPROM_BASE_LEN + \
280 XGBE_SFP_EEPROM_DIAG_LEN)
281
282 #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE "
283 #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 "
284
285 struct xgbe_sfp_ascii {
286 union {
287 char vendor[XGBE_SFP_BASE_VENDOR_NAME_LEN + 1];
288 char partno[XGBE_SFP_BASE_VENDOR_PN_LEN + 1];
289 char rev[XGBE_SFP_BASE_VENDOR_REV_LEN + 1];
290 char serno[XGBE_SFP_BASE_VENDOR_SN_LEN + 1];
291 } u;
292 };
293
294 /* MDIO PHY reset types */
295 enum xgbe_mdio_reset {
296 XGBE_MDIO_RESET_NONE = 0,
297 XGBE_MDIO_RESET_I2C_GPIO,
298 XGBE_MDIO_RESET_INT_GPIO,
299 XGBE_MDIO_RESET_MAX,
300 };
301
302 /* Re-driver related definitions */
303 enum xgbe_phy_redrv_if {
304 XGBE_PHY_REDRV_IF_MDIO = 0,
305 XGBE_PHY_REDRV_IF_I2C,
306 XGBE_PHY_REDRV_IF_MAX,
307 };
308
309 enum xgbe_phy_redrv_model {
310 XGBE_PHY_REDRV_MODEL_4223 = 0,
311 XGBE_PHY_REDRV_MODEL_4227,
312 XGBE_PHY_REDRV_MODEL_MAX,
313 };
314
315 enum xgbe_phy_redrv_mode {
316 XGBE_PHY_REDRV_MODE_CX = 5,
317 XGBE_PHY_REDRV_MODE_SR = 9,
318 };
319
320 #define XGBE_PHY_REDRV_MODE_REG 0x12b0
321
322 /* PHY related configuration information */
323 struct xgbe_phy_data {
324 enum xgbe_port_mode port_mode;
325
326 unsigned int port_id;
327
328 unsigned int port_speeds;
329
330 enum xgbe_conn_type conn_type;
331
332 enum xgbe_mode cur_mode;
333 enum xgbe_mode start_mode;
334
335 unsigned int rrc_count;
336
337 unsigned int mdio_addr;
338
339 /* SFP Support */
340 enum xgbe_sfp_comm sfp_comm;
341 unsigned int sfp_mux_address;
342 unsigned int sfp_mux_channel;
343
344 unsigned int sfp_gpio_address;
345 unsigned int sfp_gpio_mask;
346 unsigned int sfp_gpio_inputs;
347 unsigned int sfp_gpio_rx_los;
348 unsigned int sfp_gpio_tx_fault;
349 unsigned int sfp_gpio_mod_absent;
350 unsigned int sfp_gpio_rate_select;
351
352 unsigned int sfp_rx_los;
353 unsigned int sfp_tx_fault;
354 unsigned int sfp_mod_absent;
355 unsigned int sfp_changed;
356 unsigned int sfp_phy_avail;
357 unsigned int sfp_cable_len;
358 enum xgbe_sfp_base sfp_base;
359 enum xgbe_sfp_cable sfp_cable;
360 enum xgbe_sfp_speed sfp_speed;
361 struct xgbe_sfp_eeprom sfp_eeprom;
362
363 /* External PHY support */
364 enum xgbe_mdio_mode phydev_mode;
365 uint32_t phy_id;
366 int phydev;
367 enum xgbe_mdio_reset mdio_reset;
368 unsigned int mdio_reset_addr;
369 unsigned int mdio_reset_gpio;
370
371 /* Re-driver support */
372 unsigned int redrv;
373 unsigned int redrv_if;
374 unsigned int redrv_addr;
375 unsigned int redrv_lane;
376 unsigned int redrv_model;
377
378 /* KR AN support */
379 unsigned int phy_cdr_notrack;
380 unsigned int phy_cdr_delay;
381
382 uint8_t port_sfp_inputs;
383 };
384
385 static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata);
386 static int xgbe_phy_reset(struct xgbe_prv_data *pdata);
387
388 static int
389 xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata, struct xgbe_i2c_op *i2c_op)
390 {
391 return (pdata->i2c_if.i2c_xfer(pdata, i2c_op));
392 }
393
394 static int
395 xgbe_phy_redrv_write(struct xgbe_prv_data *pdata, unsigned int reg,
396 unsigned int val)
397 {
398 struct xgbe_phy_data *phy_data = pdata->phy_data;
399 struct xgbe_i2c_op i2c_op;
400 __be16 *redrv_val;
401 uint8_t redrv_data[5], csum;
402 unsigned int i, retry;
403 int ret;
404
405 /* High byte of register contains read/write indicator */
406 redrv_data[0] = ((reg >> 8) & 0xff) << 1;
407 redrv_data[1] = reg & 0xff;
408 redrv_val = (__be16 *)&redrv_data[2];
409 *redrv_val = cpu_to_be16(val);
410
411 /* Calculate 1 byte checksum */
412 csum = 0;
413 for (i = 0; i < 4; i++) {
414 csum += redrv_data[i];
415 if (redrv_data[i] > csum)
416 csum++;
417 }
418 redrv_data[4] = ~csum;
419
420 retry = 1;
421 again1:
422 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
423 i2c_op.target = phy_data->redrv_addr;
424 i2c_op.len = sizeof(redrv_data);
425 i2c_op.buf = redrv_data;
426 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
427 if (ret) {
428 if ((ret == -EAGAIN) && retry--)
429 goto again1;
430
431 return (ret);
432 }
433
434 retry = 1;
435 again2:
436 i2c_op.cmd = XGBE_I2C_CMD_READ;
437 i2c_op.target = phy_data->redrv_addr;
438 i2c_op.len = 1;
439 i2c_op.buf = redrv_data;
440 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
441 if (ret) {
442 if ((ret == -EAGAIN) && retry--)
443 goto again2;
444
445 return (ret);
446 }
447
448 if (redrv_data[0] != 0xff) {
449 axgbe_error("Redriver write checksum error\n");
450 ret = -EIO;
451 }
452
453 return (ret);
454 }
455
456 static int
457 xgbe_phy_i2c_write(struct xgbe_prv_data *pdata, unsigned int target, void *val,
458 unsigned int val_len)
459 {
460 struct xgbe_i2c_op i2c_op;
461 int retry, ret;
462
463 retry = 1;
464 again:
465 /* Write the specfied register */
466 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
467 i2c_op.target = target;
468 i2c_op.len = val_len;
469 i2c_op.buf = val;
470 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
471 if ((ret == -EAGAIN) && retry--)
472 goto again;
473
474 return (ret);
475 }
476
477 static int
478 xgbe_phy_i2c_read(struct xgbe_prv_data *pdata, unsigned int target, void *reg,
479 unsigned int reg_len, void *val, unsigned int val_len)
480 {
481 struct xgbe_i2c_op i2c_op;
482 int retry, ret;
483
484 axgbe_printf(3, "%s: target 0x%x reg_len %d val_len %d\n", __func__,
485 target, reg_len, val_len);
486 retry = 1;
487 again1:
488 /* Set the specified register to read */
489 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
490 i2c_op.target = target;
491 i2c_op.len = reg_len;
492 i2c_op.buf = reg;
493 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
494 axgbe_printf(3, "%s: ret1 %d retry %d\n", __func__, ret, retry);
495 if (ret) {
496 if ((ret == -EAGAIN) && retry--)
497 goto again1;
498
499 return (ret);
500 }
501
502 retry = 1;
503 again2:
504 /* Read the specfied register */
505 i2c_op.cmd = XGBE_I2C_CMD_READ;
506 i2c_op.target = target;
507 i2c_op.len = val_len;
508 i2c_op.buf = val;
509 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
510 axgbe_printf(3, "%s: ret2 %d retry %d\n", __func__, ret, retry);
511 if ((ret == -EAGAIN) && retry--)
512 goto again2;
513
514 return (ret);
515 }
516
517 static int
518 xgbe_phy_sfp_put_mux(struct xgbe_prv_data *pdata)
519 {
520 struct xgbe_phy_data *phy_data = pdata->phy_data;
521 struct xgbe_i2c_op i2c_op;
522 uint8_t mux_channel;
523
524 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
525 return (0);
526
527 /* Select no mux channels */
528 mux_channel = 0;
529 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
530 i2c_op.target = phy_data->sfp_mux_address;
531 i2c_op.len = sizeof(mux_channel);
532 i2c_op.buf = &mux_channel;
533
534 return (xgbe_phy_i2c_xfer(pdata, &i2c_op));
535 }
536
537 static int
538 xgbe_phy_sfp_get_mux(struct xgbe_prv_data *pdata)
539 {
540 struct xgbe_phy_data *phy_data = pdata->phy_data;
541 struct xgbe_i2c_op i2c_op;
542 uint8_t mux_channel;
543
544 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
545 return (0);
546
547 /* Select desired mux channel */
548 mux_channel = 1 << phy_data->sfp_mux_channel;
549 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
550 i2c_op.target = phy_data->sfp_mux_address;
551 i2c_op.len = sizeof(mux_channel);
552 i2c_op.buf = &mux_channel;
553
554 return (xgbe_phy_i2c_xfer(pdata, &i2c_op));
555 }
556
557 static void
558 xgbe_phy_put_comm_ownership(struct xgbe_prv_data *pdata)
559 {
560 mtx_unlock(&xgbe_phy_comm_lock);
561 }
562
563 static int
564 xgbe_phy_get_comm_ownership(struct xgbe_prv_data *pdata)
565 {
566 struct xgbe_phy_data *phy_data = pdata->phy_data;
567 unsigned long timeout;
568 unsigned int mutex_id;
569
570 /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
571 * the driver needs to take the software mutex and then the hardware
572 * mutexes before being able to use the busses.
573 */
574 mtx_lock(&xgbe_phy_comm_lock);
575
576 /* Clear the mutexes */
577 XP_IOWRITE(pdata, XP_I2C_MUTEX, XGBE_MUTEX_RELEASE);
578 XP_IOWRITE(pdata, XP_MDIO_MUTEX, XGBE_MUTEX_RELEASE);
579
580 /* Mutex formats are the same for I2C and MDIO/GPIO */
581 mutex_id = 0;
582 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ID, phy_data->port_id);
583 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ACTIVE, 1);
584
585 timeout = ticks + (5 * hz);
586 while (ticks < timeout) {
587 /* Must be all zeroes in order to obtain the mutex */
588 if (XP_IOREAD(pdata, XP_I2C_MUTEX) ||
589 XP_IOREAD(pdata, XP_MDIO_MUTEX)) {
590 DELAY(200);
591 continue;
592 }
593
594 /* Obtain the mutex */
595 XP_IOWRITE(pdata, XP_I2C_MUTEX, mutex_id);
596 XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
597
598 return (0);
599 }
600
601 mtx_unlock(&xgbe_phy_comm_lock);
602
603 axgbe_error("unable to obtain hardware mutexes\n");
604
605 return (-ETIMEDOUT);
606 }
607
608 static int
609 xgbe_phy_mdio_mii_write(struct xgbe_prv_data *pdata, int addr, int reg,
610 uint16_t val)
611 {
612 struct xgbe_phy_data *phy_data = pdata->phy_data;
613
614 if (reg & MII_ADDR_C45) {
615 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
616 return (-ENOTSUP);
617 } else {
618 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
619 return (-ENOTSUP);
620 }
621
622 return (pdata->hw_if.write_ext_mii_regs(pdata, addr, reg, val));
623 }
624
625 static int
626 xgbe_phy_i2c_mii_write(struct xgbe_prv_data *pdata, int reg, uint16_t val)
627 {
628 __be16 *mii_val;
629 uint8_t mii_data[3];
630 int ret;
631
632 ret = xgbe_phy_sfp_get_mux(pdata);
633 if (ret)
634 return (ret);
635
636 mii_data[0] = reg & 0xff;
637 mii_val = (__be16 *)&mii_data[1];
638 *mii_val = cpu_to_be16(val);
639
640 ret = xgbe_phy_i2c_write(pdata, XGBE_SFP_PHY_ADDRESS,
641 mii_data, sizeof(mii_data));
642
643 xgbe_phy_sfp_put_mux(pdata);
644
645 return (ret);
646 }
647
648 int
649 xgbe_phy_mii_write(struct xgbe_prv_data *pdata, int addr, int reg, uint16_t val)
650 {
651 struct xgbe_phy_data *phy_data = pdata->phy_data;
652 int ret;
653
654 axgbe_printf(3, "%s: addr %d reg %d val %#x\n", __func__, addr, reg, val);
655 ret = xgbe_phy_get_comm_ownership(pdata);
656 if (ret)
657 return (ret);
658
659 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
660 ret = xgbe_phy_i2c_mii_write(pdata, reg, val);
661 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
662 ret = xgbe_phy_mdio_mii_write(pdata, addr, reg, val);
663 else
664 ret = -ENOTSUP;
665
666 xgbe_phy_put_comm_ownership(pdata);
667
668 return (ret);
669 }
670
671 static int
672 xgbe_phy_mdio_mii_read(struct xgbe_prv_data *pdata, int addr, int reg)
673 {
674 struct xgbe_phy_data *phy_data = pdata->phy_data;
675
676 if (reg & MII_ADDR_C45) {
677 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
678 return (-ENOTSUP);
679 } else {
680 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
681 return (-ENOTSUP);
682 }
683
684 return (pdata->hw_if.read_ext_mii_regs(pdata, addr, reg));
685 }
686
687 static int
688 xgbe_phy_i2c_mii_read(struct xgbe_prv_data *pdata, int reg)
689 {
690 __be16 mii_val;
691 uint8_t mii_reg;
692 int ret;
693
694 ret = xgbe_phy_sfp_get_mux(pdata);
695 if (ret)
696 return (ret);
697
698 mii_reg = reg;
699 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_PHY_ADDRESS,
700 &mii_reg, sizeof(mii_reg),
701 &mii_val, sizeof(mii_val));
702 if (!ret)
703 ret = be16_to_cpu(mii_val);
704
705 xgbe_phy_sfp_put_mux(pdata);
706
707 return (ret);
708 }
709
710 int
711 xgbe_phy_mii_read(struct xgbe_prv_data *pdata, int addr, int reg)
712 {
713 struct xgbe_phy_data *phy_data = pdata->phy_data;
714 int ret;
715
716 axgbe_printf(3, "%s: addr %d reg %d\n", __func__, addr, reg);
717 ret = xgbe_phy_get_comm_ownership(pdata);
718 if (ret)
719 return (ret);
720
721 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
722 ret = xgbe_phy_i2c_mii_read(pdata, reg);
723 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
724 ret = xgbe_phy_mdio_mii_read(pdata, addr, reg);
725 else
726 ret = -ENOTSUP;
727
728 xgbe_phy_put_comm_ownership(pdata);
729
730 return (ret);
731 }
732
733 static void
734 xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
735 {
736 struct xgbe_phy_data *phy_data = pdata->phy_data;
737
738 if (!phy_data->sfp_mod_absent && !phy_data->sfp_changed)
739 return;
740
741 XGBE_ZERO_SUP(&pdata->phy);
742
743 if (phy_data->sfp_mod_absent) {
744 pdata->phy.speed = SPEED_UNKNOWN;
745 pdata->phy.duplex = DUPLEX_UNKNOWN;
746 pdata->phy.autoneg = AUTONEG_ENABLE;
747 pdata->phy.pause_autoneg = AUTONEG_ENABLE;
748
749 XGBE_SET_SUP(&pdata->phy, Autoneg);
750 XGBE_SET_SUP(&pdata->phy, Pause);
751 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
752 XGBE_SET_SUP(&pdata->phy, TP);
753 XGBE_SET_SUP(&pdata->phy, FIBRE);
754
755 XGBE_LM_COPY(&pdata->phy, advertising, &pdata->phy, supported);
756
757 return;
758 }
759
760 switch (phy_data->sfp_base) {
761 case XGBE_SFP_BASE_1000_T:
762 case XGBE_SFP_BASE_1000_SX:
763 case XGBE_SFP_BASE_1000_LX:
764 case XGBE_SFP_BASE_1000_CX:
765 pdata->phy.speed = SPEED_UNKNOWN;
766 pdata->phy.duplex = DUPLEX_UNKNOWN;
767 pdata->phy.autoneg = AUTONEG_ENABLE;
768 pdata->phy.pause_autoneg = AUTONEG_ENABLE;
769 XGBE_SET_SUP(&pdata->phy, Autoneg);
770 XGBE_SET_SUP(&pdata->phy, Pause);
771 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
772 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T) {
773 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
774 XGBE_SET_SUP(&pdata->phy, 100baseT_Full);
775 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
776 XGBE_SET_SUP(&pdata->phy, 1000baseT_Full);
777 } else {
778 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
779 XGBE_SET_SUP(&pdata->phy, 1000baseX_Full);
780 }
781 break;
782 case XGBE_SFP_BASE_10000_SR:
783 case XGBE_SFP_BASE_10000_LR:
784 case XGBE_SFP_BASE_10000_LRM:
785 case XGBE_SFP_BASE_10000_ER:
786 case XGBE_SFP_BASE_10000_CR:
787 pdata->phy.speed = SPEED_10000;
788 pdata->phy.duplex = DUPLEX_FULL;
789 pdata->phy.autoneg = AUTONEG_DISABLE;
790 pdata->phy.pause_autoneg = AUTONEG_DISABLE;
791 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
792 switch (phy_data->sfp_base) {
793 case XGBE_SFP_BASE_10000_SR:
794 XGBE_SET_SUP(&pdata->phy, 10000baseSR_Full);
795 break;
796 case XGBE_SFP_BASE_10000_LR:
797 XGBE_SET_SUP(&pdata->phy, 10000baseLR_Full);
798 break;
799 case XGBE_SFP_BASE_10000_LRM:
800 XGBE_SET_SUP(&pdata->phy, 10000baseLRM_Full);
801 break;
802 case XGBE_SFP_BASE_10000_ER:
803 XGBE_SET_SUP(&pdata->phy, 10000baseER_Full);
804 break;
805 case XGBE_SFP_BASE_10000_CR:
806 XGBE_SET_SUP(&pdata->phy, 10000baseCR_Full);
807 break;
808 default:
809 break;
810 }
811 }
812 break;
813 default:
814 pdata->phy.speed = SPEED_UNKNOWN;
815 pdata->phy.duplex = DUPLEX_UNKNOWN;
816 pdata->phy.autoneg = AUTONEG_DISABLE;
817 pdata->phy.pause_autoneg = AUTONEG_DISABLE;
818 break;
819 }
820
821 switch (phy_data->sfp_base) {
822 case XGBE_SFP_BASE_1000_T:
823 case XGBE_SFP_BASE_1000_CX:
824 case XGBE_SFP_BASE_10000_CR:
825 XGBE_SET_SUP(&pdata->phy, TP);
826 break;
827 default:
828 XGBE_SET_SUP(&pdata->phy, FIBRE);
829 break;
830 }
831
832 XGBE_LM_COPY(&pdata->phy, advertising, &pdata->phy, supported);
833
834 axgbe_printf(1, "%s: link speed %d spf_base 0x%x pause_autoneg %d "
835 "advert 0x%x support 0x%x\n", __func__, pdata->phy.speed,
836 phy_data->sfp_base, pdata->phy.pause_autoneg,
837 pdata->phy.advertising, pdata->phy.supported);
838 }
839
840 static bool
841 xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
842 enum xgbe_sfp_speed sfp_speed)
843 {
844 uint8_t *sfp_base, min, max;
845
846 sfp_base = sfp_eeprom->base;
847
848 switch (sfp_speed) {
849 case XGBE_SFP_SPEED_1000:
850 min = XGBE_SFP_BASE_BR_1GBE_MIN;
851 max = XGBE_SFP_BASE_BR_1GBE_MAX;
852 break;
853 case XGBE_SFP_SPEED_10000:
854 min = XGBE_SFP_BASE_BR_10GBE_MIN;
855 max = XGBE_SFP_BASE_BR_10GBE_MAX;
856 break;
857 default:
858 return (false);
859 }
860
861 return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
862 (sfp_base[XGBE_SFP_BASE_BR] <= max));
863 }
864
865 static void
866 xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
867 {
868 struct xgbe_phy_data *phy_data = pdata->phy_data;
869
870 if (phy_data->phydev)
871 phy_data->phydev = 0;
872 }
873
874 static bool
875 xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
876 {
877 struct xgbe_phy_data *phy_data = pdata->phy_data;
878 unsigned int phy_id = phy_data->phy_id;
879
880 if (phy_data->port_mode != XGBE_PORT_MODE_SFP)
881 return (false);
882
883 if ((phy_id & 0xfffffff0) != 0x01ff0cc0)
884 return (false);
885
886 /* Enable Base-T AN */
887 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x16, 0x0001);
888 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, 0x9140);
889 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x16, 0x0000);
890
891 /* Enable SGMII at 100Base-T/1000Base-T Full Duplex */
892 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1b, 0x9084);
893 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x09, 0x0e00);
894 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, 0x8140);
895 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x04, 0x0d01);
896 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, 0x9140);
897
898 axgbe_printf(3, "Finisar PHY quirk in place\n");
899
900 return (true);
901 }
902
903 static bool
904 xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
905 {
906 struct xgbe_phy_data *phy_data = pdata->phy_data;
907 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
908 unsigned int phy_id = phy_data->phy_id;
909 int reg;
910
911 if (phy_data->port_mode != XGBE_PORT_MODE_SFP)
912 return (false);
913
914 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
915 XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN))
916 return (false);
917
918 /* For Bel-Fuse, use the extra AN flag */
919 pdata->an_again = 1;
920
921 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
922 XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN))
923 return (false);
924
925 if ((phy_id & 0xfffffff0) != 0x03625d10)
926 return (false);
927
928 /* Disable RGMII mode */
929 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x18, 0x7007);
930 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x18);
931 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x18, reg & ~0x0080);
932
933 /* Enable fiber register bank */
934 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x7c00);
935 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x1c);
936 reg &= 0x03ff;
937 reg &= ~0x0001;
938 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x8000 | 0x7c00 |
939 reg | 0x0001);
940
941 /* Power down SerDes */
942 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x00);
943 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, reg | 0x00800);
944
945 /* Configure SGMII-to-Copper mode */
946 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x7c00);
947 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x1c);
948 reg &= 0x03ff;
949 reg &= ~0x0006;
950 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x8000 | 0x7c00 |
951 reg | 0x0004);
952
953 /* Power up SerDes */
954 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x00);
955 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, reg & ~0x00800);
956
957 /* Enable copper register bank */
958 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x7c00);
959 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x1c);
960 reg &= 0x03ff;
961 reg &= ~0x0001;
962 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x1c, 0x8000 | 0x7c00 |
963 reg);
964
965 /* Power up SerDes */
966 reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x00);
967 xgbe_phy_mii_write(pdata, phy_data->mdio_addr, 0x00, reg & ~0x00800);
968
969 axgbe_printf(3, "BelFuse PHY quirk in place\n");
970
971 return (true);
972 }
973
974 static void
975 xgbe_phy_external_phy_quirks(struct xgbe_prv_data *pdata)
976 {
977 if (xgbe_phy_belfuse_phy_quirks(pdata))
978 return;
979
980 if (xgbe_phy_finisar_phy_quirks(pdata))
981 return;
982 }
983
984 static int
985 xgbe_get_phy_id(struct xgbe_prv_data *pdata)
986 {
987 struct xgbe_phy_data *phy_data = pdata->phy_data;
988 uint32_t oui, model, phy_id1, phy_id2;
989 int phy_reg;
990
991 phy_reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x02);
992 if (phy_reg < 0)
993 return (-EIO);
994
995 phy_id1 = (phy_reg & 0xffff);
996 phy_data->phy_id = (phy_reg & 0xffff) << 16;
997
998 phy_reg = xgbe_phy_mii_read(pdata, phy_data->mdio_addr, 0x03);
999 if (phy_reg < 0)
1000 return (-EIO);
1001
1002 phy_id2 = (phy_reg & 0xffff);
1003 phy_data->phy_id |= (phy_reg & 0xffff);
1004
1005 oui = MII_OUI(phy_id1, phy_id2);
1006 model = MII_MODEL(phy_id2);
1007
1008 axgbe_printf(2, "%s: phy_id1: 0x%x phy_id2: 0x%x oui: %#x model %#x\n",
1009 __func__, phy_id1, phy_id2, oui, model);
1010
1011 return (0);
1012 }
1013
1014 static int
1015 xgbe_phy_start_aneg(struct xgbe_prv_data *pdata)
1016 {
1017 uint16_t ctl = 0;
1018 int changed = 0;
1019 int ret;
1020
1021 if (AUTONEG_ENABLE != pdata->phy.autoneg) {
1022 if (SPEED_1000 == pdata->phy.speed)
1023 ctl |= BMCR_SPEED1;
1024 else if (SPEED_100 == pdata->phy.speed)
1025 ctl |= BMCR_SPEED100;
1026
1027 if (DUPLEX_FULL == pdata->phy.duplex)
1028 ctl |= BMCR_FDX;
1029
1030 ret = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMCR);
1031 if (ret)
1032 return (ret);
1033
1034 ret = xgbe_phy_mii_write(pdata, pdata->mdio_addr, MII_BMCR,
1035 (ret & ~(~(BMCR_LOOP | BMCR_ISO | BMCR_PDOWN))) | ctl);
1036 }
1037
1038 ctl = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMCR);
1039 if (ctl < 0)
1040 return (ctl);
1041
1042 if (!(ctl & BMCR_AUTOEN) || (ctl & BMCR_ISO))
1043 changed = 1;
1044
1045 if (changed > 0) {
1046 ret = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMCR);
1047 if (ret)
1048 return (ret);
1049
1050 ret = xgbe_phy_mii_write(pdata, pdata->mdio_addr, MII_BMCR,
1051 (ret & ~(BMCR_ISO)) | (BMCR_AUTOEN | BMCR_STARTNEG));
1052 }
1053
1054 return (0);
1055 }
1056
1057 static int
1058 xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
1059 {
1060 struct xgbe_phy_data *phy_data = pdata->phy_data;
1061 int ret;
1062
1063 axgbe_printf(2, "%s: phydev %d phydev_mode %d sfp_phy_avail %d phy_id "
1064 "0x%08x\n", __func__, phy_data->phydev, phy_data->phydev_mode,
1065 phy_data->sfp_phy_avail, phy_data->phy_id);
1066
1067 /* If we already have a PHY, just return */
1068 if (phy_data->phydev) {
1069 axgbe_printf(3, "%s: phy present already\n", __func__);
1070 return (0);
1071 }
1072
1073 /* Clear the extra AN flag */
1074 pdata->an_again = 0;
1075
1076 /* Check for the use of an external PHY */
1077 if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE) {
1078 axgbe_printf(3, "%s: phydev_mode %d\n", __func__,
1079 phy_data->phydev_mode);
1080 return (0);
1081 }
1082
1083 /* For SFP, only use an external PHY if available */
1084 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
1085 !phy_data->sfp_phy_avail) {
1086 axgbe_printf(3, "%s: port_mode %d avail %d\n", __func__,
1087 phy_data->port_mode, phy_data->sfp_phy_avail);
1088 return (0);
1089 }
1090
1091 /* Set the proper MDIO mode for the PHY */
1092 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
1093 phy_data->phydev_mode);
1094 if (ret) {
1095 axgbe_error("mdio port/clause not compatible (%u/%u) ret %d\n",
1096 phy_data->mdio_addr, phy_data->phydev_mode, ret);
1097 return (ret);
1098 }
1099
1100 ret = xgbe_get_phy_id(pdata);
1101 if (ret)
1102 return (ret);
1103 axgbe_printf(2, "Get phy_id 0x%08x\n", phy_data->phy_id);
1104
1105 phy_data->phydev = 1;
1106 xgbe_phy_external_phy_quirks(pdata);
1107 xgbe_phy_start_aneg(pdata);
1108
1109 return (0);
1110 }
1111
1112 static void
1113 xgbe_phy_sfp_external_phy(struct xgbe_prv_data *pdata)
1114 {
1115 struct xgbe_phy_data *phy_data = pdata->phy_data;
1116 int ret;
1117
1118 axgbe_printf(3, "%s: sfp_changed: 0x%x\n", __func__,
1119 phy_data->sfp_changed);
1120 if (!phy_data->sfp_changed)
1121 return;
1122
1123 phy_data->sfp_phy_avail = 0;
1124
1125 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
1126 return;
1127
1128 /* Check access to the PHY by reading CTRL1 */
1129 ret = xgbe_phy_i2c_mii_read(pdata, MII_BMCR);
1130 if (ret < 0) {
1131 axgbe_error("%s: ext phy fail %d\n", __func__, ret);
1132 return;
1133 }
1134
1135 /* Successfully accessed the PHY */
1136 phy_data->sfp_phy_avail = 1;
1137 axgbe_printf(3, "Successfully accessed External PHY\n");
1138 }
1139
1140 static bool
1141 xgbe_phy_check_sfp_rx_los(struct xgbe_phy_data *phy_data)
1142 {
1143 uint8_t *sfp_extd = phy_data->sfp_eeprom.extd;
1144
1145 if (!(sfp_extd[XGBE_SFP_EXTD_OPT1] & XGBE_SFP_EXTD_OPT1_RX_LOS))
1146 return (false);
1147
1148 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_RX_LOS)
1149 return (false);
1150
1151 if (phy_data->sfp_gpio_inputs & (1 << phy_data->sfp_gpio_rx_los))
1152 return (true);
1153
1154 return (false);
1155 }
1156
1157 static bool
1158 xgbe_phy_check_sfp_tx_fault(struct xgbe_phy_data *phy_data)
1159 {
1160 uint8_t *sfp_extd = phy_data->sfp_eeprom.extd;
1161
1162 if (!(sfp_extd[XGBE_SFP_EXTD_OPT1] & XGBE_SFP_EXTD_OPT1_TX_FAULT))
1163 return (false);
1164
1165 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_TX_FAULT)
1166 return (false);
1167
1168 if (phy_data->sfp_gpio_inputs & (1 << phy_data->sfp_gpio_tx_fault))
1169 return (true);
1170
1171 return (false);
1172 }
1173
1174 static bool
1175 xgbe_phy_check_sfp_mod_absent(struct xgbe_phy_data *phy_data)
1176 {
1177 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_MOD_ABSENT)
1178 return (false);
1179
1180 if (phy_data->sfp_gpio_inputs & (1 << phy_data->sfp_gpio_mod_absent))
1181 return (true);
1182
1183 return (false);
1184 }
1185
1186 static void
1187 xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
1188 {
1189 struct xgbe_phy_data *phy_data = pdata->phy_data;
1190 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
1191 uint8_t *sfp_base;
1192
1193 sfp_base = sfp_eeprom->base;
1194
1195 if (sfp_base[XGBE_SFP_BASE_ID] != XGBE_SFP_ID_SFP) {
1196 axgbe_error("base id %d\n", sfp_base[XGBE_SFP_BASE_ID]);
1197 return;
1198 }
1199
1200 if (sfp_base[XGBE_SFP_BASE_EXT_ID] != XGBE_SFP_EXT_ID_SFP) {
1201 axgbe_error("base id %d\n", sfp_base[XGBE_SFP_BASE_EXT_ID]);
1202 return;
1203 }
1204
1205 /* Update transceiver signals (eeprom extd/options) */
1206 phy_data->sfp_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data);
1207 phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(phy_data);
1208
1209 /* Assume ACTIVE cable unless told it is PASSIVE */
1210 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
1211 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
1212 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
1213 } else
1214 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
1215
1216 /*
1217 * Determine the type of SFP. Certain 10G SFP+ modules read as
1218 * 1000BASE-CX. To prevent 10G DAC cables to be recognized as
1219 * 1G, we first check if it is a DAC and the bitrate is 10G.
1220 */
1221 if (((sfp_base[XGBE_SFP_BASE_CV] & XGBE_SFP_BASE_CV_CP) ||
1222 (phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE)) &&
1223 xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
1224 phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
1225 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
1226 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
1227 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
1228 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
1229 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM)
1230 phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM;
1231 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER)
1232 phy_data->sfp_base = XGBE_SFP_BASE_10000_ER;
1233 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX)
1234 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
1235 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX)
1236 phy_data->sfp_base = XGBE_SFP_BASE_1000_LX;
1237 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX)
1238 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
1239 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
1240 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
1241
1242 switch (phy_data->sfp_base) {
1243 case XGBE_SFP_BASE_1000_T:
1244 phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000;
1245 break;
1246 case XGBE_SFP_BASE_1000_SX:
1247 case XGBE_SFP_BASE_1000_LX:
1248 case XGBE_SFP_BASE_1000_CX:
1249 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
1250 break;
1251 case XGBE_SFP_BASE_10000_SR:
1252 case XGBE_SFP_BASE_10000_LR:
1253 case XGBE_SFP_BASE_10000_LRM:
1254 case XGBE_SFP_BASE_10000_ER:
1255 case XGBE_SFP_BASE_10000_CR:
1256 phy_data->sfp_speed = XGBE_SFP_SPEED_10000;
1257 break;
1258 default:
1259 break;
1260 }
1261 axgbe_printf(3, "%s: sfp_base: 0x%x sfp_speed: 0x%x sfp_cable: 0x%x "
1262 "rx_los 0x%x tx_fault 0x%x\n", __func__, phy_data->sfp_base,
1263 phy_data->sfp_speed, phy_data->sfp_cable, phy_data->sfp_rx_los,
1264 phy_data->sfp_tx_fault);
1265 }
1266
1267 static void
1268 xgbe_phy_sfp_eeprom_info(struct xgbe_prv_data *pdata,
1269 struct xgbe_sfp_eeprom *sfp_eeprom)
1270 {
1271 struct xgbe_sfp_ascii sfp_ascii;
1272 char *sfp_data = (char *)&sfp_ascii;
1273
1274 axgbe_printf(3, "SFP detected:\n");
1275 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
1276 XGBE_SFP_BASE_VENDOR_NAME_LEN);
1277 sfp_data[XGBE_SFP_BASE_VENDOR_NAME_LEN] = '\0';
1278 axgbe_printf(3, " vendor: %s\n",
1279 sfp_data);
1280
1281 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
1282 XGBE_SFP_BASE_VENDOR_PN_LEN);
1283 sfp_data[XGBE_SFP_BASE_VENDOR_PN_LEN] = '\0';
1284 axgbe_printf(3, " part number: %s\n",
1285 sfp_data);
1286
1287 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_REV],
1288 XGBE_SFP_BASE_VENDOR_REV_LEN);
1289 sfp_data[XGBE_SFP_BASE_VENDOR_REV_LEN] = '\0';
1290 axgbe_printf(3, " revision level: %s\n",
1291 sfp_data);
1292
1293 memcpy(sfp_data, &sfp_eeprom->extd[XGBE_SFP_BASE_VENDOR_SN],
1294 XGBE_SFP_BASE_VENDOR_SN_LEN);
1295 sfp_data[XGBE_SFP_BASE_VENDOR_SN_LEN] = '\0';
1296 axgbe_printf(3, " serial number: %s\n",
1297 sfp_data);
1298 }
1299
1300 static bool
1301 xgbe_phy_sfp_verify_eeprom(uint8_t cc_in, uint8_t *buf, unsigned int len)
1302 {
1303 uint8_t cc;
1304
1305 for (cc = 0; len; buf++, len--)
1306 cc += *buf;
1307
1308 return ((cc == cc_in) ? true : false);
1309 }
1310
1311 static void
1312 dump_sfp_eeprom(struct xgbe_prv_data *pdata, uint8_t *sfp_base)
1313 {
1314 axgbe_printf(3, "sfp_base[XGBE_SFP_BASE_ID] : 0x%04x\n",
1315 sfp_base[XGBE_SFP_BASE_ID]);
1316 axgbe_printf(3, "sfp_base[XGBE_SFP_BASE_EXT_ID] : 0x%04x\n",
1317 sfp_base[XGBE_SFP_BASE_EXT_ID]);
1318 axgbe_printf(3, "sfp_base[XGBE_SFP_BASE_CABLE] : 0x%04x\n",
1319 sfp_base[XGBE_SFP_BASE_CABLE]);
1320 }
1321
1322 static int
1323 xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
1324 {
1325 struct xgbe_phy_data *phy_data = pdata->phy_data;
1326 struct xgbe_sfp_eeprom sfp_eeprom, *eeprom;
1327 uint8_t eeprom_addr, *base;
1328 int ret;
1329
1330 ret = xgbe_phy_sfp_get_mux(pdata);
1331 if (ret) {
1332 axgbe_error("I2C error setting SFP MUX\n");
1333 return (ret);
1334 }
1335
1336 /* Read the SFP serial ID eeprom */
1337 eeprom_addr = 0;
1338 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
1339 &eeprom_addr, sizeof(eeprom_addr),
1340 &sfp_eeprom, sizeof(sfp_eeprom));
1341
1342 eeprom = &sfp_eeprom;
1343 base = eeprom->base;
1344 dump_sfp_eeprom(pdata, base);
1345 if (ret) {
1346 axgbe_error("I2C error reading SFP EEPROM\n");
1347 goto put;
1348 }
1349
1350 /* Validate the contents read */
1351 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[XGBE_SFP_BASE_CC],
1352 sfp_eeprom.base, sizeof(sfp_eeprom.base) - 1)) {
1353 axgbe_error("verify eeprom base failed\n");
1354 ret = -EINVAL;
1355 goto put;
1356 }
1357
1358 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[XGBE_SFP_EXTD_CC],
1359 sfp_eeprom.extd, sizeof(sfp_eeprom.extd) - 1)) {
1360 axgbe_error("verify eeprom extd failed\n");
1361 ret = -EINVAL;
1362 goto put;
1363 }
1364
1365 /* Check for an added or changed SFP */
1366 if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
1367 phy_data->sfp_changed = 1;
1368
1369 xgbe_phy_sfp_eeprom_info(pdata, &sfp_eeprom);
1370
1371 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
1372
1373 xgbe_phy_free_phy_device(pdata);
1374 } else
1375 phy_data->sfp_changed = 0;
1376
1377 put:
1378 xgbe_phy_sfp_put_mux(pdata);
1379
1380 return (ret);
1381 }
1382
1383 static void
1384 xgbe_phy_sfp_signals(struct xgbe_prv_data *pdata)
1385 {
1386 struct xgbe_phy_data *phy_data = pdata->phy_data;
1387 uint8_t gpio_reg, gpio_ports[2];
1388 int ret, prev_sfp_inputs = phy_data->port_sfp_inputs;
1389 int shift = GPIO_MASK_WIDTH * (3 - phy_data->port_id);
1390
1391 /* Read the input port registers */
1392 axgbe_printf(3, "%s: befor sfp_mod:%d sfp_gpio_address:0x%x\n",
1393 __func__, phy_data->sfp_mod_absent, phy_data->sfp_gpio_address);
1394
1395 gpio_reg = 0;
1396 ret = xgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address, &gpio_reg,
1397 sizeof(gpio_reg), gpio_ports, sizeof(gpio_ports));
1398 if (ret) {
1399 axgbe_error("%s: I2C error reading SFP GPIO addr:0x%x\n",
1400 __func__, phy_data->sfp_gpio_address);
1401 return;
1402 }
1403
1404 phy_data->sfp_gpio_inputs = (gpio_ports[1] << 8) | gpio_ports[0];
1405 phy_data->port_sfp_inputs = (phy_data->sfp_gpio_inputs >> shift) & 0x0F;
1406
1407 if (prev_sfp_inputs != phy_data->port_sfp_inputs)
1408 axgbe_printf(0, "%s: port_sfp_inputs: 0x%0x\n", __func__,
1409 phy_data->port_sfp_inputs);
1410
1411 phy_data->sfp_mod_absent = xgbe_phy_check_sfp_mod_absent(phy_data);
1412
1413 axgbe_printf(3, "%s: after sfp_mod:%d sfp_gpio_inputs:0x%x\n",
1414 __func__, phy_data->sfp_mod_absent, phy_data->sfp_gpio_inputs);
1415 }
1416
1417 static void
1418 xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
1419 {
1420 struct xgbe_phy_data *phy_data = pdata->phy_data;
1421
1422 xgbe_phy_free_phy_device(pdata);
1423
1424 phy_data->sfp_mod_absent = 1;
1425 phy_data->sfp_phy_avail = 0;
1426 memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
1427 }
1428
1429 static void
1430 xgbe_phy_sfp_reset(struct xgbe_phy_data *phy_data)
1431 {
1432 phy_data->sfp_rx_los = 0;
1433 phy_data->sfp_tx_fault = 0;
1434 phy_data->sfp_mod_absent = 1;
1435 phy_data->sfp_base = XGBE_SFP_BASE_UNKNOWN;
1436 phy_data->sfp_cable = XGBE_SFP_CABLE_UNKNOWN;
1437 phy_data->sfp_speed = XGBE_SFP_SPEED_UNKNOWN;
1438 }
1439
1440 static void
1441 xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
1442 {
1443 struct xgbe_phy_data *phy_data = pdata->phy_data;
1444 int ret, prev_sfp_state = phy_data->sfp_mod_absent;
1445
1446 /* Reset the SFP signals and info */
1447 xgbe_phy_sfp_reset(phy_data);
1448
1449 ret = xgbe_phy_get_comm_ownership(pdata);
1450 if (ret)
1451 return;
1452
1453 /* Read the SFP signals and check for module presence */
1454 xgbe_phy_sfp_signals(pdata);
1455 if (phy_data->sfp_mod_absent) {
1456 if (prev_sfp_state != phy_data->sfp_mod_absent)
1457 axgbe_error("%s: mod absent\n", __func__);
1458 xgbe_phy_sfp_mod_absent(pdata);
1459 goto put;
1460 }
1461
1462 ret = xgbe_phy_sfp_read_eeprom(pdata);
1463 if (ret) {
1464 /* Treat any error as if there isn't an SFP plugged in */
1465 axgbe_error("%s: eeprom read failed\n", __func__);
1466 xgbe_phy_sfp_reset(phy_data);
1467 xgbe_phy_sfp_mod_absent(pdata);
1468 goto put;
1469 }
1470
1471 xgbe_phy_sfp_parse_eeprom(pdata);
1472
1473 xgbe_phy_sfp_external_phy(pdata);
1474
1475 put:
1476 xgbe_phy_sfp_phy_settings(pdata);
1477
1478 axgbe_printf(3, "%s: phy speed: 0x%x duplex: 0x%x autoneg: 0x%x "
1479 "pause_autoneg: 0x%x\n", __func__, pdata->phy.speed,
1480 pdata->phy.duplex, pdata->phy.autoneg, pdata->phy.pause_autoneg);
1481
1482 xgbe_phy_put_comm_ownership(pdata);
1483 }
1484
1485 static int
1486 xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata)
1487 {
1488 struct xgbe_phy_data *phy_data = pdata->phy_data;
1489 uint8_t eeprom_addr, eeprom_data[XGBE_SFP_EEPROM_MAX];
1490 struct xgbe_sfp_eeprom *sfp_eeprom;
1491 int ret;
1492
1493 if (phy_data->port_mode != XGBE_PORT_MODE_SFP) {
1494 ret = -ENXIO;
1495 goto done;
1496 }
1497
1498 if (phy_data->sfp_mod_absent) {
1499 ret = -EIO;
1500 goto done;
1501 }
1502
1503 ret = xgbe_phy_get_comm_ownership(pdata);
1504 if (ret) {
1505 ret = -EIO;
1506 goto done;
1507 }
1508
1509 ret = xgbe_phy_sfp_get_mux(pdata);
1510 if (ret) {
1511 axgbe_error("I2C error setting SFP MUX\n");
1512 ret = -EIO;
1513 goto put_own;
1514 }
1515
1516 /* Read the SFP serial ID eeprom */
1517 eeprom_addr = 0;
1518 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
1519 &eeprom_addr, sizeof(eeprom_addr),
1520 eeprom_data, XGBE_SFP_EEPROM_BASE_LEN);
1521 if (ret) {
1522 axgbe_error("I2C error reading SFP EEPROM\n");
1523 ret = -EIO;
1524 goto put_mux;
1525 }
1526
1527 sfp_eeprom = (struct xgbe_sfp_eeprom *)eeprom_data;
1528
1529 if (XGBE_SFP_DIAGS_SUPPORTED(sfp_eeprom)) {
1530 /* Read the SFP diagnostic eeprom */
1531 eeprom_addr = 0;
1532 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_DIAG_INFO_ADDRESS,
1533 &eeprom_addr, sizeof(eeprom_addr),
1534 eeprom_data + XGBE_SFP_EEPROM_BASE_LEN,
1535 XGBE_SFP_EEPROM_DIAG_LEN);
1536 if (ret) {
1537 axgbe_error("I2C error reading SFP DIAGS\n");
1538 ret = -EIO;
1539 goto put_mux;
1540 }
1541 }
1542
1543 put_mux:
1544 xgbe_phy_sfp_put_mux(pdata);
1545
1546 put_own:
1547 xgbe_phy_put_comm_ownership(pdata);
1548
1549 done:
1550 return (ret);
1551 }
1552
1553 static int
1554 xgbe_phy_module_info(struct xgbe_prv_data *pdata)
1555 {
1556 struct xgbe_phy_data *phy_data = pdata->phy_data;
1557
1558 if (phy_data->port_mode != XGBE_PORT_MODE_SFP)
1559 return (-ENXIO);
1560
1561 if (phy_data->sfp_mod_absent)
1562 return (-EIO);
1563
1564 return (0);
1565 }
1566
1567 static void
1568 xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
1569 {
1570 struct xgbe_phy_data *phy_data = pdata->phy_data;
1571
1572 pdata->phy.tx_pause = 0;
1573 pdata->phy.rx_pause = 0;
1574
1575 if (!phy_data->phydev)
1576 return;
1577
1578 if (pdata->phy.pause)
1579 XGBE_SET_LP_ADV(&pdata->phy, Pause);
1580
1581 if (pdata->phy.asym_pause)
1582 XGBE_SET_LP_ADV(&pdata->phy, Asym_Pause);
1583
1584 axgbe_printf(1, "%s: pause tx/rx %d/%d\n", __func__,
1585 pdata->phy.tx_pause, pdata->phy.rx_pause);
1586 }
1587
1588 static enum xgbe_mode
1589 xgbe_phy_an37_sgmii_outcome(struct xgbe_prv_data *pdata)
1590 {
1591 enum xgbe_mode mode;
1592
1593 XGBE_SET_LP_ADV(&pdata->phy, Autoneg);
1594 XGBE_SET_LP_ADV(&pdata->phy, TP);
1595
1596 axgbe_printf(1, "%s: pause_autoneg %d\n", __func__,
1597 pdata->phy.pause_autoneg);
1598
1599 /* Use external PHY to determine flow control */
1600 if (pdata->phy.pause_autoneg)
1601 xgbe_phy_phydev_flowctrl(pdata);
1602
1603 switch (pdata->an_status & XGBE_SGMII_AN_LINK_SPEED) {
1604 case XGBE_SGMII_AN_LINK_SPEED_100:
1605 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1606 XGBE_SET_LP_ADV(&pdata->phy, 100baseT_Full);
1607 mode = XGBE_MODE_SGMII_100;
1608 } else {
1609 /* Half-duplex not supported */
1610 XGBE_SET_LP_ADV(&pdata->phy, 100baseT_Half);
1611 mode = XGBE_MODE_UNKNOWN;
1612 }
1613 break;
1614 case XGBE_SGMII_AN_LINK_SPEED_1000:
1615 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1616 XGBE_SET_LP_ADV(&pdata->phy, 1000baseT_Full);
1617 mode = XGBE_MODE_SGMII_1000;
1618 } else {
1619 /* Half-duplex not supported */
1620 XGBE_SET_LP_ADV(&pdata->phy, 1000baseT_Half);
1621 mode = XGBE_MODE_UNKNOWN;
1622 }
1623 break;
1624 default:
1625 mode = XGBE_MODE_UNKNOWN;
1626 }
1627
1628 return (mode);
1629 }
1630
1631 static enum xgbe_mode
1632 xgbe_phy_an37_outcome(struct xgbe_prv_data *pdata)
1633 {
1634 enum xgbe_mode mode;
1635 unsigned int ad_reg, lp_reg;
1636
1637 XGBE_SET_LP_ADV(&pdata->phy, Autoneg);
1638 XGBE_SET_LP_ADV(&pdata->phy, FIBRE);
1639
1640 /* Compare Advertisement and Link Partner register */
1641 ad_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
1642 lp_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_LP_ABILITY);
1643 if (lp_reg & 0x100)
1644 XGBE_SET_LP_ADV(&pdata->phy, Pause);
1645 if (lp_reg & 0x80)
1646 XGBE_SET_LP_ADV(&pdata->phy, Asym_Pause);
1647
1648 axgbe_printf(1, "%s: pause_autoneg %d ad_reg 0x%x lp_reg 0x%x\n",
1649 __func__, pdata->phy.pause_autoneg, ad_reg, lp_reg);
1650
1651 if (pdata->phy.pause_autoneg) {
1652 /* Set flow control based on auto-negotiation result */
1653 pdata->phy.tx_pause = 0;
1654 pdata->phy.rx_pause = 0;
1655
1656 if (ad_reg & lp_reg & 0x100) {
1657 pdata->phy.tx_pause = 1;
1658 pdata->phy.rx_pause = 1;
1659 } else if (ad_reg & lp_reg & 0x80) {
1660 if (ad_reg & 0x100)
1661 pdata->phy.rx_pause = 1;
1662 else if (lp_reg & 0x100)
1663 pdata->phy.tx_pause = 1;
1664 }
1665 }
1666
1667 axgbe_printf(1, "%s: pause tx/rx %d/%d\n", __func__, pdata->phy.tx_pause,
1668 pdata->phy.rx_pause);
1669
1670 if (lp_reg & 0x20)
1671 XGBE_SET_LP_ADV(&pdata->phy, 1000baseX_Full);
1672
1673 /* Half duplex is not supported */
1674 ad_reg &= lp_reg;
1675 mode = (ad_reg & 0x20) ? XGBE_MODE_X : XGBE_MODE_UNKNOWN;
1676
1677 return (mode);
1678 }
1679
1680 static enum xgbe_mode
1681 xgbe_phy_an73_redrv_outcome(struct xgbe_prv_data *pdata)
1682 {
1683 struct xgbe_phy_data *phy_data = pdata->phy_data;
1684 enum xgbe_mode mode;
1685 unsigned int ad_reg, lp_reg;
1686
1687 XGBE_SET_LP_ADV(&pdata->phy, Autoneg);
1688 XGBE_SET_LP_ADV(&pdata->phy, Backplane);
1689
1690 axgbe_printf(1, "%s: pause_autoneg %d\n", __func__,
1691 pdata->phy.pause_autoneg);
1692
1693 /* Use external PHY to determine flow control */
1694 if (pdata->phy.pause_autoneg)
1695 xgbe_phy_phydev_flowctrl(pdata);
1696
1697 /* Compare Advertisement and Link Partner register 2 */
1698 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1699 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1700 if (lp_reg & 0x80)
1701 XGBE_SET_LP_ADV(&pdata->phy, 10000baseKR_Full);
1702 if (lp_reg & 0x20)
1703 XGBE_SET_LP_ADV(&pdata->phy, 1000baseKX_Full);
1704
1705 ad_reg &= lp_reg;
1706 if (ad_reg & 0x80) {
1707 switch (phy_data->port_mode) {
1708 case XGBE_PORT_MODE_BACKPLANE:
1709 mode = XGBE_MODE_KR;
1710 break;
1711 default:
1712 mode = XGBE_MODE_SFI;
1713 break;
1714 }
1715 } else if (ad_reg & 0x20) {
1716 switch (phy_data->port_mode) {
1717 case XGBE_PORT_MODE_BACKPLANE:
1718 mode = XGBE_MODE_KX_1000;
1719 break;
1720 case XGBE_PORT_MODE_1000BASE_X:
1721 mode = XGBE_MODE_X;
1722 break;
1723 case XGBE_PORT_MODE_SFP:
1724 switch (phy_data->sfp_base) {
1725 case XGBE_SFP_BASE_1000_T:
1726 if ((phy_data->phydev) &&
1727 (pdata->phy.speed == SPEED_100))
1728 mode = XGBE_MODE_SGMII_100;
1729 else
1730 mode = XGBE_MODE_SGMII_1000;
1731 break;
1732 case XGBE_SFP_BASE_1000_SX:
1733 case XGBE_SFP_BASE_1000_LX:
1734 case XGBE_SFP_BASE_1000_CX:
1735 default:
1736 mode = XGBE_MODE_X;
1737 break;
1738 }
1739 break;
1740 default:
1741 if ((phy_data->phydev) &&
1742 (pdata->phy.speed == SPEED_100))
1743 mode = XGBE_MODE_SGMII_100;
1744 else
1745 mode = XGBE_MODE_SGMII_1000;
1746 break;
1747 }
1748 } else {
1749 mode = XGBE_MODE_UNKNOWN;
1750 }
1751
1752 /* Compare Advertisement and Link Partner register 3 */
1753 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1754 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1755 if (lp_reg & 0xc000)
1756 XGBE_SET_LP_ADV(&pdata->phy, 10000baseR_FEC);
1757
1758 return (mode);
1759 }
1760
1761 static enum xgbe_mode
1762 xgbe_phy_an73_outcome(struct xgbe_prv_data *pdata)
1763 {
1764 enum xgbe_mode mode;
1765 unsigned int ad_reg, lp_reg;
1766
1767 XGBE_SET_LP_ADV(&pdata->phy, Autoneg);
1768 XGBE_SET_LP_ADV(&pdata->phy, Backplane);
1769
1770 /* Compare Advertisement and Link Partner register 1 */
1771 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1772 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1773 if (lp_reg & 0x400)
1774 XGBE_SET_LP_ADV(&pdata->phy, Pause);
1775 if (lp_reg & 0x800)
1776 XGBE_SET_LP_ADV(&pdata->phy, Asym_Pause);
1777
1778 axgbe_printf(1, "%s: pause_autoneg %d ad_reg 0x%x lp_reg 0x%x\n",
1779 __func__, pdata->phy.pause_autoneg, ad_reg, lp_reg);
1780
1781 if (pdata->phy.pause_autoneg) {
1782 /* Set flow control based on auto-negotiation result */
1783 pdata->phy.tx_pause = 0;
1784 pdata->phy.rx_pause = 0;
1785
1786 if (ad_reg & lp_reg & 0x400) {
1787 pdata->phy.tx_pause = 1;
1788 pdata->phy.rx_pause = 1;
1789 } else if (ad_reg & lp_reg & 0x800) {
1790 if (ad_reg & 0x400)
1791 pdata->phy.rx_pause = 1;
1792 else if (lp_reg & 0x400)
1793 pdata->phy.tx_pause = 1;
1794 }
1795 }
1796
1797 axgbe_printf(1, "%s: pause tx/rx %d/%d\n", __func__, pdata->phy.tx_pause,
1798 pdata->phy.rx_pause);
1799
1800 /* Compare Advertisement and Link Partner register 2 */
1801 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1802 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1803 if (lp_reg & 0x80)
1804 XGBE_SET_LP_ADV(&pdata->phy, 10000baseKR_Full);
1805 if (lp_reg & 0x20)
1806 XGBE_SET_LP_ADV(&pdata->phy, 1000baseKX_Full);
1807
1808 ad_reg &= lp_reg;
1809 if (ad_reg & 0x80)
1810 mode = XGBE_MODE_KR;
1811 else if (ad_reg & 0x20)
1812 mode = XGBE_MODE_KX_1000;
1813 else
1814 mode = XGBE_MODE_UNKNOWN;
1815
1816 /* Compare Advertisement and Link Partner register 3 */
1817 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1818 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1819 if (lp_reg & 0xc000)
1820 XGBE_SET_LP_ADV(&pdata->phy, 10000baseR_FEC);
1821
1822 return (mode);
1823 }
1824
1825 static enum xgbe_mode
1826 xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
1827 {
1828 switch (pdata->an_mode) {
1829 case XGBE_AN_MODE_CL73:
1830 return (xgbe_phy_an73_outcome(pdata));
1831 case XGBE_AN_MODE_CL73_REDRV:
1832 return (xgbe_phy_an73_redrv_outcome(pdata));
1833 case XGBE_AN_MODE_CL37:
1834 return (xgbe_phy_an37_outcome(pdata));
1835 case XGBE_AN_MODE_CL37_SGMII:
1836 return (xgbe_phy_an37_sgmii_outcome(pdata));
1837 default:
1838 return (XGBE_MODE_UNKNOWN);
1839 }
1840 }
1841
1842 static void
1843 xgbe_phy_an_advertising(struct xgbe_prv_data *pdata, struct xgbe_phy *dphy)
1844 {
1845 struct xgbe_phy_data *phy_data = pdata->phy_data;
1846
1847 XGBE_LM_COPY(dphy, advertising, &pdata->phy, advertising);
1848
1849 /* Without a re-driver, just return current advertising */
1850 if (!phy_data->redrv)
1851 return;
1852
1853 /* With the KR re-driver we need to advertise a single speed */
1854 XGBE_CLR_ADV(dphy, 1000baseKX_Full);
1855 XGBE_CLR_ADV(dphy, 10000baseKR_Full);
1856
1857 /* Advertise FEC support is present */
1858 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
1859 XGBE_SET_ADV(dphy, 10000baseR_FEC);
1860
1861 switch (phy_data->port_mode) {
1862 case XGBE_PORT_MODE_BACKPLANE:
1863 XGBE_SET_ADV(dphy, 10000baseKR_Full);
1864 break;
1865 case XGBE_PORT_MODE_BACKPLANE_2500:
1866 XGBE_SET_ADV(dphy, 1000baseKX_Full);
1867 break;
1868 case XGBE_PORT_MODE_1000BASE_T:
1869 case XGBE_PORT_MODE_1000BASE_X:
1870 case XGBE_PORT_MODE_NBASE_T:
1871 XGBE_SET_ADV(dphy, 1000baseKX_Full);
1872 break;
1873 case XGBE_PORT_MODE_10GBASE_T:
1874 if ((phy_data->phydev) &&
1875 (pdata->phy.speed == SPEED_10000))
1876 XGBE_SET_ADV(dphy, 10000baseKR_Full);
1877 else
1878 XGBE_SET_ADV(dphy, 1000baseKX_Full);
1879 break;
1880 case XGBE_PORT_MODE_10GBASE_R:
1881 XGBE_SET_ADV(dphy, 10000baseKR_Full);
1882 break;
1883 case XGBE_PORT_MODE_SFP:
1884 switch (phy_data->sfp_base) {
1885 case XGBE_SFP_BASE_1000_T:
1886 case XGBE_SFP_BASE_1000_SX:
1887 case XGBE_SFP_BASE_1000_LX:
1888 case XGBE_SFP_BASE_1000_CX:
1889 XGBE_SET_ADV(dphy, 1000baseKX_Full);
1890 break;
1891 default:
1892 XGBE_SET_ADV(dphy, 10000baseKR_Full);
1893 break;
1894 }
1895 break;
1896 default:
1897 XGBE_SET_ADV(dphy, 10000baseKR_Full);
1898 break;
1899 }
1900 }
1901
1902 static int
1903 xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1904 {
1905 struct xgbe_phy_data *phy_data = pdata->phy_data;
1906 int ret;
1907
1908 ret = xgbe_phy_find_phy_device(pdata);
1909 if (ret)
1910 return (ret);
1911
1912 axgbe_printf(2, "%s: find_phy_device return %s.\n", __func__,
1913 ret ? "Failure" : "Success");
1914
1915 if (!phy_data->phydev)
1916 return (0);
1917
1918 ret = xgbe_phy_start_aneg(pdata);
1919 return (ret);
1920 }
1921
1922 static enum xgbe_an_mode
1923 xgbe_phy_an_sfp_mode(struct xgbe_phy_data *phy_data)
1924 {
1925 switch (phy_data->sfp_base) {
1926 case XGBE_SFP_BASE_1000_T:
1927 return (XGBE_AN_MODE_CL37_SGMII);
1928 case XGBE_SFP_BASE_1000_SX:
1929 case XGBE_SFP_BASE_1000_LX:
1930 case XGBE_SFP_BASE_1000_CX:
1931 return (XGBE_AN_MODE_CL37);
1932 default:
1933 return (XGBE_AN_MODE_NONE);
1934 }
1935 }
1936
1937 static enum xgbe_an_mode
1938 xgbe_phy_an_mode(struct xgbe_prv_data *pdata)
1939 {
1940 struct xgbe_phy_data *phy_data = pdata->phy_data;
1941
1942 /* A KR re-driver will always require CL73 AN */
1943 if (phy_data->redrv)
1944 return (XGBE_AN_MODE_CL73_REDRV);
1945
1946 switch (phy_data->port_mode) {
1947 case XGBE_PORT_MODE_BACKPLANE:
1948 return (XGBE_AN_MODE_CL73);
1949 case XGBE_PORT_MODE_BACKPLANE_2500:
1950 return (XGBE_AN_MODE_NONE);
1951 case XGBE_PORT_MODE_1000BASE_T:
1952 return (XGBE_AN_MODE_CL37_SGMII);
1953 case XGBE_PORT_MODE_1000BASE_X:
1954 return (XGBE_AN_MODE_CL37);
1955 case XGBE_PORT_MODE_NBASE_T:
1956 return (XGBE_AN_MODE_CL37_SGMII);
1957 case XGBE_PORT_MODE_10GBASE_T:
1958 return (XGBE_AN_MODE_CL73);
1959 case XGBE_PORT_MODE_10GBASE_R:
1960 return (XGBE_AN_MODE_NONE);
1961 case XGBE_PORT_MODE_SFP:
1962 return (xgbe_phy_an_sfp_mode(phy_data));
1963 default:
1964 return (XGBE_AN_MODE_NONE);
1965 }
1966 }
1967
1968 static int
1969 xgbe_phy_set_redrv_mode_mdio(struct xgbe_prv_data *pdata,
1970 enum xgbe_phy_redrv_mode mode)
1971 {
1972 struct xgbe_phy_data *phy_data = pdata->phy_data;
1973 uint16_t redrv_reg, redrv_val;
1974
1975 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1976 redrv_val = (uint16_t)mode;
1977
1978 return (pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr,
1979 redrv_reg, redrv_val));
1980 }
1981
1982 static int
1983 xgbe_phy_set_redrv_mode_i2c(struct xgbe_prv_data *pdata,
1984 enum xgbe_phy_redrv_mode mode)
1985 {
1986 struct xgbe_phy_data *phy_data = pdata->phy_data;
1987 unsigned int redrv_reg;
1988 int ret;
1989
1990 /* Calculate the register to write */
1991 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1992
1993 ret = xgbe_phy_redrv_write(pdata, redrv_reg, mode);
1994
1995 return (ret);
1996 }
1997
1998 static void
1999 xgbe_phy_set_redrv_mode(struct xgbe_prv_data *pdata)
2000 {
2001 struct xgbe_phy_data *phy_data = pdata->phy_data;
2002 enum xgbe_phy_redrv_mode mode;
2003 int ret;
2004
2005 if (!phy_data->redrv)
2006 return;
2007
2008 mode = XGBE_PHY_REDRV_MODE_CX;
2009 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
2010 (phy_data->sfp_base != XGBE_SFP_BASE_1000_CX) &&
2011 (phy_data->sfp_base != XGBE_SFP_BASE_10000_CR))
2012 mode = XGBE_PHY_REDRV_MODE_SR;
2013
2014 ret = xgbe_phy_get_comm_ownership(pdata);
2015 if (ret)
2016 return;
2017
2018 axgbe_printf(2, "%s: redrv_if set: %d\n", __func__, phy_data->redrv_if);
2019 if (phy_data->redrv_if)
2020 xgbe_phy_set_redrv_mode_i2c(pdata, mode);
2021 else
2022 xgbe_phy_set_redrv_mode_mdio(pdata, mode);
2023
2024 xgbe_phy_put_comm_ownership(pdata);
2025 }
2026
2027 static void
2028 xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, unsigned int cmd,
2029 unsigned int sub_cmd)
2030 {
2031 unsigned int s0 = 0;
2032 unsigned int wait;
2033
2034 /* Log if a previous command did not complete */
2035 if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
2036 axgbe_error("firmware mailbox not ready for command\n");
2037
2038 /* Construct the command */
2039 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, cmd);
2040 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, sub_cmd);
2041
2042 /* Issue the command */
2043 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
2044 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
2045 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
2046
2047 /* Wait for command to complete */
2048 wait = XGBE_RATECHANGE_COUNT;
2049 while (wait--) {
2050 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) {
2051 axgbe_printf(3, "%s: Rate change done\n", __func__);
2052 return;
2053 }
2054
2055 DELAY(2000);
2056 }
2057
2058 axgbe_printf(3, "firmware mailbox command did not complete\n");
2059 }
2060
2061 static void
2062 xgbe_phy_rrc(struct xgbe_prv_data *pdata)
2063 {
2064 /* Receiver Reset Cycle */
2065 xgbe_phy_perform_ratechange(pdata, 5, 0);
2066
2067 axgbe_printf(3, "receiver reset complete\n");
2068 }
2069
2070 static void
2071 xgbe_phy_power_off(struct xgbe_prv_data *pdata)
2072 {
2073 struct xgbe_phy_data *phy_data = pdata->phy_data;
2074
2075 /* Power off */
2076 xgbe_phy_perform_ratechange(pdata, 0, 0);
2077
2078 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
2079
2080 axgbe_printf(3, "phy powered off\n");
2081 }
2082
2083 static void
2084 xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata)
2085 {
2086 struct xgbe_phy_data *phy_data = pdata->phy_data;
2087
2088 xgbe_phy_set_redrv_mode(pdata);
2089
2090 /* 10G/SFI */
2091 axgbe_printf(3, "%s: cable %d len %d\n", __func__, phy_data->sfp_cable,
2092 phy_data->sfp_cable_len);
2093
2094 if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE)
2095 xgbe_phy_perform_ratechange(pdata, 3, 0);
2096 else {
2097 if (phy_data->sfp_cable_len <= 1)
2098 xgbe_phy_perform_ratechange(pdata, 3, 1);
2099 else if (phy_data->sfp_cable_len <= 3)
2100 xgbe_phy_perform_ratechange(pdata, 3, 2);
2101 else
2102 xgbe_phy_perform_ratechange(pdata, 3, 3);
2103 }
2104
2105 phy_data->cur_mode = XGBE_MODE_SFI;
2106
2107 axgbe_printf(3, "10GbE SFI mode set\n");
2108 }
2109
2110 static void
2111 xgbe_phy_x_mode(struct xgbe_prv_data *pdata)
2112 {
2113 struct xgbe_phy_data *phy_data = pdata->phy_data;
2114
2115 xgbe_phy_set_redrv_mode(pdata);
2116
2117 /* 1G/X */
2118 xgbe_phy_perform_ratechange(pdata, 1, 3);
2119
2120 phy_data->cur_mode = XGBE_MODE_X;
2121
2122 axgbe_printf(3, "1GbE X mode set\n");
2123 }
2124
2125 static void
2126 xgbe_phy_sgmii_1000_mode(struct xgbe_prv_data *pdata)
2127 {
2128 struct xgbe_phy_data *phy_data = pdata->phy_data;
2129
2130 xgbe_phy_set_redrv_mode(pdata);
2131
2132 /* 1G/SGMII */
2133 xgbe_phy_perform_ratechange(pdata, 1, 2);
2134
2135 phy_data->cur_mode = XGBE_MODE_SGMII_1000;
2136
2137 axgbe_printf(2, "1GbE SGMII mode set\n");
2138 }
2139
2140 static void
2141 xgbe_phy_sgmii_100_mode(struct xgbe_prv_data *pdata)
2142 {
2143 struct xgbe_phy_data *phy_data = pdata->phy_data;
2144
2145 xgbe_phy_set_redrv_mode(pdata);
2146
2147 /* 100M/SGMII */
2148 xgbe_phy_perform_ratechange(pdata, 1, 1);
2149
2150 phy_data->cur_mode = XGBE_MODE_SGMII_100;
2151
2152 axgbe_printf(3, "100MbE SGMII mode set\n");
2153 }
2154
2155 static void
2156 xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
2157 {
2158 struct xgbe_phy_data *phy_data = pdata->phy_data;
2159
2160 xgbe_phy_set_redrv_mode(pdata);
2161
2162 /* 10G/KR */
2163 xgbe_phy_perform_ratechange(pdata, 4, 0);
2164
2165 phy_data->cur_mode = XGBE_MODE_KR;
2166
2167 axgbe_printf(3, "10GbE KR mode set\n");
2168 }
2169
2170 static void
2171 xgbe_phy_kx_2500_mode(struct xgbe_prv_data *pdata)
2172 {
2173 struct xgbe_phy_data *phy_data = pdata->phy_data;
2174
2175 xgbe_phy_set_redrv_mode(pdata);
2176
2177 /* 2.5G/KX */
2178 xgbe_phy_perform_ratechange(pdata, 2, 0);
2179
2180 phy_data->cur_mode = XGBE_MODE_KX_2500;
2181
2182 axgbe_printf(3, "2.5GbE KX mode set\n");
2183 }
2184
2185 static void
2186 xgbe_phy_kx_1000_mode(struct xgbe_prv_data *pdata)
2187 {
2188 struct xgbe_phy_data *phy_data = pdata->phy_data;
2189
2190 xgbe_phy_set_redrv_mode(pdata);
2191
2192 /* 1G/KX */
2193 xgbe_phy_perform_ratechange(pdata, 1, 3);
2194
2195 phy_data->cur_mode = XGBE_MODE_KX_1000;
2196
2197 axgbe_printf(3, "1GbE KX mode set\n");
2198 }
2199
2200 static enum xgbe_mode
2201 xgbe_phy_cur_mode(struct xgbe_prv_data *pdata)
2202 {
2203 struct xgbe_phy_data *phy_data = pdata->phy_data;
2204
2205 return (phy_data->cur_mode);
2206 }
2207
2208 static enum xgbe_mode
2209 xgbe_phy_switch_baset_mode(struct xgbe_prv_data *pdata)
2210 {
2211 struct xgbe_phy_data *phy_data = pdata->phy_data;
2212
2213 /* No switching if not 10GBase-T */
2214 if (phy_data->port_mode != XGBE_PORT_MODE_10GBASE_T)
2215 return (xgbe_phy_cur_mode(pdata));
2216
2217 switch (xgbe_phy_cur_mode(pdata)) {
2218 case XGBE_MODE_SGMII_100:
2219 case XGBE_MODE_SGMII_1000:
2220 return (XGBE_MODE_KR);
2221 case XGBE_MODE_KR:
2222 default:
2223 return (XGBE_MODE_SGMII_1000);
2224 }
2225 }
2226
2227 static enum xgbe_mode
2228 xgbe_phy_switch_bp_2500_mode(struct xgbe_prv_data *pdata)
2229 {
2230 return (XGBE_MODE_KX_2500);
2231 }
2232
2233 static enum xgbe_mode
2234 xgbe_phy_switch_bp_mode(struct xgbe_prv_data *pdata)
2235 {
2236 /* If we are in KR switch to KX, and vice-versa */
2237 switch (xgbe_phy_cur_mode(pdata)) {
2238 case XGBE_MODE_KX_1000:
2239 return (XGBE_MODE_KR);
2240 case XGBE_MODE_KR:
2241 default:
2242 return (XGBE_MODE_KX_1000);
2243 }
2244 }
2245
2246 static enum xgbe_mode
2247 xgbe_phy_switch_mode(struct xgbe_prv_data *pdata)
2248 {
2249 struct xgbe_phy_data *phy_data = pdata->phy_data;
2250
2251 switch (phy_data->port_mode) {
2252 case XGBE_PORT_MODE_BACKPLANE:
2253 return (xgbe_phy_switch_bp_mode(pdata));
2254 case XGBE_PORT_MODE_BACKPLANE_2500:
2255 return (xgbe_phy_switch_bp_2500_mode(pdata));
2256 case XGBE_PORT_MODE_1000BASE_T:
2257 case XGBE_PORT_MODE_NBASE_T:
2258 case XGBE_PORT_MODE_10GBASE_T:
2259 return (xgbe_phy_switch_baset_mode(pdata));
2260 case XGBE_PORT_MODE_1000BASE_X:
2261 case XGBE_PORT_MODE_10GBASE_R:
2262 case XGBE_PORT_MODE_SFP:
2263 /* No switching, so just return current mode */
2264 return (xgbe_phy_cur_mode(pdata));
2265 default:
2266 return (XGBE_MODE_UNKNOWN);
2267 }
2268 }
2269
2270 static enum xgbe_mode
2271 xgbe_phy_get_basex_mode(struct xgbe_phy_data *phy_data, int speed)
2272 {
2273 switch (speed) {
2274 case SPEED_1000:
2275 return (XGBE_MODE_X);
2276 case SPEED_10000:
2277 return (XGBE_MODE_KR);
2278 default:
2279 return (XGBE_MODE_UNKNOWN);
2280 }
2281 }
2282
2283 static enum xgbe_mode
2284 xgbe_phy_get_baset_mode(struct xgbe_phy_data *phy_data, int speed)
2285 {
2286 switch (speed) {
2287 case SPEED_100:
2288 return (XGBE_MODE_SGMII_100);
2289 case SPEED_1000:
2290 return (XGBE_MODE_SGMII_1000);
2291 case SPEED_2500:
2292 return (XGBE_MODE_KX_2500);
2293 case SPEED_10000:
2294 return (XGBE_MODE_KR);
2295 default:
2296 return (XGBE_MODE_UNKNOWN);
2297 }
2298 }
2299
2300 static enum xgbe_mode
2301 xgbe_phy_get_sfp_mode(struct xgbe_phy_data *phy_data, int speed)
2302 {
2303 switch (speed) {
2304 case SPEED_100:
2305 return (XGBE_MODE_SGMII_100);
2306 case SPEED_1000:
2307 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2308 return (XGBE_MODE_SGMII_1000);
2309 else
2310 return (XGBE_MODE_X);
2311 case SPEED_10000:
2312 case SPEED_UNKNOWN:
2313 return (XGBE_MODE_SFI);
2314 default:
2315 return (XGBE_MODE_UNKNOWN);
2316 }
2317 }
2318
2319 static enum xgbe_mode
2320 xgbe_phy_get_bp_2500_mode(int speed)
2321 {
2322 switch (speed) {
2323 case SPEED_2500:
2324 return (XGBE_MODE_KX_2500);
2325 default:
2326 return (XGBE_MODE_UNKNOWN);
2327 }
2328 }
2329
2330 static enum xgbe_mode
2331 xgbe_phy_get_bp_mode(int speed)
2332 {
2333 switch (speed) {
2334 case SPEED_1000:
2335 return (XGBE_MODE_KX_1000);
2336 case SPEED_10000:
2337 return (XGBE_MODE_KR);
2338 default:
2339 return (XGBE_MODE_UNKNOWN);
2340 }
2341 }
2342
2343 static enum xgbe_mode
2344 xgbe_phy_get_mode(struct xgbe_prv_data *pdata, int speed)
2345 {
2346 struct xgbe_phy_data *phy_data = pdata->phy_data;
2347
2348 switch (phy_data->port_mode) {
2349 case XGBE_PORT_MODE_BACKPLANE:
2350 return (xgbe_phy_get_bp_mode(speed));
2351 case XGBE_PORT_MODE_BACKPLANE_2500:
2352 return (xgbe_phy_get_bp_2500_mode(speed));
2353 case XGBE_PORT_MODE_1000BASE_T:
2354 case XGBE_PORT_MODE_NBASE_T:
2355 case XGBE_PORT_MODE_10GBASE_T:
2356 return (xgbe_phy_get_baset_mode(phy_data, speed));
2357 case XGBE_PORT_MODE_1000BASE_X:
2358 case XGBE_PORT_MODE_10GBASE_R:
2359 return (xgbe_phy_get_basex_mode(phy_data, speed));
2360 case XGBE_PORT_MODE_SFP:
2361 return (xgbe_phy_get_sfp_mode(phy_data, speed));
2362 default:
2363 return (XGBE_MODE_UNKNOWN);
2364 }
2365 }
2366
2367 static void
2368 xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2369 {
2370 switch (mode) {
2371 case XGBE_MODE_KX_1000:
2372 xgbe_phy_kx_1000_mode(pdata);
2373 break;
2374 case XGBE_MODE_KX_2500:
2375 xgbe_phy_kx_2500_mode(pdata);
2376 break;
2377 case XGBE_MODE_KR:
2378 xgbe_phy_kr_mode(pdata);
2379 break;
2380 case XGBE_MODE_SGMII_100:
2381 xgbe_phy_sgmii_100_mode(pdata);
2382 break;
2383 case XGBE_MODE_SGMII_1000:
2384 xgbe_phy_sgmii_1000_mode(pdata);
2385 break;
2386 case XGBE_MODE_X:
2387 xgbe_phy_x_mode(pdata);
2388 break;
2389 case XGBE_MODE_SFI:
2390 xgbe_phy_sfi_mode(pdata);
2391 break;
2392 default:
2393 break;
2394 }
2395 }
2396
2397 static void
2398 xgbe_phy_get_type(struct xgbe_prv_data *pdata, struct ifmediareq * ifmr)
2399 {
2400 struct xgbe_phy_data *phy_data = pdata->phy_data;
2401
2402 switch (pdata->phy.speed) {
2403 case SPEED_10000:
2404 if (phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE)
2405 ifmr->ifm_active |= IFM_10G_KR;
2406 else if(phy_data->port_mode == XGBE_PORT_MODE_10GBASE_T)
2407 ifmr->ifm_active |= IFM_10G_T;
2408 else if(phy_data->port_mode == XGBE_PORT_MODE_10GBASE_R)
2409 ifmr->ifm_active |= IFM_10G_KR;
2410 else if(phy_data->port_mode == XGBE_PORT_MODE_SFP)
2411 ifmr->ifm_active |= IFM_10G_SFI;
2412 else
2413 ifmr->ifm_active |= IFM_OTHER;
2414 break;
2415 case SPEED_2500:
2416 if (phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE_2500)
2417 ifmr->ifm_active |= IFM_2500_KX;
2418 else
2419 ifmr->ifm_active |= IFM_OTHER;
2420 break;
2421 case SPEED_1000:
2422 if (phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE)
2423 ifmr->ifm_active |= IFM_1000_KX;
2424 else if(phy_data->port_mode == XGBE_PORT_MODE_1000BASE_T)
2425 ifmr->ifm_active |= IFM_1000_T;
2426 #if 0
2427 else if(phy_data->port_mode == XGBE_PORT_MODE_1000BASE_X)
2428 ifmr->ifm_active |= IFM_1000_SX;
2429 ifmr->ifm_active |= IFM_1000_LX;
2430 ifmr->ifm_active |= IFM_1000_CX;
2431 #endif
2432 else if(phy_data->port_mode == XGBE_PORT_MODE_SFP)
2433 ifmr->ifm_active |= IFM_1000_SGMII;
2434 else
2435 ifmr->ifm_active |= IFM_OTHER;
2436 break;
2437 case SPEED_100:
2438 if(phy_data->port_mode == XGBE_PORT_MODE_NBASE_T)
2439 ifmr->ifm_active |= IFM_100_T;
2440 else if(phy_data->port_mode == XGBE_PORT_MODE_SFP)
2441 ifmr->ifm_active |= IFM_1000_SGMII;
2442 else
2443 ifmr->ifm_active |= IFM_OTHER;
2444 break;
2445 default:
2446 ifmr->ifm_active |= IFM_OTHER;
2447 axgbe_printf(1, "Unknown mode detected\n");
2448 break;
2449 }
2450 }
2451
2452 static bool
2453 xgbe_phy_check_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode,
2454 bool advert)
2455 {
2456
2457 if (pdata->phy.autoneg == AUTONEG_ENABLE)
2458 return (advert);
2459 else {
2460 enum xgbe_mode cur_mode;
2461
2462 cur_mode = xgbe_phy_get_mode(pdata, pdata->phy.speed);
2463 if (cur_mode == mode)
2464 return (true);
2465 }
2466
2467 return (false);
2468 }
2469
2470 static bool
2471 xgbe_phy_use_basex_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2472 {
2473
2474 switch (mode) {
2475 case XGBE_MODE_X:
2476 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2477 1000baseX_Full)));
2478 case XGBE_MODE_KR:
2479 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2480 10000baseKR_Full)));
2481 default:
2482 return (false);
2483 }
2484 }
2485
2486 static bool
2487 xgbe_phy_use_baset_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2488 {
2489
2490 axgbe_printf(3, "%s: check mode %d\n", __func__, mode);
2491 switch (mode) {
2492 case XGBE_MODE_SGMII_100:
2493 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2494 100baseT_Full)));
2495 case XGBE_MODE_SGMII_1000:
2496 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2497 1000baseT_Full)));
2498 case XGBE_MODE_KX_2500:
2499 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2500 2500baseT_Full)));
2501 case XGBE_MODE_KR:
2502 return (xgbe_phy_check_mode(pdata, mode, XGBE_ADV(&pdata->phy,
2503 10000baseT_Full)));
2504 default:
2505 return (false);
2506 }
2507 }
2508
2509 static bool
2510 xgbe_phy_use_sfp_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2511 {
2512 struct xgbe_phy_data *phy_data = pdata->phy_data;
2513
2514 switch (mode) {
2515 case XGBE_MODE_X:
2516 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2517 return (false);
2518 return (xgbe_phy_check_mode(pdata, mode,
2519 XGBE_ADV(&pdata->phy, 1000baseX_Full)));
2520 case XGBE_MODE_SGMII_100:
2521 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2522 return (false);
2523 return (xgbe_phy_check_mode(pdata, mode,
2524 XGBE_ADV(&pdata->phy, 100baseT_Full)));
2525 case XGBE_MODE_SGMII_1000:
2526 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2527 return (false);
2528 return (xgbe_phy_check_mode(pdata, mode,
2529 XGBE_ADV(&pdata->phy, 1000baseT_Full)));
2530 case XGBE_MODE_SFI:
2531 if (phy_data->sfp_mod_absent)
2532 return (true);
2533 return (xgbe_phy_check_mode(pdata, mode,
2534 XGBE_ADV(&pdata->phy, 10000baseSR_Full) ||
2535 XGBE_ADV(&pdata->phy, 10000baseLR_Full) ||
2536 XGBE_ADV(&pdata->phy, 10000baseLRM_Full) ||
2537 XGBE_ADV(&pdata->phy, 10000baseER_Full) ||
2538 XGBE_ADV(&pdata->phy, 10000baseCR_Full)));
2539 default:
2540 return (false);
2541 }
2542 }
2543
2544 static bool
2545 xgbe_phy_use_bp_2500_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2546 {
2547
2548 switch (mode) {
2549 case XGBE_MODE_KX_2500:
2550 return (xgbe_phy_check_mode(pdata, mode,
2551 XGBE_ADV(&pdata->phy, 2500baseX_Full)));
2552 default:
2553 return (false);
2554 }
2555 }
2556
2557 static bool
2558 xgbe_phy_use_bp_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2559 {
2560
2561 switch (mode) {
2562 case XGBE_MODE_KX_1000:
2563 return (xgbe_phy_check_mode(pdata, mode,
2564 XGBE_ADV(&pdata->phy, 1000baseKX_Full)));
2565 case XGBE_MODE_KR:
2566 return (xgbe_phy_check_mode(pdata, mode,
2567 XGBE_ADV(&pdata->phy, 10000baseKR_Full)));
2568 default:
2569 return (false);
2570 }
2571 }
2572
2573 static bool
2574 xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2575 {
2576 struct xgbe_phy_data *phy_data = pdata->phy_data;
2577
2578 switch (phy_data->port_mode) {
2579 case XGBE_PORT_MODE_BACKPLANE:
2580 return (xgbe_phy_use_bp_mode(pdata, mode));
2581 case XGBE_PORT_MODE_BACKPLANE_2500:
2582 return (xgbe_phy_use_bp_2500_mode(pdata, mode));
2583 case XGBE_PORT_MODE_1000BASE_T:
2584 axgbe_printf(3, "use_mode %s\n",
2585 xgbe_phy_use_baset_mode(pdata, mode) ? "found" : "Not found");
2586 case XGBE_PORT_MODE_NBASE_T:
2587 case XGBE_PORT_MODE_10GBASE_T:
2588 return (xgbe_phy_use_baset_mode(pdata, mode));
2589 case XGBE_PORT_MODE_1000BASE_X:
2590 case XGBE_PORT_MODE_10GBASE_R:
2591 return (xgbe_phy_use_basex_mode(pdata, mode));
2592 case XGBE_PORT_MODE_SFP:
2593 return (xgbe_phy_use_sfp_mode(pdata, mode));
2594 default:
2595 return (false);
2596 }
2597 }
2598
2599 static bool
2600 xgbe_phy_valid_speed_basex_mode(struct xgbe_phy_data *phy_data, int speed)
2601 {
2602
2603 switch (speed) {
2604 case SPEED_1000:
2605 return (phy_data->port_mode == XGBE_PORT_MODE_1000BASE_X);
2606 case SPEED_10000:
2607 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_R);
2608 default:
2609 return (false);
2610 }
2611 }
2612
2613 static bool
2614 xgbe_phy_valid_speed_baset_mode(struct xgbe_phy_data *phy_data, int speed)
2615 {
2616
2617 switch (speed) {
2618 case SPEED_100:
2619 case SPEED_1000:
2620 return (true);
2621 case SPEED_2500:
2622 return (phy_data->port_mode == XGBE_PORT_MODE_NBASE_T);
2623 case SPEED_10000:
2624 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_T);
2625 default:
2626 return (false);
2627 }
2628 }
2629
2630 static bool
2631 xgbe_phy_valid_speed_sfp_mode(struct xgbe_phy_data *phy_data, int speed)
2632 {
2633
2634 switch (speed) {
2635 case SPEED_100:
2636 return (phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000);
2637 case SPEED_1000:
2638 return ((phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000) ||
2639 (phy_data->sfp_speed == XGBE_SFP_SPEED_1000));
2640 case SPEED_10000:
2641 return (phy_data->sfp_speed == XGBE_SFP_SPEED_10000);
2642 default:
2643 return (false);
2644 }
2645 }
2646
2647 static bool
2648 xgbe_phy_valid_speed_bp_2500_mode(int speed)
2649 {
2650
2651 switch (speed) {
2652 case SPEED_2500:
2653 return (true);
2654 default:
2655 return (false);
2656 }
2657 }
2658
2659 static bool
2660 xgbe_phy_valid_speed_bp_mode(int speed)
2661 {
2662
2663 switch (speed) {
2664 case SPEED_1000:
2665 case SPEED_10000:
2666 return (true);
2667 default:
2668 return (false);
2669 }
2670 }
2671
2672 static bool
2673 xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
2674 {
2675 struct xgbe_phy_data *phy_data = pdata->phy_data;
2676
2677 switch (phy_data->port_mode) {
2678 case XGBE_PORT_MODE_BACKPLANE:
2679 return (xgbe_phy_valid_speed_bp_mode(speed));
2680 case XGBE_PORT_MODE_BACKPLANE_2500:
2681 return (xgbe_phy_valid_speed_bp_2500_mode(speed));
2682 case XGBE_PORT_MODE_1000BASE_T:
2683 case XGBE_PORT_MODE_NBASE_T:
2684 case XGBE_PORT_MODE_10GBASE_T:
2685 return (xgbe_phy_valid_speed_baset_mode(phy_data, speed));
2686 case XGBE_PORT_MODE_1000BASE_X:
2687 case XGBE_PORT_MODE_10GBASE_R:
2688 return (xgbe_phy_valid_speed_basex_mode(phy_data, speed));
2689 case XGBE_PORT_MODE_SFP:
2690 return (xgbe_phy_valid_speed_sfp_mode(phy_data, speed));
2691 default:
2692 return (false);
2693 }
2694 }
2695
2696 static int
2697 xgbe_upd_link(struct xgbe_prv_data *pdata)
2698 {
2699 int reg;
2700
2701 axgbe_printf(2, "%s: Link %d\n", __func__, pdata->phy.link);
2702 reg = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMSR);
2703 if (reg < 0)
2704 return (reg);
2705
2706 if ((reg & BMSR_LINK) == 0)
2707 pdata->phy.link = 0;
2708 else
2709 pdata->phy.link = 1;
2710
2711 axgbe_printf(2, "Link: %d updated reg %#x\n", pdata->phy.link, reg);
2712 return (0);
2713 }
2714
2715 static int
2716 xgbe_phy_read_status(struct xgbe_prv_data *pdata)
2717 {
2718 int common_adv_gb = 0;
2719 int common_adv;
2720 int lpagb = 0;
2721 int adv, lpa;
2722 int ret;
2723
2724 ret = xgbe_upd_link(pdata);
2725 if (ret) {
2726 axgbe_printf(2, "Link Update return %d\n", ret);
2727 return (ret);
2728 }
2729
2730 if (AUTONEG_ENABLE == pdata->phy.autoneg) {
2731 if (pdata->phy.supported == SUPPORTED_1000baseT_Half ||
2732 pdata->phy.supported == SUPPORTED_1000baseT_Full) {
2733 lpagb = xgbe_phy_mii_read(pdata, pdata->mdio_addr,
2734 MII_100T2SR);
2735 if (lpagb < 0)
2736 return (lpagb);
2737
2738 adv = xgbe_phy_mii_read(pdata, pdata->mdio_addr,
2739 MII_100T2CR);
2740 if (adv < 0)
2741 return (adv);
2742
2743 if (lpagb & GTSR_MAN_MS_FLT) {
2744 if (adv & GTCR_MAN_MS)
2745 axgbe_printf(2, "Master/Slave Resolution "
2746 "failed, maybe conflicting manual settings\n");
2747 else
2748 axgbe_printf(2, "Master/Slave Resolution failed\n");
2749 return (-ENOLINK);
2750 }
2751
2752 if (pdata->phy.supported == SUPPORTED_1000baseT_Half)
2753 XGBE_SET_ADV(&pdata->phy, 1000baseT_Half);
2754 else if (pdata->phy.supported == SUPPORTED_1000baseT_Full)
2755 XGBE_SET_ADV(&pdata->phy, 1000baseT_Full);
2756
2757 common_adv_gb = lpagb & adv << 2;
2758 }
2759
2760 lpa = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_ANLPAR);
2761 if (lpa < 0)
2762 return (lpa);
2763
2764 if (pdata->phy.supported == SUPPORTED_Autoneg)
2765 XGBE_SET_ADV(&pdata->phy, Autoneg);
2766
2767 adv = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_ANAR);
2768 if (adv < 0)
2769 return (adv);
2770
2771 common_adv = lpa & adv;
2772
2773 pdata->phy.speed = SPEED_10;
2774 pdata->phy.duplex = DUPLEX_HALF;
2775 pdata->phy.pause = 0;
2776 pdata->phy.asym_pause = 0;
2777
2778 axgbe_printf(2, "%s: lpa %#x adv %#x common_adv_gb %#x "
2779 "common_adv %#x\n", __func__, lpa, adv, common_adv_gb,
2780 common_adv);
2781 if (common_adv_gb & (GTSR_LP_1000TFDX | GTSR_LP_1000THDX)) {
2782 axgbe_printf(2, "%s: SPEED 1000\n", __func__);
2783 pdata->phy.speed = SPEED_1000;
2784
2785 if (common_adv_gb & GTSR_LP_1000TFDX)
2786 pdata->phy.duplex = DUPLEX_FULL;
2787 } else if (common_adv & (ANLPAR_TX_FD | ANLPAR_TX)) {
2788 axgbe_printf(2, "%s: SPEED 100\n", __func__);
2789 pdata->phy.speed = SPEED_100;
2790
2791 if (common_adv & ANLPAR_TX_FD)
2792 pdata->phy.duplex = DUPLEX_FULL;
2793 } else
2794 if (common_adv & ANLPAR_10_FD)
2795 pdata->phy.duplex = DUPLEX_FULL;
2796
2797 if (pdata->phy.duplex == DUPLEX_FULL) {
2798 pdata->phy.pause = lpa & ANLPAR_FC ? 1 : 0;
2799 pdata->phy.asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
2800 }
2801 } else {
2802 int bmcr = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMCR);
2803 if (bmcr < 0)
2804 return (bmcr);
2805
2806 if (bmcr & BMCR_FDX)
2807 pdata->phy.duplex = DUPLEX_FULL;
2808 else
2809 pdata->phy.duplex = DUPLEX_HALF;
2810
2811 if (bmcr & BMCR_SPEED1)
2812 pdata->phy.speed = SPEED_1000;
2813 else if (bmcr & BMCR_SPEED100)
2814 pdata->phy.speed = SPEED_100;
2815 else
2816 pdata->phy.speed = SPEED_10;
2817
2818 pdata->phy.pause = 0;
2819 pdata->phy.asym_pause = 0;
2820 axgbe_printf(2, "%s: link speed %#x duplex %#x media %#x "
2821 "autoneg %#x\n", __func__, pdata->phy.speed,
2822 pdata->phy.duplex, pdata->phy.link, pdata->phy.autoneg);
2823 }
2824
2825 return (0);
2826 }
2827
2828 static int
2829 xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
2830 {
2831 struct xgbe_phy_data *phy_data = pdata->phy_data;
2832 struct mii_data *mii = NULL;
2833 unsigned int reg;
2834 int ret;
2835
2836 *an_restart = 0;
2837
2838 if (phy_data->port_mode == XGBE_PORT_MODE_SFP) {
2839 /* Check SFP signals */
2840 axgbe_printf(3, "%s: calling phy detect\n", __func__);
2841 xgbe_phy_sfp_detect(pdata);
2842
2843 if (phy_data->sfp_changed) {
2844 axgbe_printf(1, "%s: SFP changed observed\n", __func__);
2845 *an_restart = 1;
2846 return (0);
2847 }
2848
2849 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los) {
2850 axgbe_printf(1, "%s: SFP absent 0x%x & sfp_rx_los 0x%x\n",
2851 __func__, phy_data->sfp_mod_absent,
2852 phy_data->sfp_rx_los);
2853 return (0);
2854 }
2855 } else {
2856 mii = device_get_softc(pdata->axgbe_miibus);
2857 mii_tick(mii);
2858
2859 ret = xgbe_phy_read_status(pdata);
2860 if (ret) {
2861 axgbe_printf(2, "Link: Read status returned %d\n", ret);
2862 return (ret);
2863 }
2864
2865 axgbe_printf(2, "%s: link speed %#x duplex %#x media %#x "
2866 "autoneg %#x\n", __func__, pdata->phy.speed,
2867 pdata->phy.duplex, pdata->phy.link, pdata->phy.autoneg);
2868 ret = xgbe_phy_mii_read(pdata, pdata->mdio_addr, MII_BMSR);
2869 ret = (ret < 0) ? ret : (ret & BMSR_ACOMP);
2870 axgbe_printf(2, "Link: BMCR returned %d\n", ret);
2871 if ((pdata->phy.autoneg == AUTONEG_ENABLE) && !ret)
2872 return (0);
2873
2874 return (pdata->phy.link);
2875 }
2876
2877 /* Link status is latched low, so read once to clear
2878 * and then read again to get current state
2879 */
2880 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2881 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2882 axgbe_printf(1, "%s: link_status reg: 0x%x\n", __func__, reg);
2883 if (reg & MDIO_STAT1_LSTATUS)
2884 return (1);
2885
2886 /* No link, attempt a receiver reset cycle */
2887 if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) {
2888 axgbe_printf(1, "ENTERED RRC: rrc_count: %d\n",
2889 phy_data->rrc_count);
2890 phy_data->rrc_count = 0;
2891 if (pdata->link_workaround) {
2892 ret = xgbe_phy_reset(pdata);
2893 if (ret)
2894 axgbe_error("Error resetting phy\n");
2895 } else
2896 xgbe_phy_rrc(pdata);
2897 }
2898
2899 return (0);
2900 }
2901
2902 static void
2903 xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata)
2904 {
2905 struct xgbe_phy_data *phy_data = pdata->phy_data;
2906
2907 phy_data->sfp_gpio_address = XGBE_GPIO_ADDRESS_PCA9555 +
2908 XP_GET_BITS(pdata->pp3, XP_PROP_3, GPIO_ADDR);
2909 phy_data->sfp_gpio_mask = XP_GET_BITS(pdata->pp3, XP_PROP_3,
2910 GPIO_MASK);
2911 phy_data->sfp_gpio_rx_los = XP_GET_BITS(pdata->pp3, XP_PROP_3,
2912 GPIO_RX_LOS);
2913 phy_data->sfp_gpio_tx_fault = XP_GET_BITS(pdata->pp3, XP_PROP_3,
2914 GPIO_TX_FAULT);
2915 phy_data->sfp_gpio_mod_absent = XP_GET_BITS(pdata->pp3, XP_PROP_3,
2916 GPIO_MOD_ABS);
2917 phy_data->sfp_gpio_rate_select = XP_GET_BITS(pdata->pp3, XP_PROP_3,
2918 GPIO_RATE_SELECT);
2919
2920 DBGPR("SFP: gpio_address=%#x\n", phy_data->sfp_gpio_address);
2921 DBGPR("SFP: gpio_mask=%#x\n", phy_data->sfp_gpio_mask);
2922 DBGPR("SFP: gpio_rx_los=%u\n", phy_data->sfp_gpio_rx_los);
2923 DBGPR("SFP: gpio_tx_fault=%u\n", phy_data->sfp_gpio_tx_fault);
2924 DBGPR("SFP: gpio_mod_absent=%u\n",
2925 phy_data->sfp_gpio_mod_absent);
2926 DBGPR("SFP: gpio_rate_select=%u\n",
2927 phy_data->sfp_gpio_rate_select);
2928 }
2929
2930 static void
2931 xgbe_phy_sfp_comm_setup(struct xgbe_prv_data *pdata)
2932 {
2933 struct xgbe_phy_data *phy_data = pdata->phy_data;
2934 unsigned int mux_addr_hi, mux_addr_lo;
2935
2936 mux_addr_hi = XP_GET_BITS(pdata->pp4, XP_PROP_4, MUX_ADDR_HI);
2937 mux_addr_lo = XP_GET_BITS(pdata->pp4, XP_PROP_4, MUX_ADDR_LO);
2938 if (mux_addr_lo == XGBE_SFP_DIRECT)
2939 return;
2940
2941 phy_data->sfp_comm = XGBE_SFP_COMM_PCA9545;
2942 phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
2943 phy_data->sfp_mux_channel = XP_GET_BITS(pdata->pp4, XP_PROP_4,
2944 MUX_CHAN);
2945
2946 DBGPR("SFP: mux_address=%#x\n", phy_data->sfp_mux_address);
2947 DBGPR("SFP: mux_channel=%u\n", phy_data->sfp_mux_channel);
2948 }
2949
2950 static void
2951 xgbe_phy_sfp_setup(struct xgbe_prv_data *pdata)
2952 {
2953 xgbe_phy_sfp_comm_setup(pdata);
2954 xgbe_phy_sfp_gpio_setup(pdata);
2955 }
2956
2957 static int
2958 xgbe_phy_int_mdio_reset(struct xgbe_prv_data *pdata)
2959 {
2960 struct xgbe_phy_data *phy_data = pdata->phy_data;
2961 unsigned int ret;
2962
2963 ret = pdata->hw_if.set_gpio(pdata, phy_data->mdio_reset_gpio);
2964 if (ret)
2965 return (ret);
2966
2967 ret = pdata->hw_if.clr_gpio(pdata, phy_data->mdio_reset_gpio);
2968
2969 return (ret);
2970 }
2971
2972 static int
2973 xgbe_phy_i2c_mdio_reset(struct xgbe_prv_data *pdata)
2974 {
2975 struct xgbe_phy_data *phy_data = pdata->phy_data;
2976 uint8_t gpio_reg, gpio_ports[2], gpio_data[3];
2977 int ret;
2978
2979 /* Read the output port registers */
2980 gpio_reg = 2;
2981 ret = xgbe_phy_i2c_read(pdata, phy_data->mdio_reset_addr,
2982 &gpio_reg, sizeof(gpio_reg),
2983 gpio_ports, sizeof(gpio_ports));
2984 if (ret)
2985 return (ret);
2986
2987 /* Prepare to write the GPIO data */
2988 gpio_data[0] = 2;
2989 gpio_data[1] = gpio_ports[0];
2990 gpio_data[2] = gpio_ports[1];
2991
2992 /* Set the GPIO pin */
2993 if (phy_data->mdio_reset_gpio < 8)
2994 gpio_data[1] |= (1 << (phy_data->mdio_reset_gpio % 8));
2995 else
2996 gpio_data[2] |= (1 << (phy_data->mdio_reset_gpio % 8));
2997
2998 /* Write the output port registers */
2999 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
3000 gpio_data, sizeof(gpio_data));
3001 if (ret)
3002 return (ret);
3003
3004 /* Clear the GPIO pin */
3005 if (phy_data->mdio_reset_gpio < 8)
3006 gpio_data[1] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
3007 else
3008 gpio_data[2] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
3009
3010 /* Write the output port registers */
3011 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
3012 gpio_data, sizeof(gpio_data));
3013
3014 return (ret);
3015 }
3016
3017 static int
3018 xgbe_phy_mdio_reset(struct xgbe_prv_data *pdata)
3019 {
3020 struct xgbe_phy_data *phy_data = pdata->phy_data;
3021 int ret;
3022
3023 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
3024 return (0);
3025
3026 ret = xgbe_phy_get_comm_ownership(pdata);
3027 if (ret)
3028 return (ret);
3029
3030 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO)
3031 ret = xgbe_phy_i2c_mdio_reset(pdata);
3032 else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO)
3033 ret = xgbe_phy_int_mdio_reset(pdata);
3034
3035 xgbe_phy_put_comm_ownership(pdata);
3036
3037 return (ret);
3038 }
3039
3040 static bool
3041 xgbe_phy_redrv_error(struct xgbe_phy_data *phy_data)
3042 {
3043 if (!phy_data->redrv)
3044 return (false);
3045
3046 if (phy_data->redrv_if >= XGBE_PHY_REDRV_IF_MAX)
3047 return (true);
3048
3049 switch (phy_data->redrv_model) {
3050 case XGBE_PHY_REDRV_MODEL_4223:
3051 if (phy_data->redrv_lane > 3)
3052 return (true);
3053 break;
3054 case XGBE_PHY_REDRV_MODEL_4227:
3055 if (phy_data->redrv_lane > 1)
3056 return (true);
3057 break;
3058 default:
3059 return (true);
3060 }
3061
3062 return (false);
3063 }
3064
3065 static int
3066 xgbe_phy_mdio_reset_setup(struct xgbe_prv_data *pdata)
3067 {
3068 struct xgbe_phy_data *phy_data = pdata->phy_data;
3069
3070 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
3071 return (0);
3072
3073 phy_data->mdio_reset = XP_GET_BITS(pdata->pp3, XP_PROP_3, MDIO_RESET);
3074 switch (phy_data->mdio_reset) {
3075 case XGBE_MDIO_RESET_NONE:
3076 case XGBE_MDIO_RESET_I2C_GPIO:
3077 case XGBE_MDIO_RESET_INT_GPIO:
3078 break;
3079 default:
3080 axgbe_error("unsupported MDIO reset (%#x)\n",
3081 phy_data->mdio_reset);
3082 return (-EINVAL);
3083 }
3084
3085 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO) {
3086 phy_data->mdio_reset_addr = XGBE_GPIO_ADDRESS_PCA9555 +
3087 XP_GET_BITS(pdata->pp3, XP_PROP_3, MDIO_RESET_I2C_ADDR);
3088 phy_data->mdio_reset_gpio = XP_GET_BITS(pdata->pp3, XP_PROP_3,
3089 MDIO_RESET_I2C_GPIO);
3090 } else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO)
3091 phy_data->mdio_reset_gpio = XP_GET_BITS(pdata->pp3, XP_PROP_3,
3092 MDIO_RESET_INT_GPIO);
3093
3094 return (0);
3095 }
3096
3097 static bool
3098 xgbe_phy_port_mode_mismatch(struct xgbe_prv_data *pdata)
3099 {
3100 struct xgbe_phy_data *phy_data = pdata->phy_data;
3101
3102 switch (phy_data->port_mode) {
3103 case XGBE_PORT_MODE_BACKPLANE:
3104 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
3105 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
3106 return (false);
3107 break;
3108 case XGBE_PORT_MODE_BACKPLANE_2500:
3109 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500)
3110 return (false);
3111 break;
3112 case XGBE_PORT_MODE_1000BASE_T:
3113 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
3114 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000))
3115 return (false);
3116 break;
3117 case XGBE_PORT_MODE_1000BASE_X:
3118 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
3119 return (false);
3120 break;
3121 case XGBE_PORT_MODE_NBASE_T:
3122 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
3123 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
3124 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500))
3125 return (false);
3126 break;
3127 case XGBE_PORT_MODE_10GBASE_T:
3128 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
3129 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
3130 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
3131 return (false);
3132 break;
3133 case XGBE_PORT_MODE_10GBASE_R:
3134 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
3135 return (false);
3136 break;
3137 case XGBE_PORT_MODE_SFP:
3138 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
3139 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
3140 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
3141 return (false);
3142 break;
3143 default:
3144 break;
3145 }
3146
3147 return (true);
3148 }
3149
3150 static bool
3151 xgbe_phy_conn_type_mismatch(struct xgbe_prv_data *pdata)
3152 {
3153 struct xgbe_phy_data *phy_data = pdata->phy_data;
3154
3155 switch (phy_data->port_mode) {
3156 case XGBE_PORT_MODE_BACKPLANE:
3157 case XGBE_PORT_MODE_BACKPLANE_2500:
3158 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
3159 return (false);
3160 break;
3161 case XGBE_PORT_MODE_1000BASE_T:
3162 case XGBE_PORT_MODE_1000BASE_X:
3163 case XGBE_PORT_MODE_NBASE_T:
3164 case XGBE_PORT_MODE_10GBASE_T:
3165 case XGBE_PORT_MODE_10GBASE_R:
3166 if (phy_data->conn_type == XGBE_CONN_TYPE_MDIO)
3167 return (false);
3168 break;
3169 case XGBE_PORT_MODE_SFP:
3170 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
3171 return (false);
3172 break;
3173 default:
3174 break;
3175 }
3176
3177 return (true);
3178 }
3179
3180 static bool
3181 xgbe_phy_port_enabled(struct xgbe_prv_data *pdata)
3182 {
3183
3184 if (!XP_GET_BITS(pdata->pp0, XP_PROP_0, PORT_SPEEDS))
3185 return (false);
3186 if (!XP_GET_BITS(pdata->pp0, XP_PROP_0, CONN_TYPE))
3187 return (false);
3188
3189 return (true);
3190 }
3191
3192 static void
3193 xgbe_phy_cdr_track(struct xgbe_prv_data *pdata)
3194 {
3195 struct xgbe_phy_data *phy_data = pdata->phy_data;
3196
3197 axgbe_printf(2, "%s: an_cdr_workaround %d phy_cdr_notrack %d\n",
3198 __func__, pdata->sysctl_an_cdr_workaround, phy_data->phy_cdr_notrack);
3199
3200 if (!pdata->sysctl_an_cdr_workaround)
3201 return;
3202
3203 if (!phy_data->phy_cdr_notrack)
3204 return;
3205
3206 DELAY(phy_data->phy_cdr_delay + 500);
3207
3208 XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
3209 XGBE_PMA_CDR_TRACK_EN_MASK, XGBE_PMA_CDR_TRACK_EN_ON);
3210
3211 phy_data->phy_cdr_notrack = 0;
3212
3213 axgbe_printf(2, "CDR TRACK DONE\n");
3214 }
3215
3216 static void
3217 xgbe_phy_cdr_notrack(struct xgbe_prv_data *pdata)
3218 {
3219 struct xgbe_phy_data *phy_data = pdata->phy_data;
3220
3221 axgbe_printf(2, "%s: an_cdr_workaround %d phy_cdr_notrack %d\n",
3222 __func__, pdata->sysctl_an_cdr_workaround, phy_data->phy_cdr_notrack);
3223
3224 if (!pdata->sysctl_an_cdr_workaround)
3225 return;
3226
3227 if (phy_data->phy_cdr_notrack)
3228 return;
3229
3230 XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
3231 XGBE_PMA_CDR_TRACK_EN_MASK, XGBE_PMA_CDR_TRACK_EN_OFF);
3232
3233 xgbe_phy_rrc(pdata);
3234
3235 phy_data->phy_cdr_notrack = 1;
3236 }
3237
3238 static void
3239 xgbe_phy_kr_training_post(struct xgbe_prv_data *pdata)
3240 {
3241 if (!pdata->sysctl_an_cdr_track_early)
3242 xgbe_phy_cdr_track(pdata);
3243 }
3244
3245 static void
3246 xgbe_phy_kr_training_pre(struct xgbe_prv_data *pdata)
3247 {
3248 if (pdata->sysctl_an_cdr_track_early)
3249 xgbe_phy_cdr_track(pdata);
3250 }
3251
3252 static void
3253 xgbe_phy_an_post(struct xgbe_prv_data *pdata)
3254 {
3255 struct xgbe_phy_data *phy_data = pdata->phy_data;
3256
3257 switch (pdata->an_mode) {
3258 case XGBE_AN_MODE_CL73:
3259 case XGBE_AN_MODE_CL73_REDRV:
3260 if (phy_data->cur_mode != XGBE_MODE_KR)
3261 break;
3262
3263 xgbe_phy_cdr_track(pdata);
3264
3265 switch (pdata->an_result) {
3266 case XGBE_AN_READY:
3267 case XGBE_AN_COMPLETE:
3268 break;
3269 default:
3270 if (phy_data->phy_cdr_delay < XGBE_CDR_DELAY_MAX)
3271 phy_data->phy_cdr_delay += XGBE_CDR_DELAY_INC;
3272 else
3273 phy_data->phy_cdr_delay = XGBE_CDR_DELAY_INIT;
3274 break;
3275 }
3276 break;
3277 default:
3278 break;
3279 }
3280 }
3281
3282 static void
3283 xgbe_phy_an_pre(struct xgbe_prv_data *pdata)
3284 {
3285 struct xgbe_phy_data *phy_data = pdata->phy_data;
3286
3287 switch (pdata->an_mode) {
3288 case XGBE_AN_MODE_CL73:
3289 case XGBE_AN_MODE_CL73_REDRV:
3290 if (phy_data->cur_mode != XGBE_MODE_KR)
3291 break;
3292
3293 xgbe_phy_cdr_notrack(pdata);
3294 break;
3295 default:
3296 break;
3297 }
3298 }
3299
3300 static void
3301 xgbe_phy_stop(struct xgbe_prv_data *pdata)
3302 {
3303 struct xgbe_phy_data *phy_data = pdata->phy_data;
3304
3305 /* If we have an external PHY, free it */
3306 xgbe_phy_free_phy_device(pdata);
3307
3308 /* Reset SFP data */
3309 xgbe_phy_sfp_reset(phy_data);
3310 xgbe_phy_sfp_mod_absent(pdata);
3311
3312 /* Reset CDR support */
3313 xgbe_phy_cdr_track(pdata);
3314
3315 /* Power off the PHY */
3316 xgbe_phy_power_off(pdata);
3317
3318 /* Stop the I2C controller */
3319 pdata->i2c_if.i2c_stop(pdata);
3320 }
3321
3322 static int
3323 xgbe_phy_start(struct xgbe_prv_data *pdata)
3324 {
3325 struct xgbe_phy_data *phy_data = pdata->phy_data;
3326 int ret;
3327
3328 axgbe_printf(2, "%s: redrv %d redrv_if %d start_mode %d\n", __func__,
3329 phy_data->redrv, phy_data->redrv_if, phy_data->start_mode);
3330
3331 /* Start the I2C controller */
3332 ret = pdata->i2c_if.i2c_start(pdata);
3333 if (ret) {
3334 axgbe_error("%s: impl i2c start ret %d\n", __func__, ret);
3335 return (ret);
3336 }
3337
3338 /* Set the proper MDIO mode for the re-driver */
3339 if (phy_data->redrv && !phy_data->redrv_if) {
3340 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
3341 XGBE_MDIO_MODE_CL22);
3342 if (ret) {
3343 axgbe_error("redriver mdio port not compatible (%u)\n",
3344 phy_data->redrv_addr);
3345 return (ret);
3346 }
3347 }
3348
3349 /* Start in highest supported mode */
3350 xgbe_phy_set_mode(pdata, phy_data->start_mode);
3351
3352 /* Reset CDR support */
3353 xgbe_phy_cdr_track(pdata);
3354
3355 /* After starting the I2C controller, we can check for an SFP */
3356 switch (phy_data->port_mode) {
3357 case XGBE_PORT_MODE_SFP:
3358 axgbe_printf(3, "%s: calling phy detect\n", __func__);
3359 xgbe_phy_sfp_detect(pdata);
3360 break;
3361 default:
3362 break;
3363 }
3364
3365 /* If we have an external PHY, start it */
3366 ret = xgbe_phy_find_phy_device(pdata);
3367 if (ret) {
3368 axgbe_error("%s: impl find phy dev ret %d\n", __func__, ret);
3369 goto err_i2c;
3370 }
3371
3372 axgbe_printf(3, "%s: impl return success\n", __func__);
3373 return (0);
3374
3375 err_i2c:
3376 pdata->i2c_if.i2c_stop(pdata);
3377
3378 return (ret);
3379 }
3380
3381 static int
3382 xgbe_phy_reset(struct xgbe_prv_data *pdata)
3383 {
3384 struct xgbe_phy_data *phy_data = pdata->phy_data;
3385 enum xgbe_mode cur_mode;
3386 int ret;
3387
3388 /* Reset by power cycling the PHY */
3389 cur_mode = phy_data->cur_mode;
3390 xgbe_phy_power_off(pdata);
3391 xgbe_phy_set_mode(pdata, cur_mode);
3392
3393 axgbe_printf(3, "%s: mode %d\n", __func__, cur_mode);
3394 if (!phy_data->phydev) {
3395 axgbe_printf(1, "%s: no phydev\n", __func__);
3396 return (0);
3397 }
3398
3399 /* Reset the external PHY */
3400 ret = xgbe_phy_mdio_reset(pdata);
3401 if (ret) {
3402 axgbe_error("%s: mdio reset %d\n", __func__, ret);
3403 return (ret);
3404 }
3405
3406 axgbe_printf(3, "%s: return success\n", __func__);
3407
3408 return (0);
3409 }
3410
3411 static void
3412 axgbe_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr)
3413 {
3414 struct axgbe_if_softc *sc;
3415 struct xgbe_prv_data *pdata;
3416 struct mii_data *mii;
3417
3418 sc = if_getsoftc(ifp);
3419 pdata = &sc->pdata;
3420
3421 axgbe_printf(2, "%s: Invoked\n", __func__);
3422 mtx_lock_spin(&pdata->mdio_mutex);
3423 mii = device_get_softc(pdata->axgbe_miibus);
3424 axgbe_printf(2, "%s: media_active %#x media_status %#x\n", __func__,
3425 mii->mii_media_active, mii->mii_media_status);
3426 mii_pollstat(mii);
3427 ifmr->ifm_active = mii->mii_media_active;
3428 ifmr->ifm_status = mii->mii_media_status;
3429 mtx_unlock_spin(&pdata->mdio_mutex);
3430 }
3431
3432 static int
3433 axgbe_ifmedia_upd(if_t ifp)
3434 {
3435 struct xgbe_prv_data *pdata;
3436 struct axgbe_if_softc *sc;
3437 struct mii_data *mii;
3438 struct mii_softc *miisc;
3439 int ret;
3440
3441 sc = if_getsoftc(ifp);
3442 pdata = &sc->pdata;
3443
3444 axgbe_printf(2, "%s: Invoked\n", __func__);
3445 mtx_lock_spin(&pdata->mdio_mutex);
3446 mii = device_get_softc(pdata->axgbe_miibus);
3447 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
3448 PHY_RESET(miisc);
3449 ret = mii_mediachg(mii);
3450 mtx_unlock_spin(&pdata->mdio_mutex);
3451
3452 return (ret);
3453 }
3454
3455 static void
3456 xgbe_phy_exit(struct xgbe_prv_data *pdata)
3457 {
3458 if (pdata->axgbe_miibus != NULL)
3459 device_delete_child(pdata->dev, pdata->axgbe_miibus);
3460
3461 /* free phy_data structure */
3462 free(pdata->phy_data, M_AXGBE);
3463 }
3464
3465 static int
3466 xgbe_phy_init(struct xgbe_prv_data *pdata)
3467 {
3468 struct xgbe_phy_data *phy_data;
3469 int ret;
3470
3471 /* Initialize the global lock */
3472 if (!mtx_initialized(&xgbe_phy_comm_lock))
3473 mtx_init(&xgbe_phy_comm_lock, "xgbe phy common lock", NULL, MTX_DEF);
3474
3475 /* Check if enabled */
3476 if (!xgbe_phy_port_enabled(pdata)) {
3477 axgbe_error("device is not enabled\n");
3478 return (-ENODEV);
3479 }
3480
3481 /* Initialize the I2C controller */
3482 ret = pdata->i2c_if.i2c_init(pdata);
3483 if (ret)
3484 return (ret);
3485
3486 phy_data = malloc(sizeof(*phy_data), M_AXGBE, M_WAITOK | M_ZERO);
3487 if (!phy_data)
3488 return (-ENOMEM);
3489 pdata->phy_data = phy_data;
3490
3491 phy_data->port_mode = XP_GET_BITS(pdata->pp0, XP_PROP_0, PORT_MODE);
3492 phy_data->port_id = XP_GET_BITS(pdata->pp0, XP_PROP_0, PORT_ID);
3493 phy_data->port_speeds = XP_GET_BITS(pdata->pp0, XP_PROP_0, PORT_SPEEDS);
3494 phy_data->conn_type = XP_GET_BITS(pdata->pp0, XP_PROP_0, CONN_TYPE);
3495 phy_data->mdio_addr = XP_GET_BITS(pdata->pp0, XP_PROP_0, MDIO_ADDR);
3496
3497 pdata->mdio_addr = phy_data->mdio_addr;
3498 DBGPR("port mode=%u\n", phy_data->port_mode);
3499 DBGPR("port id=%u\n", phy_data->port_id);
3500 DBGPR("port speeds=%#x\n", phy_data->port_speeds);
3501 DBGPR("conn type=%u\n", phy_data->conn_type);
3502 DBGPR("mdio addr=%u\n", phy_data->mdio_addr);
3503
3504 phy_data->redrv = XP_GET_BITS(pdata->pp4, XP_PROP_4, REDRV_PRESENT);
3505 phy_data->redrv_if = XP_GET_BITS(pdata->pp4, XP_PROP_4, REDRV_IF);
3506 phy_data->redrv_addr = XP_GET_BITS(pdata->pp4, XP_PROP_4, REDRV_ADDR);
3507 phy_data->redrv_lane = XP_GET_BITS(pdata->pp4, XP_PROP_4, REDRV_LANE);
3508 phy_data->redrv_model = XP_GET_BITS(pdata->pp4, XP_PROP_4, REDRV_MODEL);
3509
3510 if (phy_data->redrv) {
3511 DBGPR("redrv present\n");
3512 DBGPR("redrv i/f=%u\n", phy_data->redrv_if);
3513 DBGPR("redrv addr=%#x\n", phy_data->redrv_addr);
3514 DBGPR("redrv lane=%u\n", phy_data->redrv_lane);
3515 DBGPR("redrv model=%u\n", phy_data->redrv_model);
3516 }
3517
3518 DBGPR("%s: redrv addr=%#x redrv i/f=%u\n", __func__,
3519 phy_data->redrv_addr, phy_data->redrv_if);
3520 /* Validate the connection requested */
3521 if (xgbe_phy_conn_type_mismatch(pdata)) {
3522 axgbe_error("phy mode/connection mismatch "
3523 "(%#x/%#x)\n", phy_data->port_mode, phy_data->conn_type);
3524 return (-EINVAL);
3525 }
3526
3527 /* Validate the mode requested */
3528 if (xgbe_phy_port_mode_mismatch(pdata)) {
3529 axgbe_error("phy mode/speed mismatch "
3530 "(%#x/%#x)\n", phy_data->port_mode, phy_data->port_speeds);
3531 return (-EINVAL);
3532 }
3533
3534 /* Check for and validate MDIO reset support */
3535 ret = xgbe_phy_mdio_reset_setup(pdata);
3536 if (ret) {
3537 axgbe_error("%s, mdio_reset_setup ret %d\n", __func__, ret);
3538 return (ret);
3539 }
3540
3541 /* Validate the re-driver information */
3542 if (xgbe_phy_redrv_error(phy_data)) {
3543 axgbe_error("phy re-driver settings error\n");
3544 return (-EINVAL);
3545 }
3546 pdata->kr_redrv = phy_data->redrv;
3547
3548 /* Indicate current mode is unknown */
3549 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
3550
3551 /* Initialize supported features. Current code does not support ethtool */
3552 XGBE_ZERO_SUP(&pdata->phy);
3553
3554 DBGPR("%s: port mode %d\n", __func__, phy_data->port_mode);
3555 switch (phy_data->port_mode) {
3556 /* Backplane support */
3557 case XGBE_PORT_MODE_BACKPLANE:
3558 XGBE_SET_SUP(&pdata->phy, Autoneg);
3559 XGBE_SET_SUP(&pdata->phy, Pause);
3560 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3561 XGBE_SET_SUP(&pdata->phy, Backplane);
3562 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3563 XGBE_SET_SUP(&pdata->phy, 1000baseKX_Full);
3564 phy_data->start_mode = XGBE_MODE_KX_1000;
3565 }
3566 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
3567 XGBE_SET_SUP(&pdata->phy, 10000baseKR_Full);
3568 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
3569 XGBE_SET_SUP(&pdata->phy, 10000baseR_FEC);
3570 phy_data->start_mode = XGBE_MODE_KR;
3571 }
3572
3573 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
3574 break;
3575 case XGBE_PORT_MODE_BACKPLANE_2500:
3576 XGBE_SET_SUP(&pdata->phy, Pause);
3577 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3578 XGBE_SET_SUP(&pdata->phy, Backplane);
3579 XGBE_SET_SUP(&pdata->phy, 2500baseX_Full);
3580 phy_data->start_mode = XGBE_MODE_KX_2500;
3581
3582 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
3583 break;
3584
3585 /* MDIO 1GBase-T support */
3586 case XGBE_PORT_MODE_1000BASE_T:
3587 XGBE_SET_SUP(&pdata->phy, Autoneg);
3588 XGBE_SET_SUP(&pdata->phy, Pause);
3589 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3590 XGBE_SET_SUP(&pdata->phy, TP);
3591 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
3592 XGBE_SET_SUP(&pdata->phy, 100baseT_Full);
3593 phy_data->start_mode = XGBE_MODE_SGMII_100;
3594 }
3595 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3596 XGBE_SET_SUP(&pdata->phy, 1000baseT_Full);
3597 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3598 }
3599
3600 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
3601 break;
3602
3603 /* MDIO Base-X support */
3604 case XGBE_PORT_MODE_1000BASE_X:
3605 XGBE_SET_SUP(&pdata->phy, Autoneg);
3606 XGBE_SET_SUP(&pdata->phy, Pause);
3607 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3608 XGBE_SET_SUP(&pdata->phy, FIBRE);
3609 XGBE_SET_SUP(&pdata->phy, 1000baseX_Full);
3610 phy_data->start_mode = XGBE_MODE_X;
3611
3612 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
3613 break;
3614
3615 /* MDIO NBase-T support */
3616 case XGBE_PORT_MODE_NBASE_T:
3617 XGBE_SET_SUP(&pdata->phy, Autoneg);
3618 XGBE_SET_SUP(&pdata->phy, Pause);
3619 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3620 XGBE_SET_SUP(&pdata->phy, TP);
3621 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
3622 XGBE_SET_SUP(&pdata->phy, 100baseT_Full);
3623 phy_data->start_mode = XGBE_MODE_SGMII_100;
3624 }
3625 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3626 XGBE_SET_SUP(&pdata->phy, 1000baseT_Full);
3627 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3628 }
3629 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500) {
3630 XGBE_SET_SUP(&pdata->phy, 2500baseT_Full);
3631 phy_data->start_mode = XGBE_MODE_KX_2500;
3632 }
3633
3634 phy_data->phydev_mode = XGBE_MDIO_MODE_CL45;
3635 break;
3636
3637 /* 10GBase-T support */
3638 case XGBE_PORT_MODE_10GBASE_T:
3639 XGBE_SET_SUP(&pdata->phy, Autoneg);
3640 XGBE_SET_SUP(&pdata->phy, Pause);
3641 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3642 XGBE_SET_SUP(&pdata->phy, TP);
3643 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
3644 XGBE_SET_SUP(&pdata->phy, 100baseT_Full);
3645 phy_data->start_mode = XGBE_MODE_SGMII_100;
3646 }
3647 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3648 XGBE_SET_SUP(&pdata->phy, 1000baseT_Full);
3649 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3650 }
3651 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
3652 XGBE_SET_SUP(&pdata->phy, 10000baseT_Full);
3653 phy_data->start_mode = XGBE_MODE_KR;
3654 }
3655
3656 phy_data->phydev_mode = XGBE_MDIO_MODE_CL45;
3657 break;
3658
3659 /* 10GBase-R support */
3660 case XGBE_PORT_MODE_10GBASE_R:
3661 XGBE_SET_SUP(&pdata->phy, Autoneg);
3662 XGBE_SET_SUP(&pdata->phy, Pause);
3663 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3664 XGBE_SET_SUP(&pdata->phy, FIBRE);
3665 XGBE_SET_SUP(&pdata->phy, 10000baseSR_Full);
3666 XGBE_SET_SUP(&pdata->phy, 10000baseLR_Full);
3667 XGBE_SET_SUP(&pdata->phy, 10000baseLRM_Full);
3668 XGBE_SET_SUP(&pdata->phy, 10000baseER_Full);
3669 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
3670 XGBE_SET_SUP(&pdata->phy, 10000baseR_FEC);
3671 phy_data->start_mode = XGBE_MODE_SFI;
3672
3673 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
3674 break;
3675
3676 /* SFP support */
3677 case XGBE_PORT_MODE_SFP:
3678 XGBE_SET_SUP(&pdata->phy, Autoneg);
3679 XGBE_SET_SUP(&pdata->phy, Pause);
3680 XGBE_SET_SUP(&pdata->phy, Asym_Pause);
3681 XGBE_SET_SUP(&pdata->phy, TP);
3682 XGBE_SET_SUP(&pdata->phy, FIBRE);
3683 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
3684 phy_data->start_mode = XGBE_MODE_SGMII_100;
3685 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
3686 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3687 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
3688 phy_data->start_mode = XGBE_MODE_SFI;
3689
3690 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
3691
3692 xgbe_phy_sfp_setup(pdata);
3693 DBGPR("%s: start %d mode %d adv 0x%x\n", __func__,
3694 phy_data->start_mode, phy_data->phydev_mode,
3695 pdata->phy.advertising);
3696 break;
3697 default:
3698 return (-EINVAL);
3699 }
3700
3701 axgbe_printf(2, "%s: start %d mode %d adv 0x%x\n", __func__,
3702 phy_data->start_mode, phy_data->phydev_mode, pdata->phy.advertising);
3703
3704 DBGPR("%s: conn type %d mode %d\n", __func__,
3705 phy_data->conn_type, phy_data->phydev_mode);
3706 if ((phy_data->conn_type & XGBE_CONN_TYPE_MDIO) &&
3707 (phy_data->phydev_mode != XGBE_MDIO_MODE_NONE)) {
3708 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
3709 phy_data->phydev_mode);
3710 if (ret) {
3711 axgbe_error("mdio port/clause not compatible (%d/%u)\n",
3712 phy_data->mdio_addr, phy_data->phydev_mode);
3713 return (-EINVAL);
3714 }
3715 }
3716
3717 if (phy_data->redrv && !phy_data->redrv_if) {
3718 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
3719 XGBE_MDIO_MODE_CL22);
3720 if (ret) {
3721 axgbe_error("redriver mdio port not compatible (%u)\n",
3722 phy_data->redrv_addr);
3723 return (-EINVAL);
3724 }
3725 }
3726
3727 phy_data->phy_cdr_delay = XGBE_CDR_DELAY_INIT;
3728
3729 if (phy_data->port_mode != XGBE_PORT_MODE_SFP) {
3730 ret = mii_attach(pdata->dev, &pdata->axgbe_miibus, pdata->netdev,
3731 (ifm_change_cb_t)axgbe_ifmedia_upd,
3732 (ifm_stat_cb_t)axgbe_ifmedia_sts, BMSR_DEFCAPMASK,
3733 pdata->mdio_addr, MII_OFFSET_ANY, MIIF_FORCEANEG);
3734
3735 if (ret){
3736 axgbe_printf(2, "mii attach failed with err=(%d)\n", ret);
3737 return (-EINVAL);
3738 }
3739 }
3740
3741 DBGPR("%s: return success\n", __func__);
3742
3743 return (0);
3744 }
3745
3746 void
3747 xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
3748 {
3749 struct xgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
3750
3751 phy_impl->init = xgbe_phy_init;
3752 phy_impl->exit = xgbe_phy_exit;
3753
3754 phy_impl->reset = xgbe_phy_reset;
3755 phy_impl->start = xgbe_phy_start;
3756 phy_impl->stop = xgbe_phy_stop;
3757
3758 phy_impl->link_status = xgbe_phy_link_status;
3759
3760 phy_impl->valid_speed = xgbe_phy_valid_speed;
3761
3762 phy_impl->use_mode = xgbe_phy_use_mode;
3763 phy_impl->set_mode = xgbe_phy_set_mode;
3764 phy_impl->get_mode = xgbe_phy_get_mode;
3765 phy_impl->switch_mode = xgbe_phy_switch_mode;
3766 phy_impl->cur_mode = xgbe_phy_cur_mode;
3767 phy_impl->get_type = xgbe_phy_get_type;
3768
3769 phy_impl->an_mode = xgbe_phy_an_mode;
3770
3771 phy_impl->an_config = xgbe_phy_an_config;
3772
3773 phy_impl->an_advertising = xgbe_phy_an_advertising;
3774
3775 phy_impl->an_outcome = xgbe_phy_an_outcome;
3776
3777 phy_impl->an_pre = xgbe_phy_an_pre;
3778 phy_impl->an_post = xgbe_phy_an_post;
3779
3780 phy_impl->kr_training_pre = xgbe_phy_kr_training_pre;
3781 phy_impl->kr_training_post = xgbe_phy_kr_training_post;
3782
3783 phy_impl->module_info = xgbe_phy_module_info;
3784 phy_impl->module_eeprom = xgbe_phy_module_eeprom;
3785 }
Cache object: 78121ea33b738b8187fe005df0332a48
|