xref: /dpdk/drivers/net/axgbe/axgbe_phy_impl.c (revision 25d11a86c56d50947af33d0b79ede622809bd8b9)
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 	if (phy_data->comm_owned)
416 		return 0;
417 
418 	/* The I2C and MDIO/GPIO bus is multiplexed between multiple devices,
419 	 * the driver needs to take the software mutex and then the hardware
420 	 * mutexes before being able to use the busses.
421 	 */
422 	pthread_mutex_lock(&pdata->phy_mutex);
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 	if (axgbe_phy_sfp_parse_quirks(pdata))
614 		return;
615 
616 	/* Assume ACTIVE cable unless told it is PASSIVE */
617 	if (sfp_base[AXGBE_SFP_BASE_CABLE] & AXGBE_SFP_BASE_CABLE_PASSIVE) {
618 		phy_data->sfp_cable = AXGBE_SFP_CABLE_PASSIVE;
619 		phy_data->sfp_cable_len = sfp_base[AXGBE_SFP_BASE_CU_CABLE_LEN];
620 	} else {
621 		phy_data->sfp_cable = AXGBE_SFP_CABLE_ACTIVE;
622 	}
623 
624 	/* Determine the type of SFP */
625 	if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_SR)
626 		phy_data->sfp_base = AXGBE_SFP_BASE_10000_SR;
627 	else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_LR)
628 		phy_data->sfp_base = AXGBE_SFP_BASE_10000_LR;
629 	else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] &
630 		 AXGBE_SFP_BASE_10GBE_CC_LRM)
631 		phy_data->sfp_base = AXGBE_SFP_BASE_10000_LRM;
632 	else if (sfp_base[AXGBE_SFP_BASE_10GBE_CC] & AXGBE_SFP_BASE_10GBE_CC_ER)
633 		phy_data->sfp_base = AXGBE_SFP_BASE_10000_ER;
634 	else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_SX)
635 		phy_data->sfp_base = AXGBE_SFP_BASE_1000_SX;
636 	else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_LX)
637 		phy_data->sfp_base = AXGBE_SFP_BASE_1000_LX;
638 	else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_CX)
639 		phy_data->sfp_base = AXGBE_SFP_BASE_1000_CX;
640 	else if (sfp_base[AXGBE_SFP_BASE_1GBE_CC] & AXGBE_SFP_BASE_1GBE_CC_T)
641 		phy_data->sfp_base = AXGBE_SFP_BASE_1000_T;
642 	else if ((phy_data->sfp_cable == AXGBE_SFP_CABLE_PASSIVE) &&
643 		 axgbe_phy_sfp_bit_rate(sfp_eeprom, AXGBE_SFP_SPEED_10000))
644 		phy_data->sfp_base = AXGBE_SFP_BASE_10000_CR;
645 
646 	switch (phy_data->sfp_base) {
647 	case AXGBE_SFP_BASE_1000_T:
648 		phy_data->sfp_speed = AXGBE_SFP_SPEED_100_1000;
649 		break;
650 	case AXGBE_SFP_BASE_1000_SX:
651 	case AXGBE_SFP_BASE_1000_LX:
652 	case AXGBE_SFP_BASE_1000_CX:
653 		phy_data->sfp_speed = AXGBE_SFP_SPEED_1000;
654 		break;
655 	case AXGBE_SFP_BASE_10000_SR:
656 	case AXGBE_SFP_BASE_10000_LR:
657 	case AXGBE_SFP_BASE_10000_LRM:
658 	case AXGBE_SFP_BASE_10000_ER:
659 	case AXGBE_SFP_BASE_10000_CR:
660 		phy_data->sfp_speed = AXGBE_SFP_SPEED_10000;
661 		break;
662 	default:
663 		break;
664 	}
665 }
666 
667 static bool axgbe_phy_sfp_verify_eeprom(uint8_t cc_in, uint8_t *buf,
668 					unsigned int len)
669 {
670 	uint8_t cc;
671 
672 	for (cc = 0; len; buf++, len--)
673 		cc += *buf;
674 
675 	return (cc == cc_in) ? true : false;
676 }
677 
678 static int axgbe_phy_sfp_read_eeprom(struct axgbe_port *pdata)
679 {
680 	struct axgbe_phy_data *phy_data = pdata->phy_data;
681 	struct axgbe_sfp_eeprom sfp_eeprom;
682 	uint8_t eeprom_addr;
683 	int ret;
684 
685 	ret = axgbe_phy_sfp_get_mux(pdata);
686 	if (ret) {
687 		PMD_DRV_LOG(ERR, "I2C error setting SFP MUX\n");
688 		return ret;
689 	}
690 
691 	/* Read the SFP serial ID eeprom */
692 	eeprom_addr = 0;
693 	ret = axgbe_phy_i2c_read(pdata, AXGBE_SFP_SERIAL_ID_ADDRESS,
694 				 &eeprom_addr, sizeof(eeprom_addr),
695 				 &sfp_eeprom, sizeof(sfp_eeprom));
696 	if (ret) {
697 		PMD_DRV_LOG(ERR, "I2C error reading SFP EEPROM\n");
698 		goto put;
699 	}
700 
701 	/* Validate the contents read */
702 	if (!axgbe_phy_sfp_verify_eeprom(sfp_eeprom.base[AXGBE_SFP_BASE_CC],
703 					 sfp_eeprom.base,
704 					 sizeof(sfp_eeprom.base) - 1)) {
705 		ret = -EINVAL;
706 		goto put;
707 	}
708 
709 	if (!axgbe_phy_sfp_verify_eeprom(sfp_eeprom.extd[AXGBE_SFP_EXTD_CC],
710 					 sfp_eeprom.extd,
711 					 sizeof(sfp_eeprom.extd) - 1)) {
712 		ret = -EINVAL;
713 		goto put;
714 	}
715 
716 	/* Check for an added or changed SFP */
717 	if (memcmp(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom))) {
718 		phy_data->sfp_changed = 1;
719 		memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
720 
721 		if (sfp_eeprom.extd[AXGBE_SFP_EXTD_SFF_8472]) {
722 			uint8_t diag_type;
723 			diag_type = sfp_eeprom.extd[AXGBE_SFP_EXTD_DIAG];
724 
725 			if (!(diag_type & AXGBE_SFP_EXTD_DIAG_ADDR_CHANGE))
726 				phy_data->sfp_diags = 1;
727 		}
728 	} else {
729 		phy_data->sfp_changed = 0;
730 	}
731 
732 put:
733 	axgbe_phy_sfp_put_mux(pdata);
734 
735 	return ret;
736 }
737 
738 static void axgbe_phy_sfp_signals(struct axgbe_port *pdata)
739 {
740 	struct axgbe_phy_data *phy_data = pdata->phy_data;
741 	unsigned int gpio_input;
742 	u8 gpio_reg, gpio_ports[2];
743 	int ret;
744 
745 	/* Read the input port registers */
746 	gpio_reg = 0;
747 	ret = axgbe_phy_i2c_read(pdata, phy_data->sfp_gpio_address,
748 				 &gpio_reg, sizeof(gpio_reg),
749 				 gpio_ports, sizeof(gpio_ports));
750 	if (ret) {
751 		PMD_DRV_LOG(ERR, "I2C error reading SFP GPIOs\n");
752 		return;
753 	}
754 
755 	gpio_input = (gpio_ports[1] << 8) | gpio_ports[0];
756 
757 	if (phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_MOD_ABSENT) {
758 		/* No GPIO, just assume the module is present for now */
759 		phy_data->sfp_mod_absent = 0;
760 	} else {
761 		if (!(gpio_input & (1 << phy_data->sfp_gpio_mod_absent)))
762 			phy_data->sfp_mod_absent = 0;
763 	}
764 
765 	if (!(phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_RX_LOS) &&
766 	    (gpio_input & (1 << phy_data->sfp_gpio_rx_los)))
767 		phy_data->sfp_rx_los = 1;
768 
769 	if (!(phy_data->sfp_gpio_mask & AXGBE_GPIO_NO_TX_FAULT) &&
770 	    (gpio_input & (1 << phy_data->sfp_gpio_tx_fault)))
771 		phy_data->sfp_tx_fault = 1;
772 }
773 
774 static void axgbe_phy_sfp_mod_absent(struct axgbe_port *pdata)
775 {
776 	struct axgbe_phy_data *phy_data = pdata->phy_data;
777 
778 	phy_data->sfp_mod_absent = 1;
779 	phy_data->sfp_phy_avail = 0;
780 	memset(&phy_data->sfp_eeprom, 0, sizeof(phy_data->sfp_eeprom));
781 }
782 
783 static void axgbe_phy_sfp_reset(struct axgbe_phy_data *phy_data)
784 {
785 	phy_data->sfp_rx_los = 0;
786 	phy_data->sfp_tx_fault = 0;
787 	phy_data->sfp_mod_absent = 1;
788 	phy_data->sfp_diags = 0;
789 	phy_data->sfp_base = AXGBE_SFP_BASE_UNKNOWN;
790 	phy_data->sfp_cable = AXGBE_SFP_CABLE_UNKNOWN;
791 	phy_data->sfp_speed = AXGBE_SFP_SPEED_UNKNOWN;
792 }
793 
794 static void axgbe_phy_sfp_detect(struct axgbe_port *pdata)
795 {
796 	struct axgbe_phy_data *phy_data = pdata->phy_data;
797 	int ret;
798 
799 	/* Reset the SFP signals and info */
800 	axgbe_phy_sfp_reset(phy_data);
801 
802 	ret = axgbe_phy_get_comm_ownership(pdata);
803 	if (ret)
804 		return;
805 
806 	/* Read the SFP signals and check for module presence */
807 	axgbe_phy_sfp_signals(pdata);
808 	if (phy_data->sfp_mod_absent) {
809 		axgbe_phy_sfp_mod_absent(pdata);
810 		goto put;
811 	}
812 
813 	ret = axgbe_phy_sfp_read_eeprom(pdata);
814 	if (ret) {
815 		/* Treat any error as if there isn't an SFP plugged in */
816 		axgbe_phy_sfp_reset(phy_data);
817 		axgbe_phy_sfp_mod_absent(pdata);
818 		goto put;
819 	}
820 
821 	axgbe_phy_sfp_parse_eeprom(pdata);
822 	axgbe_phy_sfp_external_phy(pdata);
823 
824 put:
825 	axgbe_phy_sfp_phy_settings(pdata);
826 	axgbe_phy_put_comm_ownership(pdata);
827 }
828 
829 static void axgbe_phy_phydev_flowctrl(struct axgbe_port *pdata)
830 {
831 	pdata->phy.tx_pause = 0;
832 	pdata->phy.rx_pause = 0;
833 }
834 
835 static enum axgbe_mode axgbe_phy_an73_redrv_outcome(struct axgbe_port *pdata)
836 {
837 	struct axgbe_phy_data *phy_data = pdata->phy_data;
838 	enum axgbe_mode mode;
839 	unsigned int ad_reg, lp_reg;
840 
841 	pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
842 	pdata->phy.lp_advertising |= ADVERTISED_Backplane;
843 
844 	/* Use external PHY to determine flow control */
845 	if (pdata->phy.pause_autoneg)
846 		axgbe_phy_phydev_flowctrl(pdata);
847 
848 	/* Compare Advertisement and Link Partner register 2 */
849 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
850 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
851 	if (lp_reg & 0x80)
852 		pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
853 	if (lp_reg & 0x20)
854 		pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
855 
856 	ad_reg &= lp_reg;
857 	if (ad_reg & 0x80) {
858 		switch (phy_data->port_mode) {
859 		case AXGBE_PORT_MODE_BACKPLANE:
860 			mode = AXGBE_MODE_KR;
861 			break;
862 		default:
863 			mode = AXGBE_MODE_SFI;
864 			break;
865 		}
866 	} else if (ad_reg & 0x20) {
867 		switch (phy_data->port_mode) {
868 		case AXGBE_PORT_MODE_BACKPLANE:
869 			mode = AXGBE_MODE_KX_1000;
870 			break;
871 		case AXGBE_PORT_MODE_1000BASE_X:
872 			mode = AXGBE_MODE_X;
873 			break;
874 		case AXGBE_PORT_MODE_SFP:
875 			switch (phy_data->sfp_base) {
876 			case AXGBE_SFP_BASE_1000_T:
877 				mode = AXGBE_MODE_SGMII_1000;
878 				break;
879 			case AXGBE_SFP_BASE_1000_SX:
880 			case AXGBE_SFP_BASE_1000_LX:
881 			case AXGBE_SFP_BASE_1000_CX:
882 			default:
883 				mode = AXGBE_MODE_X;
884 				break;
885 			}
886 			break;
887 		default:
888 			mode = AXGBE_MODE_SGMII_1000;
889 			break;
890 		}
891 	} else {
892 		mode = AXGBE_MODE_UNKNOWN;
893 	}
894 
895 	/* Compare Advertisement and Link Partner register 3 */
896 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
897 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
898 	if (lp_reg & 0xc000)
899 		pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
900 
901 	return mode;
902 }
903 
904 static enum axgbe_mode axgbe_phy_an73_outcome(struct axgbe_port *pdata)
905 {
906 	enum axgbe_mode mode;
907 	unsigned int ad_reg, lp_reg;
908 
909 	pdata->phy.lp_advertising |= ADVERTISED_Autoneg;
910 	pdata->phy.lp_advertising |= ADVERTISED_Backplane;
911 
912 	/* Compare Advertisement and Link Partner register 1 */
913 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
914 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA);
915 	if (lp_reg & 0x400)
916 		pdata->phy.lp_advertising |= ADVERTISED_Pause;
917 	if (lp_reg & 0x800)
918 		pdata->phy.lp_advertising |= ADVERTISED_Asym_Pause;
919 
920 	if (pdata->phy.pause_autoneg) {
921 		/* Set flow control based on auto-negotiation result */
922 		pdata->phy.tx_pause = 0;
923 		pdata->phy.rx_pause = 0;
924 
925 		if (ad_reg & lp_reg & 0x400) {
926 			pdata->phy.tx_pause = 1;
927 			pdata->phy.rx_pause = 1;
928 		} else if (ad_reg & lp_reg & 0x800) {
929 			if (ad_reg & 0x400)
930 				pdata->phy.rx_pause = 1;
931 			else if (lp_reg & 0x400)
932 				pdata->phy.tx_pause = 1;
933 		}
934 	}
935 
936 	/* Compare Advertisement and Link Partner register 2 */
937 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1);
938 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 1);
939 	if (lp_reg & 0x80)
940 		pdata->phy.lp_advertising |= ADVERTISED_10000baseKR_Full;
941 	if (lp_reg & 0x20)
942 		pdata->phy.lp_advertising |= ADVERTISED_1000baseKX_Full;
943 
944 	ad_reg &= lp_reg;
945 	if (ad_reg & 0x80)
946 		mode = AXGBE_MODE_KR;
947 	else if (ad_reg & 0x20)
948 		mode = AXGBE_MODE_KX_1000;
949 	else
950 		mode = AXGBE_MODE_UNKNOWN;
951 
952 	/* Compare Advertisement and Link Partner register 3 */
953 	ad_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2);
954 	lp_reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_LPA + 2);
955 	if (lp_reg & 0xc000)
956 		pdata->phy.lp_advertising |= ADVERTISED_10000baseR_FEC;
957 
958 	return mode;
959 }
960 
961 static enum axgbe_mode axgbe_phy_an_outcome(struct axgbe_port *pdata)
962 {
963 	switch (pdata->an_mode) {
964 	case AXGBE_AN_MODE_CL73:
965 		return axgbe_phy_an73_outcome(pdata);
966 	case AXGBE_AN_MODE_CL73_REDRV:
967 		return axgbe_phy_an73_redrv_outcome(pdata);
968 	case AXGBE_AN_MODE_CL37:
969 	case AXGBE_AN_MODE_CL37_SGMII:
970 	default:
971 		return AXGBE_MODE_UNKNOWN;
972 	}
973 }
974 
975 static unsigned int axgbe_phy_an_advertising(struct axgbe_port *pdata)
976 {
977 	struct axgbe_phy_data *phy_data = pdata->phy_data;
978 	unsigned int advertising;
979 
980 	/* Without a re-driver, just return current advertising */
981 	if (!phy_data->redrv)
982 		return pdata->phy.advertising;
983 
984 	/* With the KR re-driver we need to advertise a single speed */
985 	advertising = pdata->phy.advertising;
986 	advertising &= ~ADVERTISED_1000baseKX_Full;
987 	advertising &= ~ADVERTISED_10000baseKR_Full;
988 
989 	switch (phy_data->port_mode) {
990 	case AXGBE_PORT_MODE_BACKPLANE:
991 		advertising |= ADVERTISED_10000baseKR_Full;
992 		break;
993 	case AXGBE_PORT_MODE_BACKPLANE_2500:
994 		advertising |= ADVERTISED_1000baseKX_Full;
995 		break;
996 	case AXGBE_PORT_MODE_1000BASE_T:
997 	case AXGBE_PORT_MODE_1000BASE_X:
998 	case AXGBE_PORT_MODE_NBASE_T:
999 		advertising |= ADVERTISED_1000baseKX_Full;
1000 		break;
1001 	case AXGBE_PORT_MODE_10GBASE_T:
1002 		PMD_DRV_LOG(ERR, "10GBASE_T mode is not supported\n");
1003 		break;
1004 	case AXGBE_PORT_MODE_10GBASE_R:
1005 		advertising |= ADVERTISED_10000baseKR_Full;
1006 		break;
1007 	case AXGBE_PORT_MODE_SFP:
1008 		switch (phy_data->sfp_base) {
1009 		case AXGBE_SFP_BASE_1000_T:
1010 		case AXGBE_SFP_BASE_1000_SX:
1011 		case AXGBE_SFP_BASE_1000_LX:
1012 		case AXGBE_SFP_BASE_1000_CX:
1013 			advertising |= ADVERTISED_1000baseKX_Full;
1014 			break;
1015 		default:
1016 			advertising |= ADVERTISED_10000baseKR_Full;
1017 			break;
1018 		}
1019 		break;
1020 	default:
1021 		advertising |= ADVERTISED_10000baseKR_Full;
1022 		break;
1023 	}
1024 
1025 	return advertising;
1026 }
1027 
1028 static int axgbe_phy_an_config(struct axgbe_port *pdata __rte_unused)
1029 {
1030 	return 0;
1031 	/* Dummy API since there is no case to support
1032 	 * external phy devices registred through kerenl apis
1033 	 */
1034 }
1035 
1036 static enum axgbe_an_mode axgbe_phy_an_sfp_mode(struct axgbe_phy_data *phy_data)
1037 {
1038 	switch (phy_data->sfp_base) {
1039 	case AXGBE_SFP_BASE_1000_T:
1040 		return AXGBE_AN_MODE_CL37_SGMII;
1041 	case AXGBE_SFP_BASE_1000_SX:
1042 	case AXGBE_SFP_BASE_1000_LX:
1043 	case AXGBE_SFP_BASE_1000_CX:
1044 		return AXGBE_AN_MODE_CL37;
1045 	default:
1046 		return AXGBE_AN_MODE_NONE;
1047 	}
1048 }
1049 
1050 static enum axgbe_an_mode axgbe_phy_an_mode(struct axgbe_port *pdata)
1051 {
1052 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1053 
1054 	/* A KR re-driver will always require CL73 AN */
1055 	if (phy_data->redrv)
1056 		return AXGBE_AN_MODE_CL73_REDRV;
1057 
1058 	switch (phy_data->port_mode) {
1059 	case AXGBE_PORT_MODE_BACKPLANE:
1060 		return AXGBE_AN_MODE_CL73;
1061 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1062 		return AXGBE_AN_MODE_NONE;
1063 	case AXGBE_PORT_MODE_1000BASE_T:
1064 		return AXGBE_AN_MODE_CL37_SGMII;
1065 	case AXGBE_PORT_MODE_1000BASE_X:
1066 		return AXGBE_AN_MODE_CL37;
1067 	case AXGBE_PORT_MODE_NBASE_T:
1068 		return AXGBE_AN_MODE_CL37_SGMII;
1069 	case AXGBE_PORT_MODE_10GBASE_T:
1070 		return AXGBE_AN_MODE_CL73;
1071 	case AXGBE_PORT_MODE_10GBASE_R:
1072 		return AXGBE_AN_MODE_NONE;
1073 	case AXGBE_PORT_MODE_SFP:
1074 		return axgbe_phy_an_sfp_mode(phy_data);
1075 	default:
1076 		return AXGBE_AN_MODE_NONE;
1077 	}
1078 }
1079 
1080 static int axgbe_phy_set_redrv_mode_mdio(struct axgbe_port *pdata,
1081 					 enum axgbe_phy_redrv_mode mode)
1082 {
1083 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1084 	u16 redrv_reg, redrv_val;
1085 
1086 	redrv_reg = AXGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1087 	redrv_val = (u16)mode;
1088 
1089 	return pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr,
1090 					       redrv_reg, redrv_val);
1091 }
1092 
1093 static int axgbe_phy_set_redrv_mode_i2c(struct axgbe_port *pdata,
1094 					enum axgbe_phy_redrv_mode mode)
1095 {
1096 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1097 	unsigned int redrv_reg;
1098 	int ret;
1099 
1100 	/* Calculate the register to write */
1101 	redrv_reg = AXGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000);
1102 
1103 	ret = axgbe_phy_redrv_write(pdata, redrv_reg, mode);
1104 
1105 	return ret;
1106 }
1107 
1108 static void axgbe_phy_set_redrv_mode(struct axgbe_port *pdata)
1109 {
1110 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1111 	enum axgbe_phy_redrv_mode mode;
1112 	int ret;
1113 
1114 	if (!phy_data->redrv)
1115 		return;
1116 
1117 	mode = AXGBE_PHY_REDRV_MODE_CX;
1118 	if ((phy_data->port_mode == AXGBE_PORT_MODE_SFP) &&
1119 	    (phy_data->sfp_base != AXGBE_SFP_BASE_1000_CX) &&
1120 	    (phy_data->sfp_base != AXGBE_SFP_BASE_10000_CR))
1121 		mode = AXGBE_PHY_REDRV_MODE_SR;
1122 
1123 	ret = axgbe_phy_get_comm_ownership(pdata);
1124 	if (ret)
1125 		return;
1126 
1127 	if (phy_data->redrv_if)
1128 		axgbe_phy_set_redrv_mode_i2c(pdata, mode);
1129 	else
1130 		axgbe_phy_set_redrv_mode_mdio(pdata, mode);
1131 
1132 	axgbe_phy_put_comm_ownership(pdata);
1133 }
1134 
1135 static void axgbe_phy_start_ratechange(struct axgbe_port *pdata)
1136 {
1137 	if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1138 		return;
1139 }
1140 
1141 static void axgbe_phy_complete_ratechange(struct axgbe_port *pdata)
1142 {
1143 	unsigned int wait;
1144 
1145 	/* Wait for command to complete */
1146 	wait = AXGBE_RATECHANGE_COUNT;
1147 	while (wait--) {
1148 		if (!XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
1149 			return;
1150 
1151 		rte_delay_us(1500);
1152 	}
1153 }
1154 
1155 static void axgbe_phy_rrc(struct axgbe_port *pdata)
1156 {
1157 	unsigned int s0;
1158 
1159 	axgbe_phy_start_ratechange(pdata);
1160 
1161 	/* Receiver Reset Cycle */
1162 	s0 = 0;
1163 	XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 5);
1164 	XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1165 
1166 	/* Call FW to make the change */
1167 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1168 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1169 	XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1170 
1171 	axgbe_phy_complete_ratechange(pdata);
1172 }
1173 
1174 static void axgbe_phy_power_off(struct axgbe_port *pdata)
1175 {
1176 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1177 
1178 	axgbe_phy_start_ratechange(pdata);
1179 
1180 	/* Call FW to make the change */
1181 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, 0);
1182 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1183 	XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1184 	axgbe_phy_complete_ratechange(pdata);
1185 	phy_data->cur_mode = AXGBE_MODE_UNKNOWN;
1186 }
1187 
1188 static void axgbe_phy_sfi_mode(struct axgbe_port *pdata)
1189 {
1190 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1191 	unsigned int s0;
1192 
1193 	axgbe_phy_set_redrv_mode(pdata);
1194 
1195 	axgbe_phy_start_ratechange(pdata);
1196 
1197 	/* 10G/SFI */
1198 	s0 = 0;
1199 	XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 3);
1200 	if (phy_data->sfp_cable != AXGBE_SFP_CABLE_PASSIVE) {
1201 		XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1202 	} else {
1203 		if (phy_data->sfp_cable_len <= 1)
1204 			XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 1);
1205 		else if (phy_data->sfp_cable_len <= 3)
1206 			XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 2);
1207 		else
1208 			XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 3);
1209 	}
1210 
1211 	/* Call FW to make the change */
1212 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1213 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1214 	XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1215 	axgbe_phy_complete_ratechange(pdata);
1216 	phy_data->cur_mode = AXGBE_MODE_SFI;
1217 }
1218 
1219 static void axgbe_phy_kr_mode(struct axgbe_port *pdata)
1220 {
1221 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1222 	unsigned int s0;
1223 
1224 	axgbe_phy_set_redrv_mode(pdata);
1225 
1226 	axgbe_phy_start_ratechange(pdata);
1227 
1228 	/* 10G/KR */
1229 	s0 = 0;
1230 	XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, 4);
1231 	XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, SUB_COMMAND, 0);
1232 
1233 	/* Call FW to make the change */
1234 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_0, s0);
1235 	XP_IOWRITE(pdata, XP_DRIVER_SCRATCH_1, 0);
1236 	XP_IOWRITE_BITS(pdata, XP_DRIVER_INT_REQ, REQUEST, 1);
1237 	axgbe_phy_complete_ratechange(pdata);
1238 	phy_data->cur_mode = AXGBE_MODE_KR;
1239 }
1240 
1241 static enum axgbe_mode axgbe_phy_cur_mode(struct axgbe_port *pdata)
1242 {
1243 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1244 
1245 	return phy_data->cur_mode;
1246 }
1247 
1248 static enum axgbe_mode axgbe_phy_switch_baset_mode(struct axgbe_port *pdata)
1249 {
1250 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1251 
1252 	/* No switching if not 10GBase-T */
1253 	if (phy_data->port_mode != AXGBE_PORT_MODE_10GBASE_T)
1254 		return axgbe_phy_cur_mode(pdata);
1255 
1256 	switch (axgbe_phy_cur_mode(pdata)) {
1257 	case AXGBE_MODE_SGMII_100:
1258 	case AXGBE_MODE_SGMII_1000:
1259 		return AXGBE_MODE_KR;
1260 	case AXGBE_MODE_KR:
1261 	default:
1262 		return AXGBE_MODE_SGMII_1000;
1263 	}
1264 }
1265 
1266 static enum axgbe_mode axgbe_phy_switch_bp_2500_mode(struct axgbe_port *pdata
1267 						     __rte_unused)
1268 {
1269 	return AXGBE_MODE_KX_2500;
1270 }
1271 
1272 static enum axgbe_mode axgbe_phy_switch_bp_mode(struct axgbe_port *pdata)
1273 {
1274 	/* If we are in KR switch to KX, and vice-versa */
1275 	switch (axgbe_phy_cur_mode(pdata)) {
1276 	case AXGBE_MODE_KX_1000:
1277 		return AXGBE_MODE_KR;
1278 	case AXGBE_MODE_KR:
1279 	default:
1280 		return AXGBE_MODE_KX_1000;
1281 	}
1282 }
1283 
1284 static enum axgbe_mode axgbe_phy_switch_mode(struct axgbe_port *pdata)
1285 {
1286 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1287 
1288 	switch (phy_data->port_mode) {
1289 	case AXGBE_PORT_MODE_BACKPLANE:
1290 		return axgbe_phy_switch_bp_mode(pdata);
1291 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1292 		return axgbe_phy_switch_bp_2500_mode(pdata);
1293 	case AXGBE_PORT_MODE_1000BASE_T:
1294 	case AXGBE_PORT_MODE_NBASE_T:
1295 	case AXGBE_PORT_MODE_10GBASE_T:
1296 		return axgbe_phy_switch_baset_mode(pdata);
1297 	case AXGBE_PORT_MODE_1000BASE_X:
1298 	case AXGBE_PORT_MODE_10GBASE_R:
1299 	case AXGBE_PORT_MODE_SFP:
1300 		/* No switching, so just return current mode */
1301 		return axgbe_phy_cur_mode(pdata);
1302 	default:
1303 		return AXGBE_MODE_UNKNOWN;
1304 	}
1305 }
1306 
1307 static enum axgbe_mode axgbe_phy_get_basex_mode(struct axgbe_phy_data *phy_data
1308 						__rte_unused,
1309 						int speed)
1310 {
1311 	switch (speed) {
1312 	case SPEED_1000:
1313 		return AXGBE_MODE_X;
1314 	case SPEED_10000:
1315 		return AXGBE_MODE_KR;
1316 	default:
1317 		return AXGBE_MODE_UNKNOWN;
1318 	}
1319 }
1320 
1321 static enum axgbe_mode axgbe_phy_get_baset_mode(struct axgbe_phy_data *phy_data
1322 						__rte_unused,
1323 						int speed)
1324 {
1325 	switch (speed) {
1326 	case SPEED_100:
1327 		return AXGBE_MODE_SGMII_100;
1328 	case SPEED_1000:
1329 		return AXGBE_MODE_SGMII_1000;
1330 	case SPEED_10000:
1331 		return AXGBE_MODE_KR;
1332 	default:
1333 		return AXGBE_MODE_UNKNOWN;
1334 	}
1335 }
1336 
1337 static enum axgbe_mode axgbe_phy_get_sfp_mode(struct axgbe_phy_data *phy_data,
1338 					      int speed)
1339 {
1340 	switch (speed) {
1341 	case SPEED_100:
1342 		return AXGBE_MODE_SGMII_100;
1343 	case SPEED_1000:
1344 		if (phy_data->sfp_base == AXGBE_SFP_BASE_1000_T)
1345 			return AXGBE_MODE_SGMII_1000;
1346 		else
1347 			return AXGBE_MODE_X;
1348 	case SPEED_10000:
1349 	case SPEED_UNKNOWN:
1350 		return AXGBE_MODE_SFI;
1351 	default:
1352 		return AXGBE_MODE_UNKNOWN;
1353 	}
1354 }
1355 
1356 static enum axgbe_mode axgbe_phy_get_bp_2500_mode(int speed)
1357 {
1358 	switch (speed) {
1359 	case SPEED_2500:
1360 		return AXGBE_MODE_KX_2500;
1361 	default:
1362 		return AXGBE_MODE_UNKNOWN;
1363 	}
1364 }
1365 
1366 static enum axgbe_mode axgbe_phy_get_bp_mode(int speed)
1367 {
1368 	switch (speed) {
1369 	case SPEED_1000:
1370 		return AXGBE_MODE_KX_1000;
1371 	case SPEED_10000:
1372 		return AXGBE_MODE_KR;
1373 	default:
1374 		return AXGBE_MODE_UNKNOWN;
1375 	}
1376 }
1377 
1378 static enum axgbe_mode axgbe_phy_get_mode(struct axgbe_port *pdata,
1379 					  int speed)
1380 {
1381 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1382 
1383 	switch (phy_data->port_mode) {
1384 	case AXGBE_PORT_MODE_BACKPLANE:
1385 		return axgbe_phy_get_bp_mode(speed);
1386 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1387 		return axgbe_phy_get_bp_2500_mode(speed);
1388 	case AXGBE_PORT_MODE_1000BASE_T:
1389 	case AXGBE_PORT_MODE_NBASE_T:
1390 	case AXGBE_PORT_MODE_10GBASE_T:
1391 		return axgbe_phy_get_baset_mode(phy_data, speed);
1392 	case AXGBE_PORT_MODE_1000BASE_X:
1393 	case AXGBE_PORT_MODE_10GBASE_R:
1394 		return axgbe_phy_get_basex_mode(phy_data, speed);
1395 	case AXGBE_PORT_MODE_SFP:
1396 		return axgbe_phy_get_sfp_mode(phy_data, speed);
1397 	default:
1398 		return AXGBE_MODE_UNKNOWN;
1399 	}
1400 }
1401 
1402 static void axgbe_phy_set_mode(struct axgbe_port *pdata, enum axgbe_mode mode)
1403 {
1404 	switch (mode) {
1405 	case AXGBE_MODE_KR:
1406 		axgbe_phy_kr_mode(pdata);
1407 		break;
1408 	case AXGBE_MODE_SFI:
1409 		axgbe_phy_sfi_mode(pdata);
1410 		break;
1411 	default:
1412 		break;
1413 	}
1414 }
1415 
1416 static bool axgbe_phy_check_mode(struct axgbe_port *pdata,
1417 				 enum axgbe_mode mode, u32 advert)
1418 {
1419 	if (pdata->phy.autoneg == AUTONEG_ENABLE) {
1420 		if (pdata->phy.advertising & advert)
1421 			return true;
1422 	} else {
1423 		enum axgbe_mode cur_mode;
1424 
1425 		cur_mode = axgbe_phy_get_mode(pdata, pdata->phy.speed);
1426 		if (cur_mode == mode)
1427 			return true;
1428 	}
1429 
1430 	return false;
1431 }
1432 
1433 static bool axgbe_phy_use_basex_mode(struct axgbe_port *pdata,
1434 				     enum axgbe_mode mode)
1435 {
1436 	switch (mode) {
1437 	case AXGBE_MODE_X:
1438 		return axgbe_phy_check_mode(pdata, mode,
1439 					    ADVERTISED_1000baseT_Full);
1440 	case AXGBE_MODE_KR:
1441 		return axgbe_phy_check_mode(pdata, mode,
1442 					    ADVERTISED_10000baseT_Full);
1443 	default:
1444 		return false;
1445 	}
1446 }
1447 
1448 static bool axgbe_phy_use_baset_mode(struct axgbe_port *pdata,
1449 				     enum axgbe_mode mode)
1450 {
1451 	switch (mode) {
1452 	case AXGBE_MODE_SGMII_100:
1453 		return axgbe_phy_check_mode(pdata, mode,
1454 					    ADVERTISED_100baseT_Full);
1455 	case AXGBE_MODE_SGMII_1000:
1456 		return axgbe_phy_check_mode(pdata, mode,
1457 					    ADVERTISED_1000baseT_Full);
1458 	case AXGBE_MODE_KR:
1459 		return axgbe_phy_check_mode(pdata, mode,
1460 					    ADVERTISED_10000baseT_Full);
1461 	default:
1462 		return false;
1463 	}
1464 }
1465 
1466 static bool axgbe_phy_use_sfp_mode(struct axgbe_port *pdata,
1467 				   enum axgbe_mode mode)
1468 {
1469 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1470 
1471 	switch (mode) {
1472 	case AXGBE_MODE_X:
1473 		if (phy_data->sfp_base == AXGBE_SFP_BASE_1000_T)
1474 			return false;
1475 		return axgbe_phy_check_mode(pdata, mode,
1476 					    ADVERTISED_1000baseT_Full);
1477 	case AXGBE_MODE_SGMII_100:
1478 		if (phy_data->sfp_base != AXGBE_SFP_BASE_1000_T)
1479 			return false;
1480 		return axgbe_phy_check_mode(pdata, mode,
1481 					    ADVERTISED_100baseT_Full);
1482 	case AXGBE_MODE_SGMII_1000:
1483 		if (phy_data->sfp_base != AXGBE_SFP_BASE_1000_T)
1484 			return false;
1485 		return axgbe_phy_check_mode(pdata, mode,
1486 					    ADVERTISED_1000baseT_Full);
1487 	case AXGBE_MODE_SFI:
1488 		return axgbe_phy_check_mode(pdata, mode,
1489 					    ADVERTISED_10000baseT_Full);
1490 	default:
1491 		return false;
1492 	}
1493 }
1494 
1495 static bool axgbe_phy_use_bp_2500_mode(struct axgbe_port *pdata,
1496 				       enum axgbe_mode mode)
1497 {
1498 	switch (mode) {
1499 	case AXGBE_MODE_KX_2500:
1500 		return axgbe_phy_check_mode(pdata, mode,
1501 					    ADVERTISED_2500baseX_Full);
1502 	default:
1503 		return false;
1504 	}
1505 }
1506 
1507 static bool axgbe_phy_use_bp_mode(struct axgbe_port *pdata,
1508 				  enum axgbe_mode mode)
1509 {
1510 	switch (mode) {
1511 	case AXGBE_MODE_KX_1000:
1512 		return axgbe_phy_check_mode(pdata, mode,
1513 					    ADVERTISED_1000baseKX_Full);
1514 	case AXGBE_MODE_KR:
1515 		return axgbe_phy_check_mode(pdata, mode,
1516 					    ADVERTISED_10000baseKR_Full);
1517 	default:
1518 		return false;
1519 	}
1520 }
1521 
1522 static bool axgbe_phy_use_mode(struct axgbe_port *pdata, enum axgbe_mode mode)
1523 {
1524 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1525 
1526 	switch (phy_data->port_mode) {
1527 	case AXGBE_PORT_MODE_BACKPLANE:
1528 		return axgbe_phy_use_bp_mode(pdata, mode);
1529 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1530 		return axgbe_phy_use_bp_2500_mode(pdata, mode);
1531 	case AXGBE_PORT_MODE_1000BASE_T:
1532 	case AXGBE_PORT_MODE_NBASE_T:
1533 	case AXGBE_PORT_MODE_10GBASE_T:
1534 		return axgbe_phy_use_baset_mode(pdata, mode);
1535 	case AXGBE_PORT_MODE_1000BASE_X:
1536 	case AXGBE_PORT_MODE_10GBASE_R:
1537 		return axgbe_phy_use_basex_mode(pdata, mode);
1538 	case AXGBE_PORT_MODE_SFP:
1539 		return axgbe_phy_use_sfp_mode(pdata, mode);
1540 	default:
1541 		return false;
1542 	}
1543 }
1544 
1545 static int axgbe_phy_link_status(struct axgbe_port *pdata, int *an_restart)
1546 {
1547 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1548 	unsigned int reg;
1549 
1550 	*an_restart = 0;
1551 
1552 	if (phy_data->port_mode == AXGBE_PORT_MODE_SFP) {
1553 		/* Check SFP signals */
1554 		axgbe_phy_sfp_detect(pdata);
1555 
1556 		if (phy_data->sfp_changed) {
1557 			*an_restart = 1;
1558 			return 0;
1559 		}
1560 
1561 		if (phy_data->sfp_mod_absent || phy_data->sfp_rx_los)
1562 			return 0;
1563 	}
1564 
1565 	/* Link status is latched low, so read once to clear
1566 	 * and then read again to get current state
1567 	 */
1568 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1569 	reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
1570 	if (reg & MDIO_STAT1_LSTATUS)
1571 		return 1;
1572 
1573 	/* No link, attempt a receiver reset cycle */
1574 	if (phy_data->rrc_count++) {
1575 		phy_data->rrc_count = 0;
1576 		axgbe_phy_rrc(pdata);
1577 	}
1578 
1579 	return 0;
1580 }
1581 
1582 static void axgbe_phy_sfp_gpio_setup(struct axgbe_port *pdata)
1583 {
1584 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1585 	unsigned int reg;
1586 
1587 	reg = XP_IOREAD(pdata, XP_PROP_3);
1588 
1589 	phy_data->sfp_gpio_address = AXGBE_GPIO_ADDRESS_PCA9555 +
1590 		XP_GET_BITS(reg, XP_PROP_3, GPIO_ADDR);
1591 
1592 	phy_data->sfp_gpio_mask = XP_GET_BITS(reg, XP_PROP_3, GPIO_MASK);
1593 
1594 	phy_data->sfp_gpio_rx_los = XP_GET_BITS(reg, XP_PROP_3,
1595 						GPIO_RX_LOS);
1596 	phy_data->sfp_gpio_tx_fault = XP_GET_BITS(reg, XP_PROP_3,
1597 						  GPIO_TX_FAULT);
1598 	phy_data->sfp_gpio_mod_absent = XP_GET_BITS(reg, XP_PROP_3,
1599 						    GPIO_MOD_ABS);
1600 	phy_data->sfp_gpio_rate_select = XP_GET_BITS(reg, XP_PROP_3,
1601 						     GPIO_RATE_SELECT);
1602 }
1603 
1604 static void axgbe_phy_sfp_comm_setup(struct axgbe_port *pdata)
1605 {
1606 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1607 	unsigned int reg, mux_addr_hi, mux_addr_lo;
1608 
1609 	reg = XP_IOREAD(pdata, XP_PROP_4);
1610 
1611 	mux_addr_hi = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_HI);
1612 	mux_addr_lo = XP_GET_BITS(reg, XP_PROP_4, MUX_ADDR_LO);
1613 	if (mux_addr_lo == AXGBE_SFP_DIRECT)
1614 		return;
1615 
1616 	phy_data->sfp_comm = AXGBE_SFP_COMM_PCA9545;
1617 	phy_data->sfp_mux_address = (mux_addr_hi << 2) + mux_addr_lo;
1618 	phy_data->sfp_mux_channel = XP_GET_BITS(reg, XP_PROP_4, MUX_CHAN);
1619 }
1620 
1621 static void axgbe_phy_sfp_setup(struct axgbe_port *pdata)
1622 {
1623 	axgbe_phy_sfp_comm_setup(pdata);
1624 	axgbe_phy_sfp_gpio_setup(pdata);
1625 }
1626 
1627 static bool axgbe_phy_redrv_error(struct axgbe_phy_data *phy_data)
1628 {
1629 	if (!phy_data->redrv)
1630 		return false;
1631 
1632 	if (phy_data->redrv_if >= AXGBE_PHY_REDRV_IF_MAX)
1633 		return true;
1634 
1635 	switch (phy_data->redrv_model) {
1636 	case AXGBE_PHY_REDRV_MODEL_4223:
1637 		if (phy_data->redrv_lane > 3)
1638 			return true;
1639 		break;
1640 	case AXGBE_PHY_REDRV_MODEL_4227:
1641 		if (phy_data->redrv_lane > 1)
1642 			return true;
1643 		break;
1644 	default:
1645 		return true;
1646 	}
1647 
1648 	return false;
1649 }
1650 
1651 static int axgbe_phy_mdio_reset_setup(struct axgbe_port *pdata)
1652 {
1653 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1654 	unsigned int reg;
1655 
1656 	if (phy_data->conn_type != AXGBE_CONN_TYPE_MDIO)
1657 		return 0;
1658 	reg = XP_IOREAD(pdata, XP_PROP_3);
1659 	phy_data->mdio_reset = XP_GET_BITS(reg, XP_PROP_3, MDIO_RESET);
1660 	switch (phy_data->mdio_reset) {
1661 	case AXGBE_MDIO_RESET_NONE:
1662 	case AXGBE_MDIO_RESET_I2C_GPIO:
1663 	case AXGBE_MDIO_RESET_INT_GPIO:
1664 		break;
1665 	default:
1666 		PMD_DRV_LOG(ERR, "unsupported MDIO reset (%#x)\n",
1667 			    phy_data->mdio_reset);
1668 		return -EINVAL;
1669 	}
1670 	if (phy_data->mdio_reset == AXGBE_MDIO_RESET_I2C_GPIO) {
1671 		phy_data->mdio_reset_addr = AXGBE_GPIO_ADDRESS_PCA9555 +
1672 			XP_GET_BITS(reg, XP_PROP_3,
1673 				    MDIO_RESET_I2C_ADDR);
1674 		phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
1675 							MDIO_RESET_I2C_GPIO);
1676 	} else if (phy_data->mdio_reset == AXGBE_MDIO_RESET_INT_GPIO) {
1677 		phy_data->mdio_reset_gpio = XP_GET_BITS(reg, XP_PROP_3,
1678 							MDIO_RESET_INT_GPIO);
1679 	}
1680 
1681 	return 0;
1682 }
1683 
1684 static bool axgbe_phy_port_mode_mismatch(struct axgbe_port *pdata)
1685 {
1686 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1687 
1688 	switch (phy_data->port_mode) {
1689 	case AXGBE_PORT_MODE_BACKPLANE:
1690 		if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1691 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1692 			return false;
1693 		break;
1694 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1695 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500)
1696 			return false;
1697 		break;
1698 	case AXGBE_PORT_MODE_1000BASE_T:
1699 		if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1700 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000))
1701 			return false;
1702 		break;
1703 	case AXGBE_PORT_MODE_1000BASE_X:
1704 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000)
1705 			return false;
1706 		break;
1707 	case AXGBE_PORT_MODE_NBASE_T:
1708 		if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1709 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1710 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500))
1711 			return false;
1712 		break;
1713 	case AXGBE_PORT_MODE_10GBASE_T:
1714 		if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1715 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1716 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1717 			return false;
1718 		break;
1719 	case AXGBE_PORT_MODE_10GBASE_R:
1720 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000)
1721 			return false;
1722 		break;
1723 	case AXGBE_PORT_MODE_SFP:
1724 		if ((phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) ||
1725 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) ||
1726 		    (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000))
1727 			return false;
1728 		break;
1729 	default:
1730 		break;
1731 	}
1732 
1733 	return true;
1734 }
1735 
1736 static bool axgbe_phy_conn_type_mismatch(struct axgbe_port *pdata)
1737 {
1738 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1739 
1740 	switch (phy_data->port_mode) {
1741 	case AXGBE_PORT_MODE_BACKPLANE:
1742 	case AXGBE_PORT_MODE_BACKPLANE_2500:
1743 		if (phy_data->conn_type == AXGBE_CONN_TYPE_BACKPLANE)
1744 			return false;
1745 		break;
1746 	case AXGBE_PORT_MODE_1000BASE_T:
1747 	case AXGBE_PORT_MODE_1000BASE_X:
1748 	case AXGBE_PORT_MODE_NBASE_T:
1749 	case AXGBE_PORT_MODE_10GBASE_T:
1750 	case AXGBE_PORT_MODE_10GBASE_R:
1751 		if (phy_data->conn_type == AXGBE_CONN_TYPE_MDIO)
1752 			return false;
1753 		break;
1754 	case AXGBE_PORT_MODE_SFP:
1755 		if (phy_data->conn_type == AXGBE_CONN_TYPE_SFP)
1756 			return false;
1757 		break;
1758 	default:
1759 		break;
1760 	}
1761 
1762 	return true;
1763 }
1764 
1765 static bool axgbe_phy_port_enabled(struct axgbe_port *pdata)
1766 {
1767 	unsigned int reg;
1768 
1769 	reg = XP_IOREAD(pdata, XP_PROP_0);
1770 	if (!XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS))
1771 		return false;
1772 	if (!XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE))
1773 		return false;
1774 
1775 	return true;
1776 }
1777 
1778 static void axgbe_phy_cdr_track(struct axgbe_port *pdata)
1779 {
1780 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1781 
1782 	if (!pdata->vdata->an_cdr_workaround)
1783 		return;
1784 
1785 	if (!phy_data->phy_cdr_notrack)
1786 		return;
1787 
1788 	rte_delay_us(phy_data->phy_cdr_delay + 400);
1789 
1790 	XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
1791 			 AXGBE_PMA_CDR_TRACK_EN_MASK,
1792 			 AXGBE_PMA_CDR_TRACK_EN_ON);
1793 
1794 	phy_data->phy_cdr_notrack = 0;
1795 }
1796 
1797 static void axgbe_phy_cdr_notrack(struct axgbe_port *pdata)
1798 {
1799 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1800 
1801 	if (!pdata->vdata->an_cdr_workaround)
1802 		return;
1803 
1804 	if (phy_data->phy_cdr_notrack)
1805 		return;
1806 
1807 	XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
1808 			 AXGBE_PMA_CDR_TRACK_EN_MASK,
1809 			 AXGBE_PMA_CDR_TRACK_EN_OFF);
1810 
1811 	axgbe_phy_rrc(pdata);
1812 
1813 	phy_data->phy_cdr_notrack = 1;
1814 }
1815 
1816 static void axgbe_phy_kr_training_post(struct axgbe_port *pdata)
1817 {
1818 	if (!pdata->cdr_track_early)
1819 		axgbe_phy_cdr_track(pdata);
1820 }
1821 
1822 static void axgbe_phy_kr_training_pre(struct axgbe_port *pdata)
1823 {
1824 	if (pdata->cdr_track_early)
1825 		axgbe_phy_cdr_track(pdata);
1826 }
1827 
1828 static void axgbe_phy_an_post(struct axgbe_port *pdata)
1829 {
1830 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1831 
1832 	switch (pdata->an_mode) {
1833 	case AXGBE_AN_MODE_CL73:
1834 	case AXGBE_AN_MODE_CL73_REDRV:
1835 		if (phy_data->cur_mode != AXGBE_MODE_KR)
1836 			break;
1837 
1838 		axgbe_phy_cdr_track(pdata);
1839 
1840 		switch (pdata->an_result) {
1841 		case AXGBE_AN_READY:
1842 		case AXGBE_AN_COMPLETE:
1843 			break;
1844 		default:
1845 			if (phy_data->phy_cdr_delay < AXGBE_CDR_DELAY_MAX)
1846 				phy_data->phy_cdr_delay += AXGBE_CDR_DELAY_INC;
1847 			break;
1848 		}
1849 		break;
1850 	default:
1851 		break;
1852 	}
1853 }
1854 
1855 static void axgbe_phy_an_pre(struct axgbe_port *pdata)
1856 {
1857 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1858 
1859 	switch (pdata->an_mode) {
1860 	case AXGBE_AN_MODE_CL73:
1861 	case AXGBE_AN_MODE_CL73_REDRV:
1862 		if (phy_data->cur_mode != AXGBE_MODE_KR)
1863 			break;
1864 
1865 		axgbe_phy_cdr_notrack(pdata);
1866 		break;
1867 	default:
1868 		break;
1869 	}
1870 }
1871 
1872 static void axgbe_phy_stop(struct axgbe_port *pdata)
1873 {
1874 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1875 
1876 	/* Reset SFP data */
1877 	axgbe_phy_sfp_reset(phy_data);
1878 	axgbe_phy_sfp_mod_absent(pdata);
1879 
1880 	/* Reset CDR support */
1881 	axgbe_phy_cdr_track(pdata);
1882 
1883 	/* Power off the PHY */
1884 	axgbe_phy_power_off(pdata);
1885 
1886 	/* Stop the I2C controller */
1887 	pdata->i2c_if.i2c_stop(pdata);
1888 }
1889 
1890 static int axgbe_phy_start(struct axgbe_port *pdata)
1891 {
1892 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1893 	int ret;
1894 
1895 	/* Start the I2C controller */
1896 	ret = pdata->i2c_if.i2c_start(pdata);
1897 	if (ret)
1898 		return ret;
1899 
1900 	/* Start in highest supported mode */
1901 	axgbe_phy_set_mode(pdata, phy_data->start_mode);
1902 
1903 	/* Reset CDR support */
1904 	axgbe_phy_cdr_track(pdata);
1905 
1906 	/* After starting the I2C controller, we can check for an SFP */
1907 	switch (phy_data->port_mode) {
1908 	case AXGBE_PORT_MODE_SFP:
1909 		axgbe_phy_sfp_detect(pdata);
1910 		break;
1911 	default:
1912 		break;
1913 	}
1914 
1915 	return ret;
1916 }
1917 
1918 static int axgbe_phy_reset(struct axgbe_port *pdata)
1919 {
1920 	struct axgbe_phy_data *phy_data = pdata->phy_data;
1921 	enum axgbe_mode cur_mode;
1922 
1923 	/* Reset by power cycling the PHY */
1924 	cur_mode = phy_data->cur_mode;
1925 	axgbe_phy_power_off(pdata);
1926 	/* First time reset is done with passed unknown mode*/
1927 	axgbe_phy_set_mode(pdata, cur_mode);
1928 	return 0;
1929 }
1930 
1931 static int axgbe_phy_init(struct axgbe_port *pdata)
1932 {
1933 	struct axgbe_phy_data *phy_data;
1934 	unsigned int reg;
1935 	int ret;
1936 
1937 	/* Check if enabled */
1938 	if (!axgbe_phy_port_enabled(pdata)) {
1939 		PMD_DRV_LOG(ERR, "device is not enabled\n");
1940 		return -ENODEV;
1941 	}
1942 
1943 	/* Initialize the I2C controller */
1944 	ret = pdata->i2c_if.i2c_init(pdata);
1945 	if (ret)
1946 		return ret;
1947 
1948 	phy_data = rte_zmalloc("phy_data memory", sizeof(*phy_data), 0);
1949 	if (!phy_data) {
1950 		PMD_DRV_LOG(ERR, "phy_data allocation failed\n");
1951 		return -ENOMEM;
1952 	}
1953 	pdata->phy_data = phy_data;
1954 
1955 	reg = XP_IOREAD(pdata, XP_PROP_0);
1956 	phy_data->port_mode = XP_GET_BITS(reg, XP_PROP_0, PORT_MODE);
1957 	phy_data->port_id = XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
1958 	phy_data->port_speeds = XP_GET_BITS(reg, XP_PROP_0, PORT_SPEEDS);
1959 	phy_data->conn_type = XP_GET_BITS(reg, XP_PROP_0, CONN_TYPE);
1960 	phy_data->mdio_addr = XP_GET_BITS(reg, XP_PROP_0, MDIO_ADDR);
1961 
1962 	reg = XP_IOREAD(pdata, XP_PROP_4);
1963 	phy_data->redrv = XP_GET_BITS(reg, XP_PROP_4, REDRV_PRESENT);
1964 	phy_data->redrv_if = XP_GET_BITS(reg, XP_PROP_4, REDRV_IF);
1965 	phy_data->redrv_addr = XP_GET_BITS(reg, XP_PROP_4, REDRV_ADDR);
1966 	phy_data->redrv_lane = XP_GET_BITS(reg, XP_PROP_4, REDRV_LANE);
1967 	phy_data->redrv_model = XP_GET_BITS(reg, XP_PROP_4, REDRV_MODEL);
1968 
1969 	/* Validate the connection requested */
1970 	if (axgbe_phy_conn_type_mismatch(pdata)) {
1971 		PMD_DRV_LOG(ERR, "phy mode/connection mismatch (%#x/%#x)\n",
1972 			    phy_data->port_mode, phy_data->conn_type);
1973 		return -EINVAL;
1974 	}
1975 
1976 	/* Validate the mode requested */
1977 	if (axgbe_phy_port_mode_mismatch(pdata)) {
1978 		PMD_DRV_LOG(ERR, "phy mode/speed mismatch (%#x/%#x)\n",
1979 			    phy_data->port_mode, phy_data->port_speeds);
1980 		return -EINVAL;
1981 	}
1982 
1983 	/* Check for and validate MDIO reset support */
1984 	ret = axgbe_phy_mdio_reset_setup(pdata);
1985 	if (ret)
1986 		return ret;
1987 
1988 	/* Validate the re-driver information */
1989 	if (axgbe_phy_redrv_error(phy_data)) {
1990 		PMD_DRV_LOG(ERR, "phy re-driver settings error\n");
1991 		return -EINVAL;
1992 	}
1993 	pdata->kr_redrv = phy_data->redrv;
1994 
1995 	/* Indicate current mode is unknown */
1996 	phy_data->cur_mode = AXGBE_MODE_UNKNOWN;
1997 
1998 	/* Initialize supported features */
1999 	pdata->phy.supported = 0;
2000 
2001 	switch (phy_data->port_mode) {
2002 		/* Backplane support */
2003 	case AXGBE_PORT_MODE_BACKPLANE:
2004 		pdata->phy.supported |= SUPPORTED_Autoneg;
2005 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2006 		pdata->phy.supported |= SUPPORTED_Backplane;
2007 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2008 			pdata->phy.supported |= SUPPORTED_1000baseKX_Full;
2009 			phy_data->start_mode = AXGBE_MODE_KX_1000;
2010 		}
2011 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
2012 			pdata->phy.supported |= SUPPORTED_10000baseKR_Full;
2013 			if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2014 				pdata->phy.supported |=
2015 					SUPPORTED_10000baseR_FEC;
2016 			phy_data->start_mode = AXGBE_MODE_KR;
2017 		}
2018 
2019 		phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
2020 		break;
2021 	case AXGBE_PORT_MODE_BACKPLANE_2500:
2022 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2023 		pdata->phy.supported |= SUPPORTED_Backplane;
2024 		pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2025 		phy_data->start_mode = AXGBE_MODE_KX_2500;
2026 
2027 		phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
2028 		break;
2029 
2030 		/* MDIO 1GBase-T support */
2031 	case AXGBE_PORT_MODE_1000BASE_T:
2032 		pdata->phy.supported |= SUPPORTED_Autoneg;
2033 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2034 		pdata->phy.supported |= SUPPORTED_TP;
2035 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
2036 			pdata->phy.supported |= SUPPORTED_100baseT_Full;
2037 			phy_data->start_mode = AXGBE_MODE_SGMII_100;
2038 		}
2039 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2040 			pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2041 			phy_data->start_mode = AXGBE_MODE_SGMII_1000;
2042 		}
2043 
2044 		phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
2045 		break;
2046 
2047 		/* MDIO Base-X support */
2048 	case AXGBE_PORT_MODE_1000BASE_X:
2049 		pdata->phy.supported |= SUPPORTED_Autoneg;
2050 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2051 		pdata->phy.supported |= SUPPORTED_FIBRE;
2052 		pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2053 		phy_data->start_mode = AXGBE_MODE_X;
2054 
2055 		phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
2056 		break;
2057 
2058 		/* MDIO NBase-T support */
2059 	case AXGBE_PORT_MODE_NBASE_T:
2060 		pdata->phy.supported |= SUPPORTED_Autoneg;
2061 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2062 		pdata->phy.supported |= SUPPORTED_TP;
2063 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
2064 			pdata->phy.supported |= SUPPORTED_100baseT_Full;
2065 			phy_data->start_mode = AXGBE_MODE_SGMII_100;
2066 		}
2067 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2068 			pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2069 			phy_data->start_mode = AXGBE_MODE_SGMII_1000;
2070 		}
2071 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_2500) {
2072 			pdata->phy.supported |= SUPPORTED_2500baseX_Full;
2073 			phy_data->start_mode = AXGBE_MODE_KX_2500;
2074 		}
2075 
2076 		phy_data->phydev_mode = AXGBE_MDIO_MODE_CL45;
2077 		break;
2078 
2079 		/* 10GBase-T support */
2080 	case AXGBE_PORT_MODE_10GBASE_T:
2081 		pdata->phy.supported |= SUPPORTED_Autoneg;
2082 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2083 		pdata->phy.supported |= SUPPORTED_TP;
2084 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
2085 			pdata->phy.supported |= SUPPORTED_100baseT_Full;
2086 			phy_data->start_mode = AXGBE_MODE_SGMII_100;
2087 		}
2088 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2089 			pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2090 			phy_data->start_mode = AXGBE_MODE_SGMII_1000;
2091 		}
2092 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
2093 			pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2094 			phy_data->start_mode = AXGBE_MODE_KR;
2095 		}
2096 
2097 		phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
2098 		break;
2099 
2100 		/* 10GBase-R support */
2101 	case AXGBE_PORT_MODE_10GBASE_R:
2102 		pdata->phy.supported |= SUPPORTED_Autoneg;
2103 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2104 		pdata->phy.supported |= SUPPORTED_TP;
2105 		pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2106 		if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2107 			pdata->phy.supported |= SUPPORTED_10000baseR_FEC;
2108 		phy_data->start_mode = AXGBE_MODE_SFI;
2109 
2110 		phy_data->phydev_mode = AXGBE_MDIO_MODE_NONE;
2111 		break;
2112 
2113 		/* SFP support */
2114 	case AXGBE_PORT_MODE_SFP:
2115 		pdata->phy.supported |= SUPPORTED_Autoneg;
2116 		pdata->phy.supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
2117 		pdata->phy.supported |= SUPPORTED_TP;
2118 		pdata->phy.supported |= SUPPORTED_FIBRE;
2119 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_100) {
2120 			pdata->phy.supported |= SUPPORTED_100baseT_Full;
2121 			phy_data->start_mode = AXGBE_MODE_SGMII_100;
2122 		}
2123 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_1000) {
2124 			pdata->phy.supported |= SUPPORTED_1000baseT_Full;
2125 			phy_data->start_mode = AXGBE_MODE_SGMII_1000;
2126 		}
2127 		if (phy_data->port_speeds & AXGBE_PHY_PORT_SPEED_10000) {
2128 			pdata->phy.supported |= SUPPORTED_10000baseT_Full;
2129 			phy_data->start_mode = AXGBE_MODE_SFI;
2130 			if (pdata->fec_ability & MDIO_PMA_10GBR_FECABLE_ABLE)
2131 				pdata->phy.supported |=
2132 					SUPPORTED_10000baseR_FEC;
2133 		}
2134 
2135 		phy_data->phydev_mode = AXGBE_MDIO_MODE_CL22;
2136 
2137 		axgbe_phy_sfp_setup(pdata);
2138 		break;
2139 	default:
2140 		return -EINVAL;
2141 	}
2142 
2143 	if ((phy_data->conn_type & AXGBE_CONN_TYPE_MDIO) &&
2144 	    (phy_data->phydev_mode != AXGBE_MDIO_MODE_NONE)) {
2145 		ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
2146 						    phy_data->phydev_mode);
2147 		if (ret) {
2148 			PMD_DRV_LOG(ERR, "mdio port/clause not compatible (%d/%u)\n",
2149 				    phy_data->mdio_addr, phy_data->phydev_mode);
2150 			return -EINVAL;
2151 		}
2152 	}
2153 
2154 	if (phy_data->redrv && !phy_data->redrv_if) {
2155 		ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
2156 						    AXGBE_MDIO_MODE_CL22);
2157 		if (ret) {
2158 			PMD_DRV_LOG(ERR, "redriver mdio port not compatible (%u)\n",
2159 				    phy_data->redrv_addr);
2160 			return -EINVAL;
2161 		}
2162 	}
2163 
2164 	phy_data->phy_cdr_delay = AXGBE_CDR_DELAY_INIT;
2165 	return 0;
2166 }
2167 void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if *phy_if)
2168 {
2169 	struct axgbe_phy_impl_if *phy_impl = &phy_if->phy_impl;
2170 
2171 	phy_impl->init			= axgbe_phy_init;
2172 	phy_impl->reset			= axgbe_phy_reset;
2173 	phy_impl->start			= axgbe_phy_start;
2174 	phy_impl->stop			= axgbe_phy_stop;
2175 	phy_impl->link_status		= axgbe_phy_link_status;
2176 	phy_impl->use_mode		= axgbe_phy_use_mode;
2177 	phy_impl->set_mode		= axgbe_phy_set_mode;
2178 	phy_impl->get_mode		= axgbe_phy_get_mode;
2179 	phy_impl->switch_mode		= axgbe_phy_switch_mode;
2180 	phy_impl->cur_mode		= axgbe_phy_cur_mode;
2181 	phy_impl->an_mode		= axgbe_phy_an_mode;
2182 	phy_impl->an_config		= axgbe_phy_an_config;
2183 	phy_impl->an_advertising	= axgbe_phy_an_advertising;
2184 	phy_impl->an_outcome		= axgbe_phy_an_outcome;
2185 
2186 	phy_impl->an_pre		= axgbe_phy_an_pre;
2187 	phy_impl->an_post		= axgbe_phy_an_post;
2188 
2189 	phy_impl->kr_training_pre	= axgbe_phy_kr_training_pre;
2190 	phy_impl->kr_training_post	= axgbe_phy_kr_training_post;
2191 }
2192