blob: e707c49cc55a785f9950685f73c03932a1117541 [file] [log] [blame]
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001/*
2 * AMD 10Gb Ethernet driver
3 *
4 * This file is available to you under your choice of the following two
5 * licenses:
6 *
7 * License 1: GPLv2
8 *
9 * Copyright (c) 2016 Advanced Micro Devices, Inc.
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 * Copyright (c) 2016 Advanced Micro Devices, Inc.
60 * All rights reserved.
61 *
62 * Redistribution and use in source and binary forms, with or without
63 * modification, are permitted provided that the following conditions are met:
64 * * Redistributions of source code must retain the above copyright
65 * notice, this list of conditions and the following disclaimer.
66 * * Redistributions in binary form must reproduce the above copyright
67 * notice, this list of conditions and the following disclaimer in the
68 * documentation and/or other materials provided with the distribution.
69 * * Neither the name of Advanced Micro Devices, Inc. nor the
70 * names of its contributors may be used to endorse or promote products
71 * derived from this software without specific prior written permission.
72 *
73 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
74 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
76 * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
77 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
78 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
79 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
80 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
81 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
82 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
83 *
84 * This file incorporates work covered by the following copyright and
85 * permission notice:
86 * The Synopsys DWC ETHER XGMAC Software Driver and documentation
87 * (hereinafter "Software") is an unsupported proprietary work of Synopsys,
88 * Inc. unless otherwise expressly agreed to in writing between Synopsys
89 * and you.
90 *
91 * The Software IS NOT an item of Licensed Software or Licensed Product
92 * under any End User Software License Agreement or Agreement for Licensed
93 * Product with Synopsys or any supplement thereto. Permission is hereby
94 * granted, free of charge, to any person obtaining a copy of this software
95 * annotated with this license and the Software, to deal in the Software
96 * without restriction, including without limitation the rights to use,
97 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies
98 * of the Software, and to permit persons to whom the Software is furnished
99 * to do so, subject to the following conditions:
100 *
101 * The above copyright notice and this permission notice shall be included
102 * in all copies or substantial portions of the Software.
103 *
104 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS"
105 * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
106 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
107 * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS
108 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
109 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
110 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
111 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
112 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
113 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
114 * THE POSSIBILITY OF SUCH DAMAGE.
115 */
116
117#include <linux/module.h>
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600118#include <linux/device.h>
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600119#include <linux/kmod.h>
120#include <linux/mdio.h>
121#include <linux/phy.h>
122
123#include "xgbe.h"
124#include "xgbe-common.h"
125
126#define XGBE_PHY_PORT_SPEED_100 BIT(0)
127#define XGBE_PHY_PORT_SPEED_1000 BIT(1)
128#define XGBE_PHY_PORT_SPEED_2500 BIT(2)
129#define XGBE_PHY_PORT_SPEED_10000 BIT(3)
130
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600131#define XGBE_MUTEX_RELEASE 0x80000000
132
133#define XGBE_SFP_DIRECT 7
134
135/* I2C target addresses */
136#define XGBE_SFP_SERIAL_ID_ADDRESS 0x50
137#define XGBE_SFP_DIAG_INFO_ADDRESS 0x51
138#define XGBE_SFP_PHY_ADDRESS 0x56
139#define XGBE_GPIO_ADDRESS_PCA9555 0x20
140
141/* SFP sideband signal indicators */
142#define XGBE_GPIO_NO_TX_FAULT BIT(0)
143#define XGBE_GPIO_NO_RATE_SELECT BIT(1)
144#define XGBE_GPIO_NO_MOD_ABSENT BIT(2)
145#define XGBE_GPIO_NO_RX_LOS BIT(3)
146
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600147/* Rate-change complete wait/retry count */
148#define XGBE_RATECHANGE_COUNT 500
149
150enum xgbe_port_mode {
151 XGBE_PORT_MODE_RSVD = 0,
152 XGBE_PORT_MODE_BACKPLANE,
153 XGBE_PORT_MODE_BACKPLANE_2500,
154 XGBE_PORT_MODE_1000BASE_T,
155 XGBE_PORT_MODE_1000BASE_X,
156 XGBE_PORT_MODE_NBASE_T,
157 XGBE_PORT_MODE_10GBASE_T,
158 XGBE_PORT_MODE_10GBASE_R,
159 XGBE_PORT_MODE_SFP,
160 XGBE_PORT_MODE_MAX,
161};
162
163enum xgbe_conn_type {
164 XGBE_CONN_TYPE_NONE = 0,
165 XGBE_CONN_TYPE_SFP,
166 XGBE_CONN_TYPE_MDIO,
Lendacky, Thomas5a4e4c82016-11-17 08:43:37 -0600167 XGBE_CONN_TYPE_RSVD1,
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600168 XGBE_CONN_TYPE_BACKPLANE,
169 XGBE_CONN_TYPE_MAX,
170};
171
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600172/* SFP/SFP+ related definitions */
173enum xgbe_sfp_comm {
174 XGBE_SFP_COMM_DIRECT = 0,
175 XGBE_SFP_COMM_PCA9545,
176};
177
178enum xgbe_sfp_cable {
179 XGBE_SFP_CABLE_UNKNOWN = 0,
180 XGBE_SFP_CABLE_ACTIVE,
181 XGBE_SFP_CABLE_PASSIVE,
182};
183
184enum xgbe_sfp_base {
185 XGBE_SFP_BASE_UNKNOWN = 0,
186 XGBE_SFP_BASE_1000_T,
187 XGBE_SFP_BASE_1000_SX,
188 XGBE_SFP_BASE_1000_LX,
189 XGBE_SFP_BASE_1000_CX,
190 XGBE_SFP_BASE_10000_SR,
191 XGBE_SFP_BASE_10000_LR,
192 XGBE_SFP_BASE_10000_LRM,
193 XGBE_SFP_BASE_10000_ER,
194 XGBE_SFP_BASE_10000_CR,
195};
196
197enum xgbe_sfp_speed {
198 XGBE_SFP_SPEED_UNKNOWN = 0,
199 XGBE_SFP_SPEED_100_1000,
200 XGBE_SFP_SPEED_1000,
201 XGBE_SFP_SPEED_10000,
202};
203
204/* SFP Serial ID Base ID values relative to an offset of 0 */
205#define XGBE_SFP_BASE_ID 0
206#define XGBE_SFP_ID_SFP 0x03
207
208#define XGBE_SFP_BASE_EXT_ID 1
209#define XGBE_SFP_EXT_ID_SFP 0x04
210
211#define XGBE_SFP_BASE_10GBE_CC 3
212#define XGBE_SFP_BASE_10GBE_CC_SR BIT(4)
213#define XGBE_SFP_BASE_10GBE_CC_LR BIT(5)
214#define XGBE_SFP_BASE_10GBE_CC_LRM BIT(6)
215#define XGBE_SFP_BASE_10GBE_CC_ER BIT(7)
216
217#define XGBE_SFP_BASE_1GBE_CC 6
218#define XGBE_SFP_BASE_1GBE_CC_SX BIT(0)
219#define XGBE_SFP_BASE_1GBE_CC_LX BIT(1)
220#define XGBE_SFP_BASE_1GBE_CC_CX BIT(2)
221#define XGBE_SFP_BASE_1GBE_CC_T BIT(3)
222
223#define XGBE_SFP_BASE_CABLE 8
224#define XGBE_SFP_BASE_CABLE_PASSIVE BIT(2)
225#define XGBE_SFP_BASE_CABLE_ACTIVE BIT(3)
226
227#define XGBE_SFP_BASE_BR 12
228#define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
229#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
230#define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
231#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
232
233#define XGBE_SFP_BASE_CU_CABLE_LEN 18
234
235#define XGBE_SFP_BASE_VENDOR_NAME 20
236#define XGBE_SFP_BASE_VENDOR_NAME_LEN 16
237#define XGBE_SFP_BASE_VENDOR_PN 40
238#define XGBE_SFP_BASE_VENDOR_PN_LEN 16
239#define XGBE_SFP_BASE_VENDOR_REV 56
240#define XGBE_SFP_BASE_VENDOR_REV_LEN 4
241
242#define XGBE_SFP_BASE_CC 63
243
244/* SFP Serial ID Extended ID values relative to an offset of 64 */
245#define XGBE_SFP_BASE_VENDOR_SN 4
246#define XGBE_SFP_BASE_VENDOR_SN_LEN 16
247
248#define XGBE_SFP_EXTD_DIAG 28
249#define XGBE_SFP_EXTD_DIAG_ADDR_CHANGE BIT(2)
250
251#define XGBE_SFP_EXTD_SFF_8472 30
252
253#define XGBE_SFP_EXTD_CC 31
254
255struct xgbe_sfp_eeprom {
256 u8 base[64];
257 u8 extd[32];
258 u8 vendor[32];
259};
260
261#define XGBE_BEL_FUSE_VENDOR "BEL-FUSE "
262#define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 "
263
264struct xgbe_sfp_ascii {
265 union {
266 char vendor[XGBE_SFP_BASE_VENDOR_NAME_LEN + 1];
267 char partno[XGBE_SFP_BASE_VENDOR_PN_LEN + 1];
268 char rev[XGBE_SFP_BASE_VENDOR_REV_LEN + 1];
269 char serno[XGBE_SFP_BASE_VENDOR_SN_LEN + 1];
270 } u;
271};
272
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600273/* MDIO PHY reset types */
274enum xgbe_mdio_reset {
275 XGBE_MDIO_RESET_NONE = 0,
276 XGBE_MDIO_RESET_I2C_GPIO,
277 XGBE_MDIO_RESET_INT_GPIO,
278 XGBE_MDIO_RESET_MAX,
279};
280
Lendacky, Thomasd7445d12016-11-10 17:11:41 -0600281/* Re-driver related definitions */
282enum xgbe_phy_redrv_if {
283 XGBE_PHY_REDRV_IF_MDIO = 0,
284 XGBE_PHY_REDRV_IF_I2C,
285 XGBE_PHY_REDRV_IF_MAX,
286};
287
288enum xgbe_phy_redrv_model {
289 XGBE_PHY_REDRV_MODEL_4223 = 0,
290 XGBE_PHY_REDRV_MODEL_4227,
291 XGBE_PHY_REDRV_MODEL_MAX,
292};
293
294enum xgbe_phy_redrv_mode {
295 XGBE_PHY_REDRV_MODE_CX = 5,
296 XGBE_PHY_REDRV_MODE_SR = 9,
297};
298
299#define XGBE_PHY_REDRV_MODE_REG 0x12b0
300
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600301/* PHY related configuration information */
302struct xgbe_phy_data {
303 enum xgbe_port_mode port_mode;
304
305 unsigned int port_id;
306
307 unsigned int port_speeds;
308
309 enum xgbe_conn_type conn_type;
310
311 enum xgbe_mode cur_mode;
312 enum xgbe_mode start_mode;
313
314 unsigned int rrc_count;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600315
316 unsigned int mdio_addr;
317
318 unsigned int comm_owned;
319
320 /* SFP Support */
321 enum xgbe_sfp_comm sfp_comm;
322 unsigned int sfp_mux_address;
323 unsigned int sfp_mux_channel;
324
325 unsigned int sfp_gpio_address;
326 unsigned int sfp_gpio_mask;
327 unsigned int sfp_gpio_rx_los;
328 unsigned int sfp_gpio_tx_fault;
329 unsigned int sfp_gpio_mod_absent;
330 unsigned int sfp_gpio_rate_select;
331
332 unsigned int sfp_rx_los;
333 unsigned int sfp_tx_fault;
334 unsigned int sfp_mod_absent;
335 unsigned int sfp_diags;
336 unsigned int sfp_changed;
337 unsigned int sfp_phy_avail;
338 unsigned int sfp_cable_len;
339 enum xgbe_sfp_base sfp_base;
340 enum xgbe_sfp_cable sfp_cable;
341 enum xgbe_sfp_speed sfp_speed;
342 struct xgbe_sfp_eeprom sfp_eeprom;
343
344 /* External PHY support */
345 enum xgbe_mdio_mode phydev_mode;
346 struct mii_bus *mii;
347 struct phy_device *phydev;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600348 enum xgbe_mdio_reset mdio_reset;
349 unsigned int mdio_reset_addr;
350 unsigned int mdio_reset_gpio;
Lendacky, Thomasd7445d12016-11-10 17:11:41 -0600351
352 /* Re-driver support */
353 unsigned int redrv;
354 unsigned int redrv_if;
355 unsigned int redrv_addr;
356 unsigned int redrv_lane;
357 unsigned int redrv_model;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600358};
359
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600360/* I2C, MDIO and GPIO lines are muxed, so only one device at a time */
361static DEFINE_MUTEX(xgbe_phy_comm_lock);
362
363static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata);
364
365static int xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata,
366 struct xgbe_i2c_op *i2c_op)
367{
368 struct xgbe_phy_data *phy_data = pdata->phy_data;
369
370 /* Be sure we own the bus */
371 if (WARN_ON(!phy_data->comm_owned))
372 return -EIO;
373
374 return pdata->i2c_if.i2c_xfer(pdata, i2c_op);
375}
376
Lendacky, Thomasd7445d12016-11-10 17:11:41 -0600377static int xgbe_phy_redrv_write(struct xgbe_prv_data *pdata, unsigned int reg,
378 unsigned int val)
379{
380 struct xgbe_phy_data *phy_data = pdata->phy_data;
381 struct xgbe_i2c_op i2c_op;
382 __be16 *redrv_val;
383 u8 redrv_data[5], csum;
384 unsigned int i, retry;
385 int ret;
386
387 /* High byte of register contains read/write indicator */
388 redrv_data[0] = ((reg >> 8) & 0xff) << 1;
389 redrv_data[1] = reg & 0xff;
390 redrv_val = (__be16 *)&redrv_data[2];
391 *redrv_val = cpu_to_be16(val);
392
393 /* Calculate 1 byte checksum */
394 csum = 0;
395 for (i = 0; i < 4; i++) {
396 csum += redrv_data[i];
397 if (redrv_data[i] > csum)
398 csum++;
399 }
400 redrv_data[4] = ~csum;
401
402 retry = 1;
403again1:
404 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
405 i2c_op.target = phy_data->redrv_addr;
406 i2c_op.len = sizeof(redrv_data);
407 i2c_op.buf = redrv_data;
408 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
409 if (ret) {
410 if ((ret == -EAGAIN) && retry--)
411 goto again1;
412
413 return ret;
414 }
415
416 retry = 1;
417again2:
418 i2c_op.cmd = XGBE_I2C_CMD_READ;
419 i2c_op.target = phy_data->redrv_addr;
420 i2c_op.len = 1;
421 i2c_op.buf = redrv_data;
422 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
423 if (ret) {
424 if ((ret == -EAGAIN) && retry--)
425 goto again2;
426
427 return ret;
428 }
429
430 if (redrv_data[0] != 0xff) {
431 netif_dbg(pdata, drv, pdata->netdev,
432 "Redriver write checksum error\n");
433 ret = -EIO;
434 }
435
436 return ret;
437}
438
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600439static int xgbe_phy_i2c_write(struct xgbe_prv_data *pdata, unsigned int target,
440 void *val, unsigned int val_len)
441{
442 struct xgbe_i2c_op i2c_op;
443 int retry, ret;
444
445 retry = 1;
446again:
447 /* Write the specfied register */
448 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
449 i2c_op.target = target;
450 i2c_op.len = val_len;
451 i2c_op.buf = val;
452 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
453 if ((ret == -EAGAIN) && retry--)
454 goto again;
455
456 return ret;
457}
458
459static int xgbe_phy_i2c_read(struct xgbe_prv_data *pdata, unsigned int target,
460 void *reg, unsigned int reg_len,
461 void *val, unsigned int val_len)
462{
463 struct xgbe_i2c_op i2c_op;
464 int retry, ret;
465
466 retry = 1;
467again1:
468 /* Set the specified register to read */
469 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
470 i2c_op.target = target;
471 i2c_op.len = reg_len;
472 i2c_op.buf = reg;
473 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
474 if (ret) {
475 if ((ret == -EAGAIN) && retry--)
476 goto again1;
477
478 return ret;
479 }
480
481 retry = 1;
482again2:
483 /* Read the specfied register */
484 i2c_op.cmd = XGBE_I2C_CMD_READ;
485 i2c_op.target = target;
486 i2c_op.len = val_len;
487 i2c_op.buf = val;
488 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
489 if ((ret == -EAGAIN) && retry--)
490 goto again2;
491
492 return ret;
493}
494
495static int xgbe_phy_sfp_put_mux(struct xgbe_prv_data *pdata)
496{
497 struct xgbe_phy_data *phy_data = pdata->phy_data;
498 struct xgbe_i2c_op i2c_op;
499 u8 mux_channel;
500
501 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
502 return 0;
503
504 /* Select no mux channels */
505 mux_channel = 0;
506 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
507 i2c_op.target = phy_data->sfp_mux_address;
508 i2c_op.len = sizeof(mux_channel);
509 i2c_op.buf = &mux_channel;
510
511 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
512}
513
514static int xgbe_phy_sfp_get_mux(struct xgbe_prv_data *pdata)
515{
516 struct xgbe_phy_data *phy_data = pdata->phy_data;
517 struct xgbe_i2c_op i2c_op;
518 u8 mux_channel;
519
520 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
521 return 0;
522
523 /* Select desired mux channel */
524 mux_channel = 1 << phy_data->sfp_mux_channel;
525 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
526 i2c_op.target = phy_data->sfp_mux_address;
527 i2c_op.len = sizeof(mux_channel);
528 i2c_op.buf = &mux_channel;
529
530 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
531}
532
533static void xgbe_phy_put_comm_ownership(struct xgbe_prv_data *pdata)
534{
535 struct xgbe_phy_data *phy_data = pdata->phy_data;
536
537 phy_data->comm_owned = 0;
538
539 mutex_unlock(&xgbe_phy_comm_lock);
540}
541
542static int xgbe_phy_get_comm_ownership(struct xgbe_prv_data *pdata)
543{
544 struct xgbe_phy_data *phy_data = pdata->phy_data;
545 unsigned long timeout;
546 unsigned int mutex_id;
547
548 if (phy_data->comm_owned)
549 return 0;
550
551 /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
552 * the driver needs to take the software mutex and then the hardware
553 * mutexes before being able to use the busses.
554 */
555 mutex_lock(&xgbe_phy_comm_lock);
556
557 /* Clear the mutexes */
558 XP_IOWRITE(pdata, XP_I2C_MUTEX, XGBE_MUTEX_RELEASE);
559 XP_IOWRITE(pdata, XP_MDIO_MUTEX, XGBE_MUTEX_RELEASE);
560
561 /* Mutex formats are the same for I2C and MDIO/GPIO */
562 mutex_id = 0;
563 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ID, phy_data->port_id);
564 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ACTIVE, 1);
565
566 timeout = jiffies + (5 * HZ);
567 while (time_before(jiffies, timeout)) {
568 /* Must be all zeroes in order to obtain the mutex */
569 if (XP_IOREAD(pdata, XP_I2C_MUTEX) ||
570 XP_IOREAD(pdata, XP_MDIO_MUTEX)) {
571 usleep_range(100, 200);
572 continue;
573 }
574
575 /* Obtain the mutex */
576 XP_IOWRITE(pdata, XP_I2C_MUTEX, mutex_id);
577 XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
578
579 phy_data->comm_owned = 1;
580 return 0;
581 }
582
583 mutex_unlock(&xgbe_phy_comm_lock);
584
585 netdev_err(pdata->netdev, "unable to obtain hardware mutexes\n");
586
587 return -ETIMEDOUT;
588}
589
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600590static int xgbe_phy_mdio_mii_write(struct xgbe_prv_data *pdata, int addr,
591 int reg, u16 val)
592{
593 struct xgbe_phy_data *phy_data = pdata->phy_data;
594
595 if (reg & MII_ADDR_C45) {
596 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
597 return -ENOTSUPP;
598 } else {
599 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
600 return -ENOTSUPP;
601 }
602
603 return pdata->hw_if.write_ext_mii_regs(pdata, addr, reg, val);
604}
605
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600606static int xgbe_phy_i2c_mii_write(struct xgbe_prv_data *pdata, int reg, u16 val)
607{
608 __be16 *mii_val;
609 u8 mii_data[3];
610 int ret;
611
612 ret = xgbe_phy_sfp_get_mux(pdata);
613 if (ret)
614 return ret;
615
616 mii_data[0] = reg & 0xff;
617 mii_val = (__be16 *)&mii_data[1];
618 *mii_val = cpu_to_be16(val);
619
620 ret = xgbe_phy_i2c_write(pdata, XGBE_SFP_PHY_ADDRESS,
621 mii_data, sizeof(mii_data));
622
623 xgbe_phy_sfp_put_mux(pdata);
624
625 return ret;
626}
627
628static int xgbe_phy_mii_write(struct mii_bus *mii, int addr, int reg, u16 val)
629{
630 struct xgbe_prv_data *pdata = mii->priv;
631 struct xgbe_phy_data *phy_data = pdata->phy_data;
632 int ret;
633
634 ret = xgbe_phy_get_comm_ownership(pdata);
635 if (ret)
636 return ret;
637
638 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
639 ret = xgbe_phy_i2c_mii_write(pdata, reg, val);
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600640 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
641 ret = xgbe_phy_mdio_mii_write(pdata, addr, reg, val);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600642 else
643 ret = -ENOTSUPP;
644
645 xgbe_phy_put_comm_ownership(pdata);
646
647 return ret;
648}
649
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600650static int xgbe_phy_mdio_mii_read(struct xgbe_prv_data *pdata, int addr,
651 int reg)
652{
653 struct xgbe_phy_data *phy_data = pdata->phy_data;
654
655 if (reg & MII_ADDR_C45) {
656 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
657 return -ENOTSUPP;
658 } else {
659 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
660 return -ENOTSUPP;
661 }
662
663 return pdata->hw_if.read_ext_mii_regs(pdata, addr, reg);
664}
665
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600666static int xgbe_phy_i2c_mii_read(struct xgbe_prv_data *pdata, int reg)
667{
668 __be16 mii_val;
669 u8 mii_reg;
670 int ret;
671
672 ret = xgbe_phy_sfp_get_mux(pdata);
673 if (ret)
674 return ret;
675
676 mii_reg = reg;
677 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_PHY_ADDRESS,
678 &mii_reg, sizeof(mii_reg),
679 &mii_val, sizeof(mii_val));
680 if (!ret)
681 ret = be16_to_cpu(mii_val);
682
683 xgbe_phy_sfp_put_mux(pdata);
684
685 return ret;
686}
687
688static int xgbe_phy_mii_read(struct mii_bus *mii, int addr, int reg)
689{
690 struct xgbe_prv_data *pdata = mii->priv;
691 struct xgbe_phy_data *phy_data = pdata->phy_data;
692 int ret;
693
694 ret = xgbe_phy_get_comm_ownership(pdata);
695 if (ret)
696 return ret;
697
698 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
699 ret = xgbe_phy_i2c_mii_read(pdata, reg);
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600700 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
701 ret = xgbe_phy_mdio_mii_read(pdata, addr, reg);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600702 else
703 ret = -ENOTSUPP;
704
705 xgbe_phy_put_comm_ownership(pdata);
706
707 return ret;
708}
709
710static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
711{
712 struct xgbe_phy_data *phy_data = pdata->phy_data;
713
714 if (phy_data->sfp_mod_absent) {
715 pdata->phy.speed = SPEED_UNKNOWN;
716 pdata->phy.duplex = DUPLEX_UNKNOWN;
717 pdata->phy.autoneg = AUTONEG_ENABLE;
718 pdata->phy.advertising = pdata->phy.supported;
Lendacky, Thomas2697ea52017-02-28 15:03:10 -0600719
720 return;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600721 }
722
723 pdata->phy.advertising &= ~ADVERTISED_Autoneg;
724 pdata->phy.advertising &= ~ADVERTISED_TP;
725 pdata->phy.advertising &= ~ADVERTISED_FIBRE;
726 pdata->phy.advertising &= ~ADVERTISED_100baseT_Full;
727 pdata->phy.advertising &= ~ADVERTISED_1000baseT_Full;
728 pdata->phy.advertising &= ~ADVERTISED_10000baseT_Full;
729 pdata->phy.advertising &= ~ADVERTISED_10000baseR_FEC;
730
731 switch (phy_data->sfp_base) {
732 case XGBE_SFP_BASE_1000_T:
733 case XGBE_SFP_BASE_1000_SX:
734 case XGBE_SFP_BASE_1000_LX:
735 case XGBE_SFP_BASE_1000_CX:
736 pdata->phy.speed = SPEED_UNKNOWN;
737 pdata->phy.duplex = DUPLEX_UNKNOWN;
738 pdata->phy.autoneg = AUTONEG_ENABLE;
739 pdata->phy.advertising |= ADVERTISED_Autoneg;
740 break;
741 case XGBE_SFP_BASE_10000_SR:
742 case XGBE_SFP_BASE_10000_LR:
743 case XGBE_SFP_BASE_10000_LRM:
744 case XGBE_SFP_BASE_10000_ER:
745 case XGBE_SFP_BASE_10000_CR:
746 default:
747 pdata->phy.speed = SPEED_10000;
748 pdata->phy.duplex = DUPLEX_FULL;
749 pdata->phy.autoneg = AUTONEG_DISABLE;
750 break;
751 }
752
753 switch (phy_data->sfp_base) {
754 case XGBE_SFP_BASE_1000_T:
755 case XGBE_SFP_BASE_1000_CX:
756 case XGBE_SFP_BASE_10000_CR:
757 pdata->phy.advertising |= ADVERTISED_TP;
758 break;
759 default:
760 pdata->phy.advertising |= ADVERTISED_FIBRE;
761 }
762
763 switch (phy_data->sfp_speed) {
764 case XGBE_SFP_SPEED_100_1000:
765 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
766 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
767 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
768 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
769 break;
770 case XGBE_SFP_SPEED_1000:
771 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
772 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
773 break;
774 case XGBE_SFP_SPEED_10000:
775 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
776 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
777 break;
778 default:
779 /* Choose the fastest supported speed */
780 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
781 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
782 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
783 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
784 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
785 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
786 }
787}
788
789static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
790 enum xgbe_sfp_speed sfp_speed)
791{
792 u8 *sfp_base, min, max;
793
794 sfp_base = sfp_eeprom->base;
795
796 switch (sfp_speed) {
797 case XGBE_SFP_SPEED_1000:
798 min = XGBE_SFP_BASE_BR_1GBE_MIN;
799 max = XGBE_SFP_BASE_BR_1GBE_MAX;
800 break;
801 case XGBE_SFP_SPEED_10000:
802 min = XGBE_SFP_BASE_BR_10GBE_MIN;
803 max = XGBE_SFP_BASE_BR_10GBE_MAX;
804 break;
805 default:
806 return false;
807 }
808
809 return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
810 (sfp_base[XGBE_SFP_BASE_BR] <= max));
811}
812
813static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
814{
815 struct xgbe_phy_data *phy_data = pdata->phy_data;
816
817 if (phy_data->phydev) {
818 phy_detach(phy_data->phydev);
819 phy_device_remove(phy_data->phydev);
820 phy_device_free(phy_data->phydev);
821 phy_data->phydev = NULL;
822 }
823}
824
825static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
826{
827 struct xgbe_phy_data *phy_data = pdata->phy_data;
828 unsigned int phy_id = phy_data->phydev->phy_id;
829
830 if ((phy_id & 0xfffffff0) != 0x01ff0cc0)
831 return false;
832
833 /* Enable Base-T AN */
834 phy_write(phy_data->phydev, 0x16, 0x0001);
835 phy_write(phy_data->phydev, 0x00, 0x9140);
836 phy_write(phy_data->phydev, 0x16, 0x0000);
837
838 /* Enable SGMII at 100Base-T/1000Base-T Full Duplex */
839 phy_write(phy_data->phydev, 0x1b, 0x9084);
840 phy_write(phy_data->phydev, 0x09, 0x0e00);
841 phy_write(phy_data->phydev, 0x00, 0x8140);
842 phy_write(phy_data->phydev, 0x04, 0x0d01);
843 phy_write(phy_data->phydev, 0x00, 0x9140);
844
845 phy_data->phydev->supported = PHY_GBIT_FEATURES;
846 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
847 phy_data->phydev->advertising = phy_data->phydev->supported;
848
849 netif_dbg(pdata, drv, pdata->netdev,
850 "Finisar PHY quirk in place\n");
851
852 return true;
853}
854
855static void xgbe_phy_external_phy_quirks(struct xgbe_prv_data *pdata)
856{
857 if (xgbe_phy_finisar_phy_quirks(pdata))
858 return;
859}
860
861static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
862{
863 struct xgbe_phy_data *phy_data = pdata->phy_data;
864 struct phy_device *phydev;
865 int ret;
866
867 /* If we already have a PHY, just return */
868 if (phy_data->phydev)
869 return 0;
870
871 /* Check for the use of an external PHY */
872 if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE)
873 return 0;
874
875 /* For SFP, only use an external PHY if available */
876 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
877 !phy_data->sfp_phy_avail)
878 return 0;
879
Lendacky, Thomasb42c6762017-02-28 15:03:01 -0600880 /* Set the proper MDIO mode for the PHY */
881 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
882 phy_data->phydev_mode);
883 if (ret) {
884 netdev_err(pdata->netdev,
885 "mdio port/clause not compatible (%u/%u)\n",
886 phy_data->mdio_addr, phy_data->phydev_mode);
887 return ret;
888 }
889
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600890 /* Create and connect to the PHY device */
891 phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
892 (phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
893 if (IS_ERR(phydev)) {
894 netdev_err(pdata->netdev, "get_phy_device failed\n");
895 return -ENODEV;
896 }
897 netif_dbg(pdata, drv, pdata->netdev, "external PHY id is %#010x\n",
898 phydev->phy_id);
899
900 /*TODO: If c45, add request_module based on one of the MMD ids? */
901
902 ret = phy_device_register(phydev);
903 if (ret) {
904 netdev_err(pdata->netdev, "phy_device_register failed\n");
905 phy_device_free(phydev);
906 return ret;
907 }
908
909 ret = phy_attach_direct(pdata->netdev, phydev, phydev->dev_flags,
910 PHY_INTERFACE_MODE_SGMII);
911 if (ret) {
912 netdev_err(pdata->netdev, "phy_attach_direct failed\n");
913 phy_device_remove(phydev);
914 phy_device_free(phydev);
915 return ret;
916 }
917 phy_data->phydev = phydev;
918
919 xgbe_phy_external_phy_quirks(pdata);
920 phydev->advertising &= pdata->phy.advertising;
921
922 phy_start_aneg(phy_data->phydev);
923
924 return 0;
925}
926
927static void xgbe_phy_sfp_external_phy(struct xgbe_prv_data *pdata)
928{
929 struct xgbe_phy_data *phy_data = pdata->phy_data;
930 int ret;
931
932 if (!phy_data->sfp_changed)
933 return;
934
935 phy_data->sfp_phy_avail = 0;
936
937 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
938 return;
939
940 /* Check access to the PHY by reading CTRL1 */
941 ret = xgbe_phy_i2c_mii_read(pdata, MII_BMCR);
942 if (ret < 0)
943 return;
944
945 /* Successfully accessed the PHY */
946 phy_data->sfp_phy_avail = 1;
947}
948
949static bool xgbe_phy_belfuse_parse_quirks(struct xgbe_prv_data *pdata)
950{
951 struct xgbe_phy_data *phy_data = pdata->phy_data;
952 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
953
954 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
955 XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN))
956 return false;
957
958 if (!memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
959 XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN)) {
960 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
961 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
962 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
963 if (phy_data->sfp_changed)
964 netif_dbg(pdata, drv, pdata->netdev,
965 "Bel-Fuse SFP quirk in place\n");
966 return true;
967 }
968
969 return false;
970}
971
972static bool xgbe_phy_sfp_parse_quirks(struct xgbe_prv_data *pdata)
973{
974 if (xgbe_phy_belfuse_parse_quirks(pdata))
975 return true;
976
977 return false;
978}
979
980static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
981{
982 struct xgbe_phy_data *phy_data = pdata->phy_data;
983 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
984 u8 *sfp_base;
985
986 sfp_base = sfp_eeprom->base;
987
988 if (sfp_base[XGBE_SFP_BASE_ID] != XGBE_SFP_ID_SFP)
989 return;
990
991 if (sfp_base[XGBE_SFP_BASE_EXT_ID] != XGBE_SFP_EXT_ID_SFP)
992 return;
993
994 if (xgbe_phy_sfp_parse_quirks(pdata))
995 return;
996
997 /* Assume ACTIVE cable unless told it is PASSIVE */
998 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
999 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
1000 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
1001 } else {
1002 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
1003 }
1004
1005 /* Determine the type of SFP */
1006 if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
1007 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
1008 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
1009 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
1010 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM)
1011 phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM;
1012 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER)
1013 phy_data->sfp_base = XGBE_SFP_BASE_10000_ER;
1014 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX)
1015 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
1016 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX)
1017 phy_data->sfp_base = XGBE_SFP_BASE_1000_LX;
1018 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX)
1019 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
1020 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
1021 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
1022 else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
1023 xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
1024 phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
1025
1026 switch (phy_data->sfp_base) {
1027 case XGBE_SFP_BASE_1000_T:
1028 phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000;
1029 break;
1030 case XGBE_SFP_BASE_1000_SX:
1031 case XGBE_SFP_BASE_1000_LX:
1032 case XGBE_SFP_BASE_1000_CX:
1033 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
1034 break;
1035 case XGBE_SFP_BASE_10000_SR:
1036 case XGBE_SFP_BASE_10000_LR:
1037 case XGBE_SFP_BASE_10000_LRM:
1038 case XGBE_SFP_BASE_10000_ER:
1039 case XGBE_SFP_BASE_10000_CR:
1040 phy_data->sfp_speed = XGBE_SFP_SPEED_10000;
1041 break;
1042 default:
1043 break;
1044 }
1045}
1046
1047static void xgbe_phy_sfp_eeprom_info(struct xgbe_prv_data *pdata,
1048 struct xgbe_sfp_eeprom *sfp_eeprom)
1049{
1050 struct xgbe_sfp_ascii sfp_ascii;
1051 char *sfp_data = (char *)&sfp_ascii;
1052
1053 netif_dbg(pdata, drv, pdata->netdev, "SFP detected:\n");
1054 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
1055 XGBE_SFP_BASE_VENDOR_NAME_LEN);
1056 sfp_data[XGBE_SFP_BASE_VENDOR_NAME_LEN] = '\0';
1057 netif_dbg(pdata, drv, pdata->netdev, " vendor: %s\n",
1058 sfp_data);
1059
1060 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
1061 XGBE_SFP_BASE_VENDOR_PN_LEN);
1062 sfp_data[XGBE_SFP_BASE_VENDOR_PN_LEN] = '\0';
1063 netif_dbg(pdata, drv, pdata->netdev, " part number: %s\n",
1064 sfp_data);
1065
1066 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_REV],
1067 XGBE_SFP_BASE_VENDOR_REV_LEN);
1068 sfp_data[XGBE_SFP_BASE_VENDOR_REV_LEN] = '\0';
1069 netif_dbg(pdata, drv, pdata->netdev, " revision level: %s\n",
1070 sfp_data);
1071
1072 memcpy(sfp_data, &sfp_eeprom->extd[XGBE_SFP_BASE_VENDOR_SN],
1073 XGBE_SFP_BASE_VENDOR_SN_LEN);
1074 sfp_data[XGBE_SFP_BASE_VENDOR_SN_LEN] = '\0';
1075 netif_dbg(pdata, drv, pdata->netdev, " serial number: %s\n",
1076 sfp_data);
1077}
1078
1079static bool xgbe_phy_sfp_verify_eeprom(u8 cc_in, u8 *buf, unsigned int len)
1080{
1081 u8 cc;
1082
1083 for (cc = 0; len; buf++, len--)
1084 cc += *buf;
1085
1086 return (cc == cc_in) ? true : false;
1087}
1088
1089static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
1090{
1091 struct xgbe_phy_data *phy_data = pdata->phy_data;
1092 struct xgbe_sfp_eeprom sfp_eeprom;
1093 u8 eeprom_addr;
1094 int ret;
1095
1096 ret = xgbe_phy_sfp_get_mux(pdata);
1097 if (ret) {
1098 netdev_err(pdata->netdev, "I2C error setting SFP MUX\n");
1099 return ret;
1100 }
1101
1102 /* Read the SFP serial ID eeprom */
1103 eeprom_addr = 0;
1104 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
1105 &eeprom_addr, sizeof(eeprom_addr),
1106 &sfp_eeprom, sizeof(sfp_eeprom));
1107 if (ret) {
1108 netdev_err(pdata->netdev, "I2C error reading SFP EEPROM\n");
1109 goto put;
1110 }
1111
1112 /* Validate the contents read */
1113 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[XGBE_SFP_BASE_CC],
1114 sfp_eeprom.base,
1115 sizeof(sfp_eeprom.base) - 1)) {
1116 ret = -EINVAL;
1117 goto put;
1118 }
1119
1120 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[XGBE_SFP_EXTD_CC],
1121 sfp_eeprom.extd,
1122 sizeof(sfp_eeprom.extd) - 1)) {
1123 ret = -EINVAL;
1124 goto put;
1125 }
1126
1127 /* Check for an added or changed SFP */
1128 if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
1129 phy_data->sfp_changed = 1;
1130
1131 if (netif_msg_drv(pdata))
1132 xgbe_phy_sfp_eeprom_info(pdata, &sfp_eeprom);
1133
1134 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
1135
1136 if (sfp_eeprom.extd[XGBE_SFP_EXTD_SFF_8472]) {
1137 u8 diag_type = sfp_eeprom.extd[XGBE_SFP_EXTD_DIAG];
1138
1139 if (!(diag_type & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
1140 phy_data->sfp_diags = 1;
1141 }
1142
1143 xgbe_phy_free_phy_device(pdata);
1144 } else {
1145 phy_data->sfp_changed = 0;
1146 }
1147
1148put:
1149 xgbe_phy_sfp_put_mux(pdata);
1150
1151 return ret;
1152}
1153
1154static void xgbe_phy_sfp_signals(struct xgbe_prv_data *pdata)
1155{
1156 struct xgbe_phy_data *phy_data = pdata->phy_data;
1157 unsigned int gpio_input;
1158 u8 gpio_reg, gpio_ports[2];
1159 int ret;
1160
1161 /* Read the input port registers */
1162 gpio_reg = 0;
1163 ret = xgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
1164 &gpio_reg, sizeof(gpio_reg),
1165 gpio_ports, sizeof(gpio_ports));
1166 if (ret) {
1167 netdev_err(pdata->netdev, "I2C error reading SFP GPIOs\n");
1168 return;
1169 }
1170
1171 gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
1172
1173 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_MOD_ABSENT) {
1174 /* No GPIO, just assume the module is present for now */
1175 phy_data->sfp_mod_absent = 0;
1176 } else {
1177 if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
1178 phy_data->sfp_mod_absent = 0;
1179 }
1180
1181 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_RX_LOS) &&
1182 (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
1183 phy_data->sfp_rx_los = 1;
1184
1185 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_TX_FAULT) &&
1186 (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
1187 phy_data->sfp_tx_fault = 1;
1188}
1189
1190static void xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
1191{
1192 struct xgbe_phy_data *phy_data = pdata->phy_data;
1193
1194 xgbe_phy_free_phy_device(pdata);
1195
1196 phy_data->sfp_mod_absent = 1;
1197 phy_data->sfp_phy_avail = 0;
1198 memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
1199}
1200
1201static void xgbe_phy_sfp_reset(struct xgbe_phy_data *phy_data)
1202{
1203 phy_data->sfp_rx_los = 0;
1204 phy_data->sfp_tx_fault = 0;
1205 phy_data->sfp_mod_absent = 1;
1206 phy_data->sfp_diags = 0;
1207 phy_data->sfp_base = XGBE_SFP_BASE_UNKNOWN;
1208 phy_data->sfp_cable = XGBE_SFP_CABLE_UNKNOWN;
1209 phy_data->sfp_speed = XGBE_SFP_SPEED_UNKNOWN;
1210}
1211
1212static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
1213{
1214 struct xgbe_phy_data *phy_data = pdata->phy_data;
1215 int ret;
1216
1217 /* Reset the SFP signals and info */
1218 xgbe_phy_sfp_reset(phy_data);
1219
1220 ret = xgbe_phy_get_comm_ownership(pdata);
1221 if (ret)
1222 return;
1223
1224 /* Read the SFP signals and check for module presence */
1225 xgbe_phy_sfp_signals(pdata);
1226 if (phy_data->sfp_mod_absent) {
1227 xgbe_phy_sfp_mod_absent(pdata);
1228 goto put;
1229 }
1230
1231 ret = xgbe_phy_sfp_read_eeprom(pdata);
1232 if (ret) {
1233 /* Treat any error as if there isn't an SFP plugged in */
1234 xgbe_phy_sfp_reset(phy_data);
1235 xgbe_phy_sfp_mod_absent(pdata);
1236 goto put;
1237 }
1238
1239 xgbe_phy_sfp_parse_eeprom(pdata);
1240
1241 xgbe_phy_sfp_external_phy(pdata);
1242
1243put:
1244 xgbe_phy_sfp_phy_settings(pdata);
1245
1246 xgbe_phy_put_comm_ownership(pdata);
1247}
1248
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001249static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001250{
1251 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001252 u16 lcl_adv = 0, rmt_adv = 0;
1253 u8 fc;
1254
1255 pdata->phy.tx_pause = 0;
1256 pdata->phy.rx_pause = 0;
1257
1258 if (!phy_data->phydev)
1259 return;
1260
1261 if (phy_data->phydev->advertising & ADVERTISED_Pause)
1262 lcl_adv |= ADVERTISE_PAUSE_CAP;
1263 if (phy_data->phydev->advertising & ADVERTISED_Asym_Pause)
1264 lcl_adv |= ADVERTISE_PAUSE_ASYM;
1265
1266 if (phy_data->phydev->pause) {
1267 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1268 rmt_adv |= LPA_PAUSE_CAP;
1269 }
1270 if (phy_data->phydev->asym_pause) {
1271 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1272 rmt_adv |= LPA_PAUSE_ASYM;
1273 }
1274
1275 fc = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
1276 if (fc & FLOW_CTRL_TX)
1277 pdata->phy.tx_pause = 1;
1278 if (fc & FLOW_CTRL_RX)
1279 pdata->phy.rx_pause = 1;
1280}
1281
1282static enum xgbe_mode xgbe_phy_an37_sgmii_outcome(struct xgbe_prv_data *pdata)
1283{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001284 enum xgbe_mode mode;
1285
1286 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1287 pdata->phy.lp_advertising |= ADVERTISED_TP;
1288
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001289 /* Use external PHY to determine flow control */
1290 if (pdata->phy.pause_autoneg)
1291 xgbe_phy_phydev_flowctrl(pdata);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001292
1293 switch (pdata->an_status & XGBE_SGMII_AN_LINK_SPEED) {
1294 case XGBE_SGMII_AN_LINK_SPEED_100:
1295 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1296 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Full;
1297 mode = XGBE_MODE_SGMII_100;
1298 } else {
1299 /* Half-duplex not supported */
1300 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Half;
1301 mode = XGBE_MODE_UNKNOWN;
1302 }
1303 break;
1304 case XGBE_SGMII_AN_LINK_SPEED_1000:
1305 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1306 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1307 mode = XGBE_MODE_SGMII_1000;
1308 } else {
1309 /* Half-duplex not supported */
1310 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1311 mode = XGBE_MODE_UNKNOWN;
1312 }
1313 break;
1314 default:
1315 mode = XGBE_MODE_UNKNOWN;
1316 }
1317
1318 return mode;
1319}
1320
1321static enum xgbe_mode xgbe_phy_an37_outcome(struct xgbe_prv_data *pdata)
1322{
1323 enum xgbe_mode mode;
1324 unsigned int ad_reg, lp_reg;
1325
1326 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1327 pdata->phy.lp_advertising |= ADVERTISED_FIBRE;
1328
1329 /* Compare Advertisement and Link Partner register */
1330 ad_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
1331 lp_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_LP_ABILITY);
1332 if (lp_reg & 0x100)
1333 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1334 if (lp_reg & 0x80)
1335 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1336
1337 if (pdata->phy.pause_autoneg) {
1338 /* Set flow control based on auto-negotiation result */
1339 pdata->phy.tx_pause = 0;
1340 pdata->phy.rx_pause = 0;
1341
1342 if (ad_reg & lp_reg & 0x100) {
1343 pdata->phy.tx_pause = 1;
1344 pdata->phy.rx_pause = 1;
1345 } else if (ad_reg & lp_reg & 0x80) {
1346 if (ad_reg & 0x100)
1347 pdata->phy.rx_pause = 1;
1348 else if (lp_reg & 0x100)
1349 pdata->phy.tx_pause = 1;
1350 }
1351 }
1352
1353 if (lp_reg & 0x40)
1354 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1355 if (lp_reg & 0x20)
1356 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1357
1358 /* Half duplex is not supported */
1359 ad_reg &= lp_reg;
1360 mode = (ad_reg & 0x20) ? XGBE_MODE_X : XGBE_MODE_UNKNOWN;
1361
1362 return mode;
1363}
1364
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001365static enum xgbe_mode xgbe_phy_an73_redrv_outcome(struct xgbe_prv_data *pdata)
1366{
1367 struct xgbe_phy_data *phy_data = pdata->phy_data;
1368 enum xgbe_mode mode;
1369 unsigned int ad_reg, lp_reg;
1370
1371 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1372 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1373
1374 /* Use external PHY to determine flow control */
1375 if (pdata->phy.pause_autoneg)
1376 xgbe_phy_phydev_flowctrl(pdata);
1377
1378 /* Compare Advertisement and Link Partner register 2 */
1379 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1380 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1381 if (lp_reg & 0x80)
1382 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1383 if (lp_reg & 0x20)
1384 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1385
1386 ad_reg &= lp_reg;
1387 if (ad_reg & 0x80) {
1388 switch (phy_data->port_mode) {
1389 case XGBE_PORT_MODE_BACKPLANE:
1390 mode = XGBE_MODE_KR;
1391 break;
1392 default:
1393 mode = XGBE_MODE_SFI;
1394 break;
1395 }
1396 } else if (ad_reg & 0x20) {
1397 switch (phy_data->port_mode) {
1398 case XGBE_PORT_MODE_BACKPLANE:
1399 mode = XGBE_MODE_KX_1000;
1400 break;
1401 case XGBE_PORT_MODE_1000BASE_X:
1402 mode = XGBE_MODE_X;
1403 break;
1404 case XGBE_PORT_MODE_SFP:
1405 switch (phy_data->sfp_base) {
1406 case XGBE_SFP_BASE_1000_T:
1407 if (phy_data->phydev &&
1408 (phy_data->phydev->speed == SPEED_100))
1409 mode = XGBE_MODE_SGMII_100;
1410 else
1411 mode = XGBE_MODE_SGMII_1000;
1412 break;
1413 case XGBE_SFP_BASE_1000_SX:
1414 case XGBE_SFP_BASE_1000_LX:
1415 case XGBE_SFP_BASE_1000_CX:
1416 default:
1417 mode = XGBE_MODE_X;
1418 break;
1419 }
1420 break;
1421 default:
1422 if (phy_data->phydev &&
1423 (phy_data->phydev->speed == SPEED_100))
1424 mode = XGBE_MODE_SGMII_100;
1425 else
1426 mode = XGBE_MODE_SGMII_1000;
1427 break;
1428 }
1429 } else {
1430 mode = XGBE_MODE_UNKNOWN;
1431 }
1432
1433 /* Compare Advertisement and Link Partner register 3 */
1434 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1435 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1436 if (lp_reg & 0xc000)
1437 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1438
1439 return mode;
1440}
1441
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001442static enum xgbe_mode xgbe_phy_an73_outcome(struct xgbe_prv_data *pdata)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001443{
1444 enum xgbe_mode mode;
1445 unsigned int ad_reg, lp_reg;
1446
1447 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1448 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1449
1450 /* Compare Advertisement and Link Partner register 1 */
1451 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1452 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1453 if (lp_reg & 0x400)
1454 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1455 if (lp_reg & 0x800)
1456 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1457
1458 if (pdata->phy.pause_autoneg) {
1459 /* Set flow control based on auto-negotiation result */
1460 pdata->phy.tx_pause = 0;
1461 pdata->phy.rx_pause = 0;
1462
1463 if (ad_reg & lp_reg & 0x400) {
1464 pdata->phy.tx_pause = 1;
1465 pdata->phy.rx_pause = 1;
1466 } else if (ad_reg & lp_reg & 0x800) {
1467 if (ad_reg & 0x400)
1468 pdata->phy.rx_pause = 1;
1469 else if (lp_reg & 0x400)
1470 pdata->phy.tx_pause = 1;
1471 }
1472 }
1473
1474 /* Compare Advertisement and Link Partner register 2 */
1475 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1476 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1477 if (lp_reg & 0x80)
1478 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1479 if (lp_reg & 0x20)
1480 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1481
1482 ad_reg &= lp_reg;
1483 if (ad_reg & 0x80)
1484 mode = XGBE_MODE_KR;
1485 else if (ad_reg & 0x20)
1486 mode = XGBE_MODE_KX_1000;
1487 else
1488 mode = XGBE_MODE_UNKNOWN;
1489
1490 /* Compare Advertisement and Link Partner register 3 */
1491 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1492 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1493 if (lp_reg & 0xc000)
1494 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1495
1496 return mode;
1497}
1498
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001499static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
1500{
1501 switch (pdata->an_mode) {
1502 case XGBE_AN_MODE_CL73:
1503 return xgbe_phy_an73_outcome(pdata);
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001504 case XGBE_AN_MODE_CL73_REDRV:
1505 return xgbe_phy_an73_redrv_outcome(pdata);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001506 case XGBE_AN_MODE_CL37:
1507 return xgbe_phy_an37_outcome(pdata);
1508 case XGBE_AN_MODE_CL37_SGMII:
1509 return xgbe_phy_an37_sgmii_outcome(pdata);
1510 default:
1511 return XGBE_MODE_UNKNOWN;
1512 }
1513}
1514
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001515static unsigned int xgbe_phy_an_advertising(struct xgbe_prv_data *pdata)
1516{
1517 struct xgbe_phy_data *phy_data = pdata->phy_data;
1518 unsigned int advertising;
1519
1520 /* Without a re-driver, just return current advertising */
1521 if (!phy_data->redrv)
1522 return pdata->phy.advertising;
1523
1524 /* With the KR re-driver we need to advertise a single speed */
1525 advertising = pdata->phy.advertising;
1526 advertising &= ~ADVERTISED_1000baseKX_Full;
1527 advertising &= ~ADVERTISED_10000baseKR_Full;
1528
1529 switch (phy_data->port_mode) {
1530 case XGBE_PORT_MODE_BACKPLANE:
1531 advertising |= ADVERTISED_10000baseKR_Full;
1532 break;
1533 case XGBE_PORT_MODE_BACKPLANE_2500:
1534 advertising |= ADVERTISED_1000baseKX_Full;
1535 break;
1536 case XGBE_PORT_MODE_1000BASE_T:
1537 case XGBE_PORT_MODE_1000BASE_X:
1538 case XGBE_PORT_MODE_NBASE_T:
1539 advertising |= ADVERTISED_1000baseKX_Full;
1540 break;
1541 case XGBE_PORT_MODE_10GBASE_T:
1542 if (phy_data->phydev &&
1543 (phy_data->phydev->speed == SPEED_10000))
1544 advertising |= ADVERTISED_10000baseKR_Full;
1545 else
1546 advertising |= ADVERTISED_1000baseKX_Full;
1547 break;
1548 case XGBE_PORT_MODE_10GBASE_R:
1549 advertising |= ADVERTISED_10000baseKR_Full;
1550 break;
1551 case XGBE_PORT_MODE_SFP:
1552 switch (phy_data->sfp_base) {
1553 case XGBE_SFP_BASE_1000_T:
1554 case XGBE_SFP_BASE_1000_SX:
1555 case XGBE_SFP_BASE_1000_LX:
1556 case XGBE_SFP_BASE_1000_CX:
1557 advertising |= ADVERTISED_1000baseKX_Full;
1558 break;
1559 default:
1560 advertising |= ADVERTISED_10000baseKR_Full;
1561 break;
1562 }
1563 break;
1564 default:
1565 advertising |= ADVERTISED_10000baseKR_Full;
1566 break;
1567 }
1568
1569 return advertising;
1570}
1571
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001572static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1573{
1574 struct xgbe_phy_data *phy_data = pdata->phy_data;
1575 int ret;
1576
1577 ret = xgbe_phy_find_phy_device(pdata);
1578 if (ret)
1579 return ret;
1580
1581 if (!phy_data->phydev)
1582 return 0;
1583
1584 phy_data->phydev->autoneg = pdata->phy.autoneg;
1585 phy_data->phydev->advertising = phy_data->phydev->supported &
1586 pdata->phy.advertising;
1587
1588 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1589 phy_data->phydev->speed = pdata->phy.speed;
1590 phy_data->phydev->duplex = pdata->phy.duplex;
1591 }
1592
1593 ret = phy_start_aneg(phy_data->phydev);
1594
1595 return ret;
1596}
1597
1598static enum xgbe_an_mode xgbe_phy_an_sfp_mode(struct xgbe_phy_data *phy_data)
1599{
1600 switch (phy_data->sfp_base) {
1601 case XGBE_SFP_BASE_1000_T:
1602 return XGBE_AN_MODE_CL37_SGMII;
1603 case XGBE_SFP_BASE_1000_SX:
1604 case XGBE_SFP_BASE_1000_LX:
1605 case XGBE_SFP_BASE_1000_CX:
1606 return XGBE_AN_MODE_CL37;
1607 default:
1608 return XGBE_AN_MODE_NONE;
1609 }
1610}
1611
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001612static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata)
1613{
1614 struct xgbe_phy_data *phy_data = pdata->phy_data;
1615
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001616 /* A KR re-driver will always require CL73 AN */
1617 if (phy_data->redrv)
1618 return XGBE_AN_MODE_CL73_REDRV;
1619
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001620 switch (phy_data->port_mode) {
1621 case XGBE_PORT_MODE_BACKPLANE:
1622 return XGBE_AN_MODE_CL73;
1623 case XGBE_PORT_MODE_BACKPLANE_2500:
1624 return XGBE_AN_MODE_NONE;
1625 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001626 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001627 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001628 return XGBE_AN_MODE_CL37;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001629 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001630 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001631 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001632 return XGBE_AN_MODE_CL73;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001633 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001634 return XGBE_AN_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001635 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001636 return xgbe_phy_an_sfp_mode(phy_data);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001637 default:
1638 return XGBE_AN_MODE_NONE;
1639 }
1640}
1641
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001642static int xgbe_phy_set_redrv_mode_mdio(struct xgbe_prv_data *pdata,
1643 enum xgbe_phy_redrv_mode mode)
1644{
1645 struct xgbe_phy_data *phy_data = pdata->phy_data;
1646 u16 redrv_reg, redrv_val;
1647
1648 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1649 redrv_val = (u16)mode;
1650
1651 return pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr,
1652 redrv_reg, redrv_val);
1653}
1654
1655static int xgbe_phy_set_redrv_mode_i2c(struct xgbe_prv_data *pdata,
1656 enum xgbe_phy_redrv_mode mode)
1657{
1658 struct xgbe_phy_data *phy_data = pdata->phy_data;
1659 unsigned int redrv_reg;
1660 int ret;
1661
1662 /* Calculate the register to write */
1663 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1664
1665 ret = xgbe_phy_redrv_write(pdata, redrv_reg, mode);
1666
1667 return ret;
1668}
1669
1670static void xgbe_phy_set_redrv_mode(struct xgbe_prv_data *pdata)
1671{
1672 struct xgbe_phy_data *phy_data = pdata->phy_data;
1673 enum xgbe_phy_redrv_mode mode;
1674 int ret;
1675
1676 if (!phy_data->redrv)
1677 return;
1678
1679 mode = XGBE_PHY_REDRV_MODE_CX;
1680 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
1681 (phy_data->sfp_base != XGBE_SFP_BASE_1000_CX) &&
1682 (phy_data->sfp_base != XGBE_SFP_BASE_10000_CR))
1683 mode = XGBE_PHY_REDRV_MODE_SR;
1684
1685 ret = xgbe_phy_get_comm_ownership(pdata);
1686 if (ret)
1687 return;
1688
1689 if (phy_data->redrv_if)
1690 xgbe_phy_set_redrv_mode_i2c(pdata, mode);
1691 else
1692 xgbe_phy_set_redrv_mode_mdio(pdata, mode);
1693
1694 xgbe_phy_put_comm_ownership(pdata);
1695}
1696
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001697static void xgbe_phy_start_ratechange(struct xgbe_prv_data *pdata)
1698{
1699 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1700 return;
1701
1702 /* Log if a previous command did not complete */
1703 netif_dbg(pdata, link, pdata->netdev,
1704 "firmware mailbox not ready for command\n");
1705}
1706
1707static void xgbe_phy_complete_ratechange(struct xgbe_prv_data *pdata)
1708{
1709 unsigned int wait;
1710
1711 /* Wait for command to complete */
1712 wait = XGBE_RATECHANGE_COUNT;
1713 while (wait--) {
1714 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1715 return;
1716
1717 usleep_range(1000, 2000);
1718 }
1719
1720 netif_dbg(pdata, link, pdata->netdev,
1721 "firmware mailbox command did not complete\n");
1722}
1723
1724static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
1725{
1726 unsigned int s0;
1727
1728 xgbe_phy_start_ratechange(pdata);
1729
1730 /* Receiver Reset Cycle */
1731 s0 = 0;
1732 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1733 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1734
1735 /* Call FW to make the change */
1736 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1737 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1738 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1739
1740 xgbe_phy_complete_ratechange(pdata);
1741
1742 netif_dbg(pdata, link, pdata->netdev, "receiver reset complete\n");
1743}
1744
1745static void xgbe_phy_power_off(struct xgbe_prv_data *pdata)
1746{
1747 struct xgbe_phy_data *phy_data = pdata->phy_data;
1748
1749 xgbe_phy_start_ratechange(pdata);
1750
1751 /* Call FW to make the change */
1752 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1753 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1754 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1755
1756 xgbe_phy_complete_ratechange(pdata);
1757
1758 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
1759
1760 netif_dbg(pdata, link, pdata->netdev, "phy powered off\n");
1761}
1762
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001763static void xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata)
1764{
1765 struct xgbe_phy_data *phy_data = pdata->phy_data;
1766 unsigned int s0;
1767
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001768 xgbe_phy_set_redrv_mode(pdata);
1769
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001770 xgbe_phy_start_ratechange(pdata);
1771
1772 /* 10G/SFI */
1773 s0 = 0;
1774 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1775 if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE) {
1776 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1777 } else {
1778 if (phy_data->sfp_cable_len <= 1)
1779 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1780 else if (phy_data->sfp_cable_len <= 3)
1781 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001782 else
1783 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1784 }
1785
1786 /* Call FW to make the change */
1787 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1788 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1789 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1790
1791 xgbe_phy_complete_ratechange(pdata);
1792
1793 phy_data->cur_mode = XGBE_MODE_SFI;
1794
1795 netif_dbg(pdata, link, pdata->netdev, "10GbE SFI mode set\n");
1796}
1797
1798static void xgbe_phy_x_mode(struct xgbe_prv_data *pdata)
1799{
1800 struct xgbe_phy_data *phy_data = pdata->phy_data;
1801 unsigned int s0;
1802
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001803 xgbe_phy_set_redrv_mode(pdata);
1804
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001805 xgbe_phy_start_ratechange(pdata);
1806
1807 /* 1G/X */
1808 s0 = 0;
1809 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1810 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1811
1812 /* Call FW to make the change */
1813 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1814 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1815 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1816
1817 xgbe_phy_complete_ratechange(pdata);
1818
1819 phy_data->cur_mode = XGBE_MODE_X;
1820
1821 netif_dbg(pdata, link, pdata->netdev, "1GbE X mode set\n");
1822}
1823
1824static void xgbe_phy_sgmii_1000_mode(struct xgbe_prv_data *pdata)
1825{
1826 struct xgbe_phy_data *phy_data = pdata->phy_data;
1827 unsigned int s0;
1828
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001829 xgbe_phy_set_redrv_mode(pdata);
1830
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001831 xgbe_phy_start_ratechange(pdata);
1832
1833 /* 1G/SGMII */
1834 s0 = 0;
1835 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1836 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1837
1838 /* Call FW to make the change */
1839 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1840 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1841 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1842
1843 xgbe_phy_complete_ratechange(pdata);
1844
1845 phy_data->cur_mode = XGBE_MODE_SGMII_1000;
1846
1847 netif_dbg(pdata, link, pdata->netdev, "1GbE SGMII mode set\n");
1848}
1849
1850static void xgbe_phy_sgmii_100_mode(struct xgbe_prv_data *pdata)
1851{
1852 struct xgbe_phy_data *phy_data = pdata->phy_data;
1853 unsigned int s0;
1854
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001855 xgbe_phy_set_redrv_mode(pdata);
1856
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001857 xgbe_phy_start_ratechange(pdata);
1858
1859 /* 1G/SGMII */
1860 s0 = 0;
1861 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1862 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1863
1864 /* Call FW to make the change */
1865 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1866 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1867 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1868
1869 xgbe_phy_complete_ratechange(pdata);
1870
1871 phy_data->cur_mode = XGBE_MODE_SGMII_100;
1872
1873 netif_dbg(pdata, link, pdata->netdev, "100MbE SGMII mode set\n");
1874}
1875
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001876static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
1877{
1878 struct xgbe_phy_data *phy_data = pdata->phy_data;
1879 unsigned int s0;
1880
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001881 xgbe_phy_set_redrv_mode(pdata);
1882
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001883 xgbe_phy_start_ratechange(pdata);
1884
1885 /* 10G/KR */
1886 s0 = 0;
1887 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1888 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1889
1890 /* Call FW to make the change */
1891 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1892 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1893 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1894
1895 xgbe_phy_complete_ratechange(pdata);
1896
1897 phy_data->cur_mode = XGBE_MODE_KR;
1898
1899 netif_dbg(pdata, link, pdata->netdev, "10GbE KR mode set\n");
1900}
1901
1902static void xgbe_phy_kx_2500_mode(struct xgbe_prv_data *pdata)
1903{
1904 struct xgbe_phy_data *phy_data = pdata->phy_data;
1905 unsigned int s0;
1906
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001907 xgbe_phy_set_redrv_mode(pdata);
1908
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001909 xgbe_phy_start_ratechange(pdata);
1910
1911 /* 2.5G/KX */
1912 s0 = 0;
1913 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 2);
1914 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1915
1916 /* Call FW to make the change */
1917 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1918 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1919 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1920
1921 xgbe_phy_complete_ratechange(pdata);
1922
1923 phy_data->cur_mode = XGBE_MODE_KX_2500;
1924
1925 netif_dbg(pdata, link, pdata->netdev, "2.5GbE KX mode set\n");
1926}
1927
1928static void xgbe_phy_kx_1000_mode(struct xgbe_prv_data *pdata)
1929{
1930 struct xgbe_phy_data *phy_data = pdata->phy_data;
1931 unsigned int s0;
1932
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001933 xgbe_phy_set_redrv_mode(pdata);
1934
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001935 xgbe_phy_start_ratechange(pdata);
1936
1937 /* 1G/KX */
1938 s0 = 0;
1939 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1940 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1941
1942 /* Call FW to make the change */
1943 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1944 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1945 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1946
1947 xgbe_phy_complete_ratechange(pdata);
1948
1949 phy_data->cur_mode = XGBE_MODE_KX_1000;
1950
1951 netif_dbg(pdata, link, pdata->netdev, "1GbE KX mode set\n");
1952}
1953
1954static enum xgbe_mode xgbe_phy_cur_mode(struct xgbe_prv_data *pdata)
1955{
1956 struct xgbe_phy_data *phy_data = pdata->phy_data;
1957
1958 return phy_data->cur_mode;
1959}
1960
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001961static enum xgbe_mode xgbe_phy_switch_baset_mode(struct xgbe_prv_data *pdata)
1962{
1963 struct xgbe_phy_data *phy_data = pdata->phy_data;
1964
1965 /* No switching if not 10GBase-T */
1966 if (phy_data->port_mode != XGBE_PORT_MODE_10GBASE_T)
1967 return xgbe_phy_cur_mode(pdata);
1968
1969 switch (xgbe_phy_cur_mode(pdata)) {
1970 case XGBE_MODE_SGMII_100:
1971 case XGBE_MODE_SGMII_1000:
1972 return XGBE_MODE_KR;
1973 case XGBE_MODE_KR:
1974 default:
1975 return XGBE_MODE_SGMII_1000;
1976 }
1977}
1978
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001979static enum xgbe_mode xgbe_phy_switch_bp_2500_mode(struct xgbe_prv_data *pdata)
1980{
1981 return XGBE_MODE_KX_2500;
1982}
1983
1984static enum xgbe_mode xgbe_phy_switch_bp_mode(struct xgbe_prv_data *pdata)
1985{
1986 /* If we are in KR switch to KX, and vice-versa */
1987 switch (xgbe_phy_cur_mode(pdata)) {
1988 case XGBE_MODE_KX_1000:
1989 return XGBE_MODE_KR;
1990 case XGBE_MODE_KR:
1991 default:
1992 return XGBE_MODE_KX_1000;
1993 }
1994}
1995
1996static enum xgbe_mode xgbe_phy_switch_mode(struct xgbe_prv_data *pdata)
1997{
1998 struct xgbe_phy_data *phy_data = pdata->phy_data;
1999
2000 switch (phy_data->port_mode) {
2001 case XGBE_PORT_MODE_BACKPLANE:
2002 return xgbe_phy_switch_bp_mode(pdata);
2003 case XGBE_PORT_MODE_BACKPLANE_2500:
2004 return xgbe_phy_switch_bp_2500_mode(pdata);
2005 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002006 case XGBE_PORT_MODE_NBASE_T:
2007 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002008 return xgbe_phy_switch_baset_mode(pdata);
2009 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002010 case XGBE_PORT_MODE_10GBASE_R:
2011 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002012 /* No switching, so just return current mode */
2013 return xgbe_phy_cur_mode(pdata);
2014 default:
2015 return XGBE_MODE_UNKNOWN;
2016 }
2017}
2018
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002019static enum xgbe_mode xgbe_phy_get_basex_mode(struct xgbe_phy_data *phy_data,
2020 int speed)
2021{
2022 switch (speed) {
2023 case SPEED_1000:
2024 return XGBE_MODE_X;
2025 case SPEED_10000:
2026 return XGBE_MODE_KR;
2027 default:
2028 return XGBE_MODE_UNKNOWN;
2029 }
2030}
2031
2032static enum xgbe_mode xgbe_phy_get_baset_mode(struct xgbe_phy_data *phy_data,
2033 int speed)
2034{
2035 switch (speed) {
2036 case SPEED_100:
2037 return XGBE_MODE_SGMII_100;
2038 case SPEED_1000:
2039 return XGBE_MODE_SGMII_1000;
2040 case SPEED_10000:
2041 return XGBE_MODE_KR;
2042 default:
2043 return XGBE_MODE_UNKNOWN;
2044 }
2045}
2046
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002047static enum xgbe_mode xgbe_phy_get_sfp_mode(struct xgbe_phy_data *phy_data,
2048 int speed)
2049{
2050 switch (speed) {
2051 case SPEED_100:
2052 return XGBE_MODE_SGMII_100;
2053 case SPEED_1000:
2054 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2055 return XGBE_MODE_SGMII_1000;
2056 else
2057 return XGBE_MODE_X;
2058 case SPEED_10000:
2059 case SPEED_UNKNOWN:
2060 return XGBE_MODE_SFI;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002061 default:
2062 return XGBE_MODE_UNKNOWN;
2063 }
2064}
2065
2066static enum xgbe_mode xgbe_phy_get_bp_2500_mode(int speed)
2067{
2068 switch (speed) {
2069 case SPEED_2500:
2070 return XGBE_MODE_KX_2500;
2071 default:
2072 return XGBE_MODE_UNKNOWN;
2073 }
2074}
2075
2076static enum xgbe_mode xgbe_phy_get_bp_mode(int speed)
2077{
2078 switch (speed) {
2079 case SPEED_1000:
2080 return XGBE_MODE_KX_1000;
2081 case SPEED_10000:
2082 return XGBE_MODE_KR;
2083 default:
2084 return XGBE_MODE_UNKNOWN;
2085 }
2086}
2087
2088static enum xgbe_mode xgbe_phy_get_mode(struct xgbe_prv_data *pdata,
2089 int speed)
2090{
2091 struct xgbe_phy_data *phy_data = pdata->phy_data;
2092
2093 switch (phy_data->port_mode) {
2094 case XGBE_PORT_MODE_BACKPLANE:
2095 return xgbe_phy_get_bp_mode(speed);
2096 case XGBE_PORT_MODE_BACKPLANE_2500:
2097 return xgbe_phy_get_bp_2500_mode(speed);
2098 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002099 case XGBE_PORT_MODE_NBASE_T:
2100 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002101 return xgbe_phy_get_baset_mode(phy_data, speed);
2102 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002103 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002104 return xgbe_phy_get_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002105 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002106 return xgbe_phy_get_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002107 default:
2108 return XGBE_MODE_UNKNOWN;
2109 }
2110}
2111
2112static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2113{
2114 switch (mode) {
2115 case XGBE_MODE_KX_1000:
2116 xgbe_phy_kx_1000_mode(pdata);
2117 break;
2118 case XGBE_MODE_KX_2500:
2119 xgbe_phy_kx_2500_mode(pdata);
2120 break;
2121 case XGBE_MODE_KR:
2122 xgbe_phy_kr_mode(pdata);
2123 break;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002124 case XGBE_MODE_SGMII_100:
2125 xgbe_phy_sgmii_100_mode(pdata);
2126 break;
2127 case XGBE_MODE_SGMII_1000:
2128 xgbe_phy_sgmii_1000_mode(pdata);
2129 break;
2130 case XGBE_MODE_X:
2131 xgbe_phy_x_mode(pdata);
2132 break;
2133 case XGBE_MODE_SFI:
2134 xgbe_phy_sfi_mode(pdata);
2135 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002136 default:
2137 break;
2138 }
2139}
2140
2141static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
2142 enum xgbe_mode mode, u32 advert)
2143{
2144 if (pdata->phy.autoneg == AUTONEG_ENABLE) {
2145 if (pdata->phy.advertising & advert)
2146 return true;
2147 } else {
2148 enum xgbe_mode cur_mode;
2149
2150 cur_mode = xgbe_phy_get_mode(pdata, pdata->phy.speed);
2151 if (cur_mode == mode)
2152 return true;
2153 }
2154
2155 return false;
2156}
2157
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002158static bool xgbe_phy_use_basex_mode(struct xgbe_prv_data *pdata,
2159 enum xgbe_mode mode)
2160{
2161 switch (mode) {
2162 case XGBE_MODE_X:
2163 return xgbe_phy_check_mode(pdata, mode,
2164 ADVERTISED_1000baseT_Full);
2165 case XGBE_MODE_KR:
2166 return xgbe_phy_check_mode(pdata, mode,
2167 ADVERTISED_10000baseT_Full);
2168 default:
2169 return false;
2170 }
2171}
2172
2173static bool xgbe_phy_use_baset_mode(struct xgbe_prv_data *pdata,
2174 enum xgbe_mode mode)
2175{
2176 switch (mode) {
2177 case XGBE_MODE_SGMII_100:
2178 return xgbe_phy_check_mode(pdata, mode,
2179 ADVERTISED_100baseT_Full);
2180 case XGBE_MODE_SGMII_1000:
2181 return xgbe_phy_check_mode(pdata, mode,
2182 ADVERTISED_1000baseT_Full);
2183 case XGBE_MODE_KR:
2184 return xgbe_phy_check_mode(pdata, mode,
2185 ADVERTISED_10000baseT_Full);
2186 default:
2187 return false;
2188 }
2189}
2190
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002191static bool xgbe_phy_use_sfp_mode(struct xgbe_prv_data *pdata,
2192 enum xgbe_mode mode)
2193{
2194 struct xgbe_phy_data *phy_data = pdata->phy_data;
2195
2196 switch (mode) {
2197 case XGBE_MODE_X:
2198 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2199 return false;
2200 return xgbe_phy_check_mode(pdata, mode,
2201 ADVERTISED_1000baseT_Full);
2202 case XGBE_MODE_SGMII_100:
2203 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2204 return false;
2205 return xgbe_phy_check_mode(pdata, mode,
2206 ADVERTISED_100baseT_Full);
2207 case XGBE_MODE_SGMII_1000:
2208 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2209 return false;
2210 return xgbe_phy_check_mode(pdata, mode,
2211 ADVERTISED_1000baseT_Full);
2212 case XGBE_MODE_SFI:
2213 return xgbe_phy_check_mode(pdata, mode,
2214 ADVERTISED_10000baseT_Full);
2215 default:
2216 return false;
2217 }
2218}
2219
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002220static bool xgbe_phy_use_bp_2500_mode(struct xgbe_prv_data *pdata,
2221 enum xgbe_mode mode)
2222{
2223 switch (mode) {
2224 case XGBE_MODE_KX_2500:
2225 return xgbe_phy_check_mode(pdata, mode,
2226 ADVERTISED_2500baseX_Full);
2227 default:
2228 return false;
2229 }
2230}
2231
2232static bool xgbe_phy_use_bp_mode(struct xgbe_prv_data *pdata,
2233 enum xgbe_mode mode)
2234{
2235 switch (mode) {
2236 case XGBE_MODE_KX_1000:
2237 return xgbe_phy_check_mode(pdata, mode,
2238 ADVERTISED_1000baseKX_Full);
2239 case XGBE_MODE_KR:
2240 return xgbe_phy_check_mode(pdata, mode,
2241 ADVERTISED_10000baseKR_Full);
2242 default:
2243 return false;
2244 }
2245}
2246
2247static bool xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
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_use_bp_mode(pdata, mode);
2254 case XGBE_PORT_MODE_BACKPLANE_2500:
2255 return xgbe_phy_use_bp_2500_mode(pdata, mode);
2256 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002257 case XGBE_PORT_MODE_NBASE_T:
2258 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002259 return xgbe_phy_use_baset_mode(pdata, mode);
2260 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002261 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002262 return xgbe_phy_use_basex_mode(pdata, mode);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002263 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002264 return xgbe_phy_use_sfp_mode(pdata, mode);
2265 default:
2266 return false;
2267 }
2268}
2269
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002270static bool xgbe_phy_valid_speed_basex_mode(struct xgbe_phy_data *phy_data,
2271 int speed)
2272{
2273 switch (speed) {
2274 case SPEED_1000:
2275 return (phy_data->port_mode == XGBE_PORT_MODE_1000BASE_X);
2276 case SPEED_10000:
2277 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_R);
2278 default:
2279 return false;
2280 }
2281}
2282
2283static bool xgbe_phy_valid_speed_baset_mode(struct xgbe_phy_data *phy_data,
2284 int speed)
2285{
2286 switch (speed) {
2287 case SPEED_100:
2288 case SPEED_1000:
2289 return true;
2290 case SPEED_10000:
2291 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_T);
2292 default:
2293 return false;
2294 }
2295}
2296
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002297static bool xgbe_phy_valid_speed_sfp_mode(struct xgbe_phy_data *phy_data,
2298 int speed)
2299{
2300 switch (speed) {
2301 case SPEED_100:
2302 return (phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000);
2303 case SPEED_1000:
2304 return ((phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000) ||
2305 (phy_data->sfp_speed == XGBE_SFP_SPEED_1000));
2306 case SPEED_10000:
2307 return (phy_data->sfp_speed == XGBE_SFP_SPEED_10000);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002308 default:
2309 return false;
2310 }
2311}
2312
2313static bool xgbe_phy_valid_speed_bp_2500_mode(int speed)
2314{
2315 switch (speed) {
2316 case SPEED_2500:
2317 return true;
2318 default:
2319 return false;
2320 }
2321}
2322
2323static bool xgbe_phy_valid_speed_bp_mode(int speed)
2324{
2325 switch (speed) {
2326 case SPEED_1000:
2327 case SPEED_10000:
2328 return true;
2329 default:
2330 return false;
2331 }
2332}
2333
2334static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
2335{
2336 struct xgbe_phy_data *phy_data = pdata->phy_data;
2337
2338 switch (phy_data->port_mode) {
2339 case XGBE_PORT_MODE_BACKPLANE:
2340 return xgbe_phy_valid_speed_bp_mode(speed);
2341 case XGBE_PORT_MODE_BACKPLANE_2500:
2342 return xgbe_phy_valid_speed_bp_2500_mode(speed);
2343 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002344 case XGBE_PORT_MODE_NBASE_T:
2345 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002346 return xgbe_phy_valid_speed_baset_mode(phy_data, speed);
2347 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002348 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002349 return xgbe_phy_valid_speed_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002350 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002351 return xgbe_phy_valid_speed_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002352 default:
2353 return false;
2354 }
2355}
2356
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002357static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002358{
2359 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas8c5385c2016-11-14 16:39:16 -06002360 unsigned int reg;
2361 int ret;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002362
2363 *an_restart = 0;
2364
2365 if (phy_data->port_mode == XGBE_PORT_MODE_SFP) {
2366 /* Check SFP signals */
2367 xgbe_phy_sfp_detect(pdata);
2368
2369 if (phy_data->sfp_changed) {
2370 *an_restart = 1;
2371 return 0;
2372 }
2373
2374 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
2375 return 0;
2376 }
2377
2378 if (phy_data->phydev) {
2379 /* Check external PHY */
2380 ret = phy_read_status(phy_data->phydev);
2381 if (ret < 0)
2382 return 0;
2383
2384 if ((pdata->phy.autoneg == AUTONEG_ENABLE) &&
2385 !phy_aneg_done(phy_data->phydev))
2386 return 0;
2387
2388 if (!phy_data->phydev->link)
2389 return 0;
2390 }
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002391
2392 /* Link status is latched low, so read once to clear
2393 * and then read again to get current state
2394 */
2395 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2396 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2397 if (reg & MDIO_STAT1_LSTATUS)
2398 return 1;
2399
2400 /* No link, attempt a receiver reset cycle */
2401 if (phy_data->rrc_count++) {
2402 phy_data->rrc_count = 0;
2403 xgbe_phy_rrc(pdata);
2404 }
2405
2406 return 0;
2407}
2408
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002409static void xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata)
2410{
2411 struct xgbe_phy_data *phy_data = pdata->phy_data;
2412 unsigned int reg;
2413
2414 reg = XP_IOREAD(pdata, XP_PROP_3);
2415
2416 phy_data->sfp_gpio_address = XGBE_GPIO_ADDRESS_PCA9555 +
2417 XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
2418
2419 phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
2420
2421 phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
2422 GPIO_RX_LOS);
2423 phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
2424 GPIO_TX_FAULT);
2425 phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
2426 GPIO_MOD_ABS);
2427 phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
2428 GPIO_RATE_SELECT);
2429
2430 if (netif_msg_probe(pdata)) {
2431 dev_dbg(pdata->dev, "SFP: gpio_address=%#x\n",
2432 phy_data->sfp_gpio_address);
2433 dev_dbg(pdata->dev, "SFP: gpio_mask=%#x\n",
2434 phy_data->sfp_gpio_mask);
2435 dev_dbg(pdata->dev, "SFP: gpio_rx_los=%u\n",
2436 phy_data->sfp_gpio_rx_los);
2437 dev_dbg(pdata->dev, "SFP: gpio_tx_fault=%u\n",
2438 phy_data->sfp_gpio_tx_fault);
2439 dev_dbg(pdata->dev, "SFP: gpio_mod_absent=%u\n",
2440 phy_data->sfp_gpio_mod_absent);
2441 dev_dbg(pdata->dev, "SFP: gpio_rate_select=%u\n",
2442 phy_data->sfp_gpio_rate_select);
2443 }
2444}
2445
2446static void xgbe_phy_sfp_comm_setup(struct xgbe_prv_data *pdata)
2447{
2448 struct xgbe_phy_data *phy_data = pdata->phy_data;
2449 unsigned int reg, mux_addr_hi, mux_addr_lo;
2450
2451 reg = XP_IOREAD(pdata, XP_PROP_4);
2452
2453 mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
2454 mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
2455 if (mux_addr_lo == XGBE_SFP_DIRECT)
2456 return;
2457
2458 phy_data->sfp_comm = XGBE_SFP_COMM_PCA9545;
2459 phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
2460 phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
2461
2462 if (netif_msg_probe(pdata)) {
2463 dev_dbg(pdata->dev, "SFP: mux_address=%#x\n",
2464 phy_data->sfp_mux_address);
2465 dev_dbg(pdata->dev, "SFP: mux_channel=%u\n",
2466 phy_data->sfp_mux_channel);
2467 }
2468}
2469
2470static void xgbe_phy_sfp_setup(struct xgbe_prv_data *pdata)
2471{
2472 xgbe_phy_sfp_comm_setup(pdata);
2473 xgbe_phy_sfp_gpio_setup(pdata);
2474}
2475
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002476static int xgbe_phy_int_mdio_reset(struct xgbe_prv_data *pdata)
2477{
2478 struct xgbe_phy_data *phy_data = pdata->phy_data;
2479 unsigned int ret;
2480
2481 ret = pdata->hw_if.set_gpio(pdata, phy_data->mdio_reset_gpio);
2482 if (ret)
2483 return ret;
2484
2485 ret = pdata->hw_if.clr_gpio(pdata, phy_data->mdio_reset_gpio);
2486
2487 return ret;
2488}
2489
2490static int xgbe_phy_i2c_mdio_reset(struct xgbe_prv_data *pdata)
2491{
2492 struct xgbe_phy_data *phy_data = pdata->phy_data;
2493 u8 gpio_reg, gpio_ports[2], gpio_data[3];
2494 int ret;
2495
2496 /* Read the output port registers */
2497 gpio_reg = 2;
2498 ret = xgbe_phy_i2c_read(pdata, phy_data->mdio_reset_addr,
2499 &gpio_reg, sizeof(gpio_reg),
2500 gpio_ports, sizeof(gpio_ports));
2501 if (ret)
2502 return ret;
2503
2504 /* Prepare to write the GPIO data */
2505 gpio_data[0] = 2;
2506 gpio_data[1] = gpio_ports[0];
2507 gpio_data[2] = gpio_ports[1];
2508
2509 /* Set the GPIO pin */
2510 if (phy_data->mdio_reset_gpio < 8)
2511 gpio_data[1] |= (1 << (phy_data->mdio_reset_gpio % 8));
2512 else
2513 gpio_data[2] |= (1 << (phy_data->mdio_reset_gpio % 8));
2514
2515 /* Write the output port registers */
2516 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2517 gpio_data, sizeof(gpio_data));
2518 if (ret)
2519 return ret;
2520
2521 /* Clear the GPIO pin */
2522 if (phy_data->mdio_reset_gpio < 8)
2523 gpio_data[1] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2524 else
2525 gpio_data[2] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2526
2527 /* Write the output port registers */
2528 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2529 gpio_data, sizeof(gpio_data));
2530
2531 return ret;
2532}
2533
2534static int xgbe_phy_mdio_reset(struct xgbe_prv_data *pdata)
2535{
2536 struct xgbe_phy_data *phy_data = pdata->phy_data;
2537 int ret;
2538
2539 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2540 return 0;
2541
2542 ret = xgbe_phy_get_comm_ownership(pdata);
2543 if (ret)
2544 return ret;
2545
2546 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO)
2547 ret = xgbe_phy_i2c_mdio_reset(pdata);
2548 else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO)
2549 ret = xgbe_phy_int_mdio_reset(pdata);
2550
2551 xgbe_phy_put_comm_ownership(pdata);
2552
2553 return ret;
2554}
2555
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002556static bool xgbe_phy_redrv_error(struct xgbe_phy_data *phy_data)
2557{
2558 if (!phy_data->redrv)
2559 return false;
2560
2561 if (phy_data->redrv_if >= XGBE_PHY_REDRV_IF_MAX)
2562 return true;
2563
2564 switch (phy_data->redrv_model) {
2565 case XGBE_PHY_REDRV_MODEL_4223:
2566 if (phy_data->redrv_lane > 3)
2567 return true;
2568 break;
2569 case XGBE_PHY_REDRV_MODEL_4227:
2570 if (phy_data->redrv_lane > 1)
2571 return true;
2572 break;
2573 default:
2574 return true;
2575 }
2576
2577 return false;
2578}
2579
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002580static int xgbe_phy_mdio_reset_setup(struct xgbe_prv_data *pdata)
2581{
2582 struct xgbe_phy_data *phy_data = pdata->phy_data;
2583 unsigned int reg;
2584
2585 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2586 return 0;
2587
2588 reg = XP_IOREAD(pdata, XP_PROP_3);
2589 phy_data->mdio_reset = XP_GET_BITS(reg, XP_PROP_3, MDIO_RESET);
2590 switch (phy_data->mdio_reset) {
2591 case XGBE_MDIO_RESET_NONE:
2592 case XGBE_MDIO_RESET_I2C_GPIO:
2593 case XGBE_MDIO_RESET_INT_GPIO:
2594 break;
2595 default:
2596 dev_err(pdata->dev, "unsupported MDIO reset (%#x)\n",
2597 phy_data->mdio_reset);
2598 return -EINVAL;
2599 }
2600
2601 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO) {
2602 phy_data->mdio_reset_addr = XGBE_GPIO_ADDRESS_PCA9555 +
2603 XP_GET_BITS(reg, XP_PROP_3,
2604 MDIO_RESET_I2C_ADDR);
2605 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2606 MDIO_RESET_I2C_GPIO);
2607 } else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO) {
2608 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2609 MDIO_RESET_INT_GPIO);
2610 }
2611
2612 return 0;
2613}
2614
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002615static bool xgbe_phy_port_mode_mismatch(struct xgbe_prv_data *pdata)
2616{
2617 struct xgbe_phy_data *phy_data = pdata->phy_data;
2618
2619 switch (phy_data->port_mode) {
2620 case XGBE_PORT_MODE_BACKPLANE:
2621 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2622 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2623 return false;
2624 break;
2625 case XGBE_PORT_MODE_BACKPLANE_2500:
2626 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500)
2627 return false;
2628 break;
2629 case XGBE_PORT_MODE_1000BASE_T:
2630 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2631 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000))
2632 return false;
2633 break;
2634 case XGBE_PORT_MODE_1000BASE_X:
2635 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
2636 return false;
2637 break;
2638 case XGBE_PORT_MODE_NBASE_T:
2639 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2640 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2641 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500))
2642 return false;
2643 break;
2644 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002645 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2646 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002647 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2648 return false;
2649 break;
2650 case XGBE_PORT_MODE_10GBASE_R:
2651 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
2652 return false;
2653 break;
2654 case XGBE_PORT_MODE_SFP:
2655 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2656 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2657 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2658 return false;
2659 break;
2660 default:
2661 break;
2662 }
2663
2664 return true;
2665}
2666
2667static bool xgbe_phy_conn_type_mismatch(struct xgbe_prv_data *pdata)
2668{
2669 struct xgbe_phy_data *phy_data = pdata->phy_data;
2670
2671 switch (phy_data->port_mode) {
2672 case XGBE_PORT_MODE_BACKPLANE:
2673 case XGBE_PORT_MODE_BACKPLANE_2500:
2674 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
2675 return false;
2676 break;
2677 case XGBE_PORT_MODE_1000BASE_T:
2678 case XGBE_PORT_MODE_1000BASE_X:
2679 case XGBE_PORT_MODE_NBASE_T:
2680 case XGBE_PORT_MODE_10GBASE_T:
2681 case XGBE_PORT_MODE_10GBASE_R:
2682 if (phy_data->conn_type == XGBE_CONN_TYPE_MDIO)
2683 return false;
2684 break;
2685 case XGBE_PORT_MODE_SFP:
2686 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
2687 return false;
2688 break;
2689 default:
2690 break;
2691 }
2692
2693 return true;
2694}
2695
2696static bool xgbe_phy_port_enabled(struct xgbe_prv_data *pdata)
2697{
2698 unsigned int reg;
2699
2700 reg = XP_IOREAD(pdata, XP_PROP_0);
2701 if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
2702 return false;
2703 if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
2704 return false;
2705
2706 return true;
2707}
2708
2709static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
2710{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002711 struct xgbe_phy_data *phy_data = pdata->phy_data;
2712
2713 /* If we have an external PHY, free it */
2714 xgbe_phy_free_phy_device(pdata);
2715
2716 /* Reset SFP data */
2717 xgbe_phy_sfp_reset(phy_data);
2718 xgbe_phy_sfp_mod_absent(pdata);
2719
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002720 /* Power off the PHY */
2721 xgbe_phy_power_off(pdata);
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002722
2723 /* Stop the I2C controller */
2724 pdata->i2c_if.i2c_stop(pdata);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002725}
2726
2727static int xgbe_phy_start(struct xgbe_prv_data *pdata)
2728{
2729 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002730 int ret;
2731
2732 /* Start the I2C controller */
2733 ret = pdata->i2c_if.i2c_start(pdata);
2734 if (ret)
2735 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002736
Lendacky, Thomasb42c6762017-02-28 15:03:01 -06002737 /* Set the proper MDIO mode for the re-driver */
2738 if (phy_data->redrv && !phy_data->redrv_if) {
2739 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
2740 XGBE_MDIO_MODE_CL22);
2741 if (ret) {
2742 netdev_err(pdata->netdev,
2743 "redriver mdio port not compatible (%u)\n",
2744 phy_data->redrv_addr);
2745 return ret;
2746 }
2747 }
2748
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002749 /* Start in highest supported mode */
2750 xgbe_phy_set_mode(pdata, phy_data->start_mode);
2751
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002752 /* After starting the I2C controller, we can check for an SFP */
2753 switch (phy_data->port_mode) {
2754 case XGBE_PORT_MODE_SFP:
2755 xgbe_phy_sfp_detect(pdata);
2756 break;
2757 default:
2758 break;
2759 }
2760
2761 /* If we have an external PHY, start it */
2762 ret = xgbe_phy_find_phy_device(pdata);
2763 if (ret)
2764 goto err_i2c;
2765
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002766 return 0;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002767
2768err_i2c:
2769 pdata->i2c_if.i2c_stop(pdata);
2770
2771 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002772}
2773
2774static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
2775{
2776 struct xgbe_phy_data *phy_data = pdata->phy_data;
2777 enum xgbe_mode cur_mode;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002778 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002779
2780 /* Reset by power cycling the PHY */
2781 cur_mode = phy_data->cur_mode;
2782 xgbe_phy_power_off(pdata);
2783 xgbe_phy_set_mode(pdata, cur_mode);
2784
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002785 if (!phy_data->phydev)
2786 return 0;
2787
2788 /* Reset the external PHY */
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002789 ret = xgbe_phy_mdio_reset(pdata);
2790 if (ret)
2791 return ret;
2792
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002793 return phy_init_hw(phy_data->phydev);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002794}
2795
2796static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
2797{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002798 struct xgbe_phy_data *phy_data = pdata->phy_data;
2799
2800 /* Unregister for driving external PHYs */
2801 mdiobus_unregister(phy_data->mii);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002802}
2803
2804static int xgbe_phy_init(struct xgbe_prv_data *pdata)
2805{
2806 struct xgbe_phy_data *phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002807 struct mii_bus *mii;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002808 unsigned int reg;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002809 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002810
2811 /* Check if enabled */
2812 if (!xgbe_phy_port_enabled(pdata)) {
2813 dev_info(pdata->dev, "device is not enabled\n");
2814 return -ENODEV;
2815 }
2816
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002817 /* Initialize the I2C controller */
2818 ret = pdata->i2c_if.i2c_init(pdata);
2819 if (ret)
2820 return ret;
2821
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002822 phy_data = devm_kzalloc(pdata->dev, sizeof(*phy_data), GFP_KERNEL);
2823 if (!phy_data)
2824 return -ENOMEM;
2825 pdata->phy_data = phy_data;
2826
2827 reg = XP_IOREAD(pdata, XP_PROP_0);
2828 phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
2829 phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
2830 phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
2831 phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002832 phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002833 if (netif_msg_probe(pdata)) {
2834 dev_dbg(pdata->dev, "port mode=%u\n", phy_data->port_mode);
2835 dev_dbg(pdata->dev, "port id=%u\n", phy_data->port_id);
2836 dev_dbg(pdata->dev, "port speeds=%#x\n", phy_data->port_speeds);
2837 dev_dbg(pdata->dev, "conn type=%u\n", phy_data->conn_type);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002838 dev_dbg(pdata->dev, "mdio addr=%u\n", phy_data->mdio_addr);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002839 }
2840
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002841 reg = XP_IOREAD(pdata, XP_PROP_4);
2842 phy_data->redrv = XP_GET_BITS(reg, XP_PROP_4, REDRV_PRESENT);
2843 phy_data->redrv_if = XP_GET_BITS(reg, XP_PROP_4, REDRV_IF);
2844 phy_data->redrv_addr = XP_GET_BITS(reg, XP_PROP_4, REDRV_ADDR);
2845 phy_data->redrv_lane = XP_GET_BITS(reg, XP_PROP_4, REDRV_LANE);
2846 phy_data->redrv_model = XP_GET_BITS(reg, XP_PROP_4, REDRV_MODEL);
2847 if (phy_data->redrv && netif_msg_probe(pdata)) {
2848 dev_dbg(pdata->dev, "redrv present\n");
2849 dev_dbg(pdata->dev, "redrv i/f=%u\n", phy_data->redrv_if);
2850 dev_dbg(pdata->dev, "redrv addr=%#x\n", phy_data->redrv_addr);
2851 dev_dbg(pdata->dev, "redrv lane=%u\n", phy_data->redrv_lane);
2852 dev_dbg(pdata->dev, "redrv model=%u\n", phy_data->redrv_model);
2853 }
2854
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002855 /* Validate the connection requested */
2856 if (xgbe_phy_conn_type_mismatch(pdata)) {
2857 dev_err(pdata->dev, "phy mode/connection mismatch (%#x/%#x)\n",
2858 phy_data->port_mode, phy_data->conn_type);
Lendacky, Thomas5a4e4c82016-11-17 08:43:37 -06002859 return -EINVAL;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002860 }
2861
2862 /* Validate the mode requested */
2863 if (xgbe_phy_port_mode_mismatch(pdata)) {
2864 dev_err(pdata->dev, "phy mode/speed mismatch (%#x/%#x)\n",
2865 phy_data->port_mode, phy_data->port_speeds);
2866 return -EINVAL;
2867 }
2868
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002869 /* Check for and validate MDIO reset support */
2870 ret = xgbe_phy_mdio_reset_setup(pdata);
2871 if (ret)
2872 return ret;
2873
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002874 /* Validate the re-driver information */
2875 if (xgbe_phy_redrv_error(phy_data)) {
2876 dev_err(pdata->dev, "phy re-driver settings error\n");
2877 return -EINVAL;
2878 }
2879 pdata->kr_redrv = phy_data->redrv;
2880
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002881 /* Indicate current mode is unknown */
2882 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
2883
2884 /* Initialize supported features */
2885 pdata->phy.supported = 0;
2886
2887 switch (phy_data->port_mode) {
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002888 /* Backplane support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002889 case XGBE_PORT_MODE_BACKPLANE:
2890 pdata->phy.supported |= SUPPORTED_Autoneg;
2891 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2892 pdata->phy.supported |= SUPPORTED_Backplane;
2893 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2894 pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
2895 phy_data->start_mode = XGBE_MODE_KX_1000;
2896 }
2897 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2898 pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
2899 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2900 pdata->phy.supported |=
2901 SUPPORTED_10000baseR_FEC;
2902 phy_data->start_mode = XGBE_MODE_KR;
2903 }
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002904
2905 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002906 break;
2907 case XGBE_PORT_MODE_BACKPLANE_2500:
2908 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2909 pdata->phy.supported |= SUPPORTED_Backplane;
2910 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2911 phy_data->start_mode = XGBE_MODE_KX_2500;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002912
2913 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002914 break;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002915
2916 /* MDIO 1GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002917 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002918 pdata->phy.supported |= SUPPORTED_Autoneg;
2919 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2920 pdata->phy.supported |= SUPPORTED_TP;
2921 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2922 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2923 phy_data->start_mode = XGBE_MODE_SGMII_100;
2924 }
2925 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2926 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2927 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2928 }
2929
2930 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2931 break;
2932
2933 /* MDIO Base-X support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002934 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002935 pdata->phy.supported |= SUPPORTED_Autoneg;
2936 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2937 pdata->phy.supported |= SUPPORTED_FIBRE;
2938 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2939 phy_data->start_mode = XGBE_MODE_X;
2940
2941 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2942 break;
2943
2944 /* MDIO NBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002945 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002946 pdata->phy.supported |= SUPPORTED_Autoneg;
2947 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2948 pdata->phy.supported |= SUPPORTED_TP;
2949 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2950 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2951 phy_data->start_mode = XGBE_MODE_SGMII_100;
2952 }
2953 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2954 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2955 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2956 }
2957 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500) {
2958 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2959 phy_data->start_mode = XGBE_MODE_KX_2500;
2960 }
2961
2962 phy_data->phydev_mode = XGBE_MDIO_MODE_CL45;
2963 break;
2964
2965 /* 10GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002966 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002967 pdata->phy.supported |= SUPPORTED_Autoneg;
2968 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2969 pdata->phy.supported |= SUPPORTED_TP;
2970 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2971 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2972 phy_data->start_mode = XGBE_MODE_SGMII_100;
2973 }
2974 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2975 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2976 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2977 }
2978 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2979 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2980 phy_data->start_mode = XGBE_MODE_KR;
2981 }
2982
2983 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2984 break;
2985
2986 /* 10GBase-R support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002987 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002988 pdata->phy.supported |= SUPPORTED_Autoneg;
2989 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2990 pdata->phy.supported |= SUPPORTED_TP;
2991 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2992 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2993 pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
2994 phy_data->start_mode = XGBE_MODE_SFI;
2995
2996 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2997 break;
2998
2999 /* SFP support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003000 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06003001 pdata->phy.supported |= SUPPORTED_Autoneg;
3002 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
3003 pdata->phy.supported |= SUPPORTED_TP;
3004 pdata->phy.supported |= SUPPORTED_FIBRE;
3005 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
3006 pdata->phy.supported |= SUPPORTED_100baseT_Full;
3007 phy_data->start_mode = XGBE_MODE_SGMII_100;
3008 }
3009 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3010 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
3011 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3012 }
3013 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
3014 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
3015 phy_data->start_mode = XGBE_MODE_SFI;
3016 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
3017 pdata->phy.supported |=
3018 SUPPORTED_10000baseR_FEC;
3019 }
3020
3021 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
3022
3023 xgbe_phy_sfp_setup(pdata);
3024 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003025 default:
3026 return -EINVAL;
3027 }
3028
3029 if (netif_msg_probe(pdata))
3030 dev_dbg(pdata->dev, "phy supported=%#x\n",
3031 pdata->phy.supported);
3032
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06003033 if ((phy_data->conn_type & XGBE_CONN_TYPE_MDIO) &&
3034 (phy_data->phydev_mode != XGBE_MDIO_MODE_NONE)) {
3035 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
3036 phy_data->phydev_mode);
3037 if (ret) {
3038 dev_err(pdata->dev,
3039 "mdio port/clause not compatible (%d/%u)\n",
3040 phy_data->mdio_addr, phy_data->phydev_mode);
3041 return -EINVAL;
3042 }
3043 }
3044
3045 if (phy_data->redrv && !phy_data->redrv_if) {
3046 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
3047 XGBE_MDIO_MODE_CL22);
3048 if (ret) {
3049 dev_err(pdata->dev,
3050 "redriver mdio port not compatible (%u)\n",
3051 phy_data->redrv_addr);
3052 return -EINVAL;
3053 }
3054 }
3055
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06003056 /* Register for driving external PHYs */
3057 mii = devm_mdiobus_alloc(pdata->dev);
3058 if (!mii) {
3059 dev_err(pdata->dev, "mdiobus_alloc failed\n");
3060 return -ENOMEM;
3061 }
3062
3063 mii->priv = pdata;
3064 mii->name = "amd-xgbe-mii";
3065 mii->read = xgbe_phy_mii_read;
3066 mii->write = xgbe_phy_mii_write;
3067 mii->parent = pdata->dev;
3068 mii->phy_mask = ~0;
3069 snprintf(mii->id, sizeof(mii->id), "%s", dev_name(pdata->dev));
3070 ret = mdiobus_register(mii);
3071 if (ret) {
3072 dev_err(pdata->dev, "mdiobus_register failed\n");
3073 return ret;
3074 }
3075 phy_data->mii = mii;
3076
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003077 return 0;
3078}
3079
3080void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
3081{
3082 struct xgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
3083
3084 phy_impl->init = xgbe_phy_init;
3085 phy_impl->exit = xgbe_phy_exit;
3086
3087 phy_impl->reset = xgbe_phy_reset;
3088 phy_impl->start = xgbe_phy_start;
3089 phy_impl->stop = xgbe_phy_stop;
3090
3091 phy_impl->link_status = xgbe_phy_link_status;
3092
3093 phy_impl->valid_speed = xgbe_phy_valid_speed;
3094
3095 phy_impl->use_mode = xgbe_phy_use_mode;
3096 phy_impl->set_mode = xgbe_phy_set_mode;
3097 phy_impl->get_mode = xgbe_phy_get_mode;
3098 phy_impl->switch_mode = xgbe_phy_switch_mode;
3099 phy_impl->cur_mode = xgbe_phy_cur_mode;
3100
3101 phy_impl->an_mode = xgbe_phy_an_mode;
3102
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06003103 phy_impl->an_config = xgbe_phy_an_config;
3104
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06003105 phy_impl->an_advertising = xgbe_phy_an_advertising;
3106
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003107 phy_impl->an_outcome = xgbe_phy_an_outcome;
3108}