blob: 9848f741f44f29862b78645428c45583be08efeb [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,
167 XGBE_CONN_TYPE_BACKPLANE,
168 XGBE_CONN_TYPE_MAX,
169};
170
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600171/* SFP/SFP+ related definitions */
172enum xgbe_sfp_comm {
173 XGBE_SFP_COMM_DIRECT = 0,
174 XGBE_SFP_COMM_PCA9545,
175};
176
177enum xgbe_sfp_cable {
178 XGBE_SFP_CABLE_UNKNOWN = 0,
179 XGBE_SFP_CABLE_ACTIVE,
180 XGBE_SFP_CABLE_PASSIVE,
181};
182
183enum xgbe_sfp_base {
184 XGBE_SFP_BASE_UNKNOWN = 0,
185 XGBE_SFP_BASE_1000_T,
186 XGBE_SFP_BASE_1000_SX,
187 XGBE_SFP_BASE_1000_LX,
188 XGBE_SFP_BASE_1000_CX,
189 XGBE_SFP_BASE_10000_SR,
190 XGBE_SFP_BASE_10000_LR,
191 XGBE_SFP_BASE_10000_LRM,
192 XGBE_SFP_BASE_10000_ER,
193 XGBE_SFP_BASE_10000_CR,
194};
195
196enum xgbe_sfp_speed {
197 XGBE_SFP_SPEED_UNKNOWN = 0,
198 XGBE_SFP_SPEED_100_1000,
199 XGBE_SFP_SPEED_1000,
200 XGBE_SFP_SPEED_10000,
201};
202
203/* SFP Serial ID Base ID values relative to an offset of 0 */
204#define XGBE_SFP_BASE_ID 0
205#define XGBE_SFP_ID_SFP 0x03
206
207#define XGBE_SFP_BASE_EXT_ID 1
208#define XGBE_SFP_EXT_ID_SFP 0x04
209
210#define XGBE_SFP_BASE_10GBE_CC 3
211#define XGBE_SFP_BASE_10GBE_CC_SR BIT(4)
212#define XGBE_SFP_BASE_10GBE_CC_LR BIT(5)
213#define XGBE_SFP_BASE_10GBE_CC_LRM BIT(6)
214#define XGBE_SFP_BASE_10GBE_CC_ER BIT(7)
215
216#define XGBE_SFP_BASE_1GBE_CC 6
217#define XGBE_SFP_BASE_1GBE_CC_SX BIT(0)
218#define XGBE_SFP_BASE_1GBE_CC_LX BIT(1)
219#define XGBE_SFP_BASE_1GBE_CC_CX BIT(2)
220#define XGBE_SFP_BASE_1GBE_CC_T BIT(3)
221
222#define XGBE_SFP_BASE_CABLE 8
223#define XGBE_SFP_BASE_CABLE_PASSIVE BIT(2)
224#define XGBE_SFP_BASE_CABLE_ACTIVE BIT(3)
225
226#define XGBE_SFP_BASE_BR 12
227#define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
228#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
229#define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
230#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
231
232#define XGBE_SFP_BASE_CU_CABLE_LEN 18
233
234#define XGBE_SFP_BASE_VENDOR_NAME 20
235#define XGBE_SFP_BASE_VENDOR_NAME_LEN 16
236#define XGBE_SFP_BASE_VENDOR_PN 40
237#define XGBE_SFP_BASE_VENDOR_PN_LEN 16
238#define XGBE_SFP_BASE_VENDOR_REV 56
239#define XGBE_SFP_BASE_VENDOR_REV_LEN 4
240
241#define XGBE_SFP_BASE_CC 63
242
243/* SFP Serial ID Extended ID values relative to an offset of 64 */
244#define XGBE_SFP_BASE_VENDOR_SN 4
245#define XGBE_SFP_BASE_VENDOR_SN_LEN 16
246
247#define XGBE_SFP_EXTD_DIAG 28
248#define XGBE_SFP_EXTD_DIAG_ADDR_CHANGE BIT(2)
249
250#define XGBE_SFP_EXTD_SFF_8472 30
251
252#define XGBE_SFP_EXTD_CC 31
253
254struct xgbe_sfp_eeprom {
255 u8 base[64];
256 u8 extd[32];
257 u8 vendor[32];
258};
259
260#define XGBE_BEL_FUSE_VENDOR "BEL-FUSE "
261#define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 "
262
263struct xgbe_sfp_ascii {
264 union {
265 char vendor[XGBE_SFP_BASE_VENDOR_NAME_LEN + 1];
266 char partno[XGBE_SFP_BASE_VENDOR_PN_LEN + 1];
267 char rev[XGBE_SFP_BASE_VENDOR_REV_LEN + 1];
268 char serno[XGBE_SFP_BASE_VENDOR_SN_LEN + 1];
269 } u;
270};
271
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600272/* MDIO PHY reset types */
273enum xgbe_mdio_reset {
274 XGBE_MDIO_RESET_NONE = 0,
275 XGBE_MDIO_RESET_I2C_GPIO,
276 XGBE_MDIO_RESET_INT_GPIO,
277 XGBE_MDIO_RESET_MAX,
278};
279
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600280/* PHY related configuration information */
281struct xgbe_phy_data {
282 enum xgbe_port_mode port_mode;
283
284 unsigned int port_id;
285
286 unsigned int port_speeds;
287
288 enum xgbe_conn_type conn_type;
289
290 enum xgbe_mode cur_mode;
291 enum xgbe_mode start_mode;
292
293 unsigned int rrc_count;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600294
295 unsigned int mdio_addr;
296
297 unsigned int comm_owned;
298
299 /* SFP Support */
300 enum xgbe_sfp_comm sfp_comm;
301 unsigned int sfp_mux_address;
302 unsigned int sfp_mux_channel;
303
304 unsigned int sfp_gpio_address;
305 unsigned int sfp_gpio_mask;
306 unsigned int sfp_gpio_rx_los;
307 unsigned int sfp_gpio_tx_fault;
308 unsigned int sfp_gpio_mod_absent;
309 unsigned int sfp_gpio_rate_select;
310
311 unsigned int sfp_rx_los;
312 unsigned int sfp_tx_fault;
313 unsigned int sfp_mod_absent;
314 unsigned int sfp_diags;
315 unsigned int sfp_changed;
316 unsigned int sfp_phy_avail;
317 unsigned int sfp_cable_len;
318 enum xgbe_sfp_base sfp_base;
319 enum xgbe_sfp_cable sfp_cable;
320 enum xgbe_sfp_speed sfp_speed;
321 struct xgbe_sfp_eeprom sfp_eeprom;
322
323 /* External PHY support */
324 enum xgbe_mdio_mode phydev_mode;
325 struct mii_bus *mii;
326 struct phy_device *phydev;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600327 enum xgbe_mdio_reset mdio_reset;
328 unsigned int mdio_reset_addr;
329 unsigned int mdio_reset_gpio;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600330};
331
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600332/* I2C, MDIO and GPIO lines are muxed, so only one device at a time */
333static DEFINE_MUTEX(xgbe_phy_comm_lock);
334
335static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata);
336
337static int xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata,
338 struct xgbe_i2c_op *i2c_op)
339{
340 struct xgbe_phy_data *phy_data = pdata->phy_data;
341
342 /* Be sure we own the bus */
343 if (WARN_ON(!phy_data->comm_owned))
344 return -EIO;
345
346 return pdata->i2c_if.i2c_xfer(pdata, i2c_op);
347}
348
349static int xgbe_phy_i2c_write(struct xgbe_prv_data *pdata, unsigned int target,
350 void *val, unsigned int val_len)
351{
352 struct xgbe_i2c_op i2c_op;
353 int retry, ret;
354
355 retry = 1;
356again:
357 /* Write the specfied register */
358 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
359 i2c_op.target = target;
360 i2c_op.len = val_len;
361 i2c_op.buf = val;
362 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
363 if ((ret == -EAGAIN) && retry--)
364 goto again;
365
366 return ret;
367}
368
369static int xgbe_phy_i2c_read(struct xgbe_prv_data *pdata, unsigned int target,
370 void *reg, unsigned int reg_len,
371 void *val, unsigned int val_len)
372{
373 struct xgbe_i2c_op i2c_op;
374 int retry, ret;
375
376 retry = 1;
377again1:
378 /* Set the specified register to read */
379 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
380 i2c_op.target = target;
381 i2c_op.len = reg_len;
382 i2c_op.buf = reg;
383 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
384 if (ret) {
385 if ((ret == -EAGAIN) && retry--)
386 goto again1;
387
388 return ret;
389 }
390
391 retry = 1;
392again2:
393 /* Read the specfied register */
394 i2c_op.cmd = XGBE_I2C_CMD_READ;
395 i2c_op.target = target;
396 i2c_op.len = val_len;
397 i2c_op.buf = val;
398 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
399 if ((ret == -EAGAIN) && retry--)
400 goto again2;
401
402 return ret;
403}
404
405static int xgbe_phy_sfp_put_mux(struct xgbe_prv_data *pdata)
406{
407 struct xgbe_phy_data *phy_data = pdata->phy_data;
408 struct xgbe_i2c_op i2c_op;
409 u8 mux_channel;
410
411 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
412 return 0;
413
414 /* Select no mux channels */
415 mux_channel = 0;
416 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
417 i2c_op.target = phy_data->sfp_mux_address;
418 i2c_op.len = sizeof(mux_channel);
419 i2c_op.buf = &mux_channel;
420
421 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
422}
423
424static int xgbe_phy_sfp_get_mux(struct xgbe_prv_data *pdata)
425{
426 struct xgbe_phy_data *phy_data = pdata->phy_data;
427 struct xgbe_i2c_op i2c_op;
428 u8 mux_channel;
429
430 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
431 return 0;
432
433 /* Select desired mux channel */
434 mux_channel = 1 << phy_data->sfp_mux_channel;
435 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
436 i2c_op.target = phy_data->sfp_mux_address;
437 i2c_op.len = sizeof(mux_channel);
438 i2c_op.buf = &mux_channel;
439
440 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
441}
442
443static void xgbe_phy_put_comm_ownership(struct xgbe_prv_data *pdata)
444{
445 struct xgbe_phy_data *phy_data = pdata->phy_data;
446
447 phy_data->comm_owned = 0;
448
449 mutex_unlock(&xgbe_phy_comm_lock);
450}
451
452static int xgbe_phy_get_comm_ownership(struct xgbe_prv_data *pdata)
453{
454 struct xgbe_phy_data *phy_data = pdata->phy_data;
455 unsigned long timeout;
456 unsigned int mutex_id;
457
458 if (phy_data->comm_owned)
459 return 0;
460
461 /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
462 * the driver needs to take the software mutex and then the hardware
463 * mutexes before being able to use the busses.
464 */
465 mutex_lock(&xgbe_phy_comm_lock);
466
467 /* Clear the mutexes */
468 XP_IOWRITE(pdata, XP_I2C_MUTEX, XGBE_MUTEX_RELEASE);
469 XP_IOWRITE(pdata, XP_MDIO_MUTEX, XGBE_MUTEX_RELEASE);
470
471 /* Mutex formats are the same for I2C and MDIO/GPIO */
472 mutex_id = 0;
473 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ID, phy_data->port_id);
474 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ACTIVE, 1);
475
476 timeout = jiffies + (5 * HZ);
477 while (time_before(jiffies, timeout)) {
478 /* Must be all zeroes in order to obtain the mutex */
479 if (XP_IOREAD(pdata, XP_I2C_MUTEX) ||
480 XP_IOREAD(pdata, XP_MDIO_MUTEX)) {
481 usleep_range(100, 200);
482 continue;
483 }
484
485 /* Obtain the mutex */
486 XP_IOWRITE(pdata, XP_I2C_MUTEX, mutex_id);
487 XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
488
489 phy_data->comm_owned = 1;
490 return 0;
491 }
492
493 mutex_unlock(&xgbe_phy_comm_lock);
494
495 netdev_err(pdata->netdev, "unable to obtain hardware mutexes\n");
496
497 return -ETIMEDOUT;
498}
499
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600500static int xgbe_phy_mdio_mii_write(struct xgbe_prv_data *pdata, int addr,
501 int reg, u16 val)
502{
503 struct xgbe_phy_data *phy_data = pdata->phy_data;
504
505 if (reg & MII_ADDR_C45) {
506 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
507 return -ENOTSUPP;
508 } else {
509 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
510 return -ENOTSUPP;
511 }
512
513 return pdata->hw_if.write_ext_mii_regs(pdata, addr, reg, val);
514}
515
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600516static int xgbe_phy_i2c_mii_write(struct xgbe_prv_data *pdata, int reg, u16 val)
517{
518 __be16 *mii_val;
519 u8 mii_data[3];
520 int ret;
521
522 ret = xgbe_phy_sfp_get_mux(pdata);
523 if (ret)
524 return ret;
525
526 mii_data[0] = reg & 0xff;
527 mii_val = (__be16 *)&mii_data[1];
528 *mii_val = cpu_to_be16(val);
529
530 ret = xgbe_phy_i2c_write(pdata, XGBE_SFP_PHY_ADDRESS,
531 mii_data, sizeof(mii_data));
532
533 xgbe_phy_sfp_put_mux(pdata);
534
535 return ret;
536}
537
538static int xgbe_phy_mii_write(struct mii_bus *mii, int addr, int reg, u16 val)
539{
540 struct xgbe_prv_data *pdata = mii->priv;
541 struct xgbe_phy_data *phy_data = pdata->phy_data;
542 int ret;
543
544 ret = xgbe_phy_get_comm_ownership(pdata);
545 if (ret)
546 return ret;
547
548 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
549 ret = xgbe_phy_i2c_mii_write(pdata, reg, val);
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600550 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
551 ret = xgbe_phy_mdio_mii_write(pdata, addr, reg, val);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600552 else
553 ret = -ENOTSUPP;
554
555 xgbe_phy_put_comm_ownership(pdata);
556
557 return ret;
558}
559
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600560static int xgbe_phy_mdio_mii_read(struct xgbe_prv_data *pdata, int addr,
561 int reg)
562{
563 struct xgbe_phy_data *phy_data = pdata->phy_data;
564
565 if (reg & MII_ADDR_C45) {
566 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45)
567 return -ENOTSUPP;
568 } else {
569 if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22)
570 return -ENOTSUPP;
571 }
572
573 return pdata->hw_if.read_ext_mii_regs(pdata, addr, reg);
574}
575
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600576static int xgbe_phy_i2c_mii_read(struct xgbe_prv_data *pdata, int reg)
577{
578 __be16 mii_val;
579 u8 mii_reg;
580 int ret;
581
582 ret = xgbe_phy_sfp_get_mux(pdata);
583 if (ret)
584 return ret;
585
586 mii_reg = reg;
587 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_PHY_ADDRESS,
588 &mii_reg, sizeof(mii_reg),
589 &mii_val, sizeof(mii_val));
590 if (!ret)
591 ret = be16_to_cpu(mii_val);
592
593 xgbe_phy_sfp_put_mux(pdata);
594
595 return ret;
596}
597
598static int xgbe_phy_mii_read(struct mii_bus *mii, int addr, int reg)
599{
600 struct xgbe_prv_data *pdata = mii->priv;
601 struct xgbe_phy_data *phy_data = pdata->phy_data;
602 int ret;
603
604 ret = xgbe_phy_get_comm_ownership(pdata);
605 if (ret)
606 return ret;
607
608 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
609 ret = xgbe_phy_i2c_mii_read(pdata, reg);
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -0600610 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO)
611 ret = xgbe_phy_mdio_mii_read(pdata, addr, reg);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600612 else
613 ret = -ENOTSUPP;
614
615 xgbe_phy_put_comm_ownership(pdata);
616
617 return ret;
618}
619
620static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
621{
622 struct xgbe_phy_data *phy_data = pdata->phy_data;
623
624 if (phy_data->sfp_mod_absent) {
625 pdata->phy.speed = SPEED_UNKNOWN;
626 pdata->phy.duplex = DUPLEX_UNKNOWN;
627 pdata->phy.autoneg = AUTONEG_ENABLE;
628 pdata->phy.advertising = pdata->phy.supported;
629 }
630
631 pdata->phy.advertising &= ~ADVERTISED_Autoneg;
632 pdata->phy.advertising &= ~ADVERTISED_TP;
633 pdata->phy.advertising &= ~ADVERTISED_FIBRE;
634 pdata->phy.advertising &= ~ADVERTISED_100baseT_Full;
635 pdata->phy.advertising &= ~ADVERTISED_1000baseT_Full;
636 pdata->phy.advertising &= ~ADVERTISED_10000baseT_Full;
637 pdata->phy.advertising &= ~ADVERTISED_10000baseR_FEC;
638
639 switch (phy_data->sfp_base) {
640 case XGBE_SFP_BASE_1000_T:
641 case XGBE_SFP_BASE_1000_SX:
642 case XGBE_SFP_BASE_1000_LX:
643 case XGBE_SFP_BASE_1000_CX:
644 pdata->phy.speed = SPEED_UNKNOWN;
645 pdata->phy.duplex = DUPLEX_UNKNOWN;
646 pdata->phy.autoneg = AUTONEG_ENABLE;
647 pdata->phy.advertising |= ADVERTISED_Autoneg;
648 break;
649 case XGBE_SFP_BASE_10000_SR:
650 case XGBE_SFP_BASE_10000_LR:
651 case XGBE_SFP_BASE_10000_LRM:
652 case XGBE_SFP_BASE_10000_ER:
653 case XGBE_SFP_BASE_10000_CR:
654 default:
655 pdata->phy.speed = SPEED_10000;
656 pdata->phy.duplex = DUPLEX_FULL;
657 pdata->phy.autoneg = AUTONEG_DISABLE;
658 break;
659 }
660
661 switch (phy_data->sfp_base) {
662 case XGBE_SFP_BASE_1000_T:
663 case XGBE_SFP_BASE_1000_CX:
664 case XGBE_SFP_BASE_10000_CR:
665 pdata->phy.advertising |= ADVERTISED_TP;
666 break;
667 default:
668 pdata->phy.advertising |= ADVERTISED_FIBRE;
669 }
670
671 switch (phy_data->sfp_speed) {
672 case XGBE_SFP_SPEED_100_1000:
673 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
674 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
675 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
676 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
677 break;
678 case XGBE_SFP_SPEED_1000:
679 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
680 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
681 break;
682 case XGBE_SFP_SPEED_10000:
683 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
684 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
685 break;
686 default:
687 /* Choose the fastest supported speed */
688 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
689 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
690 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
691 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
692 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
693 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
694 }
695}
696
697static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
698 enum xgbe_sfp_speed sfp_speed)
699{
700 u8 *sfp_base, min, max;
701
702 sfp_base = sfp_eeprom->base;
703
704 switch (sfp_speed) {
705 case XGBE_SFP_SPEED_1000:
706 min = XGBE_SFP_BASE_BR_1GBE_MIN;
707 max = XGBE_SFP_BASE_BR_1GBE_MAX;
708 break;
709 case XGBE_SFP_SPEED_10000:
710 min = XGBE_SFP_BASE_BR_10GBE_MIN;
711 max = XGBE_SFP_BASE_BR_10GBE_MAX;
712 break;
713 default:
714 return false;
715 }
716
717 return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
718 (sfp_base[XGBE_SFP_BASE_BR] <= max));
719}
720
721static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
722{
723 struct xgbe_phy_data *phy_data = pdata->phy_data;
724
725 if (phy_data->phydev) {
726 phy_detach(phy_data->phydev);
727 phy_device_remove(phy_data->phydev);
728 phy_device_free(phy_data->phydev);
729 phy_data->phydev = NULL;
730 }
731}
732
733static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
734{
735 struct xgbe_phy_data *phy_data = pdata->phy_data;
736 unsigned int phy_id = phy_data->phydev->phy_id;
737
738 if ((phy_id & 0xfffffff0) != 0x01ff0cc0)
739 return false;
740
741 /* Enable Base-T AN */
742 phy_write(phy_data->phydev, 0x16, 0x0001);
743 phy_write(phy_data->phydev, 0x00, 0x9140);
744 phy_write(phy_data->phydev, 0x16, 0x0000);
745
746 /* Enable SGMII at 100Base-T/1000Base-T Full Duplex */
747 phy_write(phy_data->phydev, 0x1b, 0x9084);
748 phy_write(phy_data->phydev, 0x09, 0x0e00);
749 phy_write(phy_data->phydev, 0x00, 0x8140);
750 phy_write(phy_data->phydev, 0x04, 0x0d01);
751 phy_write(phy_data->phydev, 0x00, 0x9140);
752
753 phy_data->phydev->supported = PHY_GBIT_FEATURES;
754 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
755 phy_data->phydev->advertising = phy_data->phydev->supported;
756
757 netif_dbg(pdata, drv, pdata->netdev,
758 "Finisar PHY quirk in place\n");
759
760 return true;
761}
762
763static void xgbe_phy_external_phy_quirks(struct xgbe_prv_data *pdata)
764{
765 if (xgbe_phy_finisar_phy_quirks(pdata))
766 return;
767}
768
769static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
770{
771 struct xgbe_phy_data *phy_data = pdata->phy_data;
772 struct phy_device *phydev;
773 int ret;
774
775 /* If we already have a PHY, just return */
776 if (phy_data->phydev)
777 return 0;
778
779 /* Check for the use of an external PHY */
780 if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE)
781 return 0;
782
783 /* For SFP, only use an external PHY if available */
784 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
785 !phy_data->sfp_phy_avail)
786 return 0;
787
788 /* Create and connect to the PHY device */
789 phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
790 (phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
791 if (IS_ERR(phydev)) {
792 netdev_err(pdata->netdev, "get_phy_device failed\n");
793 return -ENODEV;
794 }
795 netif_dbg(pdata, drv, pdata->netdev, "external PHY id is %#010x\n",
796 phydev->phy_id);
797
798 /*TODO: If c45, add request_module based on one of the MMD ids? */
799
800 ret = phy_device_register(phydev);
801 if (ret) {
802 netdev_err(pdata->netdev, "phy_device_register failed\n");
803 phy_device_free(phydev);
804 return ret;
805 }
806
807 ret = phy_attach_direct(pdata->netdev, phydev, phydev->dev_flags,
808 PHY_INTERFACE_MODE_SGMII);
809 if (ret) {
810 netdev_err(pdata->netdev, "phy_attach_direct failed\n");
811 phy_device_remove(phydev);
812 phy_device_free(phydev);
813 return ret;
814 }
815 phy_data->phydev = phydev;
816
817 xgbe_phy_external_phy_quirks(pdata);
818 phydev->advertising &= pdata->phy.advertising;
819
820 phy_start_aneg(phy_data->phydev);
821
822 return 0;
823}
824
825static void xgbe_phy_sfp_external_phy(struct xgbe_prv_data *pdata)
826{
827 struct xgbe_phy_data *phy_data = pdata->phy_data;
828 int ret;
829
830 if (!phy_data->sfp_changed)
831 return;
832
833 phy_data->sfp_phy_avail = 0;
834
835 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
836 return;
837
838 /* Check access to the PHY by reading CTRL1 */
839 ret = xgbe_phy_i2c_mii_read(pdata, MII_BMCR);
840 if (ret < 0)
841 return;
842
843 /* Successfully accessed the PHY */
844 phy_data->sfp_phy_avail = 1;
845}
846
847static bool xgbe_phy_belfuse_parse_quirks(struct xgbe_prv_data *pdata)
848{
849 struct xgbe_phy_data *phy_data = pdata->phy_data;
850 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
851
852 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
853 XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN))
854 return false;
855
856 if (!memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
857 XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN)) {
858 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
859 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
860 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
861 if (phy_data->sfp_changed)
862 netif_dbg(pdata, drv, pdata->netdev,
863 "Bel-Fuse SFP quirk in place\n");
864 return true;
865 }
866
867 return false;
868}
869
870static bool xgbe_phy_sfp_parse_quirks(struct xgbe_prv_data *pdata)
871{
872 if (xgbe_phy_belfuse_parse_quirks(pdata))
873 return true;
874
875 return false;
876}
877
878static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
879{
880 struct xgbe_phy_data *phy_data = pdata->phy_data;
881 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
882 u8 *sfp_base;
883
884 sfp_base = sfp_eeprom->base;
885
886 if (sfp_base[XGBE_SFP_BASE_ID] != XGBE_SFP_ID_SFP)
887 return;
888
889 if (sfp_base[XGBE_SFP_BASE_EXT_ID] != XGBE_SFP_EXT_ID_SFP)
890 return;
891
892 if (xgbe_phy_sfp_parse_quirks(pdata))
893 return;
894
895 /* Assume ACTIVE cable unless told it is PASSIVE */
896 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
897 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
898 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
899 } else {
900 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
901 }
902
903 /* Determine the type of SFP */
904 if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
905 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
906 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
907 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
908 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM)
909 phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM;
910 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER)
911 phy_data->sfp_base = XGBE_SFP_BASE_10000_ER;
912 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX)
913 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
914 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX)
915 phy_data->sfp_base = XGBE_SFP_BASE_1000_LX;
916 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX)
917 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
918 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
919 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
920 else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
921 xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
922 phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
923
924 switch (phy_data->sfp_base) {
925 case XGBE_SFP_BASE_1000_T:
926 phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000;
927 break;
928 case XGBE_SFP_BASE_1000_SX:
929 case XGBE_SFP_BASE_1000_LX:
930 case XGBE_SFP_BASE_1000_CX:
931 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
932 break;
933 case XGBE_SFP_BASE_10000_SR:
934 case XGBE_SFP_BASE_10000_LR:
935 case XGBE_SFP_BASE_10000_LRM:
936 case XGBE_SFP_BASE_10000_ER:
937 case XGBE_SFP_BASE_10000_CR:
938 phy_data->sfp_speed = XGBE_SFP_SPEED_10000;
939 break;
940 default:
941 break;
942 }
943}
944
945static void xgbe_phy_sfp_eeprom_info(struct xgbe_prv_data *pdata,
946 struct xgbe_sfp_eeprom *sfp_eeprom)
947{
948 struct xgbe_sfp_ascii sfp_ascii;
949 char *sfp_data = (char *)&sfp_ascii;
950
951 netif_dbg(pdata, drv, pdata->netdev, "SFP detected:\n");
952 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
953 XGBE_SFP_BASE_VENDOR_NAME_LEN);
954 sfp_data[XGBE_SFP_BASE_VENDOR_NAME_LEN] = '\0';
955 netif_dbg(pdata, drv, pdata->netdev, " vendor: %s\n",
956 sfp_data);
957
958 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
959 XGBE_SFP_BASE_VENDOR_PN_LEN);
960 sfp_data[XGBE_SFP_BASE_VENDOR_PN_LEN] = '\0';
961 netif_dbg(pdata, drv, pdata->netdev, " part number: %s\n",
962 sfp_data);
963
964 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_REV],
965 XGBE_SFP_BASE_VENDOR_REV_LEN);
966 sfp_data[XGBE_SFP_BASE_VENDOR_REV_LEN] = '\0';
967 netif_dbg(pdata, drv, pdata->netdev, " revision level: %s\n",
968 sfp_data);
969
970 memcpy(sfp_data, &sfp_eeprom->extd[XGBE_SFP_BASE_VENDOR_SN],
971 XGBE_SFP_BASE_VENDOR_SN_LEN);
972 sfp_data[XGBE_SFP_BASE_VENDOR_SN_LEN] = '\0';
973 netif_dbg(pdata, drv, pdata->netdev, " serial number: %s\n",
974 sfp_data);
975}
976
977static bool xgbe_phy_sfp_verify_eeprom(u8 cc_in, u8 *buf, unsigned int len)
978{
979 u8 cc;
980
981 for (cc = 0; len; buf++, len--)
982 cc += *buf;
983
984 return (cc == cc_in) ? true : false;
985}
986
987static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
988{
989 struct xgbe_phy_data *phy_data = pdata->phy_data;
990 struct xgbe_sfp_eeprom sfp_eeprom;
991 u8 eeprom_addr;
992 int ret;
993
994 ret = xgbe_phy_sfp_get_mux(pdata);
995 if (ret) {
996 netdev_err(pdata->netdev, "I2C error setting SFP MUX\n");
997 return ret;
998 }
999
1000 /* Read the SFP serial ID eeprom */
1001 eeprom_addr = 0;
1002 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
1003 &eeprom_addr, sizeof(eeprom_addr),
1004 &sfp_eeprom, sizeof(sfp_eeprom));
1005 if (ret) {
1006 netdev_err(pdata->netdev, "I2C error reading SFP EEPROM\n");
1007 goto put;
1008 }
1009
1010 /* Validate the contents read */
1011 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[XGBE_SFP_BASE_CC],
1012 sfp_eeprom.base,
1013 sizeof(sfp_eeprom.base) - 1)) {
1014 ret = -EINVAL;
1015 goto put;
1016 }
1017
1018 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[XGBE_SFP_EXTD_CC],
1019 sfp_eeprom.extd,
1020 sizeof(sfp_eeprom.extd) - 1)) {
1021 ret = -EINVAL;
1022 goto put;
1023 }
1024
1025 /* Check for an added or changed SFP */
1026 if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
1027 phy_data->sfp_changed = 1;
1028
1029 if (netif_msg_drv(pdata))
1030 xgbe_phy_sfp_eeprom_info(pdata, &sfp_eeprom);
1031
1032 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
1033
1034 if (sfp_eeprom.extd[XGBE_SFP_EXTD_SFF_8472]) {
1035 u8 diag_type = sfp_eeprom.extd[XGBE_SFP_EXTD_DIAG];
1036
1037 if (!(diag_type & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
1038 phy_data->sfp_diags = 1;
1039 }
1040
1041 xgbe_phy_free_phy_device(pdata);
1042 } else {
1043 phy_data->sfp_changed = 0;
1044 }
1045
1046put:
1047 xgbe_phy_sfp_put_mux(pdata);
1048
1049 return ret;
1050}
1051
1052static void xgbe_phy_sfp_signals(struct xgbe_prv_data *pdata)
1053{
1054 struct xgbe_phy_data *phy_data = pdata->phy_data;
1055 unsigned int gpio_input;
1056 u8 gpio_reg, gpio_ports[2];
1057 int ret;
1058
1059 /* Read the input port registers */
1060 gpio_reg = 0;
1061 ret = xgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
1062 &gpio_reg, sizeof(gpio_reg),
1063 gpio_ports, sizeof(gpio_ports));
1064 if (ret) {
1065 netdev_err(pdata->netdev, "I2C error reading SFP GPIOs\n");
1066 return;
1067 }
1068
1069 gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
1070
1071 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_MOD_ABSENT) {
1072 /* No GPIO, just assume the module is present for now */
1073 phy_data->sfp_mod_absent = 0;
1074 } else {
1075 if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
1076 phy_data->sfp_mod_absent = 0;
1077 }
1078
1079 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_RX_LOS) &&
1080 (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
1081 phy_data->sfp_rx_los = 1;
1082
1083 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_TX_FAULT) &&
1084 (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
1085 phy_data->sfp_tx_fault = 1;
1086}
1087
1088static void xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
1089{
1090 struct xgbe_phy_data *phy_data = pdata->phy_data;
1091
1092 xgbe_phy_free_phy_device(pdata);
1093
1094 phy_data->sfp_mod_absent = 1;
1095 phy_data->sfp_phy_avail = 0;
1096 memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
1097}
1098
1099static void xgbe_phy_sfp_reset(struct xgbe_phy_data *phy_data)
1100{
1101 phy_data->sfp_rx_los = 0;
1102 phy_data->sfp_tx_fault = 0;
1103 phy_data->sfp_mod_absent = 1;
1104 phy_data->sfp_diags = 0;
1105 phy_data->sfp_base = XGBE_SFP_BASE_UNKNOWN;
1106 phy_data->sfp_cable = XGBE_SFP_CABLE_UNKNOWN;
1107 phy_data->sfp_speed = XGBE_SFP_SPEED_UNKNOWN;
1108}
1109
1110static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
1111{
1112 struct xgbe_phy_data *phy_data = pdata->phy_data;
1113 int ret;
1114
1115 /* Reset the SFP signals and info */
1116 xgbe_phy_sfp_reset(phy_data);
1117
1118 ret = xgbe_phy_get_comm_ownership(pdata);
1119 if (ret)
1120 return;
1121
1122 /* Read the SFP signals and check for module presence */
1123 xgbe_phy_sfp_signals(pdata);
1124 if (phy_data->sfp_mod_absent) {
1125 xgbe_phy_sfp_mod_absent(pdata);
1126 goto put;
1127 }
1128
1129 ret = xgbe_phy_sfp_read_eeprom(pdata);
1130 if (ret) {
1131 /* Treat any error as if there isn't an SFP plugged in */
1132 xgbe_phy_sfp_reset(phy_data);
1133 xgbe_phy_sfp_mod_absent(pdata);
1134 goto put;
1135 }
1136
1137 xgbe_phy_sfp_parse_eeprom(pdata);
1138
1139 xgbe_phy_sfp_external_phy(pdata);
1140
1141put:
1142 xgbe_phy_sfp_phy_settings(pdata);
1143
1144 xgbe_phy_put_comm_ownership(pdata);
1145}
1146
1147static enum xgbe_mode xgbe_phy_an37_sgmii_outcome(struct xgbe_prv_data *pdata)
1148{
1149 struct xgbe_phy_data *phy_data = pdata->phy_data;
1150 enum xgbe_mode mode;
1151
1152 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1153 pdata->phy.lp_advertising |= ADVERTISED_TP;
1154
1155 if (pdata->phy.pause_autoneg && phy_data->phydev) {
1156 /* Flow control is obtained from the attached PHY */
1157 u16 lcl_adv = 0, rmt_adv = 0;
1158 u8 fc;
1159
1160 pdata->phy.tx_pause = 0;
1161 pdata->phy.rx_pause = 0;
1162
1163 if (phy_data->phydev->advertising & ADVERTISED_Pause)
1164 lcl_adv |= ADVERTISE_PAUSE_CAP;
1165 if (phy_data->phydev->advertising & ADVERTISED_Asym_Pause)
1166 lcl_adv |= ADVERTISE_PAUSE_ASYM;
1167
1168 if (phy_data->phydev->pause)
1169 rmt_adv |= LPA_PAUSE_CAP;
1170 if (phy_data->phydev->asym_pause)
1171 rmt_adv |= LPA_PAUSE_ASYM;
1172
1173 fc = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
1174 if (fc & FLOW_CTRL_TX)
1175 pdata->phy.tx_pause = 1;
1176 if (fc & FLOW_CTRL_RX)
1177 pdata->phy.rx_pause = 1;
1178 }
1179
1180 switch (pdata->an_status & XGBE_SGMII_AN_LINK_SPEED) {
1181 case XGBE_SGMII_AN_LINK_SPEED_100:
1182 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1183 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Full;
1184 mode = XGBE_MODE_SGMII_100;
1185 } else {
1186 /* Half-duplex not supported */
1187 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Half;
1188 mode = XGBE_MODE_UNKNOWN;
1189 }
1190 break;
1191 case XGBE_SGMII_AN_LINK_SPEED_1000:
1192 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1193 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1194 mode = XGBE_MODE_SGMII_1000;
1195 } else {
1196 /* Half-duplex not supported */
1197 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1198 mode = XGBE_MODE_UNKNOWN;
1199 }
1200 break;
1201 default:
1202 mode = XGBE_MODE_UNKNOWN;
1203 }
1204
1205 return mode;
1206}
1207
1208static enum xgbe_mode xgbe_phy_an37_outcome(struct xgbe_prv_data *pdata)
1209{
1210 enum xgbe_mode mode;
1211 unsigned int ad_reg, lp_reg;
1212
1213 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1214 pdata->phy.lp_advertising |= ADVERTISED_FIBRE;
1215
1216 /* Compare Advertisement and Link Partner register */
1217 ad_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
1218 lp_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_LP_ABILITY);
1219 if (lp_reg & 0x100)
1220 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1221 if (lp_reg & 0x80)
1222 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1223
1224 if (pdata->phy.pause_autoneg) {
1225 /* Set flow control based on auto-negotiation result */
1226 pdata->phy.tx_pause = 0;
1227 pdata->phy.rx_pause = 0;
1228
1229 if (ad_reg & lp_reg & 0x100) {
1230 pdata->phy.tx_pause = 1;
1231 pdata->phy.rx_pause = 1;
1232 } else if (ad_reg & lp_reg & 0x80) {
1233 if (ad_reg & 0x100)
1234 pdata->phy.rx_pause = 1;
1235 else if (lp_reg & 0x100)
1236 pdata->phy.tx_pause = 1;
1237 }
1238 }
1239
1240 if (lp_reg & 0x40)
1241 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1242 if (lp_reg & 0x20)
1243 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1244
1245 /* Half duplex is not supported */
1246 ad_reg &= lp_reg;
1247 mode = (ad_reg & 0x20) ? XGBE_MODE_X : XGBE_MODE_UNKNOWN;
1248
1249 return mode;
1250}
1251
1252static enum xgbe_mode xgbe_phy_an73_outcome(struct xgbe_prv_data *pdata)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001253{
1254 enum xgbe_mode mode;
1255 unsigned int ad_reg, lp_reg;
1256
1257 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1258 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1259
1260 /* Compare Advertisement and Link Partner register 1 */
1261 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1262 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1263 if (lp_reg & 0x400)
1264 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1265 if (lp_reg & 0x800)
1266 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1267
1268 if (pdata->phy.pause_autoneg) {
1269 /* Set flow control based on auto-negotiation result */
1270 pdata->phy.tx_pause = 0;
1271 pdata->phy.rx_pause = 0;
1272
1273 if (ad_reg & lp_reg & 0x400) {
1274 pdata->phy.tx_pause = 1;
1275 pdata->phy.rx_pause = 1;
1276 } else if (ad_reg & lp_reg & 0x800) {
1277 if (ad_reg & 0x400)
1278 pdata->phy.rx_pause = 1;
1279 else if (lp_reg & 0x400)
1280 pdata->phy.tx_pause = 1;
1281 }
1282 }
1283
1284 /* Compare Advertisement and Link Partner register 2 */
1285 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1286 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1287 if (lp_reg & 0x80)
1288 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1289 if (lp_reg & 0x20)
1290 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1291
1292 ad_reg &= lp_reg;
1293 if (ad_reg & 0x80)
1294 mode = XGBE_MODE_KR;
1295 else if (ad_reg & 0x20)
1296 mode = XGBE_MODE_KX_1000;
1297 else
1298 mode = XGBE_MODE_UNKNOWN;
1299
1300 /* Compare Advertisement and Link Partner register 3 */
1301 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1302 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1303 if (lp_reg & 0xc000)
1304 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1305
1306 return mode;
1307}
1308
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001309static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
1310{
1311 switch (pdata->an_mode) {
1312 case XGBE_AN_MODE_CL73:
1313 return xgbe_phy_an73_outcome(pdata);
1314 case XGBE_AN_MODE_CL37:
1315 return xgbe_phy_an37_outcome(pdata);
1316 case XGBE_AN_MODE_CL37_SGMII:
1317 return xgbe_phy_an37_sgmii_outcome(pdata);
1318 default:
1319 return XGBE_MODE_UNKNOWN;
1320 }
1321}
1322
1323static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1324{
1325 struct xgbe_phy_data *phy_data = pdata->phy_data;
1326 int ret;
1327
1328 ret = xgbe_phy_find_phy_device(pdata);
1329 if (ret)
1330 return ret;
1331
1332 if (!phy_data->phydev)
1333 return 0;
1334
1335 phy_data->phydev->autoneg = pdata->phy.autoneg;
1336 phy_data->phydev->advertising = phy_data->phydev->supported &
1337 pdata->phy.advertising;
1338
1339 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1340 phy_data->phydev->speed = pdata->phy.speed;
1341 phy_data->phydev->duplex = pdata->phy.duplex;
1342 }
1343
1344 ret = phy_start_aneg(phy_data->phydev);
1345
1346 return ret;
1347}
1348
1349static enum xgbe_an_mode xgbe_phy_an_sfp_mode(struct xgbe_phy_data *phy_data)
1350{
1351 switch (phy_data->sfp_base) {
1352 case XGBE_SFP_BASE_1000_T:
1353 return XGBE_AN_MODE_CL37_SGMII;
1354 case XGBE_SFP_BASE_1000_SX:
1355 case XGBE_SFP_BASE_1000_LX:
1356 case XGBE_SFP_BASE_1000_CX:
1357 return XGBE_AN_MODE_CL37;
1358 default:
1359 return XGBE_AN_MODE_NONE;
1360 }
1361}
1362
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001363static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata)
1364{
1365 struct xgbe_phy_data *phy_data = pdata->phy_data;
1366
1367 switch (phy_data->port_mode) {
1368 case XGBE_PORT_MODE_BACKPLANE:
1369 return XGBE_AN_MODE_CL73;
1370 case XGBE_PORT_MODE_BACKPLANE_2500:
1371 return XGBE_AN_MODE_NONE;
1372 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001373 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001374 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001375 return XGBE_AN_MODE_CL37;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001376 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001377 return XGBE_AN_MODE_CL37_SGMII;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001378 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001379 return XGBE_AN_MODE_CL73;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001380 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001381 return XGBE_AN_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001382 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001383 return xgbe_phy_an_sfp_mode(phy_data);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001384 default:
1385 return XGBE_AN_MODE_NONE;
1386 }
1387}
1388
1389static void xgbe_phy_start_ratechange(struct xgbe_prv_data *pdata)
1390{
1391 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1392 return;
1393
1394 /* Log if a previous command did not complete */
1395 netif_dbg(pdata, link, pdata->netdev,
1396 "firmware mailbox not ready for command\n");
1397}
1398
1399static void xgbe_phy_complete_ratechange(struct xgbe_prv_data *pdata)
1400{
1401 unsigned int wait;
1402
1403 /* Wait for command to complete */
1404 wait = XGBE_RATECHANGE_COUNT;
1405 while (wait--) {
1406 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1407 return;
1408
1409 usleep_range(1000, 2000);
1410 }
1411
1412 netif_dbg(pdata, link, pdata->netdev,
1413 "firmware mailbox command did not complete\n");
1414}
1415
1416static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
1417{
1418 unsigned int s0;
1419
1420 xgbe_phy_start_ratechange(pdata);
1421
1422 /* Receiver Reset Cycle */
1423 s0 = 0;
1424 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1425 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1426
1427 /* Call FW to make the change */
1428 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1429 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1430 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1431
1432 xgbe_phy_complete_ratechange(pdata);
1433
1434 netif_dbg(pdata, link, pdata->netdev, "receiver reset complete\n");
1435}
1436
1437static void xgbe_phy_power_off(struct xgbe_prv_data *pdata)
1438{
1439 struct xgbe_phy_data *phy_data = pdata->phy_data;
1440
1441 xgbe_phy_start_ratechange(pdata);
1442
1443 /* Call FW to make the change */
1444 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1445 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1446 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1447
1448 xgbe_phy_complete_ratechange(pdata);
1449
1450 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
1451
1452 netif_dbg(pdata, link, pdata->netdev, "phy powered off\n");
1453}
1454
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001455static void xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata)
1456{
1457 struct xgbe_phy_data *phy_data = pdata->phy_data;
1458 unsigned int s0;
1459
1460 xgbe_phy_start_ratechange(pdata);
1461
1462 /* 10G/SFI */
1463 s0 = 0;
1464 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1465 if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE) {
1466 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1467 } else {
1468 if (phy_data->sfp_cable_len <= 1)
1469 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1470 else if (phy_data->sfp_cable_len <= 3)
1471 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1472 else if (phy_data->sfp_cable_len <= 5)
1473 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1474 else
1475 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1476 }
1477
1478 /* Call FW to make the change */
1479 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1480 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1481 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1482
1483 xgbe_phy_complete_ratechange(pdata);
1484
1485 phy_data->cur_mode = XGBE_MODE_SFI;
1486
1487 netif_dbg(pdata, link, pdata->netdev, "10GbE SFI mode set\n");
1488}
1489
1490static void xgbe_phy_x_mode(struct xgbe_prv_data *pdata)
1491{
1492 struct xgbe_phy_data *phy_data = pdata->phy_data;
1493 unsigned int s0;
1494
1495 xgbe_phy_start_ratechange(pdata);
1496
1497 /* 1G/X */
1498 s0 = 0;
1499 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1500 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1501
1502 /* Call FW to make the change */
1503 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1504 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1505 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1506
1507 xgbe_phy_complete_ratechange(pdata);
1508
1509 phy_data->cur_mode = XGBE_MODE_X;
1510
1511 netif_dbg(pdata, link, pdata->netdev, "1GbE X mode set\n");
1512}
1513
1514static void xgbe_phy_sgmii_1000_mode(struct xgbe_prv_data *pdata)
1515{
1516 struct xgbe_phy_data *phy_data = pdata->phy_data;
1517 unsigned int s0;
1518
1519 xgbe_phy_start_ratechange(pdata);
1520
1521 /* 1G/SGMII */
1522 s0 = 0;
1523 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1524 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1525
1526 /* Call FW to make the change */
1527 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1528 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1529 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1530
1531 xgbe_phy_complete_ratechange(pdata);
1532
1533 phy_data->cur_mode = XGBE_MODE_SGMII_1000;
1534
1535 netif_dbg(pdata, link, pdata->netdev, "1GbE SGMII mode set\n");
1536}
1537
1538static void xgbe_phy_sgmii_100_mode(struct xgbe_prv_data *pdata)
1539{
1540 struct xgbe_phy_data *phy_data = pdata->phy_data;
1541 unsigned int s0;
1542
1543 xgbe_phy_start_ratechange(pdata);
1544
1545 /* 1G/SGMII */
1546 s0 = 0;
1547 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1548 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1549
1550 /* Call FW to make the change */
1551 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1552 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1553 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1554
1555 xgbe_phy_complete_ratechange(pdata);
1556
1557 phy_data->cur_mode = XGBE_MODE_SGMII_100;
1558
1559 netif_dbg(pdata, link, pdata->netdev, "100MbE SGMII mode set\n");
1560}
1561
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001562static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
1563{
1564 struct xgbe_phy_data *phy_data = pdata->phy_data;
1565 unsigned int s0;
1566
1567 xgbe_phy_start_ratechange(pdata);
1568
1569 /* 10G/KR */
1570 s0 = 0;
1571 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1572 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1573
1574 /* Call FW to make the change */
1575 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1576 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1577 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1578
1579 xgbe_phy_complete_ratechange(pdata);
1580
1581 phy_data->cur_mode = XGBE_MODE_KR;
1582
1583 netif_dbg(pdata, link, pdata->netdev, "10GbE KR mode set\n");
1584}
1585
1586static void xgbe_phy_kx_2500_mode(struct xgbe_prv_data *pdata)
1587{
1588 struct xgbe_phy_data *phy_data = pdata->phy_data;
1589 unsigned int s0;
1590
1591 xgbe_phy_start_ratechange(pdata);
1592
1593 /* 2.5G/KX */
1594 s0 = 0;
1595 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 2);
1596 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1597
1598 /* Call FW to make the change */
1599 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1600 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1601 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1602
1603 xgbe_phy_complete_ratechange(pdata);
1604
1605 phy_data->cur_mode = XGBE_MODE_KX_2500;
1606
1607 netif_dbg(pdata, link, pdata->netdev, "2.5GbE KX mode set\n");
1608}
1609
1610static void xgbe_phy_kx_1000_mode(struct xgbe_prv_data *pdata)
1611{
1612 struct xgbe_phy_data *phy_data = pdata->phy_data;
1613 unsigned int s0;
1614
1615 xgbe_phy_start_ratechange(pdata);
1616
1617 /* 1G/KX */
1618 s0 = 0;
1619 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1620 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1621
1622 /* Call FW to make the change */
1623 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1624 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1625 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1626
1627 xgbe_phy_complete_ratechange(pdata);
1628
1629 phy_data->cur_mode = XGBE_MODE_KX_1000;
1630
1631 netif_dbg(pdata, link, pdata->netdev, "1GbE KX mode set\n");
1632}
1633
1634static enum xgbe_mode xgbe_phy_cur_mode(struct xgbe_prv_data *pdata)
1635{
1636 struct xgbe_phy_data *phy_data = pdata->phy_data;
1637
1638 return phy_data->cur_mode;
1639}
1640
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001641static enum xgbe_mode xgbe_phy_switch_baset_mode(struct xgbe_prv_data *pdata)
1642{
1643 struct xgbe_phy_data *phy_data = pdata->phy_data;
1644
1645 /* No switching if not 10GBase-T */
1646 if (phy_data->port_mode != XGBE_PORT_MODE_10GBASE_T)
1647 return xgbe_phy_cur_mode(pdata);
1648
1649 switch (xgbe_phy_cur_mode(pdata)) {
1650 case XGBE_MODE_SGMII_100:
1651 case XGBE_MODE_SGMII_1000:
1652 return XGBE_MODE_KR;
1653 case XGBE_MODE_KR:
1654 default:
1655 return XGBE_MODE_SGMII_1000;
1656 }
1657}
1658
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001659static enum xgbe_mode xgbe_phy_switch_bp_2500_mode(struct xgbe_prv_data *pdata)
1660{
1661 return XGBE_MODE_KX_2500;
1662}
1663
1664static enum xgbe_mode xgbe_phy_switch_bp_mode(struct xgbe_prv_data *pdata)
1665{
1666 /* If we are in KR switch to KX, and vice-versa */
1667 switch (xgbe_phy_cur_mode(pdata)) {
1668 case XGBE_MODE_KX_1000:
1669 return XGBE_MODE_KR;
1670 case XGBE_MODE_KR:
1671 default:
1672 return XGBE_MODE_KX_1000;
1673 }
1674}
1675
1676static enum xgbe_mode xgbe_phy_switch_mode(struct xgbe_prv_data *pdata)
1677{
1678 struct xgbe_phy_data *phy_data = pdata->phy_data;
1679
1680 switch (phy_data->port_mode) {
1681 case XGBE_PORT_MODE_BACKPLANE:
1682 return xgbe_phy_switch_bp_mode(pdata);
1683 case XGBE_PORT_MODE_BACKPLANE_2500:
1684 return xgbe_phy_switch_bp_2500_mode(pdata);
1685 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001686 case XGBE_PORT_MODE_NBASE_T:
1687 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001688 return xgbe_phy_switch_baset_mode(pdata);
1689 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001690 case XGBE_PORT_MODE_10GBASE_R:
1691 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001692 /* No switching, so just return current mode */
1693 return xgbe_phy_cur_mode(pdata);
1694 default:
1695 return XGBE_MODE_UNKNOWN;
1696 }
1697}
1698
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001699static enum xgbe_mode xgbe_phy_get_basex_mode(struct xgbe_phy_data *phy_data,
1700 int speed)
1701{
1702 switch (speed) {
1703 case SPEED_1000:
1704 return XGBE_MODE_X;
1705 case SPEED_10000:
1706 return XGBE_MODE_KR;
1707 default:
1708 return XGBE_MODE_UNKNOWN;
1709 }
1710}
1711
1712static enum xgbe_mode xgbe_phy_get_baset_mode(struct xgbe_phy_data *phy_data,
1713 int speed)
1714{
1715 switch (speed) {
1716 case SPEED_100:
1717 return XGBE_MODE_SGMII_100;
1718 case SPEED_1000:
1719 return XGBE_MODE_SGMII_1000;
1720 case SPEED_10000:
1721 return XGBE_MODE_KR;
1722 default:
1723 return XGBE_MODE_UNKNOWN;
1724 }
1725}
1726
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001727static enum xgbe_mode xgbe_phy_get_sfp_mode(struct xgbe_phy_data *phy_data,
1728 int speed)
1729{
1730 switch (speed) {
1731 case SPEED_100:
1732 return XGBE_MODE_SGMII_100;
1733 case SPEED_1000:
1734 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
1735 return XGBE_MODE_SGMII_1000;
1736 else
1737 return XGBE_MODE_X;
1738 case SPEED_10000:
1739 case SPEED_UNKNOWN:
1740 return XGBE_MODE_SFI;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001741 default:
1742 return XGBE_MODE_UNKNOWN;
1743 }
1744}
1745
1746static enum xgbe_mode xgbe_phy_get_bp_2500_mode(int speed)
1747{
1748 switch (speed) {
1749 case SPEED_2500:
1750 return XGBE_MODE_KX_2500;
1751 default:
1752 return XGBE_MODE_UNKNOWN;
1753 }
1754}
1755
1756static enum xgbe_mode xgbe_phy_get_bp_mode(int speed)
1757{
1758 switch (speed) {
1759 case SPEED_1000:
1760 return XGBE_MODE_KX_1000;
1761 case SPEED_10000:
1762 return XGBE_MODE_KR;
1763 default:
1764 return XGBE_MODE_UNKNOWN;
1765 }
1766}
1767
1768static enum xgbe_mode xgbe_phy_get_mode(struct xgbe_prv_data *pdata,
1769 int speed)
1770{
1771 struct xgbe_phy_data *phy_data = pdata->phy_data;
1772
1773 switch (phy_data->port_mode) {
1774 case XGBE_PORT_MODE_BACKPLANE:
1775 return xgbe_phy_get_bp_mode(speed);
1776 case XGBE_PORT_MODE_BACKPLANE_2500:
1777 return xgbe_phy_get_bp_2500_mode(speed);
1778 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001779 case XGBE_PORT_MODE_NBASE_T:
1780 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001781 return xgbe_phy_get_baset_mode(phy_data, speed);
1782 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001783 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001784 return xgbe_phy_get_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001785 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001786 return xgbe_phy_get_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001787 default:
1788 return XGBE_MODE_UNKNOWN;
1789 }
1790}
1791
1792static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
1793{
1794 switch (mode) {
1795 case XGBE_MODE_KX_1000:
1796 xgbe_phy_kx_1000_mode(pdata);
1797 break;
1798 case XGBE_MODE_KX_2500:
1799 xgbe_phy_kx_2500_mode(pdata);
1800 break;
1801 case XGBE_MODE_KR:
1802 xgbe_phy_kr_mode(pdata);
1803 break;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001804 case XGBE_MODE_SGMII_100:
1805 xgbe_phy_sgmii_100_mode(pdata);
1806 break;
1807 case XGBE_MODE_SGMII_1000:
1808 xgbe_phy_sgmii_1000_mode(pdata);
1809 break;
1810 case XGBE_MODE_X:
1811 xgbe_phy_x_mode(pdata);
1812 break;
1813 case XGBE_MODE_SFI:
1814 xgbe_phy_sfi_mode(pdata);
1815 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001816 default:
1817 break;
1818 }
1819}
1820
1821static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
1822 enum xgbe_mode mode, u32 advert)
1823{
1824 if (pdata->phy.autoneg == AUTONEG_ENABLE) {
1825 if (pdata->phy.advertising & advert)
1826 return true;
1827 } else {
1828 enum xgbe_mode cur_mode;
1829
1830 cur_mode = xgbe_phy_get_mode(pdata, pdata->phy.speed);
1831 if (cur_mode == mode)
1832 return true;
1833 }
1834
1835 return false;
1836}
1837
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001838static bool xgbe_phy_use_basex_mode(struct xgbe_prv_data *pdata,
1839 enum xgbe_mode mode)
1840{
1841 switch (mode) {
1842 case XGBE_MODE_X:
1843 return xgbe_phy_check_mode(pdata, mode,
1844 ADVERTISED_1000baseT_Full);
1845 case XGBE_MODE_KR:
1846 return xgbe_phy_check_mode(pdata, mode,
1847 ADVERTISED_10000baseT_Full);
1848 default:
1849 return false;
1850 }
1851}
1852
1853static bool xgbe_phy_use_baset_mode(struct xgbe_prv_data *pdata,
1854 enum xgbe_mode mode)
1855{
1856 switch (mode) {
1857 case XGBE_MODE_SGMII_100:
1858 return xgbe_phy_check_mode(pdata, mode,
1859 ADVERTISED_100baseT_Full);
1860 case XGBE_MODE_SGMII_1000:
1861 return xgbe_phy_check_mode(pdata, mode,
1862 ADVERTISED_1000baseT_Full);
1863 case XGBE_MODE_KR:
1864 return xgbe_phy_check_mode(pdata, mode,
1865 ADVERTISED_10000baseT_Full);
1866 default:
1867 return false;
1868 }
1869}
1870
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001871static bool xgbe_phy_use_sfp_mode(struct xgbe_prv_data *pdata,
1872 enum xgbe_mode mode)
1873{
1874 struct xgbe_phy_data *phy_data = pdata->phy_data;
1875
1876 switch (mode) {
1877 case XGBE_MODE_X:
1878 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
1879 return false;
1880 return xgbe_phy_check_mode(pdata, mode,
1881 ADVERTISED_1000baseT_Full);
1882 case XGBE_MODE_SGMII_100:
1883 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
1884 return false;
1885 return xgbe_phy_check_mode(pdata, mode,
1886 ADVERTISED_100baseT_Full);
1887 case XGBE_MODE_SGMII_1000:
1888 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
1889 return false;
1890 return xgbe_phy_check_mode(pdata, mode,
1891 ADVERTISED_1000baseT_Full);
1892 case XGBE_MODE_SFI:
1893 return xgbe_phy_check_mode(pdata, mode,
1894 ADVERTISED_10000baseT_Full);
1895 default:
1896 return false;
1897 }
1898}
1899
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001900static bool xgbe_phy_use_bp_2500_mode(struct xgbe_prv_data *pdata,
1901 enum xgbe_mode mode)
1902{
1903 switch (mode) {
1904 case XGBE_MODE_KX_2500:
1905 return xgbe_phy_check_mode(pdata, mode,
1906 ADVERTISED_2500baseX_Full);
1907 default:
1908 return false;
1909 }
1910}
1911
1912static bool xgbe_phy_use_bp_mode(struct xgbe_prv_data *pdata,
1913 enum xgbe_mode mode)
1914{
1915 switch (mode) {
1916 case XGBE_MODE_KX_1000:
1917 return xgbe_phy_check_mode(pdata, mode,
1918 ADVERTISED_1000baseKX_Full);
1919 case XGBE_MODE_KR:
1920 return xgbe_phy_check_mode(pdata, mode,
1921 ADVERTISED_10000baseKR_Full);
1922 default:
1923 return false;
1924 }
1925}
1926
1927static bool xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
1928{
1929 struct xgbe_phy_data *phy_data = pdata->phy_data;
1930
1931 switch (phy_data->port_mode) {
1932 case XGBE_PORT_MODE_BACKPLANE:
1933 return xgbe_phy_use_bp_mode(pdata, mode);
1934 case XGBE_PORT_MODE_BACKPLANE_2500:
1935 return xgbe_phy_use_bp_2500_mode(pdata, mode);
1936 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001937 case XGBE_PORT_MODE_NBASE_T:
1938 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001939 return xgbe_phy_use_baset_mode(pdata, mode);
1940 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001941 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001942 return xgbe_phy_use_basex_mode(pdata, mode);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001943 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001944 return xgbe_phy_use_sfp_mode(pdata, mode);
1945 default:
1946 return false;
1947 }
1948}
1949
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06001950static bool xgbe_phy_valid_speed_basex_mode(struct xgbe_phy_data *phy_data,
1951 int speed)
1952{
1953 switch (speed) {
1954 case SPEED_1000:
1955 return (phy_data->port_mode == XGBE_PORT_MODE_1000BASE_X);
1956 case SPEED_10000:
1957 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_R);
1958 default:
1959 return false;
1960 }
1961}
1962
1963static bool xgbe_phy_valid_speed_baset_mode(struct xgbe_phy_data *phy_data,
1964 int speed)
1965{
1966 switch (speed) {
1967 case SPEED_100:
1968 case SPEED_1000:
1969 return true;
1970 case SPEED_10000:
1971 return (phy_data->port_mode == XGBE_PORT_MODE_10GBASE_T);
1972 default:
1973 return false;
1974 }
1975}
1976
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001977static bool xgbe_phy_valid_speed_sfp_mode(struct xgbe_phy_data *phy_data,
1978 int speed)
1979{
1980 switch (speed) {
1981 case SPEED_100:
1982 return (phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000);
1983 case SPEED_1000:
1984 return ((phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000) ||
1985 (phy_data->sfp_speed == XGBE_SFP_SPEED_1000));
1986 case SPEED_10000:
1987 return (phy_data->sfp_speed == XGBE_SFP_SPEED_10000);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001988 default:
1989 return false;
1990 }
1991}
1992
1993static bool xgbe_phy_valid_speed_bp_2500_mode(int speed)
1994{
1995 switch (speed) {
1996 case SPEED_2500:
1997 return true;
1998 default:
1999 return false;
2000 }
2001}
2002
2003static bool xgbe_phy_valid_speed_bp_mode(int speed)
2004{
2005 switch (speed) {
2006 case SPEED_1000:
2007 case SPEED_10000:
2008 return true;
2009 default:
2010 return false;
2011 }
2012}
2013
2014static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
2015{
2016 struct xgbe_phy_data *phy_data = pdata->phy_data;
2017
2018 switch (phy_data->port_mode) {
2019 case XGBE_PORT_MODE_BACKPLANE:
2020 return xgbe_phy_valid_speed_bp_mode(speed);
2021 case XGBE_PORT_MODE_BACKPLANE_2500:
2022 return xgbe_phy_valid_speed_bp_2500_mode(speed);
2023 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002024 case XGBE_PORT_MODE_NBASE_T:
2025 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002026 return xgbe_phy_valid_speed_baset_mode(phy_data, speed);
2027 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002028 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002029 return xgbe_phy_valid_speed_basex_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002030 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002031 return xgbe_phy_valid_speed_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002032 default:
2033 return false;
2034 }
2035}
2036
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002037static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002038{
2039 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002040 unsigned int ret, reg;
2041
2042 *an_restart = 0;
2043
2044 if (phy_data->port_mode == XGBE_PORT_MODE_SFP) {
2045 /* Check SFP signals */
2046 xgbe_phy_sfp_detect(pdata);
2047
2048 if (phy_data->sfp_changed) {
2049 *an_restart = 1;
2050 return 0;
2051 }
2052
2053 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
2054 return 0;
2055 }
2056
2057 if (phy_data->phydev) {
2058 /* Check external PHY */
2059 ret = phy_read_status(phy_data->phydev);
2060 if (ret < 0)
2061 return 0;
2062
2063 if ((pdata->phy.autoneg == AUTONEG_ENABLE) &&
2064 !phy_aneg_done(phy_data->phydev))
2065 return 0;
2066
2067 if (!phy_data->phydev->link)
2068 return 0;
2069 }
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002070
2071 /* Link status is latched low, so read once to clear
2072 * and then read again to get current state
2073 */
2074 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2075 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
2076 if (reg & MDIO_STAT1_LSTATUS)
2077 return 1;
2078
2079 /* No link, attempt a receiver reset cycle */
2080 if (phy_data->rrc_count++) {
2081 phy_data->rrc_count = 0;
2082 xgbe_phy_rrc(pdata);
2083 }
2084
2085 return 0;
2086}
2087
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002088static void xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata)
2089{
2090 struct xgbe_phy_data *phy_data = pdata->phy_data;
2091 unsigned int reg;
2092
2093 reg = XP_IOREAD(pdata, XP_PROP_3);
2094
2095 phy_data->sfp_gpio_address = XGBE_GPIO_ADDRESS_PCA9555 +
2096 XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
2097
2098 phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
2099
2100 phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
2101 GPIO_RX_LOS);
2102 phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
2103 GPIO_TX_FAULT);
2104 phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
2105 GPIO_MOD_ABS);
2106 phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
2107 GPIO_RATE_SELECT);
2108
2109 if (netif_msg_probe(pdata)) {
2110 dev_dbg(pdata->dev, "SFP: gpio_address=%#x\n",
2111 phy_data->sfp_gpio_address);
2112 dev_dbg(pdata->dev, "SFP: gpio_mask=%#x\n",
2113 phy_data->sfp_gpio_mask);
2114 dev_dbg(pdata->dev, "SFP: gpio_rx_los=%u\n",
2115 phy_data->sfp_gpio_rx_los);
2116 dev_dbg(pdata->dev, "SFP: gpio_tx_fault=%u\n",
2117 phy_data->sfp_gpio_tx_fault);
2118 dev_dbg(pdata->dev, "SFP: gpio_mod_absent=%u\n",
2119 phy_data->sfp_gpio_mod_absent);
2120 dev_dbg(pdata->dev, "SFP: gpio_rate_select=%u\n",
2121 phy_data->sfp_gpio_rate_select);
2122 }
2123}
2124
2125static void xgbe_phy_sfp_comm_setup(struct xgbe_prv_data *pdata)
2126{
2127 struct xgbe_phy_data *phy_data = pdata->phy_data;
2128 unsigned int reg, mux_addr_hi, mux_addr_lo;
2129
2130 reg = XP_IOREAD(pdata, XP_PROP_4);
2131
2132 mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
2133 mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
2134 if (mux_addr_lo == XGBE_SFP_DIRECT)
2135 return;
2136
2137 phy_data->sfp_comm = XGBE_SFP_COMM_PCA9545;
2138 phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
2139 phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
2140
2141 if (netif_msg_probe(pdata)) {
2142 dev_dbg(pdata->dev, "SFP: mux_address=%#x\n",
2143 phy_data->sfp_mux_address);
2144 dev_dbg(pdata->dev, "SFP: mux_channel=%u\n",
2145 phy_data->sfp_mux_channel);
2146 }
2147}
2148
2149static void xgbe_phy_sfp_setup(struct xgbe_prv_data *pdata)
2150{
2151 xgbe_phy_sfp_comm_setup(pdata);
2152 xgbe_phy_sfp_gpio_setup(pdata);
2153}
2154
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002155static int xgbe_phy_int_mdio_reset(struct xgbe_prv_data *pdata)
2156{
2157 struct xgbe_phy_data *phy_data = pdata->phy_data;
2158 unsigned int ret;
2159
2160 ret = pdata->hw_if.set_gpio(pdata, phy_data->mdio_reset_gpio);
2161 if (ret)
2162 return ret;
2163
2164 ret = pdata->hw_if.clr_gpio(pdata, phy_data->mdio_reset_gpio);
2165
2166 return ret;
2167}
2168
2169static int xgbe_phy_i2c_mdio_reset(struct xgbe_prv_data *pdata)
2170{
2171 struct xgbe_phy_data *phy_data = pdata->phy_data;
2172 u8 gpio_reg, gpio_ports[2], gpio_data[3];
2173 int ret;
2174
2175 /* Read the output port registers */
2176 gpio_reg = 2;
2177 ret = xgbe_phy_i2c_read(pdata, phy_data->mdio_reset_addr,
2178 &gpio_reg, sizeof(gpio_reg),
2179 gpio_ports, sizeof(gpio_ports));
2180 if (ret)
2181 return ret;
2182
2183 /* Prepare to write the GPIO data */
2184 gpio_data[0] = 2;
2185 gpio_data[1] = gpio_ports[0];
2186 gpio_data[2] = gpio_ports[1];
2187
2188 /* Set the GPIO pin */
2189 if (phy_data->mdio_reset_gpio < 8)
2190 gpio_data[1] |= (1 << (phy_data->mdio_reset_gpio % 8));
2191 else
2192 gpio_data[2] |= (1 << (phy_data->mdio_reset_gpio % 8));
2193
2194 /* Write the output port registers */
2195 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2196 gpio_data, sizeof(gpio_data));
2197 if (ret)
2198 return ret;
2199
2200 /* Clear the GPIO pin */
2201 if (phy_data->mdio_reset_gpio < 8)
2202 gpio_data[1] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2203 else
2204 gpio_data[2] &= ~(1 << (phy_data->mdio_reset_gpio % 8));
2205
2206 /* Write the output port registers */
2207 ret = xgbe_phy_i2c_write(pdata, phy_data->mdio_reset_addr,
2208 gpio_data, sizeof(gpio_data));
2209
2210 return ret;
2211}
2212
2213static int xgbe_phy_mdio_reset(struct xgbe_prv_data *pdata)
2214{
2215 struct xgbe_phy_data *phy_data = pdata->phy_data;
2216 int ret;
2217
2218 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2219 return 0;
2220
2221 ret = xgbe_phy_get_comm_ownership(pdata);
2222 if (ret)
2223 return ret;
2224
2225 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO)
2226 ret = xgbe_phy_i2c_mdio_reset(pdata);
2227 else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO)
2228 ret = xgbe_phy_int_mdio_reset(pdata);
2229
2230 xgbe_phy_put_comm_ownership(pdata);
2231
2232 return ret;
2233}
2234
2235static int xgbe_phy_mdio_reset_setup(struct xgbe_prv_data *pdata)
2236{
2237 struct xgbe_phy_data *phy_data = pdata->phy_data;
2238 unsigned int reg;
2239
2240 if (phy_data->conn_type != XGBE_CONN_TYPE_MDIO)
2241 return 0;
2242
2243 reg = XP_IOREAD(pdata, XP_PROP_3);
2244 phy_data->mdio_reset = XP_GET_BITS(reg, XP_PROP_3, MDIO_RESET);
2245 switch (phy_data->mdio_reset) {
2246 case XGBE_MDIO_RESET_NONE:
2247 case XGBE_MDIO_RESET_I2C_GPIO:
2248 case XGBE_MDIO_RESET_INT_GPIO:
2249 break;
2250 default:
2251 dev_err(pdata->dev, "unsupported MDIO reset (%#x)\n",
2252 phy_data->mdio_reset);
2253 return -EINVAL;
2254 }
2255
2256 if (phy_data->mdio_reset == XGBE_MDIO_RESET_I2C_GPIO) {
2257 phy_data->mdio_reset_addr = XGBE_GPIO_ADDRESS_PCA9555 +
2258 XP_GET_BITS(reg, XP_PROP_3,
2259 MDIO_RESET_I2C_ADDR);
2260 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2261 MDIO_RESET_I2C_GPIO);
2262 } else if (phy_data->mdio_reset == XGBE_MDIO_RESET_INT_GPIO) {
2263 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
2264 MDIO_RESET_INT_GPIO);
2265 }
2266
2267 return 0;
2268}
2269
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002270static bool xgbe_phy_port_mode_mismatch(struct xgbe_prv_data *pdata)
2271{
2272 struct xgbe_phy_data *phy_data = pdata->phy_data;
2273
2274 switch (phy_data->port_mode) {
2275 case XGBE_PORT_MODE_BACKPLANE:
2276 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2277 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2278 return false;
2279 break;
2280 case XGBE_PORT_MODE_BACKPLANE_2500:
2281 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500)
2282 return false;
2283 break;
2284 case XGBE_PORT_MODE_1000BASE_T:
2285 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2286 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000))
2287 return false;
2288 break;
2289 case XGBE_PORT_MODE_1000BASE_X:
2290 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
2291 return false;
2292 break;
2293 case XGBE_PORT_MODE_NBASE_T:
2294 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2295 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2296 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500))
2297 return false;
2298 break;
2299 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002300 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2301 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002302 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2303 return false;
2304 break;
2305 case XGBE_PORT_MODE_10GBASE_R:
2306 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
2307 return false;
2308 break;
2309 case XGBE_PORT_MODE_SFP:
2310 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2311 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2312 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2313 return false;
2314 break;
2315 default:
2316 break;
2317 }
2318
2319 return true;
2320}
2321
2322static bool xgbe_phy_conn_type_mismatch(struct xgbe_prv_data *pdata)
2323{
2324 struct xgbe_phy_data *phy_data = pdata->phy_data;
2325
2326 switch (phy_data->port_mode) {
2327 case XGBE_PORT_MODE_BACKPLANE:
2328 case XGBE_PORT_MODE_BACKPLANE_2500:
2329 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
2330 return false;
2331 break;
2332 case XGBE_PORT_MODE_1000BASE_T:
2333 case XGBE_PORT_MODE_1000BASE_X:
2334 case XGBE_PORT_MODE_NBASE_T:
2335 case XGBE_PORT_MODE_10GBASE_T:
2336 case XGBE_PORT_MODE_10GBASE_R:
2337 if (phy_data->conn_type == XGBE_CONN_TYPE_MDIO)
2338 return false;
2339 break;
2340 case XGBE_PORT_MODE_SFP:
2341 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
2342 return false;
2343 break;
2344 default:
2345 break;
2346 }
2347
2348 return true;
2349}
2350
2351static bool xgbe_phy_port_enabled(struct xgbe_prv_data *pdata)
2352{
2353 unsigned int reg;
2354
2355 reg = XP_IOREAD(pdata, XP_PROP_0);
2356 if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
2357 return false;
2358 if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
2359 return false;
2360
2361 return true;
2362}
2363
2364static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
2365{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002366 struct xgbe_phy_data *phy_data = pdata->phy_data;
2367
2368 /* If we have an external PHY, free it */
2369 xgbe_phy_free_phy_device(pdata);
2370
2371 /* Reset SFP data */
2372 xgbe_phy_sfp_reset(phy_data);
2373 xgbe_phy_sfp_mod_absent(pdata);
2374
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002375 /* Power off the PHY */
2376 xgbe_phy_power_off(pdata);
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002377
2378 /* Stop the I2C controller */
2379 pdata->i2c_if.i2c_stop(pdata);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002380}
2381
2382static int xgbe_phy_start(struct xgbe_prv_data *pdata)
2383{
2384 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002385 int ret;
2386
2387 /* Start the I2C controller */
2388 ret = pdata->i2c_if.i2c_start(pdata);
2389 if (ret)
2390 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002391
2392 /* Start in highest supported mode */
2393 xgbe_phy_set_mode(pdata, phy_data->start_mode);
2394
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002395 /* After starting the I2C controller, we can check for an SFP */
2396 switch (phy_data->port_mode) {
2397 case XGBE_PORT_MODE_SFP:
2398 xgbe_phy_sfp_detect(pdata);
2399 break;
2400 default:
2401 break;
2402 }
2403
2404 /* If we have an external PHY, start it */
2405 ret = xgbe_phy_find_phy_device(pdata);
2406 if (ret)
2407 goto err_i2c;
2408
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002409 return 0;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002410
2411err_i2c:
2412 pdata->i2c_if.i2c_stop(pdata);
2413
2414 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002415}
2416
2417static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
2418{
2419 struct xgbe_phy_data *phy_data = pdata->phy_data;
2420 enum xgbe_mode cur_mode;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002421 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002422
2423 /* Reset by power cycling the PHY */
2424 cur_mode = phy_data->cur_mode;
2425 xgbe_phy_power_off(pdata);
2426 xgbe_phy_set_mode(pdata, cur_mode);
2427
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002428 if (!phy_data->phydev)
2429 return 0;
2430
2431 /* Reset the external PHY */
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002432 ret = xgbe_phy_mdio_reset(pdata);
2433 if (ret)
2434 return ret;
2435
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002436 return phy_init_hw(phy_data->phydev);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002437}
2438
2439static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
2440{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002441 struct xgbe_phy_data *phy_data = pdata->phy_data;
2442
2443 /* Unregister for driving external PHYs */
2444 mdiobus_unregister(phy_data->mii);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002445}
2446
2447static int xgbe_phy_init(struct xgbe_prv_data *pdata)
2448{
2449 struct xgbe_phy_data *phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002450 struct mii_bus *mii;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002451 unsigned int reg;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002452 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002453
2454 /* Check if enabled */
2455 if (!xgbe_phy_port_enabled(pdata)) {
2456 dev_info(pdata->dev, "device is not enabled\n");
2457 return -ENODEV;
2458 }
2459
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002460 /* Initialize the I2C controller */
2461 ret = pdata->i2c_if.i2c_init(pdata);
2462 if (ret)
2463 return ret;
2464
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002465 phy_data = devm_kzalloc(pdata->dev, sizeof(*phy_data), GFP_KERNEL);
2466 if (!phy_data)
2467 return -ENOMEM;
2468 pdata->phy_data = phy_data;
2469
2470 reg = XP_IOREAD(pdata, XP_PROP_0);
2471 phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
2472 phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
2473 phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
2474 phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002475 phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002476 if (netif_msg_probe(pdata)) {
2477 dev_dbg(pdata->dev, "port mode=%u\n", phy_data->port_mode);
2478 dev_dbg(pdata->dev, "port id=%u\n", phy_data->port_id);
2479 dev_dbg(pdata->dev, "port speeds=%#x\n", phy_data->port_speeds);
2480 dev_dbg(pdata->dev, "conn type=%u\n", phy_data->conn_type);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002481 dev_dbg(pdata->dev, "mdio addr=%u\n", phy_data->mdio_addr);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002482 }
2483
2484 /* Validate the connection requested */
2485 if (xgbe_phy_conn_type_mismatch(pdata)) {
2486 dev_err(pdata->dev, "phy mode/connection mismatch (%#x/%#x)\n",
2487 phy_data->port_mode, phy_data->conn_type);
2488 }
2489
2490 /* Validate the mode requested */
2491 if (xgbe_phy_port_mode_mismatch(pdata)) {
2492 dev_err(pdata->dev, "phy mode/speed mismatch (%#x/%#x)\n",
2493 phy_data->port_mode, phy_data->port_speeds);
2494 return -EINVAL;
2495 }
2496
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002497 /* Check for and validate MDIO reset support */
2498 ret = xgbe_phy_mdio_reset_setup(pdata);
2499 if (ret)
2500 return ret;
2501
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002502 /* Indicate current mode is unknown */
2503 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
2504
2505 /* Initialize supported features */
2506 pdata->phy.supported = 0;
2507
2508 switch (phy_data->port_mode) {
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002509 /* Backplane support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002510 case XGBE_PORT_MODE_BACKPLANE:
2511 pdata->phy.supported |= SUPPORTED_Autoneg;
2512 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2513 pdata->phy.supported |= SUPPORTED_Backplane;
2514 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2515 pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
2516 phy_data->start_mode = XGBE_MODE_KX_1000;
2517 }
2518 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2519 pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
2520 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2521 pdata->phy.supported |=
2522 SUPPORTED_10000baseR_FEC;
2523 phy_data->start_mode = XGBE_MODE_KR;
2524 }
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002525
2526 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002527 break;
2528 case XGBE_PORT_MODE_BACKPLANE_2500:
2529 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2530 pdata->phy.supported |= SUPPORTED_Backplane;
2531 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2532 phy_data->start_mode = XGBE_MODE_KX_2500;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002533
2534 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002535 break;
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002536
2537 /* MDIO 1GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002538 case XGBE_PORT_MODE_1000BASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002539 pdata->phy.supported |= SUPPORTED_Autoneg;
2540 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2541 pdata->phy.supported |= SUPPORTED_TP;
2542 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2543 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2544 phy_data->start_mode = XGBE_MODE_SGMII_100;
2545 }
2546 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2547 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2548 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2549 }
2550
2551 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2552 break;
2553
2554 /* MDIO Base-X support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002555 case XGBE_PORT_MODE_1000BASE_X:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002556 pdata->phy.supported |= SUPPORTED_Autoneg;
2557 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2558 pdata->phy.supported |= SUPPORTED_FIBRE;
2559 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2560 phy_data->start_mode = XGBE_MODE_X;
2561
2562 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2563 break;
2564
2565 /* MDIO NBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002566 case XGBE_PORT_MODE_NBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002567 pdata->phy.supported |= SUPPORTED_Autoneg;
2568 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2569 pdata->phy.supported |= SUPPORTED_TP;
2570 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2571 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2572 phy_data->start_mode = XGBE_MODE_SGMII_100;
2573 }
2574 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2575 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2576 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2577 }
2578 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500) {
2579 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2580 phy_data->start_mode = XGBE_MODE_KX_2500;
2581 }
2582
2583 phy_data->phydev_mode = XGBE_MDIO_MODE_CL45;
2584 break;
2585
2586 /* 10GBase-T support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002587 case XGBE_PORT_MODE_10GBASE_T:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002588 pdata->phy.supported |= SUPPORTED_Autoneg;
2589 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2590 pdata->phy.supported |= SUPPORTED_TP;
2591 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2592 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2593 phy_data->start_mode = XGBE_MODE_SGMII_100;
2594 }
2595 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2596 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2597 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2598 }
2599 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2600 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2601 phy_data->start_mode = XGBE_MODE_KR;
2602 }
2603
2604 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2605 break;
2606
2607 /* 10GBase-R support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002608 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomas732f2ab2016-11-10 17:11:14 -06002609 pdata->phy.supported |= SUPPORTED_Autoneg;
2610 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2611 pdata->phy.supported |= SUPPORTED_TP;
2612 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2613 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2614 pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
2615 phy_data->start_mode = XGBE_MODE_SFI;
2616
2617 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
2618 break;
2619
2620 /* SFP support */
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002621 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002622 pdata->phy.supported |= SUPPORTED_Autoneg;
2623 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2624 pdata->phy.supported |= SUPPORTED_TP;
2625 pdata->phy.supported |= SUPPORTED_FIBRE;
2626 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2627 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2628 phy_data->start_mode = XGBE_MODE_SGMII_100;
2629 }
2630 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2631 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2632 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2633 }
2634 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2635 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2636 phy_data->start_mode = XGBE_MODE_SFI;
2637 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2638 pdata->phy.supported |=
2639 SUPPORTED_10000baseR_FEC;
2640 }
2641
2642 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2643
2644 xgbe_phy_sfp_setup(pdata);
2645 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002646 default:
2647 return -EINVAL;
2648 }
2649
2650 if (netif_msg_probe(pdata))
2651 dev_dbg(pdata->dev, "phy supported=%#x\n",
2652 pdata->phy.supported);
2653
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002654 /* Register for driving external PHYs */
2655 mii = devm_mdiobus_alloc(pdata->dev);
2656 if (!mii) {
2657 dev_err(pdata->dev, "mdiobus_alloc failed\n");
2658 return -ENOMEM;
2659 }
2660
2661 mii->priv = pdata;
2662 mii->name = "amd-xgbe-mii";
2663 mii->read = xgbe_phy_mii_read;
2664 mii->write = xgbe_phy_mii_write;
2665 mii->parent = pdata->dev;
2666 mii->phy_mask = ~0;
2667 snprintf(mii->id, sizeof(mii->id), "%s", dev_name(pdata->dev));
2668 ret = mdiobus_register(mii);
2669 if (ret) {
2670 dev_err(pdata->dev, "mdiobus_register failed\n");
2671 return ret;
2672 }
2673 phy_data->mii = mii;
2674
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002675 return 0;
2676}
2677
2678void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
2679{
2680 struct xgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
2681
2682 phy_impl->init = xgbe_phy_init;
2683 phy_impl->exit = xgbe_phy_exit;
2684
2685 phy_impl->reset = xgbe_phy_reset;
2686 phy_impl->start = xgbe_phy_start;
2687 phy_impl->stop = xgbe_phy_stop;
2688
2689 phy_impl->link_status = xgbe_phy_link_status;
2690
2691 phy_impl->valid_speed = xgbe_phy_valid_speed;
2692
2693 phy_impl->use_mode = xgbe_phy_use_mode;
2694 phy_impl->set_mode = xgbe_phy_set_mode;
2695 phy_impl->get_mode = xgbe_phy_get_mode;
2696 phy_impl->switch_mode = xgbe_phy_switch_mode;
2697 phy_impl->cur_mode = xgbe_phy_cur_mode;
2698
2699 phy_impl->an_mode = xgbe_phy_an_mode;
2700
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002701 phy_impl->an_config = xgbe_phy_an_config;
2702
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002703 phy_impl->an_outcome = xgbe_phy_an_outcome;
2704}