net/axgbe: add phy programming APIs
[dpdk.git] / drivers / net / axgbe / axgbe_phy_impl.c
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3  *   Copyright(c) 2018 Synopsys, Inc. All rights reserved.
4  */
5
6 #include "axgbe_ethdev.h"
7 #include "axgbe_common.h"
8 #include "axgbe_phy.h"
9
10 #define AXGBE_PHY_PORT_SPEED_100        BIT(0)
11 #define AXGBE_PHY_PORT_SPEED_1000       BIT(1)
12 #define AXGBE_PHY_PORT_SPEED_2500       BIT(2)
13 #define AXGBE_PHY_PORT_SPEED_10000      BIT(3)
14
15 #define AXGBE_MUTEX_RELEASE             0x80000000
16
17 #define AXGBE_SFP_DIRECT                7
18
19 /* I2C target addresses */
20 #define AXGBE_SFP_SERIAL_ID_ADDRESS     0x50
21 #define AXGBE_SFP_DIAG_INFO_ADDRESS     0x51
22 #define AXGBE_SFP_PHY_ADDRESS           0x56
23 #define AXGBE_GPIO_ADDRESS_PCA9555      0x20
24
25 /* SFP sideband signal indicators */
26 #define AXGBE_GPIO_NO_TX_FAULT          BIT(0)
27 #define AXGBE_GPIO_NO_RATE_SELECT       BIT(1)
28 #define AXGBE_GPIO_NO_MOD_ABSENT        BIT(2)
29 #define AXGBE_GPIO_NO_RX_LOS            BIT(3)
30
31 /* Rate-change complete wait/retry count */
32 #define AXGBE_RATECHANGE_COUNT          500
33
34 enum axgbe_port_mode {
35         AXGBE_PORT_MODE_RSVD = 0,
36         AXGBE_PORT_MODE_BACKPLANE,
37         AXGBE_PORT_MODE_BACKPLANE_2500,
38         AXGBE_PORT_MODE_1000BASE_T,
39         AXGBE_PORT_MODE_1000BASE_X,
40         AXGBE_PORT_MODE_NBASE_T,
41         AXGBE_PORT_MODE_10GBASE_T,
42         AXGBE_PORT_MODE_10GBASE_R,
43         AXGBE_PORT_MODE_SFP,
44         AXGBE_PORT_MODE_MAX,
45 };
46
47 enum axgbe_conn_type {
48         AXGBE_CONN_TYPE_NONE = 0,
49         AXGBE_CONN_TYPE_SFP,
50         AXGBE_CONN_TYPE_MDIO,
51         AXGBE_CONN_TYPE_RSVD1,
52         AXGBE_CONN_TYPE_BACKPLANE,
53         AXGBE_CONN_TYPE_MAX,
54 };
55
56 /* SFP/SFP+ related definitions */
57 enum axgbe_sfp_comm {
58         AXGBE_SFP_COMM_DIRECT = 0,
59         AXGBE_SFP_COMM_PCA9545,
60 };
61
62 enum axgbe_sfp_cable {
63         AXGBE_SFP_CABLE_UNKNOWN = 0,
64         AXGBE_SFP_CABLE_ACTIVE,
65         AXGBE_SFP_CABLE_PASSIVE,
66 };
67
68 enum axgbe_sfp_base {
69         AXGBE_SFP_BASE_UNKNOWN = 0,
70         AXGBE_SFP_BASE_1000_T,
71         AXGBE_SFP_BASE_1000_SX,
72         AXGBE_SFP_BASE_1000_LX,
73         AXGBE_SFP_BASE_1000_CX,
74         AXGBE_SFP_BASE_10000_SR,
75         AXGBE_SFP_BASE_10000_LR,
76         AXGBE_SFP_BASE_10000_LRM,
77         AXGBE_SFP_BASE_10000_ER,
78         AXGBE_SFP_BASE_10000_CR,
79 };
80
81 enum axgbe_sfp_speed {
82         AXGBE_SFP_SPEED_UNKNOWN = 0,
83         AXGBE_SFP_SPEED_100_1000,
84         AXGBE_SFP_SPEED_1000,
85         AXGBE_SFP_SPEED_10000,
86 };
87
88 /* SFP Serial ID Base ID values relative to an offset of 0 */
89 #define AXGBE_SFP_BASE_ID                       0
90 #define AXGBE_SFP_ID_SFP                        0x03
91
92 #define AXGBE_SFP_BASE_EXT_ID                   1
93 #define AXGBE_SFP_EXT_ID_SFP                    0x04
94
95 #define AXGBE_SFP_BASE_10GBE_CC                 3
96 #define AXGBE_SFP_BASE_10GBE_CC_SR              BIT(4)
97 #define AXGBE_SFP_BASE_10GBE_CC_LR              BIT(5)
98 #define AXGBE_SFP_BASE_10GBE_CC_LRM             BIT(6)
99 #define AXGBE_SFP_BASE_10GBE_CC_ER              BIT(7)
100
101 #define AXGBE_SFP_BASE_1GBE_CC                  6
102 #define AXGBE_SFP_BASE_1GBE_CC_SX               BIT(0)
103 #define AXGBE_SFP_BASE_1GBE_CC_LX               BIT(1)
104 #define AXGBE_SFP_BASE_1GBE_CC_CX               BIT(2)
105 #define AXGBE_SFP_BASE_1GBE_CC_T                BIT(3)
106
107 #define AXGBE_SFP_BASE_CABLE                    8
108 #define AXGBE_SFP_BASE_CABLE_PASSIVE            BIT(2)
109 #define AXGBE_SFP_BASE_CABLE_ACTIVE             BIT(3)
110
111 #define AXGBE_SFP_BASE_BR                       12
112 #define AXGBE_SFP_BASE_BR_1GBE_MIN              0x0a
113 #define AXGBE_SFP_BASE_BR_1GBE_MAX              0x0d
114 #define AXGBE_SFP_BASE_BR_10GBE_MIN             0x64
115 #define AXGBE_SFP_BASE_BR_10GBE_MAX             0x68
116
117 #define AXGBE_SFP_BASE_CU_CABLE_LEN             18
118
119 #define AXGBE_SFP_BASE_VENDOR_NAME              20
120 #define AXGBE_SFP_BASE_VENDOR_NAME_LEN          16
121 #define AXGBE_SFP_BASE_VENDOR_PN                40
122 #define AXGBE_SFP_BASE_VENDOR_PN_LEN            16
123 #define AXGBE_SFP_BASE_VENDOR_REV               56
124 #define AXGBE_SFP_BASE_VENDOR_REV_LEN           4
125
126 #define AXGBE_SFP_BASE_CC                       63
127
128 /* SFP Serial ID Extended ID values relative to an offset of 64 */
129 #define AXGBE_SFP_BASE_VENDOR_SN                4
130 #define AXGBE_SFP_BASE_VENDOR_SN_LEN            16
131
132 #define AXGBE_SFP_EXTD_DIAG                     28
133 #define AXGBE_SFP_EXTD_DIAG_ADDR_CHANGE         BIT(2)
134
135 #define AXGBE_SFP_EXTD_SFF_8472                 30
136
137 #define AXGBE_SFP_EXTD_CC                       31
138
139 struct axgbe_sfp_eeprom {
140         u8 base[64];
141         u8 extd[32];
142         u8 vendor[32];
143 };
144
145 #define AXGBE_BEL_FUSE_VENDOR   "BEL-FUSE"
146 #define AXGBE_BEL_FUSE_PARTNO   "1GBT-SFP06"
147
148 struct axgbe_sfp_ascii {
149         union {
150                 char vendor[AXGBE_SFP_BASE_VENDOR_NAME_LEN + 1];
151                 char partno[AXGBE_SFP_BASE_VENDOR_PN_LEN + 1];
152                 char rev[AXGBE_SFP_BASE_VENDOR_REV_LEN + 1];
153                 char serno[AXGBE_SFP_BASE_VENDOR_SN_LEN + 1];
154         } u;
155 };
156
157 /* MDIO PHY reset types */
158 enum axgbe_mdio_reset {
159         AXGBE_MDIO_RESET_NONE = 0,
160         AXGBE_MDIO_RESET_I2C_GPIO,
161         AXGBE_MDIO_RESET_INT_GPIO,
162         AXGBE_MDIO_RESET_MAX,
163 };
164
165 /* Re-driver related definitions */
166 enum axgbe_phy_redrv_if {
167         AXGBE_PHY_REDRV_IF_MDIO = 0,
168         AXGBE_PHY_REDRV_IF_I2C,
169         AXGBE_PHY_REDRV_IF_MAX,
170 };
171
172 enum axgbe_phy_redrv_model {
173         AXGBE_PHY_REDRV_MODEL_4223 = 0,
174         AXGBE_PHY_REDRV_MODEL_4227,
175         AXGBE_PHY_REDRV_MODEL_MAX,
176 };
177
178 enum axgbe_phy_redrv_mode {
179         AXGBE_PHY_REDRV_MODE_CX = 5,
180         AXGBE_PHY_REDRV_MODE_SR = 9,
181 };
182
183 #define AXGBE_PHY_REDRV_MODE_REG        0x12b0
184
185 /* PHY related configuration information */
186 struct axgbe_phy_data {
187         enum axgbe_port_mode port_mode;
188
189         unsigned int port_id;
190
191         unsigned int port_speeds;
192
193         enum axgbe_conn_type conn_type;
194
195         enum axgbe_mode cur_mode;
196         enum axgbe_mode start_mode;
197
198         unsigned int rrc_count;
199
200         unsigned int mdio_addr;
201
202         unsigned int comm_owned;
203
204         /* SFP Support */
205         enum axgbe_sfp_comm sfp_comm;
206         unsigned int sfp_mux_address;
207         unsigned int sfp_mux_channel;
208
209         unsigned int sfp_gpio_address;
210         unsigned int sfp_gpio_mask;
211         unsigned int sfp_gpio_rx_los;
212         unsigned int sfp_gpio_tx_fault;
213         unsigned int sfp_gpio_mod_absent;
214         unsigned int sfp_gpio_rate_select;
215
216         unsigned int sfp_rx_los;
217         unsigned int sfp_tx_fault;
218         unsigned int sfp_mod_absent;
219         unsigned int sfp_diags;
220         unsigned int sfp_changed;
221         unsigned int sfp_phy_avail;
222         unsigned int sfp_cable_len;
223         enum axgbe_sfp_base sfp_base;
224         enum axgbe_sfp_cable sfp_cable;
225         enum axgbe_sfp_speed sfp_speed;
226         struct axgbe_sfp_eeprom sfp_eeprom;
227
228         /* External PHY support */
229         enum axgbe_mdio_mode phydev_mode;
230         enum axgbe_mdio_reset mdio_reset;
231         unsigned int mdio_reset_addr;
232         unsigned int mdio_reset_gpio;
233
234         /* Re-driver support */
235         unsigned int redrv;
236         unsigned int redrv_if;
237         unsigned int redrv_addr;
238         unsigned int redrv_lane;
239         unsigned int redrv_model;
240 };
241
242 static enum axgbe_an_mode axgbe_phy_an_mode(struct axgbe_port *pdata);
243
244 static int axgbe_phy_i2c_xfer(struct axgbe_port *pdata,
245                               struct axgbe_i2c_op *i2c_op)
246 {
247         struct axgbe_phy_data *phy_data = pdata->phy_data;
248
249         /* Be sure we own the bus */
250         if (!phy_data->comm_owned)
251                 return -EIO;
252
253         return pdata->i2c_if.i2c_xfer(pdata, i2c_op);
254 }
255
256 static int axgbe_phy_redrv_write(struct axgbe_port *pdata, unsigned int reg,
257                                  unsigned int val)
258 {
259         struct axgbe_phy_data *phy_data = pdata->phy_data;
260         struct axgbe_i2c_op i2c_op;
261         uint16_t *redrv_val;
262         u8 redrv_data[5], csum;
263         unsigned int i, retry;
264         int ret;
265
266         /* High byte of register contains read/write indicator */
267         redrv_data[0] = ((reg >> 8) & 0xff) << 1;
268         redrv_data[1] = reg & 0xff;
269         redrv_val = (uint16_t *)&redrv_data[2];
270         *redrv_val = rte_cpu_to_be_16(val);
271
272         /* Calculate 1 byte checksum */
273         csum = 0;
274         for (i = 0; i < 4; i++) {
275                 csum += redrv_data[i];
276                 if (redrv_data[i] > csum)
277                         csum++;
278         }
279         redrv_data[4] = ~csum;
280
281         retry = 1;
282 again1:
283         i2c_op.cmd = AXGBE_I2C_CMD_WRITE;
284         i2c_op.target = phy_data->redrv_addr;
285         i2c_op.len = sizeof(redrv_data);
286         i2c_op.buf = redrv_data;
287         ret = axgbe_phy_i2c_xfer(pdata, &i2c_op);
288         if (ret) {
289                 if ((ret == -EAGAIN) && retry--)
290                         goto again1;
291
292                 return ret;
293         }
294
295         retry = 1;
296 again2:
297         i2c_op.cmd = AXGBE_I2C_CMD_READ;
298         i2c_op.target = phy_data->redrv_addr;
299         i2c_op.len = 1;
300         i2c_op.buf = redrv_data;
301         ret = axgbe_phy_i2c_xfer(pdata, &i2c_op);
302         if (ret) {
303                 if ((ret == -EAGAIN) && retry--)
304                         goto again2;
305
306                 return ret;
307         }
308
309         if (redrv_data[0] != 0xff) {
310                 PMD_DRV_LOG(ERR, "Redriver write checksum error\n");
311                 ret = -EIO;
312         }
313
314         return ret;
315 }
316
317 static int axgbe_phy_i2c_read(struct axgbe_port *pdata, unsigned int target,
318                               void *reg, unsigned int reg_len,
319                               void *val, unsigned int val_len)
320 {
321         struct axgbe_i2c_op i2c_op;
322         int retry, ret;
323
324         retry = 1;
325 again1:
326         /* Set the specified register to read */
327         i2c_op.cmd = AXGBE_I2C_CMD_WRITE;
328         i2c_op.target = target;
329         i2c_op.len = reg_len;
330         i2c_op.buf = reg;
331         ret = axgbe_phy_i2c_xfer(pdata, &i2c_op);
332         if (ret) {
333                 if ((ret == -EAGAIN) && retry--)
334                         goto again1;
335
336                 return ret;
337         }
338
339         retry = 1;
340 again2:
341         /* Read the specfied register */
342         i2c_op.cmd = AXGBE_I2C_CMD_READ;
343         i2c_op.target = target;
344         i2c_op.len = val_len;
345         i2c_op.buf = val;
346         ret = axgbe_phy_i2c_xfer(pdata, &i2c_op);
347         if ((ret == -EAGAIN) && retry--)
348                 goto again2;
349
350         return ret;
351 }
352
353 static int axgbe_phy_sfp_put_mux(struct axgbe_port *pdata)
354 {
355         struct axgbe_phy_data *phy_data = pdata->phy_data;
356         struct axgbe_i2c_op i2c_op;
357         uint8_t mux_channel;
358
359         if (phy_data->sfp_comm == AXGBE_SFP_COMM_DIRECT)
360                 return 0;
361
362         /* Select no mux channels */
363         mux_channel = 0;
364         i2c_op.cmd = AXGBE_I2C_CMD_WRITE;
365         i2c_op.target = phy_data->sfp_mux_address;
366         i2c_op.len = sizeof(mux_channel);
367         i2c_op.buf = &mux_channel;
368
369         return axgbe_phy_i2c_xfer(pdata, &i2c_op);
370 }
371
372 static int axgbe_phy_sfp_get_mux(struct axgbe_port *pdata)
373 {
374         struct axgbe_phy_data *phy_data = pdata->phy_data;
375         struct axgbe_i2c_op i2c_op;
376         u8 mux_channel;
377
378         if (phy_data->sfp_comm == AXGBE_SFP_COMM_DIRECT)
379                 return 0;
380
381         /* Select desired mux channel */
382         mux_channel = 1 << phy_data->sfp_mux_channel;
383         i2c_op.cmd = AXGBE_I2C_CMD_WRITE;
384         i2c_op.target = phy_data->sfp_mux_address;
385         i2c_op.len = sizeof(mux_channel);
386         i2c_op.buf = &mux_channel;
387
388         return axgbe_phy_i2c_xfer(pdata, &i2c_op);
389 }
390
391 static void axgbe_phy_put_comm_ownership(struct axgbe_port *pdata)
392 {
393         struct axgbe_phy_data *phy_data = pdata->phy_data;
394
395         phy_data->comm_owned = 0;
396
397         pthread_mutex_unlock(&pdata->phy_mutex);
398 }
399
400 static int axgbe_phy_get_comm_ownership(struct axgbe_port *pdata)
401 {
402         struct axgbe_phy_data *phy_data = pdata->phy_data;
403         uint64_t timeout;
404         unsigned int mutex_id;
405
406         if (phy_data->comm_owned)
407                 return 0;
408
409         /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
410          * the driver needs to take the software mutex and then the hardware
411          * mutexes before being able to use the busses.
412          */
413         pthread_mutex_lock(&pdata->phy_mutex);
414
415         /* Clear the mutexes */
416         XP_IOWRITE(pdata, XP_I2C_MUTEX, AXGBE_MUTEX_RELEASE);
417         XP_IOWRITE(pdata, XP_MDIO_MUTEX, AXGBE_MUTEX_RELEASE);
418
419         /* Mutex formats are the same for I2C and MDIO/GPIO */
420         mutex_id = 0;
421         XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ID, phy_data->port_id);
422         XP_SET_BITS(mutex_id, XP_I2C_MUTEX, ACTIVE, 1);
423
424         timeout = rte_get_timer_cycles() + (rte_get_timer_hz() * 5);
425         while (time_before(rte_get_timer_cycles(), timeout)) {
426                 /* Must be all zeroes in order to obtain the mutex */
427                 if (XP_IOREAD(pdata, XP_I2C_MUTEX) ||
428                     XP_IOREAD(pdata, XP_MDIO_MUTEX)) {
429                         rte_delay_us(100);
430                         continue;
431                 }
432
433                 /* Obtain the mutex */
434                 XP_IOWRITE(pdata, XP_I2C_MUTEX, mutex_id);
435                 XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
436
437                 phy_data->comm_owned = 1;
438                 return 0;
439         }
440
441         pthread_mutex_unlock(&pdata->phy_mutex);
442
443         PMD_DRV_LOG(ERR, "unable to obtain hardware mutexes\n");
444
445         return -ETIMEDOUT;
446 }
447
448 static void axgbe_phy_sfp_phy_settings(struct axgbe_port *pdata)
449 {
450         struct axgbe_phy_data *phy_data = pdata->phy_data;
451
452         if (phy_data->sfp_mod_absent) {
453                 pdata->phy.speed = SPEED_UNKNOWN;
454                 pdata->phy.duplex = DUPLEX_UNKNOWN;
455                 pdata->phy.autoneg = AUTONEG_ENABLE;
456                 pdata->phy.advertising = pdata->phy.supported;
457         }
458
459         pdata->phy.advertising &= ~ADVERTISED_Autoneg;
460         pdata->phy.advertising &= ~ADVERTISED_TP;
461         pdata->phy.advertising &= ~ADVERTISED_FIBRE;
462         pdata->phy.advertising &= ~ADVERTISED_100baseT_Full;
463         pdata->phy.advertising &= ~ADVERTISED_1000baseT_Full;
464         pdata->phy.advertising &= ~ADVERTISED_10000baseT_Full;
465         pdata->phy.advertising &= ~ADVERTISED_10000baseR_FEC;
466
467         switch (phy_data->sfp_base) {
468         case AXGBE_SFP_BASE_1000_T:
469         case AXGBE_SFP_BASE_1000_SX:
470         case AXGBE_SFP_BASE_1000_LX:
471         case AXGBE_SFP_BASE_1000_CX:
472                 pdata->phy.speed = SPEED_UNKNOWN;
473                 pdata->phy.duplex = DUPLEX_UNKNOWN;
474                 pdata->phy.autoneg = AUTONEG_ENABLE;
475                 pdata->phy.advertising |= ADVERTISED_Autoneg;
476                 break;
477         case AXGBE_SFP_BASE_10000_SR:
478         case AXGBE_SFP_BASE_10000_LR:
479         case AXGBE_SFP_BASE_10000_LRM:
480         case AXGBE_SFP_BASE_10000_ER:
481         case AXGBE_SFP_BASE_10000_CR:
482         default:
483                 pdata->phy.speed = SPEED_10000;
484                 pdata->phy.duplex = DUPLEX_FULL;
485                 pdata->phy.autoneg = AUTONEG_DISABLE;
486                 break;
487         }
488
489         switch (phy_data->sfp_base) {
490         case AXGBE_SFP_BASE_1000_T:
491         case AXGBE_SFP_BASE_1000_CX:
492         case AXGBE_SFP_BASE_10000_CR:
493                 pdata->phy.advertising |= ADVERTISED_TP;
494                 break;
495         default:
496                 pdata->phy.advertising |= ADVERTISED_FIBRE;
497         }
498
499         switch (phy_data->sfp_speed) {
500         case AXGBE_SFP_SPEED_100_1000:
501                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100)
502                         pdata->phy.advertising |= ADVERTISED_100baseT_Full;
503                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000)
504                         pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
505                 break;
506         case AXGBE_SFP_SPEED_1000:
507                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000)
508                         pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
509                 break;
510         case AXGBE_SFP_SPEED_10000:
511                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000)
512                         pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
513                 break;
514         default:
515                 /* Choose the fastest supported speed */
516                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000)
517                         pdata->phy.advertising |= ADVERTISED_10000baseT_Full;
518                 else if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000)
519                         pdata->phy.advertising |= ADVERTISED_1000baseT_Full;
520                 else if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100)
521                         pdata->phy.advertising |= ADVERTISED_100baseT_Full;
522         }
523 }
524
525 static bool axgbe_phy_sfp_bit_rate(struct axgbe_sfp_eeprom *sfp_eeprom,
526                                    enum axgbe_sfp_speed sfp_speed)
527 {
528         u8 *sfp_base, min, max;
529
530         sfp_base = sfp_eeprom->base;
531
532         switch (sfp_speed) {
533         case AXGBE_SFP_SPEED_1000:
534                 min = AXGBE_SFP_BASE_BR_1GBE_MIN;
535                 max = AXGBE_SFP_BASE_BR_1GBE_MAX;
536                 break;
537         case AXGBE_SFP_SPEED_10000:
538                 min = AXGBE_SFP_BASE_BR_10GBE_MIN;
539                 max = AXGBE_SFP_BASE_BR_10GBE_MAX;
540                 break;
541         default:
542                 return false;
543         }
544
545         return ((sfp_base[AXGBE_SFP_BASE_BR] >= min) &&
546                 (sfp_base[AXGBE_SFP_BASE_BR] <= max));
547 }
548
549 static void axgbe_phy_sfp_external_phy(struct axgbe_port *pdata)
550 {
551         struct axgbe_phy_data *phy_data = pdata->phy_data;
552
553         if (!phy_data->sfp_changed)
554                 return;
555
556         phy_data->sfp_phy_avail = 0;
557
558         if (phy_data->sfp_base != AXGBE_SFP_BASE_1000_T)
559                 return;
560 }
561
562 static bool axgbe_phy_belfuse_parse_quirks(struct axgbe_port *pdata)
563 {
564         struct axgbe_phy_data *phy_data = pdata->phy_data;
565         struct axgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
566
567         if (memcmp(&sfp_eeprom->base[AXGBE_SFP_BASE_VENDOR_NAME],
568                    AXGBE_BEL_FUSE_VENDOR, AXGBE_SFP_BASE_VENDOR_NAME_LEN))
569                 return false;
570
571         if (!memcmp(&sfp_eeprom->base[AXGBE_SFP_BASE_VENDOR_PN],
572                     AXGBE_BEL_FUSE_PARTNO, AXGBE_SFP_BASE_VENDOR_PN_LEN)) {
573                 phy_data->sfp_base = AXGBE_SFP_BASE_1000_SX;
574                 phy_data->sfp_cable = AXGBE_SFP_CABLE_ACTIVE;
575                 phy_data->sfp_speed = AXGBE_SFP_SPEED_1000;
576                 return true;
577         }
578
579         return false;
580 }
581
582 static bool axgbe_phy_sfp_parse_quirks(struct axgbe_port *pdata)
583 {
584         if (axgbe_phy_belfuse_parse_quirks(pdata))
585                 return true;
586
587         return false;
588 }
589
590 static void axgbe_phy_sfp_parse_eeprom(struct axgbe_port *pdata)
591 {
592         struct axgbe_phy_data *phy_data = pdata->phy_data;
593         struct axgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
594         uint8_t *sfp_base;
595
596         sfp_base = sfp_eeprom->base;
597
598         if (sfp_base[AXGBE_SFP_BASE_ID] != AXGBE_SFP_ID_SFP)
599                 return;
600
601         if (sfp_base[AXGBE_SFP_BASE_EXT_ID] != AXGBE_SFP_EXT_ID_SFP)
602                 return;
603
604         if (axgbe_phy_sfp_parse_quirks(pdata))
605                 return;
606
607         /* Assume ACTIVE cable unless told it is PASSIVE */
608         if (sfp_base[AXGBE_SFP_BASE_CABLE] & AXGBE_SFP_BASE_CABLE_PASSIVE) {
609                 phy_data->sfp_cable = AXGBE_SFP_CABLE_PASSIVE;
610                 phy_data->sfp_cable_len = sfp_base[AXGBE_SFP_BASE_CU_CABLE_LEN];
611         } else {
612                 phy_data->sfp_cable = AXGBE_SFP_CABLE_ACTIVE;
613         }
614
615         /* Determine the type of SFP */
616         if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_SR)
617                 phy_data->sfp_base = AXGBE_SFP_BASE_10000_SR;
618         else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_LR)
619                 phy_data->sfp_base = AXGBE_SFP_BASE_10000_LR;
620         else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] &
621                  AXGBE_SFP_BASE_10GBE_CC_LRM)
622                 phy_data->sfp_base = AXGBE_SFP_BASE_10000_LRM;
623         else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_ER)
624                 phy_data->sfp_base = AXGBE_SFP_BASE_10000_ER;
625         else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_SX)
626                 phy_data->sfp_base = AXGBE_SFP_BASE_1000_SX;
627         else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_LX)
628                 phy_data->sfp_base = AXGBE_SFP_BASE_1000_LX;
629         else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_CX)
630                 phy_data->sfp_base = AXGBE_SFP_BASE_1000_CX;
631         else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_T)
632                 phy_data->sfp_base = AXGBE_SFP_BASE_1000_T;
633         else if ((phy_data->sfp_cable == AXGBE_SFP_CABLE_PASSIVE) &&
634                  axgbe_phy_sfp_bit_rate(sfp_eeprom, AXGBE_SFP_SPEED_10000))
635                 phy_data->sfp_base = AXGBE_SFP_BASE_10000_CR;
636
637         switch (phy_data->sfp_base) {
638         case AXGBE_SFP_BASE_1000_T:
639                 phy_data->sfp_speed = AXGBE_SFP_SPEED_100_1000;
640                 break;
641         case AXGBE_SFP_BASE_1000_SX:
642         case AXGBE_SFP_BASE_1000_LX:
643         case AXGBE_SFP_BASE_1000_CX:
644                 phy_data->sfp_speed = AXGBE_SFP_SPEED_1000;
645                 break;
646         case AXGBE_SFP_BASE_10000_SR:
647         case AXGBE_SFP_BASE_10000_LR:
648         case AXGBE_SFP_BASE_10000_LRM:
649         case AXGBE_SFP_BASE_10000_ER:
650         case AXGBE_SFP_BASE_10000_CR:
651                 phy_data->sfp_speed = AXGBE_SFP_SPEED_10000;
652                 break;
653         default:
654                 break;
655         }
656 }
657
658 static bool axgbe_phy_sfp_verify_eeprom(uint8_t cc_in, uint8_t *buf,
659                                         unsigned int len)
660 {
661         uint8_t cc;
662
663         for (cc = 0; len; buf++, len--)
664                 cc += *buf;
665
666         return (cc == cc_in) ? true : false;
667 }
668
669 static int axgbe_phy_sfp_read_eeprom(struct axgbe_port *pdata)
670 {
671         struct axgbe_phy_data *phy_data = pdata->phy_data;
672         struct axgbe_sfp_eeprom sfp_eeprom;
673         uint8_t eeprom_addr;
674         int ret;
675
676         ret = axgbe_phy_sfp_get_mux(pdata);
677         if (ret) {
678                 PMD_DRV_LOG(ERR, "I2C error setting SFP MUX\n");
679                 return ret;
680         }
681
682         /* Read the SFP serial ID eeprom */
683         eeprom_addr = 0;
684         ret = axgbe_phy_i2c_read(pdata, AXGBE_SFP_SERIAL_ID_ADDRESS,
685                                  &eeprom_addr, sizeof(eeprom_addr),
686                                  &sfp_eeprom, sizeof(sfp_eeprom));
687         if (ret) {
688                 PMD_DRV_LOG(ERR, "I2C error reading SFP EEPROM\n");
689                 goto put;
690         }
691
692         /* Validate the contents read */
693         if (!axgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[AXGBE_SFP_BASE_CC],
694                                          sfp_eeprom.base,
695                                          sizeof(sfp_eeprom.base) - 1)) {
696                 ret = -EINVAL;
697                 goto put;
698         }
699
700         if (!axgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[AXGBE_SFP_EXTD_CC],
701                                          sfp_eeprom.extd,
702                                          sizeof(sfp_eeprom.extd) - 1)) {
703                 ret = -EINVAL;
704                 goto put;
705         }
706
707         /* Check for an added or changed SFP */
708         if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
709                 phy_data->sfp_changed = 1;
710                 memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
711
712                 if (sfp_eeprom.extd[AXGBE_SFP_EXTD_SFF_8472]) {
713                         uint8_t diag_type;
714                         diag_type = sfp_eeprom.extd[AXGBE_SFP_EXTD_DIAG];
715
716                         if (!(diag_type & AXGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
717                                 phy_data->sfp_diags = 1;
718                 }
719         } else {
720                 phy_data->sfp_changed = 0;
721         }
722
723 put:
724         axgbe_phy_sfp_put_mux(pdata);
725
726         return ret;
727 }
728
729 static void axgbe_phy_sfp_signals(struct axgbe_port *pdata)
730 {
731         struct axgbe_phy_data *phy_data = pdata->phy_data;
732         unsigned int gpio_input;
733         u8 gpio_reg, gpio_ports[2];
734         int ret;
735
736         /* Read the input port registers */
737         gpio_reg = 0;
738         ret = axgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
739                                  &gpio_reg, sizeof(gpio_reg),
740                                  gpio_ports, sizeof(gpio_ports));
741         if (ret) {
742                 PMD_DRV_LOG(ERR, "I2C error reading SFP GPIOs\n");
743                 return;
744         }
745
746         gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
747
748         if (phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_MOD_ABSENT) {
749                 /* No GPIO, just assume the module is present for now */
750                 phy_data->sfp_mod_absent = 0;
751         } else {
752                 if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
753                         phy_data->sfp_mod_absent = 0;
754         }
755
756         if (!(phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_RX_LOS) &&
757             (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
758                 phy_data->sfp_rx_los = 1;
759
760         if (!(phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_TX_FAULT) &&
761             (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
762                 phy_data->sfp_tx_fault = 1;
763 }
764
765 static void axgbe_phy_sfp_mod_absent(struct axgbe_port *pdata)
766 {
767         struct axgbe_phy_data *phy_data = pdata->phy_data;
768
769         phy_data->sfp_mod_absent = 1;
770         phy_data->sfp_phy_avail = 0;
771         memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
772 }
773
774 static void axgbe_phy_sfp_reset(struct axgbe_phy_data *phy_data)
775 {
776         phy_data->sfp_rx_los = 0;
777         phy_data->sfp_tx_fault = 0;
778         phy_data->sfp_mod_absent = 1;
779         phy_data->sfp_diags = 0;
780         phy_data->sfp_base = AXGBE_SFP_BASE_UNKNOWN;
781         phy_data->sfp_cable = AXGBE_SFP_CABLE_UNKNOWN;
782         phy_data->sfp_speed = AXGBE_SFP_SPEED_UNKNOWN;
783 }
784
785 static void axgbe_phy_sfp_detect(struct axgbe_port *pdata)
786 {
787         struct axgbe_phy_data *phy_data = pdata->phy_data;
788         int ret;
789
790         /* Reset the SFP signals and info */
791         axgbe_phy_sfp_reset(phy_data);
792
793         ret = axgbe_phy_get_comm_ownership(pdata);
794         if (ret)
795                 return;
796
797         /* Read the SFP signals and check for module presence */
798         axgbe_phy_sfp_signals(pdata);
799         if (phy_data->sfp_mod_absent) {
800                 axgbe_phy_sfp_mod_absent(pdata);
801                 goto put;
802         }
803
804         ret = axgbe_phy_sfp_read_eeprom(pdata);
805         if (ret) {
806                 /* Treat any error as if there isn't an SFP plugged in */
807                 axgbe_phy_sfp_reset(phy_data);
808                 axgbe_phy_sfp_mod_absent(pdata);
809                 goto put;
810         }
811
812         axgbe_phy_sfp_parse_eeprom(pdata);
813         axgbe_phy_sfp_external_phy(pdata);
814
815 put:
816         axgbe_phy_sfp_phy_settings(pdata);
817         axgbe_phy_put_comm_ownership(pdata);
818 }
819
820 static void axgbe_phy_phydev_flowctrl(struct axgbe_port *pdata)
821 {
822         pdata->phy.tx_pause = 0;
823         pdata->phy.rx_pause = 0;
824 }
825
826 static enum axgbe_mode axgbe_phy_an73_redrv_outcome(struct axgbe_port *pdata)
827 {
828         struct axgbe_phy_data *phy_data = pdata->phy_data;
829         enum axgbe_mode mode;
830         unsigned int ad_reg, lp_reg;
831
832         pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
833         pdata->phy.lp_advertising |= ADVERTISED_Backplane;
834
835         /* Use external PHY to determine flow control */
836         if (pdata->phy.pause_autoneg)
837                 axgbe_phy_phydev_flowctrl(pdata);
838
839         /* Compare Advertisement and Link Partner register 2 */
840         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
841         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
842         if (lp_reg & 0x80)
843                 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
844         if (lp_reg & 0x20)
845                 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
846
847         ad_reg &= lp_reg;
848         if (ad_reg & 0x80) {
849                 switch (phy_data->port_mode) {
850                 case AXGBE_PORT_MODE_BACKPLANE:
851                         mode = AXGBE_MODE_KR;
852                         break;
853                 default:
854                         mode = AXGBE_MODE_SFI;
855                         break;
856                 }
857         } else if (ad_reg & 0x20) {
858                 switch (phy_data->port_mode) {
859                 case AXGBE_PORT_MODE_BACKPLANE:
860                         mode = AXGBE_MODE_KX_1000;
861                         break;
862                 case AXGBE_PORT_MODE_1000BASE_X:
863                         mode = AXGBE_MODE_X;
864                         break;
865                 case AXGBE_PORT_MODE_SFP:
866                         switch (phy_data->sfp_base) {
867                         case AXGBE_SFP_BASE_1000_T:
868                                 mode = AXGBE_MODE_SGMII_1000;
869                                 break;
870                         case AXGBE_SFP_BASE_1000_SX:
871                         case AXGBE_SFP_BASE_1000_LX:
872                         case AXGBE_SFP_BASE_1000_CX:
873                         default:
874                                 mode = AXGBE_MODE_X;
875                                 break;
876                         }
877                         break;
878                 default:
879                         mode = AXGBE_MODE_SGMII_1000;
880                         break;
881                 }
882         } else {
883                 mode = AXGBE_MODE_UNKNOWN;
884         }
885
886         /* Compare Advertisement and Link Partner register 3 */
887         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
888         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
889         if (lp_reg & 0xc000)
890                 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
891
892         return mode;
893 }
894
895 static enum axgbe_mode axgbe_phy_an73_outcome(struct axgbe_port *pdata)
896 {
897         enum axgbe_mode mode;
898         unsigned int ad_reg, lp_reg;
899
900         pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
901         pdata->phy.lp_advertising |= ADVERTISED_Backplane;
902
903         /* Compare Advertisement and Link Partner register 1 */
904         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
905         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
906         if (lp_reg & 0x400)
907                 pdata->phy.lp_advertising |= ADVERTISED_Pause;
908         if (lp_reg & 0x800)
909                 pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
910
911         if (pdata->phy.pause_autoneg) {
912                 /* Set flow control based on auto-negotiation result */
913                 pdata->phy.tx_pause = 0;
914                 pdata->phy.rx_pause = 0;
915
916                 if (ad_reg & lp_reg & 0x400) {
917                         pdata->phy.tx_pause = 1;
918                         pdata->phy.rx_pause = 1;
919                 } else if (ad_reg & lp_reg & 0x800) {
920                         if (ad_reg & 0x400)
921                                 pdata->phy.rx_pause = 1;
922                         else if (lp_reg & 0x400)
923                                 pdata->phy.tx_pause = 1;
924                 }
925         }
926
927         /* Compare Advertisement and Link Partner register 2 */
928         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
929         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
930         if (lp_reg & 0x80)
931                 pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
932         if (lp_reg & 0x20)
933                 pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
934
935         ad_reg &= lp_reg;
936         if (ad_reg & 0x80)
937                 mode = AXGBE_MODE_KR;
938         else if (ad_reg & 0x20)
939                 mode = AXGBE_MODE_KX_1000;
940         else
941                 mode = AXGBE_MODE_UNKNOWN;
942
943         /* Compare Advertisement and Link Partner register 3 */
944         ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
945         lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
946         if (lp_reg & 0xc000)
947                 pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
948
949         return mode;
950 }
951
952 static enum axgbe_mode axgbe_phy_an_outcome(struct axgbe_port *pdata)
953 {
954         switch (pdata->an_mode) {
955         case AXGBE_AN_MODE_CL73:
956                 return axgbe_phy_an73_outcome(pdata);
957         case AXGBE_AN_MODE_CL73_REDRV:
958                 return axgbe_phy_an73_redrv_outcome(pdata);
959         case AXGBE_AN_MODE_CL37:
960         case AXGBE_AN_MODE_CL37_SGMII:
961         default:
962                 return AXGBE_MODE_UNKNOWN;
963         }
964 }
965
966 static unsigned int axgbe_phy_an_advertising(struct axgbe_port *pdata)
967 {
968         struct axgbe_phy_data *phy_data = pdata->phy_data;
969         unsigned int advertising;
970
971         /* Without a re-driver, just return current advertising */
972         if (!phy_data->redrv)
973                 return pdata->phy.advertising;
974
975         /* With the KR re-driver we need to advertise a single speed */
976         advertising = pdata->phy.advertising;
977         advertising &= ~ADVERTISED_1000baseKX_Full;
978         advertising &= ~ADVERTISED_10000baseKR_Full;
979
980         switch (phy_data->port_mode) {
981         case AXGBE_PORT_MODE_BACKPLANE:
982                 advertising |= ADVERTISED_10000baseKR_Full;
983                 break;
984         case AXGBE_PORT_MODE_BACKPLANE_2500:
985                 advertising |= ADVERTISED_1000baseKX_Full;
986                 break;
987         case AXGBE_PORT_MODE_1000BASE_T:
988         case AXGBE_PORT_MODE_1000BASE_X:
989         case AXGBE_PORT_MODE_NBASE_T:
990                 advertising |= ADVERTISED_1000baseKX_Full;
991                 break;
992         case AXGBE_PORT_MODE_10GBASE_T:
993                 PMD_DRV_LOG(ERR, "10GBASE_T mode is not supported\n");
994                 break;
995         case AXGBE_PORT_MODE_10GBASE_R:
996                 advertising |= ADVERTISED_10000baseKR_Full;
997                 break;
998         case AXGBE_PORT_MODE_SFP:
999                 switch (phy_data->sfp_base) {
1000                 case AXGBE_SFP_BASE_1000_T:
1001                 case AXGBE_SFP_BASE_1000_SX:
1002                 case AXGBE_SFP_BASE_1000_LX:
1003                 case AXGBE_SFP_BASE_1000_CX:
1004                         advertising |= ADVERTISED_1000baseKX_Full;
1005                         break;
1006                 default:
1007                         advertising |= ADVERTISED_10000baseKR_Full;
1008                         break;
1009                 }
1010                 break;
1011         default:
1012                 advertising |= ADVERTISED_10000baseKR_Full;
1013                 break;
1014         }
1015
1016         return advertising;
1017 }
1018
1019 static int axgbe_phy_an_config(struct axgbe_port *pdata __rte_unused)
1020 {
1021         return 0;
1022         /* Dummy API since there is no case to support
1023          * external phy devices registred through kerenl apis
1024          */
1025 }
1026
1027 static enum axgbe_an_mode axgbe_phy_an_sfp_mode(struct axgbe_phy_data *phy_data)
1028 {
1029         switch (phy_data->sfp_base) {
1030         case AXGBE_SFP_BASE_1000_T:
1031                 return AXGBE_AN_MODE_CL37_SGMII;
1032         case AXGBE_SFP_BASE_1000_SX:
1033         case AXGBE_SFP_BASE_1000_LX:
1034         case AXGBE_SFP_BASE_1000_CX:
1035                 return AXGBE_AN_MODE_CL37;
1036         default:
1037                 return AXGBE_AN_MODE_NONE;
1038         }
1039 }
1040
1041 static enum axgbe_an_mode axgbe_phy_an_mode(struct axgbe_port *pdata)
1042 {
1043         struct axgbe_phy_data *phy_data = pdata->phy_data;
1044
1045         /* A KR re-driver will always require CL73 AN */
1046         if (phy_data->redrv)
1047                 return AXGBE_AN_MODE_CL73_REDRV;
1048
1049         switch (phy_data->port_mode) {
1050         case AXGBE_PORT_MODE_BACKPLANE:
1051                 return AXGBE_AN_MODE_CL73;
1052         case AXGBE_PORT_MODE_BACKPLANE_2500:
1053                 return AXGBE_AN_MODE_NONE;
1054         case AXGBE_PORT_MODE_1000BASE_T:
1055                 return AXGBE_AN_MODE_CL37_SGMII;
1056         case AXGBE_PORT_MODE_1000BASE_X:
1057                 return AXGBE_AN_MODE_CL37;
1058         case AXGBE_PORT_MODE_NBASE_T:
1059                 return AXGBE_AN_MODE_CL37_SGMII;
1060         case AXGBE_PORT_MODE_10GBASE_T:
1061                 return AXGBE_AN_MODE_CL73;
1062         case AXGBE_PORT_MODE_10GBASE_R:
1063                 return AXGBE_AN_MODE_NONE;
1064         case AXGBE_PORT_MODE_SFP:
1065                 return axgbe_phy_an_sfp_mode(phy_data);
1066         default:
1067                 return AXGBE_AN_MODE_NONE;
1068         }
1069 }
1070
1071 static int axgbe_phy_set_redrv_mode_mdio(struct axgbe_port *pdata,
1072                                          enum axgbe_phy_redrv_mode mode)
1073 {
1074         struct axgbe_phy_data *phy_data = pdata->phy_data;
1075         u16 redrv_reg, redrv_val;
1076
1077         redrv_reg = AXGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1078         redrv_val = (u16)mode;
1079
1080         return pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr,
1081                                                redrv_reg, redrv_val);
1082 }
1083
1084 static int axgbe_phy_set_redrv_mode_i2c(struct axgbe_port *pdata,
1085                                         enum axgbe_phy_redrv_mode mode)
1086 {
1087         struct axgbe_phy_data *phy_data = pdata->phy_data;
1088         unsigned int redrv_reg;
1089         int ret;
1090
1091         /* Calculate the register to write */
1092         redrv_reg = AXGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1093
1094         ret = axgbe_phy_redrv_write(pdata, redrv_reg, mode);
1095
1096         return ret;
1097 }
1098
1099 static void axgbe_phy_set_redrv_mode(struct axgbe_port *pdata)
1100 {
1101         struct axgbe_phy_data *phy_data = pdata->phy_data;
1102         enum axgbe_phy_redrv_mode mode;
1103         int ret;
1104
1105         if (!phy_data->redrv)
1106                 return;
1107
1108         mode = AXGBE_PHY_REDRV_MODE_CX;
1109         if ((phy_data->port_mode == AXGBE_PORT_MODE_SFP) &&
1110             (phy_data->sfp_base != AXGBE_SFP_BASE_1000_CX) &&
1111             (phy_data->sfp_base != AXGBE_SFP_BASE_10000_CR))
1112                 mode = AXGBE_PHY_REDRV_MODE_SR;
1113
1114         ret = axgbe_phy_get_comm_ownership(pdata);
1115         if (ret)
1116                 return;
1117
1118         if (phy_data->redrv_if)
1119                 axgbe_phy_set_redrv_mode_i2c(pdata, mode);
1120         else
1121                 axgbe_phy_set_redrv_mode_mdio(pdata, mode);
1122
1123         axgbe_phy_put_comm_ownership(pdata);
1124 }
1125
1126 static void axgbe_phy_start_ratechange(struct axgbe_port *pdata)
1127 {
1128         if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1129                 return;
1130 }
1131
1132 static void axgbe_phy_complete_ratechange(struct axgbe_port *pdata)
1133 {
1134         unsigned int wait;
1135
1136         /* Wait for command to complete */
1137         wait = AXGBE_RATECHANGE_COUNT;
1138         while (wait--) {
1139                 if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1140                         return;
1141
1142                 rte_delay_us(1500);
1143         }
1144 }
1145
1146 static void axgbe_phy_rrc(struct axgbe_port *pdata)
1147 {
1148         unsigned int s0;
1149
1150         axgbe_phy_start_ratechange(pdata);
1151
1152         /* Receiver Reset Cycle */
1153         s0 = 0;
1154         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1155         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1156
1157         /* Call FW to make the change */
1158         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1159         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1160         XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1161
1162         axgbe_phy_complete_ratechange(pdata);
1163 }
1164
1165 static void axgbe_phy_power_off(struct axgbe_port *pdata)
1166 {
1167         struct axgbe_phy_data *phy_data = pdata->phy_data;
1168
1169         axgbe_phy_start_ratechange(pdata);
1170
1171         /* Call FW to make the change */
1172         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1173         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1174         XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1175         axgbe_phy_complete_ratechange(pdata);
1176         phy_data->cur_mode = AXGBE_MODE_UNKNOWN;
1177 }
1178
1179 static void axgbe_phy_sfi_mode(struct axgbe_port *pdata)
1180 {
1181         struct axgbe_phy_data *phy_data = pdata->phy_data;
1182         unsigned int s0;
1183
1184         axgbe_phy_set_redrv_mode(pdata);
1185
1186         axgbe_phy_start_ratechange(pdata);
1187
1188         /* 10G/SFI */
1189         s0 = 0;
1190         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1191         if (phy_data->sfp_cable != AXGBE_SFP_CABLE_PASSIVE) {
1192                 XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1193         } else {
1194                 if (phy_data->sfp_cable_len <= 1)
1195                         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1196                 else if (phy_data->sfp_cable_len <= 3)
1197                         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1198                 else
1199                         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1200         }
1201
1202         /* Call FW to make the change */
1203         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1204         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1205         XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1206         axgbe_phy_complete_ratechange(pdata);
1207         phy_data->cur_mode = AXGBE_MODE_SFI;
1208 }
1209
1210 static void axgbe_phy_kr_mode(struct axgbe_port *pdata)
1211 {
1212         struct axgbe_phy_data *phy_data = pdata->phy_data;
1213         unsigned int s0;
1214
1215         axgbe_phy_set_redrv_mode(pdata);
1216
1217         axgbe_phy_start_ratechange(pdata);
1218
1219         /* 10G/KR */
1220         s0 = 0;
1221         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1222         XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1223
1224         /* Call FW to make the change */
1225         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1226         XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1227         XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1228         axgbe_phy_complete_ratechange(pdata);
1229         phy_data->cur_mode = AXGBE_MODE_KR;
1230 }
1231
1232 static enum axgbe_mode axgbe_phy_cur_mode(struct axgbe_port *pdata)
1233 {
1234         struct axgbe_phy_data *phy_data = pdata->phy_data;
1235
1236         return phy_data->cur_mode;
1237 }
1238
1239 static enum axgbe_mode axgbe_phy_switch_baset_mode(struct axgbe_port *pdata)
1240 {
1241         struct axgbe_phy_data *phy_data = pdata->phy_data;
1242
1243         /* No switching if not 10GBase-T */
1244         if (phy_data->port_mode != AXGBE_PORT_MODE_10GBASE_T)
1245                 return axgbe_phy_cur_mode(pdata);
1246
1247         switch (axgbe_phy_cur_mode(pdata)) {
1248         case AXGBE_MODE_SGMII_100:
1249         case AXGBE_MODE_SGMII_1000:
1250                 return AXGBE_MODE_KR;
1251         case AXGBE_MODE_KR:
1252         default:
1253                 return AXGBE_MODE_SGMII_1000;
1254         }
1255 }
1256
1257 static enum axgbe_mode axgbe_phy_switch_bp_2500_mode(struct axgbe_port *pdata
1258                                                      __rte_unused)
1259 {
1260         return AXGBE_MODE_KX_2500;
1261 }
1262
1263 static enum axgbe_mode axgbe_phy_switch_bp_mode(struct axgbe_port *pdata)
1264 {
1265         /* If we are in KR switch to KX, and vice-versa */
1266         switch (axgbe_phy_cur_mode(pdata)) {
1267         case AXGBE_MODE_KX_1000:
1268                 return AXGBE_MODE_KR;
1269         case AXGBE_MODE_KR:
1270         default:
1271                 return AXGBE_MODE_KX_1000;
1272         }
1273 }
1274
1275 static enum axgbe_mode axgbe_phy_switch_mode(struct axgbe_port *pdata)
1276 {
1277         struct axgbe_phy_data *phy_data = pdata->phy_data;
1278
1279         switch (phy_data->port_mode) {
1280         case AXGBE_PORT_MODE_BACKPLANE:
1281                 return axgbe_phy_switch_bp_mode(pdata);
1282         case AXGBE_PORT_MODE_BACKPLANE_2500:
1283                 return axgbe_phy_switch_bp_2500_mode(pdata);
1284         case AXGBE_PORT_MODE_1000BASE_T:
1285         case AXGBE_PORT_MODE_NBASE_T:
1286         case AXGBE_PORT_MODE_10GBASE_T:
1287                 return axgbe_phy_switch_baset_mode(pdata);
1288         case AXGBE_PORT_MODE_1000BASE_X:
1289         case AXGBE_PORT_MODE_10GBASE_R:
1290         case AXGBE_PORT_MODE_SFP:
1291                 /* No switching, so just return current mode */
1292                 return axgbe_phy_cur_mode(pdata);
1293         default:
1294                 return AXGBE_MODE_UNKNOWN;
1295         }
1296 }
1297
1298 static enum axgbe_mode axgbe_phy_get_basex_mode(struct axgbe_phy_data *phy_data
1299                                                 __rte_unused,
1300                                                 int speed)
1301 {
1302         switch (speed) {
1303         case SPEED_1000:
1304                 return AXGBE_MODE_X;
1305         case SPEED_10000:
1306                 return AXGBE_MODE_KR;
1307         default:
1308                 return AXGBE_MODE_UNKNOWN;
1309         }
1310 }
1311
1312 static enum axgbe_mode axgbe_phy_get_baset_mode(struct axgbe_phy_data *phy_data
1313                                                 __rte_unused,
1314                                                 int speed)
1315 {
1316         switch (speed) {
1317         case SPEED_100:
1318                 return AXGBE_MODE_SGMII_100;
1319         case SPEED_1000:
1320                 return AXGBE_MODE_SGMII_1000;
1321         case SPEED_10000:
1322                 return AXGBE_MODE_KR;
1323         default:
1324                 return AXGBE_MODE_UNKNOWN;
1325         }
1326 }
1327
1328 static enum axgbe_mode axgbe_phy_get_sfp_mode(struct axgbe_phy_data *phy_data,
1329                                               int speed)
1330 {
1331         switch (speed) {
1332         case SPEED_100:
1333                 return AXGBE_MODE_SGMII_100;
1334         case SPEED_1000:
1335                 if (phy_data->sfp_base == AXGBE_SFP_BASE_1000_T)
1336                         return AXGBE_MODE_SGMII_1000;
1337                 else
1338                         return AXGBE_MODE_X;
1339         case SPEED_10000:
1340         case SPEED_UNKNOWN:
1341                 return AXGBE_MODE_SFI;
1342         default:
1343                 return AXGBE_MODE_UNKNOWN;
1344         }
1345 }
1346
1347 static enum axgbe_mode axgbe_phy_get_bp_2500_mode(int speed)
1348 {
1349         switch (speed) {
1350         case SPEED_2500:
1351                 return AXGBE_MODE_KX_2500;
1352         default:
1353                 return AXGBE_MODE_UNKNOWN;
1354         }
1355 }
1356
1357 static enum axgbe_mode axgbe_phy_get_bp_mode(int speed)
1358 {
1359         switch (speed) {
1360         case SPEED_1000:
1361                 return AXGBE_MODE_KX_1000;
1362         case SPEED_10000:
1363                 return AXGBE_MODE_KR;
1364         default:
1365                 return AXGBE_MODE_UNKNOWN;
1366         }
1367 }
1368
1369 static enum axgbe_mode axgbe_phy_get_mode(struct axgbe_port *pdata,
1370                                           int speed)
1371 {
1372         struct axgbe_phy_data *phy_data = pdata->phy_data;
1373
1374         switch (phy_data->port_mode) {
1375         case AXGBE_PORT_MODE_BACKPLANE:
1376                 return axgbe_phy_get_bp_mode(speed);
1377         case AXGBE_PORT_MODE_BACKPLANE_2500:
1378                 return axgbe_phy_get_bp_2500_mode(speed);
1379         case AXGBE_PORT_MODE_1000BASE_T:
1380         case AXGBE_PORT_MODE_NBASE_T:
1381         case AXGBE_PORT_MODE_10GBASE_T:
1382                 return axgbe_phy_get_baset_mode(phy_data, speed);
1383         case AXGBE_PORT_MODE_1000BASE_X:
1384         case AXGBE_PORT_MODE_10GBASE_R:
1385                 return axgbe_phy_get_basex_mode(phy_data, speed);
1386         case AXGBE_PORT_MODE_SFP:
1387                 return axgbe_phy_get_sfp_mode(phy_data, speed);
1388         default:
1389                 return AXGBE_MODE_UNKNOWN;
1390         }
1391 }
1392
1393 static void axgbe_phy_set_mode(struct axgbe_port *pdata, enum axgbe_mode mode)
1394 {
1395         switch (mode) {
1396         case AXGBE_MODE_KR:
1397                 axgbe_phy_kr_mode(pdata);
1398                 break;
1399         case AXGBE_MODE_SFI:
1400                 axgbe_phy_sfi_mode(pdata);
1401                 break;
1402         default:
1403                 break;
1404         }
1405 }
1406
1407 static bool axgbe_phy_check_mode(struct axgbe_port *pdata,
1408                                  enum axgbe_mode mode, u32 advert)
1409 {
1410         if (pdata->phy.autoneg == AUTONEG_ENABLE) {
1411                 if (pdata->phy.advertising & advert)
1412                         return true;
1413         } else {
1414                 enum axgbe_mode cur_mode;
1415
1416                 cur_mode = axgbe_phy_get_mode(pdata, pdata->phy.speed);
1417                 if (cur_mode == mode)
1418                         return true;
1419         }
1420
1421         return false;
1422 }
1423
1424 static bool axgbe_phy_use_basex_mode(struct axgbe_port *pdata,
1425                                      enum axgbe_mode mode)
1426 {
1427         switch (mode) {
1428         case AXGBE_MODE_X:
1429                 return axgbe_phy_check_mode(pdata, mode,
1430                                             ADVERTISED_1000baseT_Full);
1431         case AXGBE_MODE_KR:
1432                 return axgbe_phy_check_mode(pdata, mode,
1433                                             ADVERTISED_10000baseT_Full);
1434         default:
1435                 return false;
1436         }
1437 }
1438
1439 static bool axgbe_phy_use_baset_mode(struct axgbe_port *pdata,
1440                                      enum axgbe_mode mode)
1441 {
1442         switch (mode) {
1443         case AXGBE_MODE_SGMII_100:
1444                 return axgbe_phy_check_mode(pdata, mode,
1445                                             ADVERTISED_100baseT_Full);
1446         case AXGBE_MODE_SGMII_1000:
1447                 return axgbe_phy_check_mode(pdata, mode,
1448                                             ADVERTISED_1000baseT_Full);
1449         case AXGBE_MODE_KR:
1450                 return axgbe_phy_check_mode(pdata, mode,
1451                                             ADVERTISED_10000baseT_Full);
1452         default:
1453                 return false;
1454         }
1455 }
1456
1457 static bool axgbe_phy_use_sfp_mode(struct axgbe_port *pdata,
1458                                    enum axgbe_mode mode)
1459 {
1460         struct axgbe_phy_data *phy_data = pdata->phy_data;
1461
1462         switch (mode) {
1463         case AXGBE_MODE_X:
1464                 if (phy_data->sfp_base == AXGBE_SFP_BASE_1000_T)
1465                         return false;
1466                 return axgbe_phy_check_mode(pdata, mode,
1467                                             ADVERTISED_1000baseT_Full);
1468         case AXGBE_MODE_SGMII_100:
1469                 if (phy_data->sfp_base != AXGBE_SFP_BASE_1000_T)
1470                         return false;
1471                 return axgbe_phy_check_mode(pdata, mode,
1472                                             ADVERTISED_100baseT_Full);
1473         case AXGBE_MODE_SGMII_1000:
1474                 if (phy_data->sfp_base != AXGBE_SFP_BASE_1000_T)
1475                         return false;
1476                 return axgbe_phy_check_mode(pdata, mode,
1477                                             ADVERTISED_1000baseT_Full);
1478         case AXGBE_MODE_SFI:
1479                 return axgbe_phy_check_mode(pdata, mode,
1480                                             ADVERTISED_10000baseT_Full);
1481         default:
1482                 return false;
1483         }
1484 }
1485
1486 static bool axgbe_phy_use_bp_2500_mode(struct axgbe_port *pdata,
1487                                        enum axgbe_mode mode)
1488 {
1489         switch (mode) {
1490         case AXGBE_MODE_KX_2500:
1491                 return axgbe_phy_check_mode(pdata, mode,
1492                                             ADVERTISED_2500baseX_Full);
1493         default:
1494                 return false;
1495         }
1496 }
1497
1498 static bool axgbe_phy_use_bp_mode(struct axgbe_port *pdata,
1499                                   enum axgbe_mode mode)
1500 {
1501         switch (mode) {
1502         case AXGBE_MODE_KX_1000:
1503                 return axgbe_phy_check_mode(pdata, mode,
1504                                             ADVERTISED_1000baseKX_Full);
1505         case AXGBE_MODE_KR:
1506                 return axgbe_phy_check_mode(pdata, mode,
1507                                             ADVERTISED_10000baseKR_Full);
1508         default:
1509                 return false;
1510         }
1511 }
1512
1513 static bool axgbe_phy_use_mode(struct axgbe_port *pdata, enum axgbe_mode mode)
1514 {
1515         struct axgbe_phy_data *phy_data = pdata->phy_data;
1516
1517         switch (phy_data->port_mode) {
1518         case AXGBE_PORT_MODE_BACKPLANE:
1519                 return axgbe_phy_use_bp_mode(pdata, mode);
1520         case AXGBE_PORT_MODE_BACKPLANE_2500:
1521                 return axgbe_phy_use_bp_2500_mode(pdata, mode);
1522         case AXGBE_PORT_MODE_1000BASE_T:
1523         case AXGBE_PORT_MODE_NBASE_T:
1524         case AXGBE_PORT_MODE_10GBASE_T:
1525                 return axgbe_phy_use_baset_mode(pdata, mode);
1526         case AXGBE_PORT_MODE_1000BASE_X:
1527         case AXGBE_PORT_MODE_10GBASE_R:
1528                 return axgbe_phy_use_basex_mode(pdata, mode);
1529         case AXGBE_PORT_MODE_SFP:
1530                 return axgbe_phy_use_sfp_mode(pdata, mode);
1531         default:
1532                 return false;
1533         }
1534 }
1535
1536 static int axgbe_phy_link_status(struct axgbe_port *pdata, int *an_restart)
1537 {
1538         struct axgbe_phy_data *phy_data = pdata->phy_data;
1539         unsigned int reg;
1540
1541         *an_restart = 0;
1542
1543         if (phy_data->port_mode == AXGBE_PORT_MODE_SFP) {
1544                 /* Check SFP signals */
1545                 axgbe_phy_sfp_detect(pdata);
1546
1547                 if (phy_data->sfp_changed) {
1548                         *an_restart = 1;
1549                         return 0;
1550                 }
1551
1552                 if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
1553                         return 0;
1554         }
1555
1556         /* Link status is latched low, so read once to clear
1557          * and then read again to get current state
1558          */
1559         reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1560         reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1561         if (reg & MDIO_STAT1_LSTATUS)
1562                 return 1;
1563
1564         /* No link, attempt a receiver reset cycle */
1565         if (phy_data->rrc_count++) {
1566                 phy_data->rrc_count = 0;
1567                 axgbe_phy_rrc(pdata);
1568         }
1569
1570         return 0;
1571 }
1572
1573 static void axgbe_phy_sfp_gpio_setup(struct axgbe_port *pdata)
1574 {
1575         struct axgbe_phy_data *phy_data = pdata->phy_data;
1576         unsigned int reg;
1577
1578         reg = XP_IOREAD(pdata, XP_PROP_3);
1579
1580         phy_data->sfp_gpio_address = AXGBE_GPIO_ADDRESS_PCA9555 +
1581                 XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
1582
1583         phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
1584
1585         phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
1586                                                 GPIO_RX_LOS);
1587         phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
1588                                                   GPIO_TX_FAULT);
1589         phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
1590                                                     GPIO_MOD_ABS);
1591         phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
1592                                                      GPIO_RATE_SELECT);
1593 }
1594
1595 static void axgbe_phy_sfp_comm_setup(struct axgbe_port *pdata)
1596 {
1597         struct axgbe_phy_data *phy_data = pdata->phy_data;
1598         unsigned int reg, mux_addr_hi, mux_addr_lo;
1599
1600         reg = XP_IOREAD(pdata, XP_PROP_4);
1601
1602         mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
1603         mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
1604         if (mux_addr_lo == AXGBE_SFP_DIRECT)
1605                 return;
1606
1607         phy_data->sfp_comm = AXGBE_SFP_COMM_PCA9545;
1608         phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
1609         phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
1610 }
1611
1612 static void axgbe_phy_sfp_setup(struct axgbe_port *pdata)
1613 {
1614         axgbe_phy_sfp_comm_setup(pdata);
1615         axgbe_phy_sfp_gpio_setup(pdata);
1616 }
1617
1618 static bool axgbe_phy_redrv_error(struct axgbe_phy_data *phy_data)
1619 {
1620         if (!phy_data->redrv)
1621                 return false;
1622
1623         if (phy_data->redrv_if >= AXGBE_PHY_REDRV_IF_MAX)
1624                 return true;
1625
1626         switch (phy_data->redrv_model) {
1627         case AXGBE_PHY_REDRV_MODEL_4223:
1628                 if (phy_data->redrv_lane > 3)
1629                         return true;
1630                 break;
1631         case AXGBE_PHY_REDRV_MODEL_4227:
1632                 if (phy_data->redrv_lane > 1)
1633                         return true;
1634                 break;
1635         default:
1636                 return true;
1637         }
1638
1639         return false;
1640 }
1641
1642 static int axgbe_phy_mdio_reset_setup(struct axgbe_port *pdata)
1643 {
1644         struct axgbe_phy_data *phy_data = pdata->phy_data;
1645         unsigned int reg;
1646
1647         if (phy_data->conn_type != AXGBE_CONN_TYPE_MDIO)
1648                 return 0;
1649         reg = XP_IOREAD(pdata, XP_PROP_3);
1650         phy_data->mdio_reset = XP_GET_BITS(reg, XP_PROP_3, MDIO_RESET);
1651         switch (phy_data->mdio_reset) {
1652         case AXGBE_MDIO_RESET_NONE:
1653         case AXGBE_MDIO_RESET_I2C_GPIO:
1654         case AXGBE_MDIO_RESET_INT_GPIO:
1655                 break;
1656         default:
1657                 PMD_DRV_LOG(ERR, "unsupported MDIO reset (%#x)\n",
1658                             phy_data->mdio_reset);
1659                 return -EINVAL;
1660         }
1661         if (phy_data->mdio_reset == AXGBE_MDIO_RESET_I2C_GPIO) {
1662                 phy_data->mdio_reset_addr = AXGBE_GPIO_ADDRESS_PCA9555 +
1663                         XP_GET_BITS(reg, XP_PROP_3,
1664                                     MDIO_RESET_I2C_ADDR);
1665                 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
1666                                                         MDIO_RESET_I2C_GPIO);
1667         } else if (phy_data->mdio_reset == AXGBE_MDIO_RESET_INT_GPIO) {
1668                 phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
1669                                                         MDIO_RESET_INT_GPIO);
1670         }
1671
1672         return 0;
1673 }
1674
1675 static bool axgbe_phy_port_mode_mismatch(struct axgbe_port *pdata)
1676 {
1677         struct axgbe_phy_data *phy_data = pdata->phy_data;
1678
1679         switch (phy_data->port_mode) {
1680         case AXGBE_PORT_MODE_BACKPLANE:
1681                 if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1682                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1683                         return false;
1684                 break;
1685         case AXGBE_PORT_MODE_BACKPLANE_2500:
1686                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500)
1687                         return false;
1688                 break;
1689         case AXGBE_PORT_MODE_1000BASE_T:
1690                 if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1691                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000))
1692                         return false;
1693                 break;
1694         case AXGBE_PORT_MODE_1000BASE_X:
1695                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000)
1696                         return false;
1697                 break;
1698         case AXGBE_PORT_MODE_NBASE_T:
1699                 if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1700                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1701                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500))
1702                         return false;
1703                 break;
1704         case AXGBE_PORT_MODE_10GBASE_T:
1705                 if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1706                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1707                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1708                         return false;
1709                 break;
1710         case AXGBE_PORT_MODE_10GBASE_R:
1711                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000)
1712                         return false;
1713                 break;
1714         case AXGBE_PORT_MODE_SFP:
1715                 if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1716                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1717                     (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1718                         return false;
1719                 break;
1720         default:
1721                 break;
1722         }
1723
1724         return true;
1725 }
1726
1727 static bool axgbe_phy_conn_type_mismatch(struct axgbe_port *pdata)
1728 {
1729         struct axgbe_phy_data *phy_data = pdata->phy_data;
1730
1731         switch (phy_data->port_mode) {
1732         case AXGBE_PORT_MODE_BACKPLANE:
1733         case AXGBE_PORT_MODE_BACKPLANE_2500:
1734                 if (phy_data->conn_type == AXGBE_CONN_TYPE_BACKPLANE)
1735                         return false;
1736                 break;
1737         case AXGBE_PORT_MODE_1000BASE_T:
1738         case AXGBE_PORT_MODE_1000BASE_X:
1739         case AXGBE_PORT_MODE_NBASE_T:
1740         case AXGBE_PORT_MODE_10GBASE_T:
1741         case AXGBE_PORT_MODE_10GBASE_R:
1742                 if (phy_data->conn_type == AXGBE_CONN_TYPE_MDIO)
1743                         return false;
1744                 break;
1745         case AXGBE_PORT_MODE_SFP:
1746                 if (phy_data->conn_type == AXGBE_CONN_TYPE_SFP)
1747                         return false;
1748                 break;
1749         default:
1750                 break;
1751         }
1752
1753         return true;
1754 }
1755
1756 static bool axgbe_phy_port_enabled(struct axgbe_port *pdata)
1757 {
1758         unsigned int reg;
1759
1760         reg = XP_IOREAD(pdata, XP_PROP_0);
1761         if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
1762                 return false;
1763         if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
1764                 return false;
1765
1766         return true;
1767 }
1768
1769 static void axgbe_phy_stop(struct axgbe_port *pdata)
1770 {
1771         struct axgbe_phy_data *phy_data = pdata->phy_data;
1772
1773         /* Reset SFP data */
1774         axgbe_phy_sfp_reset(phy_data);
1775         axgbe_phy_sfp_mod_absent(pdata);
1776
1777         /* Power off the PHY */
1778         axgbe_phy_power_off(pdata);
1779
1780         /* Stop the I2C controller */
1781         pdata->i2c_if.i2c_stop(pdata);
1782 }
1783
1784 static int axgbe_phy_start(struct axgbe_port *pdata)
1785 {
1786         struct axgbe_phy_data *phy_data = pdata->phy_data;
1787         int ret;
1788
1789         /* Start the I2C controller */
1790         ret = pdata->i2c_if.i2c_start(pdata);
1791         if (ret)
1792                 return ret;
1793
1794         /* Start in highest supported mode */
1795         axgbe_phy_set_mode(pdata, phy_data->start_mode);
1796
1797         /* After starting the I2C controller, we can check for an SFP */
1798         switch (phy_data->port_mode) {
1799         case AXGBE_PORT_MODE_SFP:
1800                 axgbe_phy_sfp_detect(pdata);
1801                 break;
1802         default:
1803                 break;
1804         }
1805
1806         return ret;
1807 }
1808
1809 static int axgbe_phy_reset(struct axgbe_port *pdata)
1810 {
1811         struct axgbe_phy_data *phy_data = pdata->phy_data;
1812         enum axgbe_mode cur_mode;
1813
1814         /* Reset by power cycling the PHY */
1815         cur_mode = phy_data->cur_mode;
1816         axgbe_phy_power_off(pdata);
1817         /* First time reset is done with passed unknown mode*/
1818         axgbe_phy_set_mode(pdata, cur_mode);
1819         return 0;
1820 }
1821
1822 static int axgbe_phy_init(struct axgbe_port *pdata)
1823 {
1824         struct axgbe_phy_data *phy_data;
1825         unsigned int reg;
1826         int ret;
1827
1828         /* Check if enabled */
1829         if (!axgbe_phy_port_enabled(pdata)) {
1830                 PMD_DRV_LOG(ERR, "device is not enabled\n");
1831                 return -ENODEV;
1832         }
1833
1834         /* Initialize the I2C controller */
1835         ret = pdata->i2c_if.i2c_init(pdata);
1836         if (ret)
1837                 return ret;
1838
1839         phy_data = rte_zmalloc("phy_data memory", sizeof(*phy_data), 0);
1840         if (!phy_data) {
1841                 PMD_DRV_LOG(ERR, "phy_data allocation failed\n");
1842                 return -ENOMEM;
1843         }
1844         pdata->phy_data = phy_data;
1845
1846         reg = XP_IOREAD(pdata, XP_PROP_0);
1847         phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
1848         phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
1849         phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
1850         phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
1851         phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
1852
1853         reg = XP_IOREAD(pdata, XP_PROP_4);
1854         phy_data->redrv = XP_GET_BITS(reg, XP_PROP_4, REDRV_PRESENT);
1855         phy_data->redrv_if = XP_GET_BITS(reg, XP_PROP_4, REDRV_IF);
1856         phy_data->redrv_addr = XP_GET_BITS(reg, XP_PROP_4, REDRV_ADDR);
1857         phy_data->redrv_lane = XP_GET_BITS(reg, XP_PROP_4, REDRV_LANE);
1858         phy_data->redrv_model = XP_GET_BITS(reg, XP_PROP_4, REDRV_MODEL);
1859
1860         /* Validate the connection requested */
1861         if (axgbe_phy_conn_type_mismatch(pdata)) {
1862                 PMD_DRV_LOG(ERR, "phy mode/connection mismatch (%#x/%#x)\n",
1863                             phy_data->port_mode, phy_data->conn_type);
1864                 return -EINVAL;
1865         }
1866
1867         /* Validate the mode requested */
1868         if (axgbe_phy_port_mode_mismatch(pdata)) {
1869                 PMD_DRV_LOG(ERR, "phy mode/speed mismatch (%#x/%#x)\n",
1870                             phy_data->port_mode, phy_data->port_speeds);
1871                 return -EINVAL;
1872         }
1873
1874         /* Check for and validate MDIO reset support */
1875         ret = axgbe_phy_mdio_reset_setup(pdata);
1876         if (ret)
1877                 return ret;
1878
1879         /* Validate the re-driver information */
1880         if (axgbe_phy_redrv_error(phy_data)) {
1881                 PMD_DRV_LOG(ERR, "phy re-driver settings error\n");
1882                 return -EINVAL;
1883         }
1884         pdata->kr_redrv = phy_data->redrv;
1885
1886         /* Indicate current mode is unknown */
1887         phy_data->cur_mode = AXGBE_MODE_UNKNOWN;
1888
1889         /* Initialize supported features */
1890         pdata->phy.supported = 0;
1891
1892         switch (phy_data->port_mode) {
1893                 /* Backplane support */
1894         case AXGBE_PORT_MODE_BACKPLANE:
1895                 pdata->phy.supported |= SUPPORTED_Autoneg;
1896                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1897                 pdata->phy.supported |= SUPPORTED_Backplane;
1898                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
1899                         pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
1900                         phy_data->start_mode = AXGBE_MODE_KX_1000;
1901                 }
1902                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
1903                         pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
1904                         if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
1905                                 pdata->phy.supported |=
1906                                         SUPPORTED_10000baseR_FEC;
1907                         phy_data->start_mode = AXGBE_MODE_KR;
1908                 }
1909
1910                 phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
1911                 break;
1912         case AXGBE_PORT_MODE_BACKPLANE_2500:
1913                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1914                 pdata->phy.supported |= SUPPORTED_Backplane;
1915                 pdata->phy.supported |= SUPPORTED_2500baseX_Full;
1916                 phy_data->start_mode = AXGBE_MODE_KX_2500;
1917
1918                 phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
1919                 break;
1920
1921                 /* MDIO 1GBase-T support */
1922         case AXGBE_PORT_MODE_1000BASE_T:
1923                 pdata->phy.supported |= SUPPORTED_Autoneg;
1924                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1925                 pdata->phy.supported |= SUPPORTED_TP;
1926                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
1927                         pdata->phy.supported |= SUPPORTED_100baseT_Full;
1928                         phy_data->start_mode = AXGBE_MODE_SGMII_100;
1929                 }
1930                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
1931                         pdata->phy.supported |= SUPPORTED_1000baseT_Full;
1932                         phy_data->start_mode = AXGBE_MODE_SGMII_1000;
1933                 }
1934
1935                 phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
1936                 break;
1937
1938                 /* MDIO Base-X support */
1939         case AXGBE_PORT_MODE_1000BASE_X:
1940                 pdata->phy.supported |= SUPPORTED_Autoneg;
1941                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1942                 pdata->phy.supported |= SUPPORTED_FIBRE;
1943                 pdata->phy.supported |= SUPPORTED_1000baseT_Full;
1944                 phy_data->start_mode = AXGBE_MODE_X;
1945
1946                 phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
1947                 break;
1948
1949                 /* MDIO NBase-T support */
1950         case AXGBE_PORT_MODE_NBASE_T:
1951                 pdata->phy.supported |= SUPPORTED_Autoneg;
1952                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1953                 pdata->phy.supported |= SUPPORTED_TP;
1954                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
1955                         pdata->phy.supported |= SUPPORTED_100baseT_Full;
1956                         phy_data->start_mode = AXGBE_MODE_SGMII_100;
1957                 }
1958                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
1959                         pdata->phy.supported |= SUPPORTED_1000baseT_Full;
1960                         phy_data->start_mode = AXGBE_MODE_SGMII_1000;
1961                 }
1962                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500) {
1963                         pdata->phy.supported |= SUPPORTED_2500baseX_Full;
1964                         phy_data->start_mode = AXGBE_MODE_KX_2500;
1965                 }
1966
1967                 phy_data->phydev_mode = AXGBE_MDIO_MODE_CL45;
1968                 break;
1969
1970                 /* 10GBase-T support */
1971         case AXGBE_PORT_MODE_10GBASE_T:
1972                 pdata->phy.supported |= SUPPORTED_Autoneg;
1973                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1974                 pdata->phy.supported |= SUPPORTED_TP;
1975                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
1976                         pdata->phy.supported |= SUPPORTED_100baseT_Full;
1977                         phy_data->start_mode = AXGBE_MODE_SGMII_100;
1978                 }
1979                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
1980                         pdata->phy.supported |= SUPPORTED_1000baseT_Full;
1981                         phy_data->start_mode = AXGBE_MODE_SGMII_1000;
1982                 }
1983                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
1984                         pdata->phy.supported |= SUPPORTED_10000baseT_Full;
1985                         phy_data->start_mode = AXGBE_MODE_KR;
1986                 }
1987
1988                 phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
1989                 break;
1990
1991                 /* 10GBase-R support */
1992         case AXGBE_PORT_MODE_10GBASE_R:
1993                 pdata->phy.supported |= SUPPORTED_Autoneg;
1994                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1995                 pdata->phy.supported |= SUPPORTED_TP;
1996                 pdata->phy.supported |= SUPPORTED_10000baseT_Full;
1997                 if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
1998                         pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
1999                 phy_data->start_mode = AXGBE_MODE_SFI;
2000
2001                 phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
2002                 break;
2003
2004                 /* SFP support */
2005         case AXGBE_PORT_MODE_SFP:
2006                 pdata->phy.supported |= SUPPORTED_Autoneg;
2007                 pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2008                 pdata->phy.supported |= SUPPORTED_TP;
2009                 pdata->phy.supported |= SUPPORTED_FIBRE;
2010                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
2011                         pdata->phy.supported |= SUPPORTED_100baseT_Full;
2012                         phy_data->start_mode = AXGBE_MODE_SGMII_100;
2013                 }
2014                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2015                         pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2016                         phy_data->start_mode = AXGBE_MODE_SGMII_1000;
2017                 }
2018                 if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
2019                         pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2020                         phy_data->start_mode = AXGBE_MODE_SFI;
2021                         if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2022                                 pdata->phy.supported |=
2023                                         SUPPORTED_10000baseR_FEC;
2024                 }
2025
2026                 phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
2027
2028                 axgbe_phy_sfp_setup(pdata);
2029                 break;
2030         default:
2031                 return -EINVAL;
2032         }
2033
2034         if ((phy_data->conn_type & AXGBE_CONN_TYPE_MDIO) &&
2035             (phy_data->phydev_mode != AXGBE_MDIO_MODE_NONE)) {
2036                 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
2037                                                     phy_data->phydev_mode);
2038                 if (ret) {
2039                         PMD_DRV_LOG(ERR, "mdio port/clause not compatible (%d/%u)\n",
2040                                     phy_data->mdio_addr, phy_data->phydev_mode);
2041                         return -EINVAL;
2042                 }
2043         }
2044
2045         if (phy_data->redrv && !phy_data->redrv_if) {
2046                 ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
2047                                                     AXGBE_MDIO_MODE_CL22);
2048                 if (ret) {
2049                         PMD_DRV_LOG(ERR, "redriver mdio port not compatible (%u)\n",
2050                                     phy_data->redrv_addr);
2051                         return -EINVAL;
2052                 }
2053         }
2054         return 0;
2055 }
2056 void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if *phy_if)
2057 {
2058         struct axgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
2059
2060         phy_impl->init                  = axgbe_phy_init;
2061         phy_impl->reset                 = axgbe_phy_reset;
2062         phy_impl->start                 = axgbe_phy_start;
2063         phy_impl->stop                  = axgbe_phy_stop;
2064         phy_impl->link_status           = axgbe_phy_link_status;
2065         phy_impl->use_mode              = axgbe_phy_use_mode;
2066         phy_impl->set_mode              = axgbe_phy_set_mode;
2067         phy_impl->get_mode              = axgbe_phy_get_mode;
2068         phy_impl->switch_mode           = axgbe_phy_switch_mode;
2069         phy_impl->cur_mode              = axgbe_phy_cur_mode;
2070         phy_impl->an_mode               = axgbe_phy_an_mode;
2071         phy_impl->an_config             = axgbe_phy_an_config;
2072         phy_impl->an_advertising        = axgbe_phy_an_advertising;
2073         phy_impl->an_outcome            = axgbe_phy_an_outcome;
2074 }