blob: 04804cbb7dc1cd694567667074900e90ae3c6768 [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;
719 }
720
721 pdata->phy.advertising &= ~ADVERTISED_Autoneg;
722 pdata->phy.advertising &= ~ADVERTISED_TP;
723 pdata->phy.advertising &= ~ADVERTISED_FIBRE;
724 pdata->phy.advertising &= ~ADVERTISED_100baseT_Full;
725 pdata->phy.advertising &= ~ADVERTISED_1000baseT_Full;
726 pdata->phy.advertising &= ~ADVERTISED_10000baseT_Full;
727 pdata->phy.advertising &= ~ADVERTISED_10000baseR_FEC;
728
729 switch (phy_data->sfp_base) {
730 case XGBE_SFP_BASE_1000_T:
731 case XGBE_SFP_BASE_1000_SX:
732 case XGBE_SFP_BASE_1000_LX:
733 case XGBE_SFP_BASE_1000_CX:
734 pdata->phy.speed = SPEED_UNKNOWN;
735 pdata->phy.duplex = DUPLEX_UNKNOWN;
736 pdata->phy.autoneg = AUTONEG_ENABLE;
737 pdata->phy.advertising |= ADVERTISED_Autoneg;
738 break;
739 case XGBE_SFP_BASE_10000_SR:
740 case XGBE_SFP_BASE_10000_LR:
741 case XGBE_SFP_BASE_10000_LRM:
742 case XGBE_SFP_BASE_10000_ER:
743 case XGBE_SFP_BASE_10000_CR:
744 default:
745 pdata->phy.speed = SPEED_10000;
746 pdata->phy.duplex = DUPLEX_FULL;
747 pdata->phy.autoneg = AUTONEG_DISABLE;
748 break;
749 }
750
751 switch (phy_data->sfp_base) {
752 case XGBE_SFP_BASE_1000_T:
753 case XGBE_SFP_BASE_1000_CX:
754 case XGBE_SFP_BASE_10000_CR:
755 pdata->phy.advertising |= ADVERTISED_TP;
756 break;
757 default:
758 pdata->phy.advertising |= ADVERTISED_FIBRE;
759 }
760
761 switch (phy_data->sfp_speed) {
762 case XGBE_SFP_SPEED_100_1000:
763 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
764 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
765 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
766 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
767 break;
768 case XGBE_SFP_SPEED_1000:
769 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
770 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
771 break;
772 case XGBE_SFP_SPEED_10000:
773 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
774 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
775 break;
776 default:
777 /* Choose the fastest supported speed */
778 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
779 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
780 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
781 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
782 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
783 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
784 }
785}
786
787static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
788 enum xgbe_sfp_speed sfp_speed)
789{
790 u8 *sfp_base, min, max;
791
792 sfp_base = sfp_eeprom->base;
793
794 switch (sfp_speed) {
795 case XGBE_SFP_SPEED_1000:
796 min = XGBE_SFP_BASE_BR_1GBE_MIN;
797 max = XGBE_SFP_BASE_BR_1GBE_MAX;
798 break;
799 case XGBE_SFP_SPEED_10000:
800 min = XGBE_SFP_BASE_BR_10GBE_MIN;
801 max = XGBE_SFP_BASE_BR_10GBE_MAX;
802 break;
803 default:
804 return false;
805 }
806
807 return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
808 (sfp_base[XGBE_SFP_BASE_BR] <= max));
809}
810
811static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
812{
813 struct xgbe_phy_data *phy_data = pdata->phy_data;
814
815 if (phy_data->phydev) {
816 phy_detach(phy_data->phydev);
817 phy_device_remove(phy_data->phydev);
818 phy_device_free(phy_data->phydev);
819 phy_data->phydev = NULL;
820 }
821}
822
823static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
824{
825 struct xgbe_phy_data *phy_data = pdata->phy_data;
826 unsigned int phy_id = phy_data->phydev->phy_id;
827
828 if ((phy_id & 0xfffffff0) != 0x01ff0cc0)
829 return false;
830
831 /* Enable Base-T AN */
832 phy_write(phy_data->phydev, 0x16, 0x0001);
833 phy_write(phy_data->phydev, 0x00, 0x9140);
834 phy_write(phy_data->phydev, 0x16, 0x0000);
835
836 /* Enable SGMII at 100Base-T/1000Base-T Full Duplex */
837 phy_write(phy_data->phydev, 0x1b, 0x9084);
838 phy_write(phy_data->phydev, 0x09, 0x0e00);
839 phy_write(phy_data->phydev, 0x00, 0x8140);
840 phy_write(phy_data->phydev, 0x04, 0x0d01);
841 phy_write(phy_data->phydev, 0x00, 0x9140);
842
843 phy_data->phydev->supported = PHY_GBIT_FEATURES;
844 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
845 phy_data->phydev->advertising = phy_data->phydev->supported;
846
847 netif_dbg(pdata, drv, pdata->netdev,
848 "Finisar PHY quirk in place\n");
849
850 return true;
851}
852
853static void xgbe_phy_external_phy_quirks(struct xgbe_prv_data *pdata)
854{
855 if (xgbe_phy_finisar_phy_quirks(pdata))
856 return;
857}
858
859static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
860{
861 struct xgbe_phy_data *phy_data = pdata->phy_data;
862 struct phy_device *phydev;
863 int ret;
864
865 /* If we already have a PHY, just return */
866 if (phy_data->phydev)
867 return 0;
868
869 /* Check for the use of an external PHY */
870 if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE)
871 return 0;
872
873 /* For SFP, only use an external PHY if available */
874 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
875 !phy_data->sfp_phy_avail)
876 return 0;
877
Lendacky, Thomasb42c6762017-02-28 15:03:01 -0600878 /* Set the proper MDIO mode for the PHY */
879 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
880 phy_data->phydev_mode);
881 if (ret) {
882 netdev_err(pdata->netdev,
883 "mdio port/clause not compatible (%u/%u)\n",
884 phy_data->mdio_addr, phy_data->phydev_mode);
885 return ret;
886 }
887
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600888 /* Create and connect to the PHY device */
889 phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
890 (phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
891 if (IS_ERR(phydev)) {
892 netdev_err(pdata->netdev, "get_phy_device failed\n");
893 return -ENODEV;
894 }
895 netif_dbg(pdata, drv, pdata->netdev, "external PHY id is %#010x\n",
896 phydev->phy_id);
897
898 /*TODO: If c45, add request_module based on one of the MMD ids? */
899
900 ret = phy_device_register(phydev);
901 if (ret) {
902 netdev_err(pdata->netdev, "phy_device_register failed\n");
903 phy_device_free(phydev);
904 return ret;
905 }
906
907 ret = phy_attach_direct(pdata->netdev, phydev, phydev->dev_flags,
908 PHY_INTERFACE_MODE_SGMII);
909 if (ret) {
910 netdev_err(pdata->netdev, "phy_attach_direct failed\n");
911 phy_device_remove(phydev);
912 phy_device_free(phydev);
913 return ret;
914 }
915 phy_data->phydev = phydev;
916
917 xgbe_phy_external_phy_quirks(pdata);
918 phydev->advertising &= pdata->phy.advertising;
919
920 phy_start_aneg(phy_data->phydev);
921
922 return 0;
923}
924
925static void xgbe_phy_sfp_external_phy(struct xgbe_prv_data *pdata)
926{
927 struct xgbe_phy_data *phy_data = pdata->phy_data;
928 int ret;
929
930 if (!phy_data->sfp_changed)
931 return;
932
933 phy_data->sfp_phy_avail = 0;
934
935 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
936 return;
937
938 /* Check access to the PHY by reading CTRL1 */
939 ret = xgbe_phy_i2c_mii_read(pdata, MII_BMCR);
940 if (ret < 0)
941 return;
942
943 /* Successfully accessed the PHY */
944 phy_data->sfp_phy_avail = 1;
945}
946
947static bool xgbe_phy_belfuse_parse_quirks(struct xgbe_prv_data *pdata)
948{
949 struct xgbe_phy_data *phy_data = pdata->phy_data;
950 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
951
952 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
953 XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN))
954 return false;
955
956 if (!memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
957 XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN)) {
958 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
959 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
960 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
961 if (phy_data->sfp_changed)
962 netif_dbg(pdata, drv, pdata->netdev,
963 "Bel-Fuse SFP quirk in place\n");
964 return true;
965 }
966
967 return false;
968}
969
970static bool xgbe_phy_sfp_parse_quirks(struct xgbe_prv_data *pdata)
971{
972 if (xgbe_phy_belfuse_parse_quirks(pdata))
973 return true;
974
975 return false;
976}
977
978static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
979{
980 struct xgbe_phy_data *phy_data = pdata->phy_data;
981 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
982 u8 *sfp_base;
983
984 sfp_base = sfp_eeprom->base;
985
986 if (sfp_base[XGBE_SFP_BASE_ID] != XGBE_SFP_ID_SFP)
987 return;
988
989 if (sfp_base[XGBE_SFP_BASE_EXT_ID] != XGBE_SFP_EXT_ID_SFP)
990 return;
991
992 if (xgbe_phy_sfp_parse_quirks(pdata))
993 return;
994
995 /* Assume ACTIVE cable unless told it is PASSIVE */
996 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
997 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
998 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
999 } else {
1000 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
1001 }
1002
1003 /* Determine the type of SFP */
1004 if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
1005 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
1006 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
1007 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
1008 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM)
1009 phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM;
1010 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER)
1011 phy_data->sfp_base = XGBE_SFP_BASE_10000_ER;
1012 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX)
1013 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
1014 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX)
1015 phy_data->sfp_base = XGBE_SFP_BASE_1000_LX;
1016 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX)
1017 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
1018 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
1019 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
1020 else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
1021 xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
1022 phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
1023
1024 switch (phy_data->sfp_base) {
1025 case XGBE_SFP_BASE_1000_T:
1026 phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000;
1027 break;
1028 case XGBE_SFP_BASE_1000_SX:
1029 case XGBE_SFP_BASE_1000_LX:
1030 case XGBE_SFP_BASE_1000_CX:
1031 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
1032 break;
1033 case XGBE_SFP_BASE_10000_SR:
1034 case XGBE_SFP_BASE_10000_LR:
1035 case XGBE_SFP_BASE_10000_LRM:
1036 case XGBE_SFP_BASE_10000_ER:
1037 case XGBE_SFP_BASE_10000_CR:
1038 phy_data->sfp_speed = XGBE_SFP_SPEED_10000;
1039 break;
1040 default:
1041 break;
1042 }
1043}
1044
1045static void xgbe_phy_sfp_eeprom_info(struct xgbe_prv_data *pdata,
1046 struct xgbe_sfp_eeprom *sfp_eeprom)
1047{
1048 struct xgbe_sfp_ascii sfp_ascii;
1049 char *sfp_data = (char *)&sfp_ascii;
1050
1051 netif_dbg(pdata, drv, pdata->netdev, "SFP detected:\n");
1052 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
1053 XGBE_SFP_BASE_VENDOR_NAME_LEN);
1054 sfp_data[XGBE_SFP_BASE_VENDOR_NAME_LEN] = '\0';
1055 netif_dbg(pdata, drv, pdata->netdev, " vendor: %s\n",
1056 sfp_data);
1057
1058 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
1059 XGBE_SFP_BASE_VENDOR_PN_LEN);
1060 sfp_data[XGBE_SFP_BASE_VENDOR_PN_LEN] = '\0';
1061 netif_dbg(pdata, drv, pdata->netdev, " part number: %s\n",
1062 sfp_data);
1063
1064 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_REV],
1065 XGBE_SFP_BASE_VENDOR_REV_LEN);
1066 sfp_data[XGBE_SFP_BASE_VENDOR_REV_LEN] = '\0';
1067 netif_dbg(pdata, drv, pdata->netdev, " revision level: %s\n",
1068 sfp_data);
1069
1070 memcpy(sfp_data, &sfp_eeprom->extd[XGBE_SFP_BASE_VENDOR_SN],
1071 XGBE_SFP_BASE_VENDOR_SN_LEN);
1072 sfp_data[XGBE_SFP_BASE_VENDOR_SN_LEN] = '\0';
1073 netif_dbg(pdata, drv, pdata->netdev, " serial number: %s\n",
1074 sfp_data);
1075}
1076
1077static bool xgbe_phy_sfp_verify_eeprom(u8 cc_in, u8 *buf, unsigned int len)
1078{
1079 u8 cc;
1080
1081 for (cc = 0; len; buf++, len--)
1082 cc += *buf;
1083
1084 return (cc == cc_in) ? true : false;
1085}
1086
1087static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
1088{
1089 struct xgbe_phy_data *phy_data = pdata->phy_data;
1090 struct xgbe_sfp_eeprom sfp_eeprom;
1091 u8 eeprom_addr;
1092 int ret;
1093
1094 ret = xgbe_phy_sfp_get_mux(pdata);
1095 if (ret) {
1096 netdev_err(pdata->netdev, "I2C error setting SFP MUX\n");
1097 return ret;
1098 }
1099
1100 /* Read the SFP serial ID eeprom */
1101 eeprom_addr = 0;
1102 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
1103 &eeprom_addr, sizeof(eeprom_addr),
1104 &sfp_eeprom, sizeof(sfp_eeprom));
1105 if (ret) {
1106 netdev_err(pdata->netdev, "I2C error reading SFP EEPROM\n");
1107 goto put;
1108 }
1109
1110 /* Validate the contents read */
1111 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[XGBE_SFP_BASE_CC],
1112 sfp_eeprom.base,
1113 sizeof(sfp_eeprom.base) - 1)) {
1114 ret = -EINVAL;
1115 goto put;
1116 }
1117
1118 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[XGBE_SFP_EXTD_CC],
1119 sfp_eeprom.extd,
1120 sizeof(sfp_eeprom.extd) - 1)) {
1121 ret = -EINVAL;
1122 goto put;
1123 }
1124
1125 /* Check for an added or changed SFP */
1126 if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
1127 phy_data->sfp_changed = 1;
1128
1129 if (netif_msg_drv(pdata))
1130 xgbe_phy_sfp_eeprom_info(pdata, &sfp_eeprom);
1131
1132 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
1133
1134 if (sfp_eeprom.extd[XGBE_SFP_EXTD_SFF_8472]) {
1135 u8 diag_type = sfp_eeprom.extd[XGBE_SFP_EXTD_DIAG];
1136
1137 if (!(diag_type & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
1138 phy_data->sfp_diags = 1;
1139 }
1140
1141 xgbe_phy_free_phy_device(pdata);
1142 } else {
1143 phy_data->sfp_changed = 0;
1144 }
1145
1146put:
1147 xgbe_phy_sfp_put_mux(pdata);
1148
1149 return ret;
1150}
1151
1152static void xgbe_phy_sfp_signals(struct xgbe_prv_data *pdata)
1153{
1154 struct xgbe_phy_data *phy_data = pdata->phy_data;
1155 unsigned int gpio_input;
1156 u8 gpio_reg, gpio_ports[2];
1157 int ret;
1158
1159 /* Read the input port registers */
1160 gpio_reg = 0;
1161 ret = xgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
1162 &gpio_reg, sizeof(gpio_reg),
1163 gpio_ports, sizeof(gpio_ports));
1164 if (ret) {
1165 netdev_err(pdata->netdev, "I2C error reading SFP GPIOs\n");
1166 return;
1167 }
1168
1169 gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
1170
1171 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_MOD_ABSENT) {
1172 /* No GPIO, just assume the module is present for now */
1173 phy_data->sfp_mod_absent = 0;
1174 } else {
1175 if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
1176 phy_data->sfp_mod_absent = 0;
1177 }
1178
1179 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_RX_LOS) &&
1180 (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
1181 phy_data->sfp_rx_los = 1;
1182
1183 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_TX_FAULT) &&
1184 (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
1185 phy_data->sfp_tx_fault = 1;
1186}
1187
1188static void xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
1189{
1190 struct xgbe_phy_data *phy_data = pdata->phy_data;
1191
1192 xgbe_phy_free_phy_device(pdata);
1193
1194 phy_data->sfp_mod_absent = 1;
1195 phy_data->sfp_phy_avail = 0;
1196 memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
1197}
1198
1199static void xgbe_phy_sfp_reset(struct xgbe_phy_data *phy_data)
1200{
1201 phy_data->sfp_rx_los = 0;
1202 phy_data->sfp_tx_fault = 0;
1203 phy_data->sfp_mod_absent = 1;
1204 phy_data->sfp_diags = 0;
1205 phy_data->sfp_base = XGBE_SFP_BASE_UNKNOWN;
1206 phy_data->sfp_cable = XGBE_SFP_CABLE_UNKNOWN;
1207 phy_data->sfp_speed = XGBE_SFP_SPEED_UNKNOWN;
1208}
1209
1210static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
1211{
1212 struct xgbe_phy_data *phy_data = pdata->phy_data;
1213 int ret;
1214
1215 /* Reset the SFP signals and info */
1216 xgbe_phy_sfp_reset(phy_data);
1217
1218 ret = xgbe_phy_get_comm_ownership(pdata);
1219 if (ret)
1220 return;
1221
1222 /* Read the SFP signals and check for module presence */
1223 xgbe_phy_sfp_signals(pdata);
1224 if (phy_data->sfp_mod_absent) {
1225 xgbe_phy_sfp_mod_absent(pdata);
1226 goto put;
1227 }
1228
1229 ret = xgbe_phy_sfp_read_eeprom(pdata);
1230 if (ret) {
1231 /* Treat any error as if there isn't an SFP plugged in */
1232 xgbe_phy_sfp_reset(phy_data);
1233 xgbe_phy_sfp_mod_absent(pdata);
1234 goto put;
1235 }
1236
1237 xgbe_phy_sfp_parse_eeprom(pdata);
1238
1239 xgbe_phy_sfp_external_phy(pdata);
1240
1241put:
1242 xgbe_phy_sfp_phy_settings(pdata);
1243
1244 xgbe_phy_put_comm_ownership(pdata);
1245}
1246
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001247static void xgbe_phy_phydev_flowctrl(struct xgbe_prv_data *pdata)
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001248{
1249 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001250 u16 lcl_adv = 0, rmt_adv = 0;
1251 u8 fc;
1252
1253 pdata->phy.tx_pause = 0;
1254 pdata->phy.rx_pause = 0;
1255
1256 if (!phy_data->phydev)
1257 return;
1258
1259 if (phy_data->phydev->advertising & ADVERTISED_Pause)
1260 lcl_adv |= ADVERTISE_PAUSE_CAP;
1261 if (phy_data->phydev->advertising & ADVERTISED_Asym_Pause)
1262 lcl_adv |= ADVERTISE_PAUSE_ASYM;
1263
1264 if (phy_data->phydev->pause) {
1265 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1266 rmt_adv |= LPA_PAUSE_CAP;
1267 }
1268 if (phy_data->phydev->asym_pause) {
1269 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1270 rmt_adv |= LPA_PAUSE_ASYM;
1271 }
1272
1273 fc = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
1274 if (fc & FLOW_CTRL_TX)
1275 pdata->phy.tx_pause = 1;
1276 if (fc & FLOW_CTRL_RX)
1277 pdata->phy.rx_pause = 1;
1278}
1279
1280static enum xgbe_mode xgbe_phy_an37_sgmii_outcome(struct xgbe_prv_data *pdata)
1281{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001282 enum xgbe_mode mode;
1283
1284 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1285 pdata->phy.lp_advertising |= ADVERTISED_TP;
1286
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001287 /* Use external PHY to determine flow control */
1288 if (pdata->phy.pause_autoneg)
1289 xgbe_phy_phydev_flowctrl(pdata);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001290
1291 switch (pdata->an_status & XGBE_SGMII_AN_LINK_SPEED) {
1292 case XGBE_SGMII_AN_LINK_SPEED_100:
1293 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1294 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Full;
1295 mode = XGBE_MODE_SGMII_100;
1296 } else {
1297 /* Half-duplex not supported */
1298 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Half;
1299 mode = XGBE_MODE_UNKNOWN;
1300 }
1301 break;
1302 case XGBE_SGMII_AN_LINK_SPEED_1000:
1303 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1304 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1305 mode = XGBE_MODE_SGMII_1000;
1306 } else {
1307 /* Half-duplex not supported */
1308 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1309 mode = XGBE_MODE_UNKNOWN;
1310 }
1311 break;
1312 default:
1313 mode = XGBE_MODE_UNKNOWN;
1314 }
1315
1316 return mode;
1317}
1318
1319static enum xgbe_mode xgbe_phy_an37_outcome(struct xgbe_prv_data *pdata)
1320{
1321 enum xgbe_mode mode;
1322 unsigned int ad_reg, lp_reg;
1323
1324 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1325 pdata->phy.lp_advertising |= ADVERTISED_FIBRE;
1326
1327 /* Compare Advertisement and Link Partner register */
1328 ad_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
1329 lp_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_LP_ABILITY);
1330 if (lp_reg & 0x100)
1331 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1332 if (lp_reg & 0x80)
1333 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1334
1335 if (pdata->phy.pause_autoneg) {
1336 /* Set flow control based on auto-negotiation result */
1337 pdata->phy.tx_pause = 0;
1338 pdata->phy.rx_pause = 0;
1339
1340 if (ad_reg & lp_reg & 0x100) {
1341 pdata->phy.tx_pause = 1;
1342 pdata->phy.rx_pause = 1;
1343 } else if (ad_reg & lp_reg & 0x80) {
1344 if (ad_reg & 0x100)
1345 pdata->phy.rx_pause = 1;
1346 else if (lp_reg & 0x100)
1347 pdata->phy.tx_pause = 1;
1348 }
1349 }
1350
1351 if (lp_reg & 0x40)
1352 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1353 if (lp_reg & 0x20)
1354 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1355
1356 /* Half duplex is not supported */
1357 ad_reg &= lp_reg;
1358 mode = (ad_reg & 0x20) ? XGBE_MODE_X : XGBE_MODE_UNKNOWN;
1359
1360 return mode;
1361}
1362
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001363static enum xgbe_mode xgbe_phy_an73_redrv_outcome(struct xgbe_prv_data *pdata)
1364{
1365 struct xgbe_phy_data *phy_data = pdata->phy_data;
1366 enum xgbe_mode mode;
1367 unsigned int ad_reg, lp_reg;
1368
1369 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1370 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1371
1372 /* Use external PHY to determine flow control */
1373 if (pdata->phy.pause_autoneg)
1374 xgbe_phy_phydev_flowctrl(pdata);
1375
1376 /* Compare Advertisement and Link Partner register 2 */
1377 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1378 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1379 if (lp_reg & 0x80)
1380 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1381 if (lp_reg & 0x20)
1382 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1383
1384 ad_reg &= lp_reg;
1385 if (ad_reg & 0x80) {
1386 switch (phy_data->port_mode) {
1387 case XGBE_PORT_MODE_BACKPLANE:
1388 mode = XGBE_MODE_KR;
1389 break;
1390 default:
1391 mode = XGBE_MODE_SFI;
1392 break;
1393 }
1394 } else if (ad_reg & 0x20) {
1395 switch (phy_data->port_mode) {
1396 case XGBE_PORT_MODE_BACKPLANE:
1397 mode = XGBE_MODE_KX_1000;
1398 break;
1399 case XGBE_PORT_MODE_1000BASE_X:
1400 mode = XGBE_MODE_X;
1401 break;
1402 case XGBE_PORT_MODE_SFP:
1403 switch (phy_data->sfp_base) {
1404 case XGBE_SFP_BASE_1000_T:
1405 if (phy_data->phydev &&
1406 (phy_data->phydev->speed == SPEED_100))
1407 mode = XGBE_MODE_SGMII_100;
1408 else
1409 mode = XGBE_MODE_SGMII_1000;
1410 break;
1411 case XGBE_SFP_BASE_1000_SX:
1412 case XGBE_SFP_BASE_1000_LX:
1413 case XGBE_SFP_BASE_1000_CX:
1414 default:
1415 mode = XGBE_MODE_X;
1416 break;
1417 }
1418 break;
1419 default:
1420 if (phy_data->phydev &&
1421 (phy_data->phydev->speed == SPEED_100))
1422 mode = XGBE_MODE_SGMII_100;
1423 else
1424 mode = XGBE_MODE_SGMII_1000;
1425 break;
1426 }
1427 } else {
1428 mode = XGBE_MODE_UNKNOWN;
1429 }
1430
1431 /* Compare Advertisement and Link Partner register 3 */
1432 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1433 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1434 if (lp_reg & 0xc000)
1435 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1436
1437 return mode;
1438}
1439
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001440static enum xgbe_mode xgbe_phy_an73_outcome(struct xgbe_prv_data *pdata)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001441{
1442 enum xgbe_mode mode;
1443 unsigned int ad_reg, lp_reg;
1444
1445 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1446 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1447
1448 /* Compare Advertisement and Link Partner register 1 */
1449 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1450 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1451 if (lp_reg & 0x400)
1452 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1453 if (lp_reg & 0x800)
1454 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1455
1456 if (pdata->phy.pause_autoneg) {
1457 /* Set flow control based on auto-negotiation result */
1458 pdata->phy.tx_pause = 0;
1459 pdata->phy.rx_pause = 0;
1460
1461 if (ad_reg & lp_reg & 0x400) {
1462 pdata->phy.tx_pause = 1;
1463 pdata->phy.rx_pause = 1;
1464 } else if (ad_reg & lp_reg & 0x800) {
1465 if (ad_reg & 0x400)
1466 pdata->phy.rx_pause = 1;
1467 else if (lp_reg & 0x400)
1468 pdata->phy.tx_pause = 1;
1469 }
1470 }
1471
1472 /* Compare Advertisement and Link Partner register 2 */
1473 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1474 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1475 if (lp_reg & 0x80)
1476 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1477 if (lp_reg & 0x20)
1478 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1479
1480 ad_reg &= lp_reg;
1481 if (ad_reg & 0x80)
1482 mode = XGBE_MODE_KR;
1483 else if (ad_reg & 0x20)
1484 mode = XGBE_MODE_KX_1000;
1485 else
1486 mode = XGBE_MODE_UNKNOWN;
1487
1488 /* Compare Advertisement and Link Partner register 3 */
1489 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1490 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1491 if (lp_reg & 0xc000)
1492 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1493
1494 return mode;
1495}
1496
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001497static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
1498{
1499 switch (pdata->an_mode) {
1500 case XGBE_AN_MODE_CL73:
1501 return xgbe_phy_an73_outcome(pdata);
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001502 case XGBE_AN_MODE_CL73_REDRV:
1503 return xgbe_phy_an73_redrv_outcome(pdata);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001504 case XGBE_AN_MODE_CL37:
1505 return xgbe_phy_an37_outcome(pdata);
1506 case XGBE_AN_MODE_CL37_SGMII:
1507 return xgbe_phy_an37_sgmii_outcome(pdata);
1508 default:
1509 return XGBE_MODE_UNKNOWN;
1510 }
1511}
1512
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001513static unsigned int xgbe_phy_an_advertising(struct xgbe_prv_data *pdata)
1514{
1515 struct xgbe_phy_data *phy_data = pdata->phy_data;
1516 unsigned int advertising;
1517
1518 /* Without a re-driver, just return current advertising */
1519 if (!phy_data->redrv)
1520 return pdata->phy.advertising;
1521
1522 /* With the KR re-driver we need to advertise a single speed */
1523 advertising = pdata->phy.advertising;
1524 advertising &= ~ADVERTISED_1000baseKX_Full;
1525 advertising &= ~ADVERTISED_10000baseKR_Full;
1526
1527 switch (phy_data->port_mode) {
1528 case XGBE_PORT_MODE_BACKPLANE:
1529 advertising |= ADVERTISED_10000baseKR_Full;
1530 break;
1531 case XGBE_PORT_MODE_BACKPLANE_2500:
1532 advertising |= ADVERTISED_1000baseKX_Full;
1533 break;
1534 case XGBE_PORT_MODE_1000BASE_T:
1535 case XGBE_PORT_MODE_1000BASE_X:
1536 case XGBE_PORT_MODE_NBASE_T:
1537 advertising |= ADVERTISED_1000baseKX_Full;
1538 break;
1539 case XGBE_PORT_MODE_10GBASE_T:
1540 if (phy_data->phydev &&
1541 (phy_data->phydev->speed == SPEED_10000))
1542 advertising |= ADVERTISED_10000baseKR_Full;
1543 else
1544 advertising |= ADVERTISED_1000baseKX_Full;
1545 break;
1546 case XGBE_PORT_MODE_10GBASE_R:
1547 advertising |= ADVERTISED_10000baseKR_Full;
1548 break;
1549 case XGBE_PORT_MODE_SFP:
1550 switch (phy_data->sfp_base) {
1551 case XGBE_SFP_BASE_1000_T:
1552 case XGBE_SFP_BASE_1000_SX:
1553 case XGBE_SFP_BASE_1000_LX:
1554 case XGBE_SFP_BASE_1000_CX:
1555 advertising |= ADVERTISED_1000baseKX_Full;
1556 break;
1557 default:
1558 advertising |= ADVERTISED_10000baseKR_Full;
1559 break;
1560 }
1561 break;
1562 default:
1563 advertising |= ADVERTISED_10000baseKR_Full;
1564 break;
1565 }
1566
1567 return advertising;
1568}
1569
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001570static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1571{
1572 struct xgbe_phy_data *phy_data = pdata->phy_data;
1573 int ret;
1574
1575 ret = xgbe_phy_find_phy_device(pdata);
1576 if (ret)
1577 return ret;
1578
1579 if (!phy_data->phydev)
1580 return 0;
1581
1582 phy_data->phydev->autoneg = pdata->phy.autoneg;
1583 phy_data->phydev->advertising = phy_data->phydev->supported &
1584 pdata->phy.advertising;
1585
1586 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1587 phy_data->phydev->speed = pdata->phy.speed;
1588 phy_data->phydev->duplex = pdata->phy.duplex;
1589 }
1590
1591 ret = phy_start_aneg(phy_data->phydev);
1592
1593 return ret;
1594}
1595
1596static enum xgbe_an_mode xgbe_phy_an_sfp_mode(struct xgbe_phy_data *phy_data)
1597{
1598 switch (phy_data->sfp_base) {
1599 case XGBE_SFP_BASE_1000_T:
1600 return XGBE_AN_MODE_CL37_SGMII;
1601 case XGBE_SFP_BASE_1000_SX:
1602 case XGBE_SFP_BASE_1000_LX:
1603 case XGBE_SFP_BASE_1000_CX:
1604 return XGBE_AN_MODE_CL37;
1605 default:
1606 return XGBE_AN_MODE_NONE;
1607 }
1608}
1609
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001610static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata)
1611{
1612 struct xgbe_phy_data *phy_data = pdata->phy_data;
1613
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001614 /* A KR re-driver will always require CL73 AN */
1615 if (phy_data->redrv)
1616 return XGBE_AN_MODE_CL73_REDRV;
1617
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001618 switch (phy_data->port_mode) {
1619 case XGBE_PORT_MODE_BACKPLANE:
1620 return XGBE_AN_MODE_CL73;
1621 case XGBE_PORT_MODE_BACKPLANE_2500:
1622 return XGBE_AN_MODE_NONE;
1623 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001624 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001625 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001626 return XGBE_AN_MODE_CL37;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001627 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001628 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001629 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001630 return XGBE_AN_MODE_CL73;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001631 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001632 return XGBE_AN_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001633 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001634 return xgbe_phy_an_sfp_mode(phy_data);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001635 default:
1636 return XGBE_AN_MODE_NONE;
1637 }
1638}
1639
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001640static int xgbe_phy_set_redrv_mode_mdio(struct xgbe_prv_data *pdata,
1641 enum xgbe_phy_redrv_mode mode)
1642{
1643 struct xgbe_phy_data *phy_data = pdata->phy_data;
1644 u16 redrv_reg, redrv_val;
1645
1646 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1647 redrv_val = (u16)mode;
1648
1649 return pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr,
1650 redrv_reg, redrv_val);
1651}
1652
1653static int xgbe_phy_set_redrv_mode_i2c(struct xgbe_prv_data *pdata,
1654 enum xgbe_phy_redrv_mode mode)
1655{
1656 struct xgbe_phy_data *phy_data = pdata->phy_data;
1657 unsigned int redrv_reg;
1658 int ret;
1659
1660 /* Calculate the register to write */
1661 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1662
1663 ret = xgbe_phy_redrv_write(pdata, redrv_reg, mode);
1664
1665 return ret;
1666}
1667
1668static void xgbe_phy_set_redrv_mode(struct xgbe_prv_data *pdata)
1669{
1670 struct xgbe_phy_data *phy_data = pdata->phy_data;
1671 enum xgbe_phy_redrv_mode mode;
1672 int ret;
1673
1674 if (!phy_data->redrv)
1675 return;
1676
1677 mode = XGBE_PHY_REDRV_MODE_CX;
1678 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
1679 (phy_data->sfp_base != XGBE_SFP_BASE_1000_CX) &&
1680 (phy_data->sfp_base != XGBE_SFP_BASE_10000_CR))
1681 mode = XGBE_PHY_REDRV_MODE_SR;
1682
1683 ret = xgbe_phy_get_comm_ownership(pdata);
1684 if (ret)
1685 return;
1686
1687 if (phy_data->redrv_if)
1688 xgbe_phy_set_redrv_mode_i2c(pdata, mode);
1689 else
1690 xgbe_phy_set_redrv_mode_mdio(pdata, mode);
1691
1692 xgbe_phy_put_comm_ownership(pdata);
1693}
1694
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001695static void xgbe_phy_start_ratechange(struct xgbe_prv_data *pdata)
1696{
1697 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1698 return;
1699
1700 /* Log if a previous command did not complete */
1701 netif_dbg(pdata, link, pdata->netdev,
1702 "firmware mailbox not ready for command\n");
1703}
1704
1705static void xgbe_phy_complete_ratechange(struct xgbe_prv_data *pdata)
1706{
1707 unsigned int wait;
1708
1709 /* Wait for command to complete */
1710 wait = XGBE_RATECHANGE_COUNT;
1711 while (wait--) {
1712 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1713 return;
1714
1715 usleep_range(1000, 2000);
1716 }
1717
1718 netif_dbg(pdata, link, pdata->netdev,
1719 "firmware mailbox command did not complete\n");
1720}
1721
1722static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
1723{
1724 unsigned int s0;
1725
1726 xgbe_phy_start_ratechange(pdata);
1727
1728 /* Receiver Reset Cycle */
1729 s0 = 0;
1730 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1731 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1732
1733 /* Call FW to make the change */
1734 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1735 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1736 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1737
1738 xgbe_phy_complete_ratechange(pdata);
1739
1740 netif_dbg(pdata, link, pdata->netdev, "receiver reset complete\n");
1741}
1742
1743static void xgbe_phy_power_off(struct xgbe_prv_data *pdata)
1744{
1745 struct xgbe_phy_data *phy_data = pdata->phy_data;
1746
1747 xgbe_phy_start_ratechange(pdata);
1748
1749 /* Call FW to make the change */
1750 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1751 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1752 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1753
1754 xgbe_phy_complete_ratechange(pdata);
1755
1756 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
1757
1758 netif_dbg(pdata, link, pdata->netdev, "phy powered off\n");
1759}
1760
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001761static void xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata)
1762{
1763 struct xgbe_phy_data *phy_data = pdata->phy_data;
1764 unsigned int s0;
1765
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001766 xgbe_phy_set_redrv_mode(pdata);
1767
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001768 xgbe_phy_start_ratechange(pdata);
1769
1770 /* 10G/SFI */
1771 s0 = 0;
1772 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1773 if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE) {
1774 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1775 } else {
1776 if (phy_data->sfp_cable_len <= 1)
1777 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1778 else if (phy_data->sfp_cable_len <= 3)
1779 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001780 else
1781 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1782 }
1783
1784 /* Call FW to make the change */
1785 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1786 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1787 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1788
1789 xgbe_phy_complete_ratechange(pdata);
1790
1791 phy_data->cur_mode = XGBE_MODE_SFI;
1792
1793 netif_dbg(pdata, link, pdata->netdev, "10GbE SFI mode set\n");
1794}
1795
1796static void xgbe_phy_x_mode(struct xgbe_prv_data *pdata)
1797{
1798 struct xgbe_phy_data *phy_data = pdata->phy_data;
1799 unsigned int s0;
1800
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001801 xgbe_phy_set_redrv_mode(pdata);
1802
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001803 xgbe_phy_start_ratechange(pdata);
1804
1805 /* 1G/X */
1806 s0 = 0;
1807 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1808 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1809
1810 /* Call FW to make the change */
1811 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1812 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1813 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1814
1815 xgbe_phy_complete_ratechange(pdata);
1816
1817 phy_data->cur_mode = XGBE_MODE_X;
1818
1819 netif_dbg(pdata, link, pdata->netdev, "1GbE X mode set\n");
1820}
1821
1822static void xgbe_phy_sgmii_1000_mode(struct xgbe_prv_data *pdata)
1823{
1824 struct xgbe_phy_data *phy_data = pdata->phy_data;
1825 unsigned int s0;
1826
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001827 xgbe_phy_set_redrv_mode(pdata);
1828
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001829 xgbe_phy_start_ratechange(pdata);
1830
1831 /* 1G/SGMII */
1832 s0 = 0;
1833 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1834 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1835
1836 /* Call FW to make the change */
1837 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1838 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1839 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1840
1841 xgbe_phy_complete_ratechange(pdata);
1842
1843 phy_data->cur_mode = XGBE_MODE_SGMII_1000;
1844
1845 netif_dbg(pdata, link, pdata->netdev, "1GbE SGMII mode set\n");
1846}
1847
1848static void xgbe_phy_sgmii_100_mode(struct xgbe_prv_data *pdata)
1849{
1850 struct xgbe_phy_data *phy_data = pdata->phy_data;
1851 unsigned int s0;
1852
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001853 xgbe_phy_set_redrv_mode(pdata);
1854
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001855 xgbe_phy_start_ratechange(pdata);
1856
1857 /* 1G/SGMII */
1858 s0 = 0;
1859 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1860 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1861
1862 /* Call FW to make the change */
1863 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1864 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1865 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1866
1867 xgbe_phy_complete_ratechange(pdata);
1868
1869 phy_data->cur_mode = XGBE_MODE_SGMII_100;
1870
1871 netif_dbg(pdata, link, pdata->netdev, "100MbE SGMII mode set\n");
1872}
1873
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001874static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
1875{
1876 struct xgbe_phy_data *phy_data = pdata->phy_data;
1877 unsigned int s0;
1878
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001879 xgbe_phy_set_redrv_mode(pdata);
1880
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001881 xgbe_phy_start_ratechange(pdata);
1882
1883 /* 10G/KR */
1884 s0 = 0;
1885 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1886 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1887
1888 /* Call FW to make the change */
1889 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1890 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1891 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1892
1893 xgbe_phy_complete_ratechange(pdata);
1894
1895 phy_data->cur_mode = XGBE_MODE_KR;
1896
1897 netif_dbg(pdata, link, pdata->netdev, "10GbE KR mode set\n");
1898}
1899
1900static void xgbe_phy_kx_2500_mode(struct xgbe_prv_data *pdata)
1901{
1902 struct xgbe_phy_data *phy_data = pdata->phy_data;
1903 unsigned int s0;
1904
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001905 xgbe_phy_set_redrv_mode(pdata);
1906
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001907 xgbe_phy_start_ratechange(pdata);
1908
1909 /* 2.5G/KX */
1910 s0 = 0;
1911 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 2);
1912 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1913
1914 /* Call FW to make the change */
1915 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1916 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1917 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1918
1919 xgbe_phy_complete_ratechange(pdata);
1920
1921 phy_data->cur_mode = XGBE_MODE_KX_2500;
1922
1923 netif_dbg(pdata, link, pdata->netdev, "2.5GbE KX mode set\n");
1924}
1925
1926static void xgbe_phy_kx_1000_mode(struct xgbe_prv_data *pdata)
1927{
1928 struct xgbe_phy_data *phy_data = pdata->phy_data;
1929 unsigned int s0;
1930
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06001931 xgbe_phy_set_redrv_mode(pdata);
1932
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001933 xgbe_phy_start_ratechange(pdata);
1934
1935 /* 1G/KX */
1936 s0 = 0;
1937 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1938 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1939
1940 /* Call FW to make the change */
1941 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1942 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1943 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1944
1945 xgbe_phy_complete_ratechange(pdata);
1946
1947 phy_data->cur_mode = XGBE_MODE_KX_1000;
1948
1949 netif_dbg(pdata, link, pdata->netdev, "1GbE KX mode set\n");
1950}
1951
1952static enum xgbe_mode xgbe_phy_cur_mode(struct xgbe_prv_data *pdata)
1953{
1954 struct xgbe_phy_data *phy_data = pdata->phy_data;
1955
1956 return phy_data->cur_mode;
1957}
1958
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001959static enum xgbe_mode xgbe_phy_switch_baset_mode(struct xgbe_prv_data *pdata)
1960{
1961 struct xgbe_phy_data *phy_data = pdata->phy_data;
1962
1963 /* No switching if not 10GBase-T */
1964 if (phy_data->port_mode != XGBE_PORT_MODE_10GBASE_T)
1965 return xgbe_phy_cur_mode(pdata);
1966
1967 switch (xgbe_phy_cur_mode(pdata)) {
1968 case XGBE_MODE_SGMII_100:
1969 case XGBE_MODE_SGMII_1000:
1970 return XGBE_MODE_KR;
1971 case XGBE_MODE_KR:
1972 default:
1973 return XGBE_MODE_SGMII_1000;
1974 }
1975}
1976
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001977static enum xgbe_mode xgbe_phy_switch_bp_2500_mode(struct xgbe_prv_data *pdata)
1978{
1979 return XGBE_MODE_KX_2500;
1980}
1981
1982static enum xgbe_mode xgbe_phy_switch_bp_mode(struct xgbe_prv_data *pdata)
1983{
1984 /* If we are in KR switch to KX, and vice-versa */
1985 switch (xgbe_phy_cur_mode(pdata)) {
1986 case XGBE_MODE_KX_1000:
1987 return XGBE_MODE_KR;
1988 case XGBE_MODE_KR:
1989 default:
1990 return XGBE_MODE_KX_1000;
1991 }
1992}
1993
1994static enum xgbe_mode xgbe_phy_switch_mode(struct xgbe_prv_data *pdata)
1995{
1996 struct xgbe_phy_data *phy_data = pdata->phy_data;
1997
1998 switch (phy_data->port_mode) {
1999 case XGBE_PORT_MODE_BACKPLANE:
2000 return xgbe_phy_switch_bp_mode(pdata);
2001 case XGBE_PORT_MODE_BACKPLANE_2500:
2002 return xgbe_phy_switch_bp_2500_mode(pdata);
2003 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002004 case XGBE_PORT_MODE_NBASE_T:
2005 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002006 return xgbe_phy_switch_baset_mode(pdata);
2007 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002008 case XGBE_PORT_MODE_10GBASE_R:
2009 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002010 /* No switching, so just return current mode */
2011 return xgbe_phy_cur_mode(pdata);
2012 default:
2013 return XGBE_MODE_UNKNOWN;
2014 }
2015}
2016
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002017static enum xgbe_mode xgbe_phy_get_basex_mode(struct xgbe_phy_data *phy_data,
2018 int speed)
2019{
2020 switch (speed) {
2021 case SPEED_1000:
2022 return XGBE_MODE_X;
2023 case SPEED_10000:
2024 return XGBE_MODE_KR;
2025 default:
2026 return XGBE_MODE_UNKNOWN;
2027 }
2028}
2029
2030static enum xgbe_mode xgbe_phy_get_baset_mode(struct xgbe_phy_data *phy_data,
2031 int speed)
2032{
2033 switch (speed) {
2034 case SPEED_100:
2035 return XGBE_MODE_SGMII_100;
2036 case SPEED_1000:
2037 return XGBE_MODE_SGMII_1000;
2038 case SPEED_10000:
2039 return XGBE_MODE_KR;
2040 default:
2041 return XGBE_MODE_UNKNOWN;
2042 }
2043}
2044
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002045static enum xgbe_mode xgbe_phy_get_sfp_mode(struct xgbe_phy_data *phy_data,
2046 int speed)
2047{
2048 switch (speed) {
2049 case SPEED_100:
2050 return XGBE_MODE_SGMII_100;
2051 case SPEED_1000:
2052 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2053 return XGBE_MODE_SGMII_1000;
2054 else
2055 return XGBE_MODE_X;
2056 case SPEED_10000:
2057 case SPEED_UNKNOWN:
2058 return XGBE_MODE_SFI;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002059 default:
2060 return XGBE_MODE_UNKNOWN;
2061 }
2062}
2063
2064static enum xgbe_mode xgbe_phy_get_bp_2500_mode(int speed)
2065{
2066 switch (speed) {
2067 case SPEED_2500:
2068 return XGBE_MODE_KX_2500;
2069 default:
2070 return XGBE_MODE_UNKNOWN;
2071 }
2072}
2073
2074static enum xgbe_mode xgbe_phy_get_bp_mode(int speed)
2075{
2076 switch (speed) {
2077 case SPEED_1000:
2078 return XGBE_MODE_KX_1000;
2079 case SPEED_10000:
2080 return XGBE_MODE_KR;
2081 default:
2082 return XGBE_MODE_UNKNOWN;
2083 }
2084}
2085
2086static enum xgbe_mode xgbe_phy_get_mode(struct xgbe_prv_data *pdata,
2087 int speed)
2088{
2089 struct xgbe_phy_data *phy_data = pdata->phy_data;
2090
2091 switch (phy_data->port_mode) {
2092 case XGBE_PORT_MODE_BACKPLANE:
2093 return xgbe_phy_get_bp_mode(speed);
2094 case XGBE_PORT_MODE_BACKPLANE_2500:
2095 return xgbe_phy_get_bp_2500_mode(speed);
2096 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002097 case XGBE_PORT_MODE_NBASE_T:
2098 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002099 return xgbe_phy_get_baset_mode(phy_data, speed);
2100 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002101 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002102 return xgbe_phy_get_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002103 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002104 return xgbe_phy_get_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002105 default:
2106 return XGBE_MODE_UNKNOWN;
2107 }
2108}
2109
2110static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2111{
2112 switch (mode) {
2113 case XGBE_MODE_KX_1000:
2114 xgbe_phy_kx_1000_mode(pdata);
2115 break;
2116 case XGBE_MODE_KX_2500:
2117 xgbe_phy_kx_2500_mode(pdata);
2118 break;
2119 case XGBE_MODE_KR:
2120 xgbe_phy_kr_mode(pdata);
2121 break;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002122 case XGBE_MODE_SGMII_100:
2123 xgbe_phy_sgmii_100_mode(pdata);
2124 break;
2125 case XGBE_MODE_SGMII_1000:
2126 xgbe_phy_sgmii_1000_mode(pdata);
2127 break;
2128 case XGBE_MODE_X:
2129 xgbe_phy_x_mode(pdata);
2130 break;
2131 case XGBE_MODE_SFI:
2132 xgbe_phy_sfi_mode(pdata);
2133 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002134 default:
2135 break;
2136 }
2137}
2138
2139static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
2140 enum xgbe_mode mode, u32 advert)
2141{
2142 if (pdata->phy.autoneg == AUTONEG_ENABLE) {
2143 if (pdata->phy.advertising & advert)
2144 return true;
2145 } else {
2146 enum xgbe_mode cur_mode;
2147
2148 cur_mode = xgbe_phy_get_mode(pdata, pdata->phy.speed);
2149 if (cur_mode == mode)
2150 return true;
2151 }
2152
2153 return false;
2154}
2155
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002156static bool xgbe_phy_use_basex_mode(struct xgbe_prv_data *pdata,
2157 enum xgbe_mode mode)
2158{
2159 switch (mode) {
2160 case XGBE_MODE_X:
2161 return xgbe_phy_check_mode(pdata, mode,
2162 ADVERTISED_1000baseT_Full);
2163 case XGBE_MODE_KR:
2164 return xgbe_phy_check_mode(pdata, mode,
2165 ADVERTISED_10000baseT_Full);
2166 default:
2167 return false;
2168 }
2169}
2170
2171static bool xgbe_phy_use_baset_mode(struct xgbe_prv_data *pdata,
2172 enum xgbe_mode mode)
2173{
2174 switch (mode) {
2175 case XGBE_MODE_SGMII_100:
2176 return xgbe_phy_check_mode(pdata, mode,
2177 ADVERTISED_100baseT_Full);
2178 case XGBE_MODE_SGMII_1000:
2179 return xgbe_phy_check_mode(pdata, mode,
2180 ADVERTISED_1000baseT_Full);
2181 case XGBE_MODE_KR:
2182 return xgbe_phy_check_mode(pdata, mode,
2183 ADVERTISED_10000baseT_Full);
2184 default:
2185 return false;
2186 }
2187}
2188
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002189static bool xgbe_phy_use_sfp_mode(struct xgbe_prv_data *pdata,
2190 enum xgbe_mode mode)
2191{
2192 struct xgbe_phy_data *phy_data = pdata->phy_data;
2193
2194 switch (mode) {
2195 case XGBE_MODE_X:
2196 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
2197 return false;
2198 return xgbe_phy_check_mode(pdata, mode,
2199 ADVERTISED_1000baseT_Full);
2200 case XGBE_MODE_SGMII_100:
2201 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2202 return false;
2203 return xgbe_phy_check_mode(pdata, mode,
2204 ADVERTISED_100baseT_Full);
2205 case XGBE_MODE_SGMII_1000:
2206 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
2207 return false;
2208 return xgbe_phy_check_mode(pdata, mode,
2209 ADVERTISED_1000baseT_Full);
2210 case XGBE_MODE_SFI:
2211 return xgbe_phy_check_mode(pdata, mode,
2212 ADVERTISED_10000baseT_Full);
2213 default:
2214 return false;
2215 }
2216}
2217
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002218static bool xgbe_phy_use_bp_2500_mode(struct xgbe_prv_data *pdata,
2219 enum xgbe_mode mode)
2220{
2221 switch (mode) {
2222 case XGBE_MODE_KX_2500:
2223 return xgbe_phy_check_mode(pdata, mode,
2224 ADVERTISED_2500baseX_Full);
2225 default:
2226 return false;
2227 }
2228}
2229
2230static bool xgbe_phy_use_bp_mode(struct xgbe_prv_data *pdata,
2231 enum xgbe_mode mode)
2232{
2233 switch (mode) {
2234 case XGBE_MODE_KX_1000:
2235 return xgbe_phy_check_mode(pdata, mode,
2236 ADVERTISED_1000baseKX_Full);
2237 case XGBE_MODE_KR:
2238 return xgbe_phy_check_mode(pdata, mode,
2239 ADVERTISED_10000baseKR_Full);
2240 default:
2241 return false;
2242 }
2243}
2244
2245static bool xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
2246{
2247 struct xgbe_phy_data *phy_data = pdata->phy_data;
2248
2249 switch (phy_data->port_mode) {
2250 case XGBE_PORT_MODE_BACKPLANE:
2251 return xgbe_phy_use_bp_mode(pdata, mode);
2252 case XGBE_PORT_MODE_BACKPLANE_2500:
2253 return xgbe_phy_use_bp_2500_mode(pdata, mode);
2254 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002255 case XGBE_PORT_MODE_NBASE_T:
2256 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002257 return xgbe_phy_use_baset_mode(pdata, mode);
2258 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002259 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002260 return xgbe_phy_use_basex_mode(pdata, mode);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002261 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002262 return xgbe_phy_use_sfp_mode(pdata, mode);
2263 default:
2264 return false;
2265 }
2266}
2267
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002268static bool xgbe_phy_valid_speed_basex_mode(struct xgbe_phy_data *phy_data,
2269 int speed)
2270{
2271 switch (speed) {
2272 case SPEED_1000:
2273 return (phy_data->port_mode == XGBE_PORT_MODE_1000BASE_X);
2274 case SPEED_10000:
2275 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_R);
2276 default:
2277 return false;
2278 }
2279}
2280
2281static bool xgbe_phy_valid_speed_baset_mode(struct xgbe_phy_data *phy_data,
2282 int speed)
2283{
2284 switch (speed) {
2285 case SPEED_100:
2286 case SPEED_1000:
2287 return true;
2288 case SPEED_10000:
2289 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_T);
2290 default:
2291 return false;
2292 }
2293}
2294
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002295static bool xgbe_phy_valid_speed_sfp_mode(struct xgbe_phy_data *phy_data,
2296 int speed)
2297{
2298 switch (speed) {
2299 case SPEED_100:
2300 return (phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000);
2301 case SPEED_1000:
2302 return ((phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000) ||
2303 (phy_data->sfp_speed == XGBE_SFP_SPEED_1000));
2304 case SPEED_10000:
2305 return (phy_data->sfp_speed == XGBE_SFP_SPEED_10000);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002306 default:
2307 return false;
2308 }
2309}
2310
2311static bool xgbe_phy_valid_speed_bp_2500_mode(int speed)
2312{
2313 switch (speed) {
2314 case SPEED_2500:
2315 return true;
2316 default:
2317 return false;
2318 }
2319}
2320
2321static bool xgbe_phy_valid_speed_bp_mode(int speed)
2322{
2323 switch (speed) {
2324 case SPEED_1000:
2325 case SPEED_10000:
2326 return true;
2327 default:
2328 return false;
2329 }
2330}
2331
2332static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
2333{
2334 struct xgbe_phy_data *phy_data = pdata->phy_data;
2335
2336 switch (phy_data->port_mode) {
2337 case XGBE_PORT_MODE_BACKPLANE:
2338 return xgbe_phy_valid_speed_bp_mode(speed);
2339 case XGBE_PORT_MODE_BACKPLANE_2500:
2340 return xgbe_phy_valid_speed_bp_2500_mode(speed);
2341 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002342 case XGBE_PORT_MODE_NBASE_T:
2343 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002344 return xgbe_phy_valid_speed_baset_mode(phy_data, speed);
2345 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002346 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002347 return xgbe_phy_valid_speed_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002348 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002349 return xgbe_phy_valid_speed_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002350 default:
2351 return false;
2352 }
2353}
2354
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002355static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002356{
2357 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas8c5385c2016-11-14 16:39:16 -06002358 unsigned int reg;
2359 int ret;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002360
2361 *an_restart = 0;
2362
2363 if (phy_data->port_mode == XGBE_PORT_MODE_SFP) {
2364 /* Check SFP signals */
2365 xgbe_phy_sfp_detect(pdata);
2366
2367 if (phy_data->sfp_changed) {
2368 *an_restart = 1;
2369 return 0;
2370 }
2371
2372 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
2373 return 0;
2374 }
2375
2376 if (phy_data->phydev) {
2377 /* Check external PHY */
2378 ret = phy_read_status(phy_data->phydev);
2379 if (ret < 0)
2380 return 0;
2381
2382 if ((pdata->phy.autoneg == AUTONEG_ENABLE) &&
2383 !phy_aneg_done(phy_data->phydev))
2384 return 0;
2385
2386 if (!phy_data->phydev->link)
2387 return 0;
2388 }
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002389
2390 /* Link status is latched low, so read once to clear
2391 * and then read again to get current state
2392 */
2393 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2394 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2395 if (reg & MDIO_STAT1_LSTATUS)
2396 return 1;
2397
2398 /* No link, attempt a receiver reset cycle */
2399 if (phy_data->rrc_count++) {
2400 phy_data->rrc_count = 0;
2401 xgbe_phy_rrc(pdata);
2402 }
2403
2404 return 0;
2405}
2406
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002407static void xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata)
2408{
2409 struct xgbe_phy_data *phy_data = pdata->phy_data;
2410 unsigned int reg;
2411
2412 reg = XP_IOREAD(pdata, XP_PROP_3);
2413
2414 phy_data->sfp_gpio_address = XGBE_GPIO_ADDRESS_PCA9555 +
2415 XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
2416
2417 phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
2418
2419 phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
2420 GPIO_RX_LOS);
2421 phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
2422 GPIO_TX_FAULT);
2423 phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
2424 GPIO_MOD_ABS);
2425 phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
2426 GPIO_RATE_SELECT);
2427
2428 if (netif_msg_probe(pdata)) {
2429 dev_dbg(pdata->dev, "SFP: gpio_address=%#x\n",
2430 phy_data->sfp_gpio_address);
2431 dev_dbg(pdata->dev, "SFP: gpio_mask=%#x\n",
2432 phy_data->sfp_gpio_mask);
2433 dev_dbg(pdata->dev, "SFP: gpio_rx_los=%u\n",
2434 phy_data->sfp_gpio_rx_los);
2435 dev_dbg(pdata->dev, "SFP: gpio_tx_fault=%u\n",
2436 phy_data->sfp_gpio_tx_fault);
2437 dev_dbg(pdata->dev, "SFP: gpio_mod_absent=%u\n",
2438 phy_data->sfp_gpio_mod_absent);
2439 dev_dbg(pdata->dev, "SFP: gpio_rate_select=%u\n",
2440 phy_data->sfp_gpio_rate_select);
2441 }
2442}
2443
2444static void xgbe_phy_sfp_comm_setup(struct xgbe_prv_data *pdata)
2445{
2446 struct xgbe_phy_data *phy_data = pdata->phy_data;
2447 unsigned int reg, mux_addr_hi, mux_addr_lo;
2448
2449 reg = XP_IOREAD(pdata, XP_PROP_4);
2450
2451 mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
2452 mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
2453 if (mux_addr_lo == XGBE_SFP_DIRECT)
2454 return;
2455
2456 phy_data->sfp_comm = XGBE_SFP_COMM_PCA9545;
2457 phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
2458 phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
2459
2460 if (netif_msg_probe(pdata)) {
2461 dev_dbg(pdata->dev, "SFP: mux_address=%#x\n",
2462 phy_data->sfp_mux_address);
2463 dev_dbg(pdata->dev, "SFP: mux_channel=%u\n",
2464 phy_data->sfp_mux_channel);
2465 }
2466}
2467
2468static void xgbe_phy_sfp_setup(struct xgbe_prv_data *pdata)
2469{
2470 xgbe_phy_sfp_comm_setup(pdata);
2471 xgbe_phy_sfp_gpio_setup(pdata);
2472}
2473
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002474static int xgbe_phy_int_mdio_reset(struct xgbe_prv_data *pdata)
2475{
2476 struct xgbe_phy_data *phy_data = pdata->phy_data;
2477 unsigned int ret;
2478
2479 ret = pdata->hw_if.set_gpio(pdata, phy_data->mdio_reset_gpio);
2480 if (ret)
2481 return ret;
2482
2483 ret = pdata->hw_if.clr_gpio(pdata, phy_data->mdio_reset_gpio);
2484
2485 return ret;
2486}
2487
2488static int xgbe_phy_i2c_mdio_reset(struct xgbe_prv_data *pdata)
2489{
2490 struct xgbe_phy_data *phy_data = pdata->phy_data;
2491 u8 gpio_reg, gpio_ports[2], gpio_data[3];
2492 int ret;
2493
2494 /* Read the output port registers */
2495 gpio_reg = 2;
2496 ret = xgbe_phy_i2c_read(pdata, phy_data->mdio_reset_addr,
2497 &gpio_reg, sizeof(gpio_reg),
2498 gpio_ports, sizeof(gpio_ports));
2499 if (ret)
2500 return ret;
2501
2502 /* Prepare to write the GPIO data */
2503 gpio_data[0] = 2;
2504 gpio_data[1] = gpio_ports[0];
2505 gpio_data[2] = gpio_ports[1];
2506
2507 /* Set the GPIO pin */
2508 if (phy_data->mdio_reset_gpio < 8)
2509 gpio_data[1] |= (1 << (phy_data->mdio_reset_gpio % 8));
2510 else
2511 gpio_data[2] |= (1 << (phy_data->mdio_reset_gpio % 8));
2512
2513 /* Write the output port registers */
2514 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2515 gpio_data, sizeof(gpio_data));
2516 if (ret)
2517 return ret;
2518
2519 /* Clear the GPIO pin */
2520 if (phy_data->mdio_reset_gpio < 8)
2521 gpio_data[1] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2522 else
2523 gpio_data[2] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2524
2525 /* Write the output port registers */
2526 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2527 gpio_data, sizeof(gpio_data));
2528
2529 return ret;
2530}
2531
2532static int xgbe_phy_mdio_reset(struct xgbe_prv_data *pdata)
2533{
2534 struct xgbe_phy_data *phy_data = pdata->phy_data;
2535 int ret;
2536
2537 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2538 return 0;
2539
2540 ret = xgbe_phy_get_comm_ownership(pdata);
2541 if (ret)
2542 return ret;
2543
2544 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO)
2545 ret = xgbe_phy_i2c_mdio_reset(pdata);
2546 else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO)
2547 ret = xgbe_phy_int_mdio_reset(pdata);
2548
2549 xgbe_phy_put_comm_ownership(pdata);
2550
2551 return ret;
2552}
2553
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002554static bool xgbe_phy_redrv_error(struct xgbe_phy_data *phy_data)
2555{
2556 if (!phy_data->redrv)
2557 return false;
2558
2559 if (phy_data->redrv_if >= XGBE_PHY_REDRV_IF_MAX)
2560 return true;
2561
2562 switch (phy_data->redrv_model) {
2563 case XGBE_PHY_REDRV_MODEL_4223:
2564 if (phy_data->redrv_lane > 3)
2565 return true;
2566 break;
2567 case XGBE_PHY_REDRV_MODEL_4227:
2568 if (phy_data->redrv_lane > 1)
2569 return true;
2570 break;
2571 default:
2572 return true;
2573 }
2574
2575 return false;
2576}
2577
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002578static int xgbe_phy_mdio_reset_setup(struct xgbe_prv_data *pdata)
2579{
2580 struct xgbe_phy_data *phy_data = pdata->phy_data;
2581 unsigned int reg;
2582
2583 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2584 return 0;
2585
2586 reg = XP_IOREAD(pdata, XP_PROP_3);
2587 phy_data->mdio_reset = XP_GET_BITS(reg, XP_PROP_3, MDIO_RESET);
2588 switch (phy_data->mdio_reset) {
2589 case XGBE_MDIO_RESET_NONE:
2590 case XGBE_MDIO_RESET_I2C_GPIO:
2591 case XGBE_MDIO_RESET_INT_GPIO:
2592 break;
2593 default:
2594 dev_err(pdata->dev, "unsupported MDIO reset (%#x)\n",
2595 phy_data->mdio_reset);
2596 return -EINVAL;
2597 }
2598
2599 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO) {
2600 phy_data->mdio_reset_addr = XGBE_GPIO_ADDRESS_PCA9555 +
2601 XP_GET_BITS(reg, XP_PROP_3,
2602 MDIO_RESET_I2C_ADDR);
2603 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2604 MDIO_RESET_I2C_GPIO);
2605 } else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO) {
2606 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2607 MDIO_RESET_INT_GPIO);
2608 }
2609
2610 return 0;
2611}
2612
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002613static bool xgbe_phy_port_mode_mismatch(struct xgbe_prv_data *pdata)
2614{
2615 struct xgbe_phy_data *phy_data = pdata->phy_data;
2616
2617 switch (phy_data->port_mode) {
2618 case XGBE_PORT_MODE_BACKPLANE:
2619 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2620 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2621 return false;
2622 break;
2623 case XGBE_PORT_MODE_BACKPLANE_2500:
2624 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500)
2625 return false;
2626 break;
2627 case XGBE_PORT_MODE_1000BASE_T:
2628 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2629 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000))
2630 return false;
2631 break;
2632 case XGBE_PORT_MODE_1000BASE_X:
2633 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
2634 return false;
2635 break;
2636 case XGBE_PORT_MODE_NBASE_T:
2637 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2638 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2639 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500))
2640 return false;
2641 break;
2642 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002643 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2644 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002645 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2646 return false;
2647 break;
2648 case XGBE_PORT_MODE_10GBASE_R:
2649 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
2650 return false;
2651 break;
2652 case XGBE_PORT_MODE_SFP:
2653 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2654 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2655 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2656 return false;
2657 break;
2658 default:
2659 break;
2660 }
2661
2662 return true;
2663}
2664
2665static bool xgbe_phy_conn_type_mismatch(struct xgbe_prv_data *pdata)
2666{
2667 struct xgbe_phy_data *phy_data = pdata->phy_data;
2668
2669 switch (phy_data->port_mode) {
2670 case XGBE_PORT_MODE_BACKPLANE:
2671 case XGBE_PORT_MODE_BACKPLANE_2500:
2672 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
2673 return false;
2674 break;
2675 case XGBE_PORT_MODE_1000BASE_T:
2676 case XGBE_PORT_MODE_1000BASE_X:
2677 case XGBE_PORT_MODE_NBASE_T:
2678 case XGBE_PORT_MODE_10GBASE_T:
2679 case XGBE_PORT_MODE_10GBASE_R:
2680 if (phy_data->conn_type == XGBE_CONN_TYPE_MDIO)
2681 return false;
2682 break;
2683 case XGBE_PORT_MODE_SFP:
2684 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
2685 return false;
2686 break;
2687 default:
2688 break;
2689 }
2690
2691 return true;
2692}
2693
2694static bool xgbe_phy_port_enabled(struct xgbe_prv_data *pdata)
2695{
2696 unsigned int reg;
2697
2698 reg = XP_IOREAD(pdata, XP_PROP_0);
2699 if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
2700 return false;
2701 if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
2702 return false;
2703
2704 return true;
2705}
2706
2707static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
2708{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002709 struct xgbe_phy_data *phy_data = pdata->phy_data;
2710
2711 /* If we have an external PHY, free it */
2712 xgbe_phy_free_phy_device(pdata);
2713
2714 /* Reset SFP data */
2715 xgbe_phy_sfp_reset(phy_data);
2716 xgbe_phy_sfp_mod_absent(pdata);
2717
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002718 /* Power off the PHY */
2719 xgbe_phy_power_off(pdata);
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002720
2721 /* Stop the I2C controller */
2722 pdata->i2c_if.i2c_stop(pdata);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002723}
2724
2725static int xgbe_phy_start(struct xgbe_prv_data *pdata)
2726{
2727 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002728 int ret;
2729
2730 /* Start the I2C controller */
2731 ret = pdata->i2c_if.i2c_start(pdata);
2732 if (ret)
2733 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002734
Lendacky, Thomasb42c6762017-02-28 15:03:01 -06002735 /* Set the proper MDIO mode for the re-driver */
2736 if (phy_data->redrv && !phy_data->redrv_if) {
2737 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
2738 XGBE_MDIO_MODE_CL22);
2739 if (ret) {
2740 netdev_err(pdata->netdev,
2741 "redriver mdio port not compatible (%u)\n",
2742 phy_data->redrv_addr);
2743 return ret;
2744 }
2745 }
2746
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002747 /* Start in highest supported mode */
2748 xgbe_phy_set_mode(pdata, phy_data->start_mode);
2749
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002750 /* After starting the I2C controller, we can check for an SFP */
2751 switch (phy_data->port_mode) {
2752 case XGBE_PORT_MODE_SFP:
2753 xgbe_phy_sfp_detect(pdata);
2754 break;
2755 default:
2756 break;
2757 }
2758
2759 /* If we have an external PHY, start it */
2760 ret = xgbe_phy_find_phy_device(pdata);
2761 if (ret)
2762 goto err_i2c;
2763
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002764 return 0;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002765
2766err_i2c:
2767 pdata->i2c_if.i2c_stop(pdata);
2768
2769 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002770}
2771
2772static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
2773{
2774 struct xgbe_phy_data *phy_data = pdata->phy_data;
2775 enum xgbe_mode cur_mode;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002776 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002777
2778 /* Reset by power cycling the PHY */
2779 cur_mode = phy_data->cur_mode;
2780 xgbe_phy_power_off(pdata);
2781 xgbe_phy_set_mode(pdata, cur_mode);
2782
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002783 if (!phy_data->phydev)
2784 return 0;
2785
2786 /* Reset the external PHY */
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002787 ret = xgbe_phy_mdio_reset(pdata);
2788 if (ret)
2789 return ret;
2790
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002791 return phy_init_hw(phy_data->phydev);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002792}
2793
2794static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
2795{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002796 struct xgbe_phy_data *phy_data = pdata->phy_data;
2797
2798 /* Unregister for driving external PHYs */
2799 mdiobus_unregister(phy_data->mii);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002800}
2801
2802static int xgbe_phy_init(struct xgbe_prv_data *pdata)
2803{
2804 struct xgbe_phy_data *phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002805 struct mii_bus *mii;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002806 unsigned int reg;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002807 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002808
2809 /* Check if enabled */
2810 if (!xgbe_phy_port_enabled(pdata)) {
2811 dev_info(pdata->dev, "device is not enabled\n");
2812 return -ENODEV;
2813 }
2814
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002815 /* Initialize the I2C controller */
2816 ret = pdata->i2c_if.i2c_init(pdata);
2817 if (ret)
2818 return ret;
2819
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002820 phy_data = devm_kzalloc(pdata->dev, sizeof(*phy_data), GFP_KERNEL);
2821 if (!phy_data)
2822 return -ENOMEM;
2823 pdata->phy_data = phy_data;
2824
2825 reg = XP_IOREAD(pdata, XP_PROP_0);
2826 phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
2827 phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
2828 phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
2829 phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002830 phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002831 if (netif_msg_probe(pdata)) {
2832 dev_dbg(pdata->dev, "port mode=%u\n", phy_data->port_mode);
2833 dev_dbg(pdata->dev, "port id=%u\n", phy_data->port_id);
2834 dev_dbg(pdata->dev, "port speeds=%#x\n", phy_data->port_speeds);
2835 dev_dbg(pdata->dev, "conn type=%u\n", phy_data->conn_type);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002836 dev_dbg(pdata->dev, "mdio addr=%u\n", phy_data->mdio_addr);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002837 }
2838
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002839 reg = XP_IOREAD(pdata, XP_PROP_4);
2840 phy_data->redrv = XP_GET_BITS(reg, XP_PROP_4, REDRV_PRESENT);
2841 phy_data->redrv_if = XP_GET_BITS(reg, XP_PROP_4, REDRV_IF);
2842 phy_data->redrv_addr = XP_GET_BITS(reg, XP_PROP_4, REDRV_ADDR);
2843 phy_data->redrv_lane = XP_GET_BITS(reg, XP_PROP_4, REDRV_LANE);
2844 phy_data->redrv_model = XP_GET_BITS(reg, XP_PROP_4, REDRV_MODEL);
2845 if (phy_data->redrv && netif_msg_probe(pdata)) {
2846 dev_dbg(pdata->dev, "redrv present\n");
2847 dev_dbg(pdata->dev, "redrv i/f=%u\n", phy_data->redrv_if);
2848 dev_dbg(pdata->dev, "redrv addr=%#x\n", phy_data->redrv_addr);
2849 dev_dbg(pdata->dev, "redrv lane=%u\n", phy_data->redrv_lane);
2850 dev_dbg(pdata->dev, "redrv model=%u\n", phy_data->redrv_model);
2851 }
2852
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002853 /* Validate the connection requested */
2854 if (xgbe_phy_conn_type_mismatch(pdata)) {
2855 dev_err(pdata->dev, "phy mode/connection mismatch (%#x/%#x)\n",
2856 phy_data->port_mode, phy_data->conn_type);
Lendacky, Thomas5a4e4c82016-11-17 08:43:37 -06002857 return -EINVAL;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002858 }
2859
2860 /* Validate the mode requested */
2861 if (xgbe_phy_port_mode_mismatch(pdata)) {
2862 dev_err(pdata->dev, "phy mode/speed mismatch (%#x/%#x)\n",
2863 phy_data->port_mode, phy_data->port_speeds);
2864 return -EINVAL;
2865 }
2866
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002867 /* Check for and validate MDIO reset support */
2868 ret = xgbe_phy_mdio_reset_setup(pdata);
2869 if (ret)
2870 return ret;
2871
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06002872 /* Validate the re-driver information */
2873 if (xgbe_phy_redrv_error(phy_data)) {
2874 dev_err(pdata->dev, "phy re-driver settings error\n");
2875 return -EINVAL;
2876 }
2877 pdata->kr_redrv = phy_data->redrv;
2878
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002879 /* Indicate current mode is unknown */
2880 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
2881
2882 /* Initialize supported features */
2883 pdata->phy.supported = 0;
2884
2885 switch (phy_data->port_mode) {
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002886 /* Backplane support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002887 case XGBE_PORT_MODE_BACKPLANE:
2888 pdata->phy.supported |= SUPPORTED_Autoneg;
2889 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2890 pdata->phy.supported |= SUPPORTED_Backplane;
2891 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2892 pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
2893 phy_data->start_mode = XGBE_MODE_KX_1000;
2894 }
2895 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2896 pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
2897 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2898 pdata->phy.supported |=
2899 SUPPORTED_10000baseR_FEC;
2900 phy_data->start_mode = XGBE_MODE_KR;
2901 }
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002902
2903 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002904 break;
2905 case XGBE_PORT_MODE_BACKPLANE_2500:
2906 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2907 pdata->phy.supported |= SUPPORTED_Backplane;
2908 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2909 phy_data->start_mode = XGBE_MODE_KX_2500;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002910
2911 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002912 break;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002913
2914 /* MDIO 1GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002915 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002916 pdata->phy.supported |= SUPPORTED_Autoneg;
2917 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2918 pdata->phy.supported |= SUPPORTED_TP;
2919 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2920 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2921 phy_data->start_mode = XGBE_MODE_SGMII_100;
2922 }
2923 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2924 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2925 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2926 }
2927
2928 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2929 break;
2930
2931 /* MDIO Base-X support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002932 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002933 pdata->phy.supported |= SUPPORTED_Autoneg;
2934 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2935 pdata->phy.supported |= SUPPORTED_FIBRE;
2936 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2937 phy_data->start_mode = XGBE_MODE_X;
2938
2939 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2940 break;
2941
2942 /* MDIO NBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002943 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002944 pdata->phy.supported |= SUPPORTED_Autoneg;
2945 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2946 pdata->phy.supported |= SUPPORTED_TP;
2947 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2948 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2949 phy_data->start_mode = XGBE_MODE_SGMII_100;
2950 }
2951 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2952 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2953 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2954 }
2955 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500) {
2956 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2957 phy_data->start_mode = XGBE_MODE_KX_2500;
2958 }
2959
2960 phy_data->phydev_mode = XGBE_MDIO_MODE_CL45;
2961 break;
2962
2963 /* 10GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002964 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002965 pdata->phy.supported |= SUPPORTED_Autoneg;
2966 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2967 pdata->phy.supported |= SUPPORTED_TP;
2968 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2969 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2970 phy_data->start_mode = XGBE_MODE_SGMII_100;
2971 }
2972 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2973 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2974 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2975 }
2976 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2977 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2978 phy_data->start_mode = XGBE_MODE_KR;
2979 }
2980
2981 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2982 break;
2983
2984 /* 10GBase-R support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002985 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002986 pdata->phy.supported |= SUPPORTED_Autoneg;
2987 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2988 pdata->phy.supported |= SUPPORTED_TP;
2989 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2990 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2991 pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
2992 phy_data->start_mode = XGBE_MODE_SFI;
2993
2994 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2995 break;
2996
2997 /* SFP support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002998 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002999 pdata->phy.supported |= SUPPORTED_Autoneg;
3000 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
3001 pdata->phy.supported |= SUPPORTED_TP;
3002 pdata->phy.supported |= SUPPORTED_FIBRE;
3003 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
3004 pdata->phy.supported |= SUPPORTED_100baseT_Full;
3005 phy_data->start_mode = XGBE_MODE_SGMII_100;
3006 }
3007 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
3008 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
3009 phy_data->start_mode = XGBE_MODE_SGMII_1000;
3010 }
3011 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
3012 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
3013 phy_data->start_mode = XGBE_MODE_SFI;
3014 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
3015 pdata->phy.supported |=
3016 SUPPORTED_10000baseR_FEC;
3017 }
3018
3019 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
3020
3021 xgbe_phy_sfp_setup(pdata);
3022 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003023 default:
3024 return -EINVAL;
3025 }
3026
3027 if (netif_msg_probe(pdata))
3028 dev_dbg(pdata->dev, "phy supported=%#x\n",
3029 pdata->phy.supported);
3030
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06003031 if ((phy_data->conn_type & XGBE_CONN_TYPE_MDIO) &&
3032 (phy_data->phydev_mode != XGBE_MDIO_MODE_NONE)) {
3033 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
3034 phy_data->phydev_mode);
3035 if (ret) {
3036 dev_err(pdata->dev,
3037 "mdio port/clause not compatible (%d/%u)\n",
3038 phy_data->mdio_addr, phy_data->phydev_mode);
3039 return -EINVAL;
3040 }
3041 }
3042
3043 if (phy_data->redrv && !phy_data->redrv_if) {
3044 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
3045 XGBE_MDIO_MODE_CL22);
3046 if (ret) {
3047 dev_err(pdata->dev,
3048 "redriver mdio port not compatible (%u)\n",
3049 phy_data->redrv_addr);
3050 return -EINVAL;
3051 }
3052 }
3053
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06003054 /* Register for driving external PHYs */
3055 mii = devm_mdiobus_alloc(pdata->dev);
3056 if (!mii) {
3057 dev_err(pdata->dev, "mdiobus_alloc failed\n");
3058 return -ENOMEM;
3059 }
3060
3061 mii->priv = pdata;
3062 mii->name = "amd-xgbe-mii";
3063 mii->read = xgbe_phy_mii_read;
3064 mii->write = xgbe_phy_mii_write;
3065 mii->parent = pdata->dev;
3066 mii->phy_mask = ~0;
3067 snprintf(mii->id, sizeof(mii->id), "%s", dev_name(pdata->dev));
3068 ret = mdiobus_register(mii);
3069 if (ret) {
3070 dev_err(pdata->dev, "mdiobus_register failed\n");
3071 return ret;
3072 }
3073 phy_data->mii = mii;
3074
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003075 return 0;
3076}
3077
3078void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
3079{
3080 struct xgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
3081
3082 phy_impl->init = xgbe_phy_init;
3083 phy_impl->exit = xgbe_phy_exit;
3084
3085 phy_impl->reset = xgbe_phy_reset;
3086 phy_impl->start = xgbe_phy_start;
3087 phy_impl->stop = xgbe_phy_stop;
3088
3089 phy_impl->link_status = xgbe_phy_link_status;
3090
3091 phy_impl->valid_speed = xgbe_phy_valid_speed;
3092
3093 phy_impl->use_mode = xgbe_phy_use_mode;
3094 phy_impl->set_mode = xgbe_phy_set_mode;
3095 phy_impl->get_mode = xgbe_phy_get_mode;
3096 phy_impl->switch_mode = xgbe_phy_switch_mode;
3097 phy_impl->cur_mode = xgbe_phy_cur_mode;
3098
3099 phy_impl->an_mode = xgbe_phy_an_mode;
3100
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06003101 phy_impl->an_config = xgbe_phy_an_config;
3102
Lendacky, Thomasd7445d12016-11-10 17:11:41 -06003103 phy_impl->an_advertising = xgbe_phy_an_advertising;
3104
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06003105 phy_impl->an_outcome = xgbe_phy_an_outcome;
3106}