blob: 5d8cd8ba7838fa92c7577a59407f843f0b6a136c [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, Thomas47f164d2016-11-10 17:09:55 -0600272/* PHY related configuration information */
273struct xgbe_phy_data {
274 enum xgbe_port_mode port_mode;
275
276 unsigned int port_id;
277
278 unsigned int port_speeds;
279
280 enum xgbe_conn_type conn_type;
281
282 enum xgbe_mode cur_mode;
283 enum xgbe_mode start_mode;
284
285 unsigned int rrc_count;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600286
287 unsigned int mdio_addr;
288
289 unsigned int comm_owned;
290
291 /* SFP Support */
292 enum xgbe_sfp_comm sfp_comm;
293 unsigned int sfp_mux_address;
294 unsigned int sfp_mux_channel;
295
296 unsigned int sfp_gpio_address;
297 unsigned int sfp_gpio_mask;
298 unsigned int sfp_gpio_rx_los;
299 unsigned int sfp_gpio_tx_fault;
300 unsigned int sfp_gpio_mod_absent;
301 unsigned int sfp_gpio_rate_select;
302
303 unsigned int sfp_rx_los;
304 unsigned int sfp_tx_fault;
305 unsigned int sfp_mod_absent;
306 unsigned int sfp_diags;
307 unsigned int sfp_changed;
308 unsigned int sfp_phy_avail;
309 unsigned int sfp_cable_len;
310 enum xgbe_sfp_base sfp_base;
311 enum xgbe_sfp_cable sfp_cable;
312 enum xgbe_sfp_speed sfp_speed;
313 struct xgbe_sfp_eeprom sfp_eeprom;
314
315 /* External PHY support */
316 enum xgbe_mdio_mode phydev_mode;
317 struct mii_bus *mii;
318 struct phy_device *phydev;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -0600319};
320
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -0600321/* I2C, MDIO and GPIO lines are muxed, so only one device at a time */
322static DEFINE_MUTEX(xgbe_phy_comm_lock);
323
324static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata);
325
326static int xgbe_phy_i2c_xfer(struct xgbe_prv_data *pdata,
327 struct xgbe_i2c_op *i2c_op)
328{
329 struct xgbe_phy_data *phy_data = pdata->phy_data;
330
331 /* Be sure we own the bus */
332 if (WARN_ON(!phy_data->comm_owned))
333 return -EIO;
334
335 return pdata->i2c_if.i2c_xfer(pdata, i2c_op);
336}
337
338static int xgbe_phy_i2c_write(struct xgbe_prv_data *pdata, unsigned int target,
339 void *val, unsigned int val_len)
340{
341 struct xgbe_i2c_op i2c_op;
342 int retry, ret;
343
344 retry = 1;
345again:
346 /* Write the specfied register */
347 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
348 i2c_op.target = target;
349 i2c_op.len = val_len;
350 i2c_op.buf = val;
351 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
352 if ((ret == -EAGAIN) && retry--)
353 goto again;
354
355 return ret;
356}
357
358static int xgbe_phy_i2c_read(struct xgbe_prv_data *pdata, unsigned int target,
359 void *reg, unsigned int reg_len,
360 void *val, unsigned int val_len)
361{
362 struct xgbe_i2c_op i2c_op;
363 int retry, ret;
364
365 retry = 1;
366again1:
367 /* Set the specified register to read */
368 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
369 i2c_op.target = target;
370 i2c_op.len = reg_len;
371 i2c_op.buf = reg;
372 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
373 if (ret) {
374 if ((ret == -EAGAIN) && retry--)
375 goto again1;
376
377 return ret;
378 }
379
380 retry = 1;
381again2:
382 /* Read the specfied register */
383 i2c_op.cmd = XGBE_I2C_CMD_READ;
384 i2c_op.target = target;
385 i2c_op.len = val_len;
386 i2c_op.buf = val;
387 ret = xgbe_phy_i2c_xfer(pdata, &i2c_op);
388 if ((ret == -EAGAIN) && retry--)
389 goto again2;
390
391 return ret;
392}
393
394static int xgbe_phy_sfp_put_mux(struct xgbe_prv_data *pdata)
395{
396 struct xgbe_phy_data *phy_data = pdata->phy_data;
397 struct xgbe_i2c_op i2c_op;
398 u8 mux_channel;
399
400 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
401 return 0;
402
403 /* Select no mux channels */
404 mux_channel = 0;
405 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
406 i2c_op.target = phy_data->sfp_mux_address;
407 i2c_op.len = sizeof(mux_channel);
408 i2c_op.buf = &mux_channel;
409
410 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
411}
412
413static int xgbe_phy_sfp_get_mux(struct xgbe_prv_data *pdata)
414{
415 struct xgbe_phy_data *phy_data = pdata->phy_data;
416 struct xgbe_i2c_op i2c_op;
417 u8 mux_channel;
418
419 if (phy_data->sfp_comm == XGBE_SFP_COMM_DIRECT)
420 return 0;
421
422 /* Select desired mux channel */
423 mux_channel = 1 << phy_data->sfp_mux_channel;
424 i2c_op.cmd = XGBE_I2C_CMD_WRITE;
425 i2c_op.target = phy_data->sfp_mux_address;
426 i2c_op.len = sizeof(mux_channel);
427 i2c_op.buf = &mux_channel;
428
429 return xgbe_phy_i2c_xfer(pdata, &i2c_op);
430}
431
432static void xgbe_phy_put_comm_ownership(struct xgbe_prv_data *pdata)
433{
434 struct xgbe_phy_data *phy_data = pdata->phy_data;
435
436 phy_data->comm_owned = 0;
437
438 mutex_unlock(&xgbe_phy_comm_lock);
439}
440
441static int xgbe_phy_get_comm_ownership(struct xgbe_prv_data *pdata)
442{
443 struct xgbe_phy_data *phy_data = pdata->phy_data;
444 unsigned long timeout;
445 unsigned int mutex_id;
446
447 if (phy_data->comm_owned)
448 return 0;
449
450 /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
451 * the driver needs to take the software mutex and then the hardware
452 * mutexes before being able to use the busses.
453 */
454 mutex_lock(&xgbe_phy_comm_lock);
455
456 /* Clear the mutexes */
457 XP_IOWRITE(pdata, XP_I2C_MUTEX, XGBE_MUTEX_RELEASE);
458 XP_IOWRITE(pdata, XP_MDIO_MUTEX, XGBE_MUTEX_RELEASE);
459
460 /* Mutex formats are the same for I2C and MDIO/GPIO */
461 mutex_id = 0;
462 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ID, phy_data->port_id);
463 XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ACTIVE, 1);
464
465 timeout = jiffies + (5 * HZ);
466 while (time_before(jiffies, timeout)) {
467 /* Must be all zeroes in order to obtain the mutex */
468 if (XP_IOREAD(pdata, XP_I2C_MUTEX) ||
469 XP_IOREAD(pdata, XP_MDIO_MUTEX)) {
470 usleep_range(100, 200);
471 continue;
472 }
473
474 /* Obtain the mutex */
475 XP_IOWRITE(pdata, XP_I2C_MUTEX, mutex_id);
476 XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
477
478 phy_data->comm_owned = 1;
479 return 0;
480 }
481
482 mutex_unlock(&xgbe_phy_comm_lock);
483
484 netdev_err(pdata->netdev, "unable to obtain hardware mutexes\n");
485
486 return -ETIMEDOUT;
487}
488
489static int xgbe_phy_i2c_mii_write(struct xgbe_prv_data *pdata, int reg, u16 val)
490{
491 __be16 *mii_val;
492 u8 mii_data[3];
493 int ret;
494
495 ret = xgbe_phy_sfp_get_mux(pdata);
496 if (ret)
497 return ret;
498
499 mii_data[0] = reg & 0xff;
500 mii_val = (__be16 *)&mii_data[1];
501 *mii_val = cpu_to_be16(val);
502
503 ret = xgbe_phy_i2c_write(pdata, XGBE_SFP_PHY_ADDRESS,
504 mii_data, sizeof(mii_data));
505
506 xgbe_phy_sfp_put_mux(pdata);
507
508 return ret;
509}
510
511static int xgbe_phy_mii_write(struct mii_bus *mii, int addr, int reg, u16 val)
512{
513 struct xgbe_prv_data *pdata = mii->priv;
514 struct xgbe_phy_data *phy_data = pdata->phy_data;
515 int ret;
516
517 ret = xgbe_phy_get_comm_ownership(pdata);
518 if (ret)
519 return ret;
520
521 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
522 ret = xgbe_phy_i2c_mii_write(pdata, reg, val);
523 else
524 ret = -ENOTSUPP;
525
526 xgbe_phy_put_comm_ownership(pdata);
527
528 return ret;
529}
530
531static int xgbe_phy_i2c_mii_read(struct xgbe_prv_data *pdata, int reg)
532{
533 __be16 mii_val;
534 u8 mii_reg;
535 int ret;
536
537 ret = xgbe_phy_sfp_get_mux(pdata);
538 if (ret)
539 return ret;
540
541 mii_reg = reg;
542 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_PHY_ADDRESS,
543 &mii_reg, sizeof(mii_reg),
544 &mii_val, sizeof(mii_val));
545 if (!ret)
546 ret = be16_to_cpu(mii_val);
547
548 xgbe_phy_sfp_put_mux(pdata);
549
550 return ret;
551}
552
553static int xgbe_phy_mii_read(struct mii_bus *mii, int addr, int reg)
554{
555 struct xgbe_prv_data *pdata = mii->priv;
556 struct xgbe_phy_data *phy_data = pdata->phy_data;
557 int ret;
558
559 ret = xgbe_phy_get_comm_ownership(pdata);
560 if (ret)
561 return ret;
562
563 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
564 ret = xgbe_phy_i2c_mii_read(pdata, reg);
565 else
566 ret = -ENOTSUPP;
567
568 xgbe_phy_put_comm_ownership(pdata);
569
570 return ret;
571}
572
573static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
574{
575 struct xgbe_phy_data *phy_data = pdata->phy_data;
576
577 if (phy_data->sfp_mod_absent) {
578 pdata->phy.speed = SPEED_UNKNOWN;
579 pdata->phy.duplex = DUPLEX_UNKNOWN;
580 pdata->phy.autoneg = AUTONEG_ENABLE;
581 pdata->phy.advertising = pdata->phy.supported;
582 }
583
584 pdata->phy.advertising &= ~ADVERTISED_Autoneg;
585 pdata->phy.advertising &= ~ADVERTISED_TP;
586 pdata->phy.advertising &= ~ADVERTISED_FIBRE;
587 pdata->phy.advertising &= ~ADVERTISED_100baseT_Full;
588 pdata->phy.advertising &= ~ADVERTISED_1000baseT_Full;
589 pdata->phy.advertising &= ~ADVERTISED_10000baseT_Full;
590 pdata->phy.advertising &= ~ADVERTISED_10000baseR_FEC;
591
592 switch (phy_data->sfp_base) {
593 case XGBE_SFP_BASE_1000_T:
594 case XGBE_SFP_BASE_1000_SX:
595 case XGBE_SFP_BASE_1000_LX:
596 case XGBE_SFP_BASE_1000_CX:
597 pdata->phy.speed = SPEED_UNKNOWN;
598 pdata->phy.duplex = DUPLEX_UNKNOWN;
599 pdata->phy.autoneg = AUTONEG_ENABLE;
600 pdata->phy.advertising |= ADVERTISED_Autoneg;
601 break;
602 case XGBE_SFP_BASE_10000_SR:
603 case XGBE_SFP_BASE_10000_LR:
604 case XGBE_SFP_BASE_10000_LRM:
605 case XGBE_SFP_BASE_10000_ER:
606 case XGBE_SFP_BASE_10000_CR:
607 default:
608 pdata->phy.speed = SPEED_10000;
609 pdata->phy.duplex = DUPLEX_FULL;
610 pdata->phy.autoneg = AUTONEG_DISABLE;
611 break;
612 }
613
614 switch (phy_data->sfp_base) {
615 case XGBE_SFP_BASE_1000_T:
616 case XGBE_SFP_BASE_1000_CX:
617 case XGBE_SFP_BASE_10000_CR:
618 pdata->phy.advertising |= ADVERTISED_TP;
619 break;
620 default:
621 pdata->phy.advertising |= ADVERTISED_FIBRE;
622 }
623
624 switch (phy_data->sfp_speed) {
625 case XGBE_SFP_SPEED_100_1000:
626 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
627 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
628 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
629 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
630 break;
631 case XGBE_SFP_SPEED_1000:
632 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
633 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
634 break;
635 case XGBE_SFP_SPEED_10000:
636 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
637 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
638 break;
639 default:
640 /* Choose the fastest supported speed */
641 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
642 pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
643 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
644 pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
645 else if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100)
646 pdata->phy.advertising |= ADVERTISED_100baseT_Full;
647 }
648}
649
650static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
651 enum xgbe_sfp_speed sfp_speed)
652{
653 u8 *sfp_base, min, max;
654
655 sfp_base = sfp_eeprom->base;
656
657 switch (sfp_speed) {
658 case XGBE_SFP_SPEED_1000:
659 min = XGBE_SFP_BASE_BR_1GBE_MIN;
660 max = XGBE_SFP_BASE_BR_1GBE_MAX;
661 break;
662 case XGBE_SFP_SPEED_10000:
663 min = XGBE_SFP_BASE_BR_10GBE_MIN;
664 max = XGBE_SFP_BASE_BR_10GBE_MAX;
665 break;
666 default:
667 return false;
668 }
669
670 return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
671 (sfp_base[XGBE_SFP_BASE_BR] <= max));
672}
673
674static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
675{
676 struct xgbe_phy_data *phy_data = pdata->phy_data;
677
678 if (phy_data->phydev) {
679 phy_detach(phy_data->phydev);
680 phy_device_remove(phy_data->phydev);
681 phy_device_free(phy_data->phydev);
682 phy_data->phydev = NULL;
683 }
684}
685
686static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
687{
688 struct xgbe_phy_data *phy_data = pdata->phy_data;
689 unsigned int phy_id = phy_data->phydev->phy_id;
690
691 if ((phy_id & 0xfffffff0) != 0x01ff0cc0)
692 return false;
693
694 /* Enable Base-T AN */
695 phy_write(phy_data->phydev, 0x16, 0x0001);
696 phy_write(phy_data->phydev, 0x00, 0x9140);
697 phy_write(phy_data->phydev, 0x16, 0x0000);
698
699 /* Enable SGMII at 100Base-T/1000Base-T Full Duplex */
700 phy_write(phy_data->phydev, 0x1b, 0x9084);
701 phy_write(phy_data->phydev, 0x09, 0x0e00);
702 phy_write(phy_data->phydev, 0x00, 0x8140);
703 phy_write(phy_data->phydev, 0x04, 0x0d01);
704 phy_write(phy_data->phydev, 0x00, 0x9140);
705
706 phy_data->phydev->supported = PHY_GBIT_FEATURES;
707 phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
708 phy_data->phydev->advertising = phy_data->phydev->supported;
709
710 netif_dbg(pdata, drv, pdata->netdev,
711 "Finisar PHY quirk in place\n");
712
713 return true;
714}
715
716static void xgbe_phy_external_phy_quirks(struct xgbe_prv_data *pdata)
717{
718 if (xgbe_phy_finisar_phy_quirks(pdata))
719 return;
720}
721
722static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
723{
724 struct xgbe_phy_data *phy_data = pdata->phy_data;
725 struct phy_device *phydev;
726 int ret;
727
728 /* If we already have a PHY, just return */
729 if (phy_data->phydev)
730 return 0;
731
732 /* Check for the use of an external PHY */
733 if (phy_data->phydev_mode == XGBE_MDIO_MODE_NONE)
734 return 0;
735
736 /* For SFP, only use an external PHY if available */
737 if ((phy_data->port_mode == XGBE_PORT_MODE_SFP) &&
738 !phy_data->sfp_phy_avail)
739 return 0;
740
741 /* Create and connect to the PHY device */
742 phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
743 (phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
744 if (IS_ERR(phydev)) {
745 netdev_err(pdata->netdev, "get_phy_device failed\n");
746 return -ENODEV;
747 }
748 netif_dbg(pdata, drv, pdata->netdev, "external PHY id is %#010x\n",
749 phydev->phy_id);
750
751 /*TODO: If c45, add request_module based on one of the MMD ids? */
752
753 ret = phy_device_register(phydev);
754 if (ret) {
755 netdev_err(pdata->netdev, "phy_device_register failed\n");
756 phy_device_free(phydev);
757 return ret;
758 }
759
760 ret = phy_attach_direct(pdata->netdev, phydev, phydev->dev_flags,
761 PHY_INTERFACE_MODE_SGMII);
762 if (ret) {
763 netdev_err(pdata->netdev, "phy_attach_direct failed\n");
764 phy_device_remove(phydev);
765 phy_device_free(phydev);
766 return ret;
767 }
768 phy_data->phydev = phydev;
769
770 xgbe_phy_external_phy_quirks(pdata);
771 phydev->advertising &= pdata->phy.advertising;
772
773 phy_start_aneg(phy_data->phydev);
774
775 return 0;
776}
777
778static void xgbe_phy_sfp_external_phy(struct xgbe_prv_data *pdata)
779{
780 struct xgbe_phy_data *phy_data = pdata->phy_data;
781 int ret;
782
783 if (!phy_data->sfp_changed)
784 return;
785
786 phy_data->sfp_phy_avail = 0;
787
788 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
789 return;
790
791 /* Check access to the PHY by reading CTRL1 */
792 ret = xgbe_phy_i2c_mii_read(pdata, MII_BMCR);
793 if (ret < 0)
794 return;
795
796 /* Successfully accessed the PHY */
797 phy_data->sfp_phy_avail = 1;
798}
799
800static bool xgbe_phy_belfuse_parse_quirks(struct xgbe_prv_data *pdata)
801{
802 struct xgbe_phy_data *phy_data = pdata->phy_data;
803 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
804
805 if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
806 XGBE_BEL_FUSE_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN))
807 return false;
808
809 if (!memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
810 XGBE_BEL_FUSE_PARTNO, XGBE_SFP_BASE_VENDOR_PN_LEN)) {
811 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
812 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
813 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
814 if (phy_data->sfp_changed)
815 netif_dbg(pdata, drv, pdata->netdev,
816 "Bel-Fuse SFP quirk in place\n");
817 return true;
818 }
819
820 return false;
821}
822
823static bool xgbe_phy_sfp_parse_quirks(struct xgbe_prv_data *pdata)
824{
825 if (xgbe_phy_belfuse_parse_quirks(pdata))
826 return true;
827
828 return false;
829}
830
831static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
832{
833 struct xgbe_phy_data *phy_data = pdata->phy_data;
834 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
835 u8 *sfp_base;
836
837 sfp_base = sfp_eeprom->base;
838
839 if (sfp_base[XGBE_SFP_BASE_ID] != XGBE_SFP_ID_SFP)
840 return;
841
842 if (sfp_base[XGBE_SFP_BASE_EXT_ID] != XGBE_SFP_EXT_ID_SFP)
843 return;
844
845 if (xgbe_phy_sfp_parse_quirks(pdata))
846 return;
847
848 /* Assume ACTIVE cable unless told it is PASSIVE */
849 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
850 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
851 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
852 } else {
853 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
854 }
855
856 /* Determine the type of SFP */
857 if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
858 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
859 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
860 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
861 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LRM)
862 phy_data->sfp_base = XGBE_SFP_BASE_10000_LRM;
863 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_ER)
864 phy_data->sfp_base = XGBE_SFP_BASE_10000_ER;
865 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_SX)
866 phy_data->sfp_base = XGBE_SFP_BASE_1000_SX;
867 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_LX)
868 phy_data->sfp_base = XGBE_SFP_BASE_1000_LX;
869 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_CX)
870 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
871 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
872 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
873 else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
874 xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
875 phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
876
877 switch (phy_data->sfp_base) {
878 case XGBE_SFP_BASE_1000_T:
879 phy_data->sfp_speed = XGBE_SFP_SPEED_100_1000;
880 break;
881 case XGBE_SFP_BASE_1000_SX:
882 case XGBE_SFP_BASE_1000_LX:
883 case XGBE_SFP_BASE_1000_CX:
884 phy_data->sfp_speed = XGBE_SFP_SPEED_1000;
885 break;
886 case XGBE_SFP_BASE_10000_SR:
887 case XGBE_SFP_BASE_10000_LR:
888 case XGBE_SFP_BASE_10000_LRM:
889 case XGBE_SFP_BASE_10000_ER:
890 case XGBE_SFP_BASE_10000_CR:
891 phy_data->sfp_speed = XGBE_SFP_SPEED_10000;
892 break;
893 default:
894 break;
895 }
896}
897
898static void xgbe_phy_sfp_eeprom_info(struct xgbe_prv_data *pdata,
899 struct xgbe_sfp_eeprom *sfp_eeprom)
900{
901 struct xgbe_sfp_ascii sfp_ascii;
902 char *sfp_data = (char *)&sfp_ascii;
903
904 netif_dbg(pdata, drv, pdata->netdev, "SFP detected:\n");
905 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
906 XGBE_SFP_BASE_VENDOR_NAME_LEN);
907 sfp_data[XGBE_SFP_BASE_VENDOR_NAME_LEN] = '\0';
908 netif_dbg(pdata, drv, pdata->netdev, " vendor: %s\n",
909 sfp_data);
910
911 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_PN],
912 XGBE_SFP_BASE_VENDOR_PN_LEN);
913 sfp_data[XGBE_SFP_BASE_VENDOR_PN_LEN] = '\0';
914 netif_dbg(pdata, drv, pdata->netdev, " part number: %s\n",
915 sfp_data);
916
917 memcpy(sfp_data, &sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_REV],
918 XGBE_SFP_BASE_VENDOR_REV_LEN);
919 sfp_data[XGBE_SFP_BASE_VENDOR_REV_LEN] = '\0';
920 netif_dbg(pdata, drv, pdata->netdev, " revision level: %s\n",
921 sfp_data);
922
923 memcpy(sfp_data, &sfp_eeprom->extd[XGBE_SFP_BASE_VENDOR_SN],
924 XGBE_SFP_BASE_VENDOR_SN_LEN);
925 sfp_data[XGBE_SFP_BASE_VENDOR_SN_LEN] = '\0';
926 netif_dbg(pdata, drv, pdata->netdev, " serial number: %s\n",
927 sfp_data);
928}
929
930static bool xgbe_phy_sfp_verify_eeprom(u8 cc_in, u8 *buf, unsigned int len)
931{
932 u8 cc;
933
934 for (cc = 0; len; buf++, len--)
935 cc += *buf;
936
937 return (cc == cc_in) ? true : false;
938}
939
940static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
941{
942 struct xgbe_phy_data *phy_data = pdata->phy_data;
943 struct xgbe_sfp_eeprom sfp_eeprom;
944 u8 eeprom_addr;
945 int ret;
946
947 ret = xgbe_phy_sfp_get_mux(pdata);
948 if (ret) {
949 netdev_err(pdata->netdev, "I2C error setting SFP MUX\n");
950 return ret;
951 }
952
953 /* Read the SFP serial ID eeprom */
954 eeprom_addr = 0;
955 ret = xgbe_phy_i2c_read(pdata, XGBE_SFP_SERIAL_ID_ADDRESS,
956 &eeprom_addr, sizeof(eeprom_addr),
957 &sfp_eeprom, sizeof(sfp_eeprom));
958 if (ret) {
959 netdev_err(pdata->netdev, "I2C error reading SFP EEPROM\n");
960 goto put;
961 }
962
963 /* Validate the contents read */
964 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[XGBE_SFP_BASE_CC],
965 sfp_eeprom.base,
966 sizeof(sfp_eeprom.base) - 1)) {
967 ret = -EINVAL;
968 goto put;
969 }
970
971 if (!xgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[XGBE_SFP_EXTD_CC],
972 sfp_eeprom.extd,
973 sizeof(sfp_eeprom.extd) - 1)) {
974 ret = -EINVAL;
975 goto put;
976 }
977
978 /* Check for an added or changed SFP */
979 if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
980 phy_data->sfp_changed = 1;
981
982 if (netif_msg_drv(pdata))
983 xgbe_phy_sfp_eeprom_info(pdata, &sfp_eeprom);
984
985 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
986
987 if (sfp_eeprom.extd[XGBE_SFP_EXTD_SFF_8472]) {
988 u8 diag_type = sfp_eeprom.extd[XGBE_SFP_EXTD_DIAG];
989
990 if (!(diag_type & XGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
991 phy_data->sfp_diags = 1;
992 }
993
994 xgbe_phy_free_phy_device(pdata);
995 } else {
996 phy_data->sfp_changed = 0;
997 }
998
999put:
1000 xgbe_phy_sfp_put_mux(pdata);
1001
1002 return ret;
1003}
1004
1005static void xgbe_phy_sfp_signals(struct xgbe_prv_data *pdata)
1006{
1007 struct xgbe_phy_data *phy_data = pdata->phy_data;
1008 unsigned int gpio_input;
1009 u8 gpio_reg, gpio_ports[2];
1010 int ret;
1011
1012 /* Read the input port registers */
1013 gpio_reg = 0;
1014 ret = xgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
1015 &gpio_reg, sizeof(gpio_reg),
1016 gpio_ports, sizeof(gpio_ports));
1017 if (ret) {
1018 netdev_err(pdata->netdev, "I2C error reading SFP GPIOs\n");
1019 return;
1020 }
1021
1022 gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
1023
1024 if (phy_data->sfp_gpio_mask & XGBE_GPIO_NO_MOD_ABSENT) {
1025 /* No GPIO, just assume the module is present for now */
1026 phy_data->sfp_mod_absent = 0;
1027 } else {
1028 if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
1029 phy_data->sfp_mod_absent = 0;
1030 }
1031
1032 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_RX_LOS) &&
1033 (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
1034 phy_data->sfp_rx_los = 1;
1035
1036 if (!(phy_data->sfp_gpio_mask & XGBE_GPIO_NO_TX_FAULT) &&
1037 (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
1038 phy_data->sfp_tx_fault = 1;
1039}
1040
1041static void xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
1042{
1043 struct xgbe_phy_data *phy_data = pdata->phy_data;
1044
1045 xgbe_phy_free_phy_device(pdata);
1046
1047 phy_data->sfp_mod_absent = 1;
1048 phy_data->sfp_phy_avail = 0;
1049 memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
1050}
1051
1052static void xgbe_phy_sfp_reset(struct xgbe_phy_data *phy_data)
1053{
1054 phy_data->sfp_rx_los = 0;
1055 phy_data->sfp_tx_fault = 0;
1056 phy_data->sfp_mod_absent = 1;
1057 phy_data->sfp_diags = 0;
1058 phy_data->sfp_base = XGBE_SFP_BASE_UNKNOWN;
1059 phy_data->sfp_cable = XGBE_SFP_CABLE_UNKNOWN;
1060 phy_data->sfp_speed = XGBE_SFP_SPEED_UNKNOWN;
1061}
1062
1063static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
1064{
1065 struct xgbe_phy_data *phy_data = pdata->phy_data;
1066 int ret;
1067
1068 /* Reset the SFP signals and info */
1069 xgbe_phy_sfp_reset(phy_data);
1070
1071 ret = xgbe_phy_get_comm_ownership(pdata);
1072 if (ret)
1073 return;
1074
1075 /* Read the SFP signals and check for module presence */
1076 xgbe_phy_sfp_signals(pdata);
1077 if (phy_data->sfp_mod_absent) {
1078 xgbe_phy_sfp_mod_absent(pdata);
1079 goto put;
1080 }
1081
1082 ret = xgbe_phy_sfp_read_eeprom(pdata);
1083 if (ret) {
1084 /* Treat any error as if there isn't an SFP plugged in */
1085 xgbe_phy_sfp_reset(phy_data);
1086 xgbe_phy_sfp_mod_absent(pdata);
1087 goto put;
1088 }
1089
1090 xgbe_phy_sfp_parse_eeprom(pdata);
1091
1092 xgbe_phy_sfp_external_phy(pdata);
1093
1094put:
1095 xgbe_phy_sfp_phy_settings(pdata);
1096
1097 xgbe_phy_put_comm_ownership(pdata);
1098}
1099
1100static enum xgbe_mode xgbe_phy_an37_sgmii_outcome(struct xgbe_prv_data *pdata)
1101{
1102 struct xgbe_phy_data *phy_data = pdata->phy_data;
1103 enum xgbe_mode mode;
1104
1105 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1106 pdata->phy.lp_advertising |= ADVERTISED_TP;
1107
1108 if (pdata->phy.pause_autoneg && phy_data->phydev) {
1109 /* Flow control is obtained from the attached PHY */
1110 u16 lcl_adv = 0, rmt_adv = 0;
1111 u8 fc;
1112
1113 pdata->phy.tx_pause = 0;
1114 pdata->phy.rx_pause = 0;
1115
1116 if (phy_data->phydev->advertising & ADVERTISED_Pause)
1117 lcl_adv |= ADVERTISE_PAUSE_CAP;
1118 if (phy_data->phydev->advertising & ADVERTISED_Asym_Pause)
1119 lcl_adv |= ADVERTISE_PAUSE_ASYM;
1120
1121 if (phy_data->phydev->pause)
1122 rmt_adv |= LPA_PAUSE_CAP;
1123 if (phy_data->phydev->asym_pause)
1124 rmt_adv |= LPA_PAUSE_ASYM;
1125
1126 fc = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
1127 if (fc & FLOW_CTRL_TX)
1128 pdata->phy.tx_pause = 1;
1129 if (fc & FLOW_CTRL_RX)
1130 pdata->phy.rx_pause = 1;
1131 }
1132
1133 switch (pdata->an_status & XGBE_SGMII_AN_LINK_SPEED) {
1134 case XGBE_SGMII_AN_LINK_SPEED_100:
1135 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1136 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Full;
1137 mode = XGBE_MODE_SGMII_100;
1138 } else {
1139 /* Half-duplex not supported */
1140 pdata->phy.lp_advertising |= ADVERTISED_100baseT_Half;
1141 mode = XGBE_MODE_UNKNOWN;
1142 }
1143 break;
1144 case XGBE_SGMII_AN_LINK_SPEED_1000:
1145 if (pdata->an_status & XGBE_SGMII_AN_LINK_DUPLEX) {
1146 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1147 mode = XGBE_MODE_SGMII_1000;
1148 } else {
1149 /* Half-duplex not supported */
1150 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1151 mode = XGBE_MODE_UNKNOWN;
1152 }
1153 break;
1154 default:
1155 mode = XGBE_MODE_UNKNOWN;
1156 }
1157
1158 return mode;
1159}
1160
1161static enum xgbe_mode xgbe_phy_an37_outcome(struct xgbe_prv_data *pdata)
1162{
1163 enum xgbe_mode mode;
1164 unsigned int ad_reg, lp_reg;
1165
1166 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1167 pdata->phy.lp_advertising |= ADVERTISED_FIBRE;
1168
1169 /* Compare Advertisement and Link Partner register */
1170 ad_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_ADVERTISE);
1171 lp_reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_VEND2_AN_LP_ABILITY);
1172 if (lp_reg & 0x100)
1173 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1174 if (lp_reg & 0x80)
1175 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1176
1177 if (pdata->phy.pause_autoneg) {
1178 /* Set flow control based on auto-negotiation result */
1179 pdata->phy.tx_pause = 0;
1180 pdata->phy.rx_pause = 0;
1181
1182 if (ad_reg & lp_reg & 0x100) {
1183 pdata->phy.tx_pause = 1;
1184 pdata->phy.rx_pause = 1;
1185 } else if (ad_reg & lp_reg & 0x80) {
1186 if (ad_reg & 0x100)
1187 pdata->phy.rx_pause = 1;
1188 else if (lp_reg & 0x100)
1189 pdata->phy.tx_pause = 1;
1190 }
1191 }
1192
1193 if (lp_reg & 0x40)
1194 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Half;
1195 if (lp_reg & 0x20)
1196 pdata->phy.lp_advertising |= ADVERTISED_1000baseT_Full;
1197
1198 /* Half duplex is not supported */
1199 ad_reg &= lp_reg;
1200 mode = (ad_reg & 0x20) ? XGBE_MODE_X : XGBE_MODE_UNKNOWN;
1201
1202 return mode;
1203}
1204
1205static enum xgbe_mode xgbe_phy_an73_outcome(struct xgbe_prv_data *pdata)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001206{
1207 enum xgbe_mode mode;
1208 unsigned int ad_reg, lp_reg;
1209
1210 pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
1211 pdata->phy.lp_advertising |= ADVERTISED_Backplane;
1212
1213 /* Compare Advertisement and Link Partner register 1 */
1214 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
1215 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
1216 if (lp_reg & 0x400)
1217 pdata->phy.lp_advertising |= ADVERTISED_Pause;
1218 if (lp_reg & 0x800)
1219 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
1220
1221 if (pdata->phy.pause_autoneg) {
1222 /* Set flow control based on auto-negotiation result */
1223 pdata->phy.tx_pause = 0;
1224 pdata->phy.rx_pause = 0;
1225
1226 if (ad_reg & lp_reg & 0x400) {
1227 pdata->phy.tx_pause = 1;
1228 pdata->phy.rx_pause = 1;
1229 } else if (ad_reg & lp_reg & 0x800) {
1230 if (ad_reg & 0x400)
1231 pdata->phy.rx_pause = 1;
1232 else if (lp_reg & 0x400)
1233 pdata->phy.tx_pause = 1;
1234 }
1235 }
1236
1237 /* Compare Advertisement and Link Partner register 2 */
1238 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
1239 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
1240 if (lp_reg & 0x80)
1241 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
1242 if (lp_reg & 0x20)
1243 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
1244
1245 ad_reg &= lp_reg;
1246 if (ad_reg & 0x80)
1247 mode = XGBE_MODE_KR;
1248 else if (ad_reg & 0x20)
1249 mode = XGBE_MODE_KX_1000;
1250 else
1251 mode = XGBE_MODE_UNKNOWN;
1252
1253 /* Compare Advertisement and Link Partner register 3 */
1254 ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
1255 lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
1256 if (lp_reg & 0xc000)
1257 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
1258
1259 return mode;
1260}
1261
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001262static enum xgbe_mode xgbe_phy_an_outcome(struct xgbe_prv_data *pdata)
1263{
1264 switch (pdata->an_mode) {
1265 case XGBE_AN_MODE_CL73:
1266 return xgbe_phy_an73_outcome(pdata);
1267 case XGBE_AN_MODE_CL37:
1268 return xgbe_phy_an37_outcome(pdata);
1269 case XGBE_AN_MODE_CL37_SGMII:
1270 return xgbe_phy_an37_sgmii_outcome(pdata);
1271 default:
1272 return XGBE_MODE_UNKNOWN;
1273 }
1274}
1275
1276static int xgbe_phy_an_config(struct xgbe_prv_data *pdata)
1277{
1278 struct xgbe_phy_data *phy_data = pdata->phy_data;
1279 int ret;
1280
1281 ret = xgbe_phy_find_phy_device(pdata);
1282 if (ret)
1283 return ret;
1284
1285 if (!phy_data->phydev)
1286 return 0;
1287
1288 phy_data->phydev->autoneg = pdata->phy.autoneg;
1289 phy_data->phydev->advertising = phy_data->phydev->supported &
1290 pdata->phy.advertising;
1291
1292 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
1293 phy_data->phydev->speed = pdata->phy.speed;
1294 phy_data->phydev->duplex = pdata->phy.duplex;
1295 }
1296
1297 ret = phy_start_aneg(phy_data->phydev);
1298
1299 return ret;
1300}
1301
1302static enum xgbe_an_mode xgbe_phy_an_sfp_mode(struct xgbe_phy_data *phy_data)
1303{
1304 switch (phy_data->sfp_base) {
1305 case XGBE_SFP_BASE_1000_T:
1306 return XGBE_AN_MODE_CL37_SGMII;
1307 case XGBE_SFP_BASE_1000_SX:
1308 case XGBE_SFP_BASE_1000_LX:
1309 case XGBE_SFP_BASE_1000_CX:
1310 return XGBE_AN_MODE_CL37;
1311 default:
1312 return XGBE_AN_MODE_NONE;
1313 }
1314}
1315
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001316static enum xgbe_an_mode xgbe_phy_an_mode(struct xgbe_prv_data *pdata)
1317{
1318 struct xgbe_phy_data *phy_data = pdata->phy_data;
1319
1320 switch (phy_data->port_mode) {
1321 case XGBE_PORT_MODE_BACKPLANE:
1322 return XGBE_AN_MODE_CL73;
1323 case XGBE_PORT_MODE_BACKPLANE_2500:
1324 return XGBE_AN_MODE_NONE;
1325 case XGBE_PORT_MODE_1000BASE_T:
1326 case XGBE_PORT_MODE_1000BASE_X:
1327 case XGBE_PORT_MODE_NBASE_T:
1328 case XGBE_PORT_MODE_10GBASE_T:
1329 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001330 return XGBE_AN_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001331 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001332 return xgbe_phy_an_sfp_mode(phy_data);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001333 default:
1334 return XGBE_AN_MODE_NONE;
1335 }
1336}
1337
1338static void xgbe_phy_start_ratechange(struct xgbe_prv_data *pdata)
1339{
1340 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1341 return;
1342
1343 /* Log if a previous command did not complete */
1344 netif_dbg(pdata, link, pdata->netdev,
1345 "firmware mailbox not ready for command\n");
1346}
1347
1348static void xgbe_phy_complete_ratechange(struct xgbe_prv_data *pdata)
1349{
1350 unsigned int wait;
1351
1352 /* Wait for command to complete */
1353 wait = XGBE_RATECHANGE_COUNT;
1354 while (wait--) {
1355 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1356 return;
1357
1358 usleep_range(1000, 2000);
1359 }
1360
1361 netif_dbg(pdata, link, pdata->netdev,
1362 "firmware mailbox command did not complete\n");
1363}
1364
1365static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
1366{
1367 unsigned int s0;
1368
1369 xgbe_phy_start_ratechange(pdata);
1370
1371 /* Receiver Reset Cycle */
1372 s0 = 0;
1373 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1374 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1375
1376 /* Call FW to make the change */
1377 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1378 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1379 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1380
1381 xgbe_phy_complete_ratechange(pdata);
1382
1383 netif_dbg(pdata, link, pdata->netdev, "receiver reset complete\n");
1384}
1385
1386static void xgbe_phy_power_off(struct xgbe_prv_data *pdata)
1387{
1388 struct xgbe_phy_data *phy_data = pdata->phy_data;
1389
1390 xgbe_phy_start_ratechange(pdata);
1391
1392 /* Call FW to make the change */
1393 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1394 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1395 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1396
1397 xgbe_phy_complete_ratechange(pdata);
1398
1399 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
1400
1401 netif_dbg(pdata, link, pdata->netdev, "phy powered off\n");
1402}
1403
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001404static void xgbe_phy_sfi_mode(struct xgbe_prv_data *pdata)
1405{
1406 struct xgbe_phy_data *phy_data = pdata->phy_data;
1407 unsigned int s0;
1408
1409 xgbe_phy_start_ratechange(pdata);
1410
1411 /* 10G/SFI */
1412 s0 = 0;
1413 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1414 if (phy_data->sfp_cable != XGBE_SFP_CABLE_PASSIVE) {
1415 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1416 } else {
1417 if (phy_data->sfp_cable_len <= 1)
1418 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1419 else if (phy_data->sfp_cable_len <= 3)
1420 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1421 else if (phy_data->sfp_cable_len <= 5)
1422 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1423 else
1424 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1425 }
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 phy_data->cur_mode = XGBE_MODE_SFI;
1435
1436 netif_dbg(pdata, link, pdata->netdev, "10GbE SFI mode set\n");
1437}
1438
1439static void xgbe_phy_x_mode(struct xgbe_prv_data *pdata)
1440{
1441 struct xgbe_phy_data *phy_data = pdata->phy_data;
1442 unsigned int s0;
1443
1444 xgbe_phy_start_ratechange(pdata);
1445
1446 /* 1G/X */
1447 s0 = 0;
1448 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1449 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1450
1451 /* Call FW to make the change */
1452 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1453 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1454 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1455
1456 xgbe_phy_complete_ratechange(pdata);
1457
1458 phy_data->cur_mode = XGBE_MODE_X;
1459
1460 netif_dbg(pdata, link, pdata->netdev, "1GbE X mode set\n");
1461}
1462
1463static void xgbe_phy_sgmii_1000_mode(struct xgbe_prv_data *pdata)
1464{
1465 struct xgbe_phy_data *phy_data = pdata->phy_data;
1466 unsigned int s0;
1467
1468 xgbe_phy_start_ratechange(pdata);
1469
1470 /* 1G/SGMII */
1471 s0 = 0;
1472 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1473 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1474
1475 /* Call FW to make the change */
1476 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1477 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1478 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1479
1480 xgbe_phy_complete_ratechange(pdata);
1481
1482 phy_data->cur_mode = XGBE_MODE_SGMII_1000;
1483
1484 netif_dbg(pdata, link, pdata->netdev, "1GbE SGMII mode set\n");
1485}
1486
1487static void xgbe_phy_sgmii_100_mode(struct xgbe_prv_data *pdata)
1488{
1489 struct xgbe_phy_data *phy_data = pdata->phy_data;
1490 unsigned int s0;
1491
1492 xgbe_phy_start_ratechange(pdata);
1493
1494 /* 1G/SGMII */
1495 s0 = 0;
1496 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1497 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1498
1499 /* Call FW to make the change */
1500 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1501 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1502 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1503
1504 xgbe_phy_complete_ratechange(pdata);
1505
1506 phy_data->cur_mode = XGBE_MODE_SGMII_100;
1507
1508 netif_dbg(pdata, link, pdata->netdev, "100MbE SGMII mode set\n");
1509}
1510
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001511static void xgbe_phy_kr_mode(struct xgbe_prv_data *pdata)
1512{
1513 struct xgbe_phy_data *phy_data = pdata->phy_data;
1514 unsigned int s0;
1515
1516 xgbe_phy_start_ratechange(pdata);
1517
1518 /* 10G/KR */
1519 s0 = 0;
1520 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1521 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1522
1523 /* Call FW to make the change */
1524 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1525 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1526 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1527
1528 xgbe_phy_complete_ratechange(pdata);
1529
1530 phy_data->cur_mode = XGBE_MODE_KR;
1531
1532 netif_dbg(pdata, link, pdata->netdev, "10GbE KR mode set\n");
1533}
1534
1535static void xgbe_phy_kx_2500_mode(struct xgbe_prv_data *pdata)
1536{
1537 struct xgbe_phy_data *phy_data = pdata->phy_data;
1538 unsigned int s0;
1539
1540 xgbe_phy_start_ratechange(pdata);
1541
1542 /* 2.5G/KX */
1543 s0 = 0;
1544 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 2);
1545 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1546
1547 /* Call FW to make the change */
1548 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1549 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1550 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1551
1552 xgbe_phy_complete_ratechange(pdata);
1553
1554 phy_data->cur_mode = XGBE_MODE_KX_2500;
1555
1556 netif_dbg(pdata, link, pdata->netdev, "2.5GbE KX mode set\n");
1557}
1558
1559static void xgbe_phy_kx_1000_mode(struct xgbe_prv_data *pdata)
1560{
1561 struct xgbe_phy_data *phy_data = pdata->phy_data;
1562 unsigned int s0;
1563
1564 xgbe_phy_start_ratechange(pdata);
1565
1566 /* 1G/KX */
1567 s0 = 0;
1568 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 1);
1569 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1570
1571 /* Call FW to make the change */
1572 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1573 XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1574 XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1575
1576 xgbe_phy_complete_ratechange(pdata);
1577
1578 phy_data->cur_mode = XGBE_MODE_KX_1000;
1579
1580 netif_dbg(pdata, link, pdata->netdev, "1GbE KX mode set\n");
1581}
1582
1583static enum xgbe_mode xgbe_phy_cur_mode(struct xgbe_prv_data *pdata)
1584{
1585 struct xgbe_phy_data *phy_data = pdata->phy_data;
1586
1587 return phy_data->cur_mode;
1588}
1589
1590static enum xgbe_mode xgbe_phy_switch_bp_2500_mode(struct xgbe_prv_data *pdata)
1591{
1592 return XGBE_MODE_KX_2500;
1593}
1594
1595static enum xgbe_mode xgbe_phy_switch_bp_mode(struct xgbe_prv_data *pdata)
1596{
1597 /* If we are in KR switch to KX, and vice-versa */
1598 switch (xgbe_phy_cur_mode(pdata)) {
1599 case XGBE_MODE_KX_1000:
1600 return XGBE_MODE_KR;
1601 case XGBE_MODE_KR:
1602 default:
1603 return XGBE_MODE_KX_1000;
1604 }
1605}
1606
1607static enum xgbe_mode xgbe_phy_switch_mode(struct xgbe_prv_data *pdata)
1608{
1609 struct xgbe_phy_data *phy_data = pdata->phy_data;
1610
1611 switch (phy_data->port_mode) {
1612 case XGBE_PORT_MODE_BACKPLANE:
1613 return xgbe_phy_switch_bp_mode(pdata);
1614 case XGBE_PORT_MODE_BACKPLANE_2500:
1615 return xgbe_phy_switch_bp_2500_mode(pdata);
1616 case XGBE_PORT_MODE_1000BASE_T:
1617 case XGBE_PORT_MODE_1000BASE_X:
1618 case XGBE_PORT_MODE_NBASE_T:
1619 case XGBE_PORT_MODE_10GBASE_T:
1620 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001621 return XGBE_MODE_UNKNOWN;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001622 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001623 /* No switching, so just return current mode */
1624 return xgbe_phy_cur_mode(pdata);
1625 default:
1626 return XGBE_MODE_UNKNOWN;
1627 }
1628}
1629
1630static enum xgbe_mode xgbe_phy_get_sfp_mode(struct xgbe_phy_data *phy_data,
1631 int speed)
1632{
1633 switch (speed) {
1634 case SPEED_100:
1635 return XGBE_MODE_SGMII_100;
1636 case SPEED_1000:
1637 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
1638 return XGBE_MODE_SGMII_1000;
1639 else
1640 return XGBE_MODE_X;
1641 case SPEED_10000:
1642 case SPEED_UNKNOWN:
1643 return XGBE_MODE_SFI;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001644 default:
1645 return XGBE_MODE_UNKNOWN;
1646 }
1647}
1648
1649static enum xgbe_mode xgbe_phy_get_bp_2500_mode(int speed)
1650{
1651 switch (speed) {
1652 case SPEED_2500:
1653 return XGBE_MODE_KX_2500;
1654 default:
1655 return XGBE_MODE_UNKNOWN;
1656 }
1657}
1658
1659static enum xgbe_mode xgbe_phy_get_bp_mode(int speed)
1660{
1661 switch (speed) {
1662 case SPEED_1000:
1663 return XGBE_MODE_KX_1000;
1664 case SPEED_10000:
1665 return XGBE_MODE_KR;
1666 default:
1667 return XGBE_MODE_UNKNOWN;
1668 }
1669}
1670
1671static enum xgbe_mode xgbe_phy_get_mode(struct xgbe_prv_data *pdata,
1672 int speed)
1673{
1674 struct xgbe_phy_data *phy_data = pdata->phy_data;
1675
1676 switch (phy_data->port_mode) {
1677 case XGBE_PORT_MODE_BACKPLANE:
1678 return xgbe_phy_get_bp_mode(speed);
1679 case XGBE_PORT_MODE_BACKPLANE_2500:
1680 return xgbe_phy_get_bp_2500_mode(speed);
1681 case XGBE_PORT_MODE_1000BASE_T:
1682 case XGBE_PORT_MODE_1000BASE_X:
1683 case XGBE_PORT_MODE_NBASE_T:
1684 case XGBE_PORT_MODE_10GBASE_T:
1685 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001686 return XGBE_MODE_UNKNOWN;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001687 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001688 return xgbe_phy_get_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001689 default:
1690 return XGBE_MODE_UNKNOWN;
1691 }
1692}
1693
1694static void xgbe_phy_set_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
1695{
1696 switch (mode) {
1697 case XGBE_MODE_KX_1000:
1698 xgbe_phy_kx_1000_mode(pdata);
1699 break;
1700 case XGBE_MODE_KX_2500:
1701 xgbe_phy_kx_2500_mode(pdata);
1702 break;
1703 case XGBE_MODE_KR:
1704 xgbe_phy_kr_mode(pdata);
1705 break;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001706 case XGBE_MODE_SGMII_100:
1707 xgbe_phy_sgmii_100_mode(pdata);
1708 break;
1709 case XGBE_MODE_SGMII_1000:
1710 xgbe_phy_sgmii_1000_mode(pdata);
1711 break;
1712 case XGBE_MODE_X:
1713 xgbe_phy_x_mode(pdata);
1714 break;
1715 case XGBE_MODE_SFI:
1716 xgbe_phy_sfi_mode(pdata);
1717 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001718 default:
1719 break;
1720 }
1721}
1722
1723static bool xgbe_phy_check_mode(struct xgbe_prv_data *pdata,
1724 enum xgbe_mode mode, u32 advert)
1725{
1726 if (pdata->phy.autoneg == AUTONEG_ENABLE) {
1727 if (pdata->phy.advertising & advert)
1728 return true;
1729 } else {
1730 enum xgbe_mode cur_mode;
1731
1732 cur_mode = xgbe_phy_get_mode(pdata, pdata->phy.speed);
1733 if (cur_mode == mode)
1734 return true;
1735 }
1736
1737 return false;
1738}
1739
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001740static bool xgbe_phy_use_sfp_mode(struct xgbe_prv_data *pdata,
1741 enum xgbe_mode mode)
1742{
1743 struct xgbe_phy_data *phy_data = pdata->phy_data;
1744
1745 switch (mode) {
1746 case XGBE_MODE_X:
1747 if (phy_data->sfp_base == XGBE_SFP_BASE_1000_T)
1748 return false;
1749 return xgbe_phy_check_mode(pdata, mode,
1750 ADVERTISED_1000baseT_Full);
1751 case XGBE_MODE_SGMII_100:
1752 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
1753 return false;
1754 return xgbe_phy_check_mode(pdata, mode,
1755 ADVERTISED_100baseT_Full);
1756 case XGBE_MODE_SGMII_1000:
1757 if (phy_data->sfp_base != XGBE_SFP_BASE_1000_T)
1758 return false;
1759 return xgbe_phy_check_mode(pdata, mode,
1760 ADVERTISED_1000baseT_Full);
1761 case XGBE_MODE_SFI:
1762 return xgbe_phy_check_mode(pdata, mode,
1763 ADVERTISED_10000baseT_Full);
1764 default:
1765 return false;
1766 }
1767}
1768
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001769static bool xgbe_phy_use_bp_2500_mode(struct xgbe_prv_data *pdata,
1770 enum xgbe_mode mode)
1771{
1772 switch (mode) {
1773 case XGBE_MODE_KX_2500:
1774 return xgbe_phy_check_mode(pdata, mode,
1775 ADVERTISED_2500baseX_Full);
1776 default:
1777 return false;
1778 }
1779}
1780
1781static bool xgbe_phy_use_bp_mode(struct xgbe_prv_data *pdata,
1782 enum xgbe_mode mode)
1783{
1784 switch (mode) {
1785 case XGBE_MODE_KX_1000:
1786 return xgbe_phy_check_mode(pdata, mode,
1787 ADVERTISED_1000baseKX_Full);
1788 case XGBE_MODE_KR:
1789 return xgbe_phy_check_mode(pdata, mode,
1790 ADVERTISED_10000baseKR_Full);
1791 default:
1792 return false;
1793 }
1794}
1795
1796static bool xgbe_phy_use_mode(struct xgbe_prv_data *pdata, enum xgbe_mode mode)
1797{
1798 struct xgbe_phy_data *phy_data = pdata->phy_data;
1799
1800 switch (phy_data->port_mode) {
1801 case XGBE_PORT_MODE_BACKPLANE:
1802 return xgbe_phy_use_bp_mode(pdata, mode);
1803 case XGBE_PORT_MODE_BACKPLANE_2500:
1804 return xgbe_phy_use_bp_2500_mode(pdata, mode);
1805 case XGBE_PORT_MODE_1000BASE_T:
1806 case XGBE_PORT_MODE_1000BASE_X:
1807 case XGBE_PORT_MODE_NBASE_T:
1808 case XGBE_PORT_MODE_10GBASE_T:
1809 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001810 return false;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001811 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001812 return xgbe_phy_use_sfp_mode(pdata, mode);
1813 default:
1814 return false;
1815 }
1816}
1817
1818static bool xgbe_phy_valid_speed_sfp_mode(struct xgbe_phy_data *phy_data,
1819 int speed)
1820{
1821 switch (speed) {
1822 case SPEED_100:
1823 return (phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000);
1824 case SPEED_1000:
1825 return ((phy_data->sfp_speed == XGBE_SFP_SPEED_100_1000) ||
1826 (phy_data->sfp_speed == XGBE_SFP_SPEED_1000));
1827 case SPEED_10000:
1828 return (phy_data->sfp_speed == XGBE_SFP_SPEED_10000);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001829 default:
1830 return false;
1831 }
1832}
1833
1834static bool xgbe_phy_valid_speed_bp_2500_mode(int speed)
1835{
1836 switch (speed) {
1837 case SPEED_2500:
1838 return true;
1839 default:
1840 return false;
1841 }
1842}
1843
1844static bool xgbe_phy_valid_speed_bp_mode(int speed)
1845{
1846 switch (speed) {
1847 case SPEED_1000:
1848 case SPEED_10000:
1849 return true;
1850 default:
1851 return false;
1852 }
1853}
1854
1855static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
1856{
1857 struct xgbe_phy_data *phy_data = pdata->phy_data;
1858
1859 switch (phy_data->port_mode) {
1860 case XGBE_PORT_MODE_BACKPLANE:
1861 return xgbe_phy_valid_speed_bp_mode(speed);
1862 case XGBE_PORT_MODE_BACKPLANE_2500:
1863 return xgbe_phy_valid_speed_bp_2500_mode(speed);
1864 case XGBE_PORT_MODE_1000BASE_T:
1865 case XGBE_PORT_MODE_1000BASE_X:
1866 case XGBE_PORT_MODE_NBASE_T:
1867 case XGBE_PORT_MODE_10GBASE_T:
1868 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001869 return false;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001870 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001871 return xgbe_phy_valid_speed_sfp_mode(phy_data, speed);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001872 default:
1873 return false;
1874 }
1875}
1876
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001877static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001878{
1879 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001880 unsigned int ret, reg;
1881
1882 *an_restart = 0;
1883
1884 if (phy_data->port_mode == XGBE_PORT_MODE_SFP) {
1885 /* Check SFP signals */
1886 xgbe_phy_sfp_detect(pdata);
1887
1888 if (phy_data->sfp_changed) {
1889 *an_restart = 1;
1890 return 0;
1891 }
1892
1893 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
1894 return 0;
1895 }
1896
1897 if (phy_data->phydev) {
1898 /* Check external PHY */
1899 ret = phy_read_status(phy_data->phydev);
1900 if (ret < 0)
1901 return 0;
1902
1903 if ((pdata->phy.autoneg == AUTONEG_ENABLE) &&
1904 !phy_aneg_done(phy_data->phydev))
1905 return 0;
1906
1907 if (!phy_data->phydev->link)
1908 return 0;
1909 }
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001910
1911 /* Link status is latched low, so read once to clear
1912 * and then read again to get current state
1913 */
1914 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1915 reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1916 if (reg & MDIO_STAT1_LSTATUS)
1917 return 1;
1918
1919 /* No link, attempt a receiver reset cycle */
1920 if (phy_data->rrc_count++) {
1921 phy_data->rrc_count = 0;
1922 xgbe_phy_rrc(pdata);
1923 }
1924
1925 return 0;
1926}
1927
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06001928static void xgbe_phy_sfp_gpio_setup(struct xgbe_prv_data *pdata)
1929{
1930 struct xgbe_phy_data *phy_data = pdata->phy_data;
1931 unsigned int reg;
1932
1933 reg = XP_IOREAD(pdata, XP_PROP_3);
1934
1935 phy_data->sfp_gpio_address = XGBE_GPIO_ADDRESS_PCA9555 +
1936 XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
1937
1938 phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
1939
1940 phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
1941 GPIO_RX_LOS);
1942 phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
1943 GPIO_TX_FAULT);
1944 phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
1945 GPIO_MOD_ABS);
1946 phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
1947 GPIO_RATE_SELECT);
1948
1949 if (netif_msg_probe(pdata)) {
1950 dev_dbg(pdata->dev, "SFP: gpio_address=%#x\n",
1951 phy_data->sfp_gpio_address);
1952 dev_dbg(pdata->dev, "SFP: gpio_mask=%#x\n",
1953 phy_data->sfp_gpio_mask);
1954 dev_dbg(pdata->dev, "SFP: gpio_rx_los=%u\n",
1955 phy_data->sfp_gpio_rx_los);
1956 dev_dbg(pdata->dev, "SFP: gpio_tx_fault=%u\n",
1957 phy_data->sfp_gpio_tx_fault);
1958 dev_dbg(pdata->dev, "SFP: gpio_mod_absent=%u\n",
1959 phy_data->sfp_gpio_mod_absent);
1960 dev_dbg(pdata->dev, "SFP: gpio_rate_select=%u\n",
1961 phy_data->sfp_gpio_rate_select);
1962 }
1963}
1964
1965static void xgbe_phy_sfp_comm_setup(struct xgbe_prv_data *pdata)
1966{
1967 struct xgbe_phy_data *phy_data = pdata->phy_data;
1968 unsigned int reg, mux_addr_hi, mux_addr_lo;
1969
1970 reg = XP_IOREAD(pdata, XP_PROP_4);
1971
1972 mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
1973 mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
1974 if (mux_addr_lo == XGBE_SFP_DIRECT)
1975 return;
1976
1977 phy_data->sfp_comm = XGBE_SFP_COMM_PCA9545;
1978 phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
1979 phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
1980
1981 if (netif_msg_probe(pdata)) {
1982 dev_dbg(pdata->dev, "SFP: mux_address=%#x\n",
1983 phy_data->sfp_mux_address);
1984 dev_dbg(pdata->dev, "SFP: mux_channel=%u\n",
1985 phy_data->sfp_mux_channel);
1986 }
1987}
1988
1989static void xgbe_phy_sfp_setup(struct xgbe_prv_data *pdata)
1990{
1991 xgbe_phy_sfp_comm_setup(pdata);
1992 xgbe_phy_sfp_gpio_setup(pdata);
1993}
1994
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06001995static bool xgbe_phy_port_mode_mismatch(struct xgbe_prv_data *pdata)
1996{
1997 struct xgbe_phy_data *phy_data = pdata->phy_data;
1998
1999 switch (phy_data->port_mode) {
2000 case XGBE_PORT_MODE_BACKPLANE:
2001 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2002 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2003 return false;
2004 break;
2005 case XGBE_PORT_MODE_BACKPLANE_2500:
2006 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500)
2007 return false;
2008 break;
2009 case XGBE_PORT_MODE_1000BASE_T:
2010 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2011 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000))
2012 return false;
2013 break;
2014 case XGBE_PORT_MODE_1000BASE_X:
2015 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000)
2016 return false;
2017 break;
2018 case XGBE_PORT_MODE_NBASE_T:
2019 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2020 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2021 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_2500))
2022 return false;
2023 break;
2024 case XGBE_PORT_MODE_10GBASE_T:
2025 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2026 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2027 return false;
2028 break;
2029 case XGBE_PORT_MODE_10GBASE_R:
2030 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)
2031 return false;
2032 break;
2033 case XGBE_PORT_MODE_SFP:
2034 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) ||
2035 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
2036 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
2037 return false;
2038 break;
2039 default:
2040 break;
2041 }
2042
2043 return true;
2044}
2045
2046static bool xgbe_phy_conn_type_mismatch(struct xgbe_prv_data *pdata)
2047{
2048 struct xgbe_phy_data *phy_data = pdata->phy_data;
2049
2050 switch (phy_data->port_mode) {
2051 case XGBE_PORT_MODE_BACKPLANE:
2052 case XGBE_PORT_MODE_BACKPLANE_2500:
2053 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
2054 return false;
2055 break;
2056 case XGBE_PORT_MODE_1000BASE_T:
2057 case XGBE_PORT_MODE_1000BASE_X:
2058 case XGBE_PORT_MODE_NBASE_T:
2059 case XGBE_PORT_MODE_10GBASE_T:
2060 case XGBE_PORT_MODE_10GBASE_R:
2061 if (phy_data->conn_type == XGBE_CONN_TYPE_MDIO)
2062 return false;
2063 break;
2064 case XGBE_PORT_MODE_SFP:
2065 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP)
2066 return false;
2067 break;
2068 default:
2069 break;
2070 }
2071
2072 return true;
2073}
2074
2075static bool xgbe_phy_port_enabled(struct xgbe_prv_data *pdata)
2076{
2077 unsigned int reg;
2078
2079 reg = XP_IOREAD(pdata, XP_PROP_0);
2080 if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
2081 return false;
2082 if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
2083 return false;
2084
2085 return true;
2086}
2087
2088static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
2089{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002090 struct xgbe_phy_data *phy_data = pdata->phy_data;
2091
2092 /* If we have an external PHY, free it */
2093 xgbe_phy_free_phy_device(pdata);
2094
2095 /* Reset SFP data */
2096 xgbe_phy_sfp_reset(phy_data);
2097 xgbe_phy_sfp_mod_absent(pdata);
2098
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002099 /* Power off the PHY */
2100 xgbe_phy_power_off(pdata);
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002101
2102 /* Stop the I2C controller */
2103 pdata->i2c_if.i2c_stop(pdata);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002104}
2105
2106static int xgbe_phy_start(struct xgbe_prv_data *pdata)
2107{
2108 struct xgbe_phy_data *phy_data = pdata->phy_data;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002109 int ret;
2110
2111 /* Start the I2C controller */
2112 ret = pdata->i2c_if.i2c_start(pdata);
2113 if (ret)
2114 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002115
2116 /* Start in highest supported mode */
2117 xgbe_phy_set_mode(pdata, phy_data->start_mode);
2118
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002119 /* After starting the I2C controller, we can check for an SFP */
2120 switch (phy_data->port_mode) {
2121 case XGBE_PORT_MODE_SFP:
2122 xgbe_phy_sfp_detect(pdata);
2123 break;
2124 default:
2125 break;
2126 }
2127
2128 /* If we have an external PHY, start it */
2129 ret = xgbe_phy_find_phy_device(pdata);
2130 if (ret)
2131 goto err_i2c;
2132
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002133 return 0;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002134
2135err_i2c:
2136 pdata->i2c_if.i2c_stop(pdata);
2137
2138 return ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002139}
2140
2141static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
2142{
2143 struct xgbe_phy_data *phy_data = pdata->phy_data;
2144 enum xgbe_mode cur_mode;
2145
2146 /* Reset by power cycling the PHY */
2147 cur_mode = phy_data->cur_mode;
2148 xgbe_phy_power_off(pdata);
2149 xgbe_phy_set_mode(pdata, cur_mode);
2150
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002151 if (!phy_data->phydev)
2152 return 0;
2153
2154 /* Reset the external PHY */
2155 return phy_init_hw(phy_data->phydev);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002156}
2157
2158static void xgbe_phy_exit(struct xgbe_prv_data *pdata)
2159{
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002160 struct xgbe_phy_data *phy_data = pdata->phy_data;
2161
2162 /* Unregister for driving external PHYs */
2163 mdiobus_unregister(phy_data->mii);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002164}
2165
2166static int xgbe_phy_init(struct xgbe_prv_data *pdata)
2167{
2168 struct xgbe_phy_data *phy_data;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002169 struct mii_bus *mii;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002170 unsigned int reg;
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002171 int ret;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002172
2173 /* Check if enabled */
2174 if (!xgbe_phy_port_enabled(pdata)) {
2175 dev_info(pdata->dev, "device is not enabled\n");
2176 return -ENODEV;
2177 }
2178
Lendacky, Thomas5ab1dcd2016-11-10 17:10:36 -06002179 /* Initialize the I2C controller */
2180 ret = pdata->i2c_if.i2c_init(pdata);
2181 if (ret)
2182 return ret;
2183
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002184 phy_data = devm_kzalloc(pdata->dev, sizeof(*phy_data), GFP_KERNEL);
2185 if (!phy_data)
2186 return -ENOMEM;
2187 pdata->phy_data = phy_data;
2188
2189 reg = XP_IOREAD(pdata, XP_PROP_0);
2190 phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
2191 phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
2192 phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
2193 phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002194 phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002195 if (netif_msg_probe(pdata)) {
2196 dev_dbg(pdata->dev, "port mode=%u\n", phy_data->port_mode);
2197 dev_dbg(pdata->dev, "port id=%u\n", phy_data->port_id);
2198 dev_dbg(pdata->dev, "port speeds=%#x\n", phy_data->port_speeds);
2199 dev_dbg(pdata->dev, "conn type=%u\n", phy_data->conn_type);
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002200 dev_dbg(pdata->dev, "mdio addr=%u\n", phy_data->mdio_addr);
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002201 }
2202
2203 /* Validate the connection requested */
2204 if (xgbe_phy_conn_type_mismatch(pdata)) {
2205 dev_err(pdata->dev, "phy mode/connection mismatch (%#x/%#x)\n",
2206 phy_data->port_mode, phy_data->conn_type);
2207 }
2208
2209 /* Validate the mode requested */
2210 if (xgbe_phy_port_mode_mismatch(pdata)) {
2211 dev_err(pdata->dev, "phy mode/speed mismatch (%#x/%#x)\n",
2212 phy_data->port_mode, phy_data->port_speeds);
2213 return -EINVAL;
2214 }
2215
2216 /* Indicate current mode is unknown */
2217 phy_data->cur_mode = XGBE_MODE_UNKNOWN;
2218
2219 /* Initialize supported features */
2220 pdata->phy.supported = 0;
2221
2222 switch (phy_data->port_mode) {
2223 case XGBE_PORT_MODE_BACKPLANE:
2224 pdata->phy.supported |= SUPPORTED_Autoneg;
2225 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2226 pdata->phy.supported |= SUPPORTED_Backplane;
2227 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2228 pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
2229 phy_data->start_mode = XGBE_MODE_KX_1000;
2230 }
2231 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2232 pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
2233 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2234 pdata->phy.supported |=
2235 SUPPORTED_10000baseR_FEC;
2236 phy_data->start_mode = XGBE_MODE_KR;
2237 }
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002238
2239 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002240 break;
2241 case XGBE_PORT_MODE_BACKPLANE_2500:
2242 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2243 pdata->phy.supported |= SUPPORTED_Backplane;
2244 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2245 phy_data->start_mode = XGBE_MODE_KX_2500;
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002246
2247 phy_data->phydev_mode = XGBE_MDIO_MODE_NONE;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002248 break;
2249 case XGBE_PORT_MODE_1000BASE_T:
2250 case XGBE_PORT_MODE_1000BASE_X:
2251 case XGBE_PORT_MODE_NBASE_T:
2252 case XGBE_PORT_MODE_10GBASE_T:
2253 case XGBE_PORT_MODE_10GBASE_R:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002254 return -ENODEV;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002255 case XGBE_PORT_MODE_SFP:
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002256 pdata->phy.supported |= SUPPORTED_Autoneg;
2257 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2258 pdata->phy.supported |= SUPPORTED_TP;
2259 pdata->phy.supported |= SUPPORTED_FIBRE;
2260 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_100) {
2261 pdata->phy.supported |= SUPPORTED_100baseT_Full;
2262 phy_data->start_mode = XGBE_MODE_SGMII_100;
2263 }
2264 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) {
2265 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2266 phy_data->start_mode = XGBE_MODE_SGMII_1000;
2267 }
2268 if (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000) {
2269 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2270 phy_data->start_mode = XGBE_MODE_SFI;
2271 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2272 pdata->phy.supported |=
2273 SUPPORTED_10000baseR_FEC;
2274 }
2275
2276 phy_data->phydev_mode = XGBE_MDIO_MODE_CL22;
2277
2278 xgbe_phy_sfp_setup(pdata);
2279 break;
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002280 default:
2281 return -EINVAL;
2282 }
2283
2284 if (netif_msg_probe(pdata))
2285 dev_dbg(pdata->dev, "phy supported=%#x\n",
2286 pdata->phy.supported);
2287
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002288 /* Register for driving external PHYs */
2289 mii = devm_mdiobus_alloc(pdata->dev);
2290 if (!mii) {
2291 dev_err(pdata->dev, "mdiobus_alloc failed\n");
2292 return -ENOMEM;
2293 }
2294
2295 mii->priv = pdata;
2296 mii->name = "amd-xgbe-mii";
2297 mii->read = xgbe_phy_mii_read;
2298 mii->write = xgbe_phy_mii_write;
2299 mii->parent = pdata->dev;
2300 mii->phy_mask = ~0;
2301 snprintf(mii->id, sizeof(mii->id), "%s", dev_name(pdata->dev));
2302 ret = mdiobus_register(mii);
2303 if (ret) {
2304 dev_err(pdata->dev, "mdiobus_register failed\n");
2305 return ret;
2306 }
2307 phy_data->mii = mii;
2308
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002309 return 0;
2310}
2311
2312void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
2313{
2314 struct xgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
2315
2316 phy_impl->init = xgbe_phy_init;
2317 phy_impl->exit = xgbe_phy_exit;
2318
2319 phy_impl->reset = xgbe_phy_reset;
2320 phy_impl->start = xgbe_phy_start;
2321 phy_impl->stop = xgbe_phy_stop;
2322
2323 phy_impl->link_status = xgbe_phy_link_status;
2324
2325 phy_impl->valid_speed = xgbe_phy_valid_speed;
2326
2327 phy_impl->use_mode = xgbe_phy_use_mode;
2328 phy_impl->set_mode = xgbe_phy_set_mode;
2329 phy_impl->get_mode = xgbe_phy_get_mode;
2330 phy_impl->switch_mode = xgbe_phy_switch_mode;
2331 phy_impl->cur_mode = xgbe_phy_cur_mode;
2332
2333 phy_impl->an_mode = xgbe_phy_an_mode;
2334
Lendacky, Thomasabf0a1c2016-11-10 17:10:58 -06002335 phy_impl->an_config = xgbe_phy_an_config;
2336
Lendacky, Thomas47f164d2016-11-10 17:09:55 -06002337 phy_impl->an_outcome = xgbe_phy_an_outcome;
2338}