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