xref: /linux/drivers/net/ethernet/sfc/falcon/tenxpress.c (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
1 /****************************************************************************
2  * Driver for Solarflare network controllers and boards
3  * Copyright 2007-2011 Solarflare Communications Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published
7  * by the Free Software Foundation, incorporated herein by reference.
8  */
9 
10 #include <linux/delay.h>
11 #include <linux/rtnetlink.h>
12 #include <linux/seq_file.h>
13 #include <linux/slab.h>
14 #include "efx.h"
15 #include "mdio_10g.h"
16 #include "nic.h"
17 #include "phy.h"
18 #include "workarounds.h"
19 
20 /* We expect these MMDs to be in the package. */
21 #define TENXPRESS_REQUIRED_DEVS (MDIO_DEVS_PMAPMD	| \
22 				 MDIO_DEVS_PCS		| \
23 				 MDIO_DEVS_PHYXS	| \
24 				 MDIO_DEVS_AN)
25 
26 #define SFX7101_LOOPBACKS ((1 << LOOPBACK_PHYXS) |	\
27 			   (1 << LOOPBACK_PCS) |	\
28 			   (1 << LOOPBACK_PMAPMD) |	\
29 			   (1 << LOOPBACK_PHYXS_WS))
30 
31 /* We complain if we fail to see the link partner as 10G capable this many
32  * times in a row (must be > 1 as sampling the autoneg. registers is racy)
33  */
34 #define MAX_BAD_LP_TRIES	(5)
35 
36 /* Extended control register */
37 #define PMA_PMD_XCONTROL_REG	49152
38 #define PMA_PMD_EXT_GMII_EN_LBN	1
39 #define PMA_PMD_EXT_GMII_EN_WIDTH 1
40 #define PMA_PMD_EXT_CLK_OUT_LBN	2
41 #define PMA_PMD_EXT_CLK_OUT_WIDTH 1
42 #define PMA_PMD_LNPGA_POWERDOWN_LBN 8
43 #define PMA_PMD_LNPGA_POWERDOWN_WIDTH 1
44 #define PMA_PMD_EXT_CLK312_WIDTH 1
45 #define PMA_PMD_EXT_LPOWER_LBN  12
46 #define PMA_PMD_EXT_LPOWER_WIDTH 1
47 #define PMA_PMD_EXT_ROBUST_LBN	14
48 #define PMA_PMD_EXT_ROBUST_WIDTH 1
49 #define PMA_PMD_EXT_SSR_LBN	15
50 #define PMA_PMD_EXT_SSR_WIDTH	1
51 
52 /* extended status register */
53 #define PMA_PMD_XSTATUS_REG	49153
54 #define PMA_PMD_XSTAT_MDIX_LBN	14
55 #define PMA_PMD_XSTAT_FLP_LBN   (12)
56 
57 /* LED control register */
58 #define PMA_PMD_LED_CTRL_REG	49159
59 #define PMA_PMA_LED_ACTIVITY_LBN	(3)
60 
61 /* LED function override register */
62 #define PMA_PMD_LED_OVERR_REG	49161
63 /* Bit positions for different LEDs (there are more but not wired on SFE4001)*/
64 #define PMA_PMD_LED_LINK_LBN	(0)
65 #define PMA_PMD_LED_SPEED_LBN	(2)
66 #define PMA_PMD_LED_TX_LBN	(4)
67 #define PMA_PMD_LED_RX_LBN	(6)
68 /* Override settings */
69 #define	PMA_PMD_LED_AUTO	(0)	/* H/W control */
70 #define	PMA_PMD_LED_ON		(1)
71 #define	PMA_PMD_LED_OFF		(2)
72 #define PMA_PMD_LED_FLASH	(3)
73 #define PMA_PMD_LED_MASK	3
74 /* All LEDs under hardware control */
75 /* Green and Amber under hardware control, Red off */
76 #define SFX7101_PMA_PMD_LED_DEFAULT (PMA_PMD_LED_OFF << PMA_PMD_LED_RX_LBN)
77 
78 #define PMA_PMD_SPEED_ENABLE_REG 49192
79 #define PMA_PMD_100TX_ADV_LBN    1
80 #define PMA_PMD_100TX_ADV_WIDTH  1
81 #define PMA_PMD_1000T_ADV_LBN    2
82 #define PMA_PMD_1000T_ADV_WIDTH  1
83 #define PMA_PMD_10000T_ADV_LBN   3
84 #define PMA_PMD_10000T_ADV_WIDTH 1
85 #define PMA_PMD_SPEED_LBN        4
86 #define PMA_PMD_SPEED_WIDTH      4
87 
88 /* Misc register defines */
89 #define PCS_CLOCK_CTRL_REG	55297
90 #define PLL312_RST_N_LBN 2
91 
92 #define PCS_SOFT_RST2_REG	55302
93 #define SERDES_RST_N_LBN 13
94 #define XGXS_RST_N_LBN 12
95 
96 #define	PCS_TEST_SELECT_REG	55303	/* PRM 10.5.8 */
97 #define	CLK312_EN_LBN 3
98 
99 /* PHYXS registers */
100 #define PHYXS_XCONTROL_REG	49152
101 #define PHYXS_RESET_LBN		15
102 #define PHYXS_RESET_WIDTH	1
103 
104 #define PHYXS_TEST1         (49162)
105 #define LOOPBACK_NEAR_LBN   (8)
106 #define LOOPBACK_NEAR_WIDTH (1)
107 
108 /* Boot status register */
109 #define PCS_BOOT_STATUS_REG		53248
110 #define PCS_BOOT_FATAL_ERROR_LBN	0
111 #define PCS_BOOT_PROGRESS_LBN		1
112 #define PCS_BOOT_PROGRESS_WIDTH		2
113 #define PCS_BOOT_PROGRESS_INIT		0
114 #define PCS_BOOT_PROGRESS_WAIT_MDIO	1
115 #define PCS_BOOT_PROGRESS_CHECKSUM	2
116 #define PCS_BOOT_PROGRESS_JUMP		3
117 #define PCS_BOOT_DOWNLOAD_WAIT_LBN	3
118 #define PCS_BOOT_CODE_STARTED_LBN	4
119 
120 /* 100M/1G PHY registers */
121 #define GPHY_XCONTROL_REG	49152
122 #define GPHY_ISOLATE_LBN	10
123 #define GPHY_ISOLATE_WIDTH	1
124 #define GPHY_DUPLEX_LBN		8
125 #define GPHY_DUPLEX_WIDTH	1
126 #define GPHY_LOOPBACK_NEAR_LBN	14
127 #define GPHY_LOOPBACK_NEAR_WIDTH 1
128 
129 #define C22EXT_STATUS_REG       49153
130 #define C22EXT_STATUS_LINK_LBN  2
131 #define C22EXT_STATUS_LINK_WIDTH 1
132 
133 #define C22EXT_MSTSLV_CTRL			49161
134 #define C22EXT_MSTSLV_CTRL_ADV_1000_HD_LBN	8
135 #define C22EXT_MSTSLV_CTRL_ADV_1000_FD_LBN	9
136 
137 #define C22EXT_MSTSLV_STATUS			49162
138 #define C22EXT_MSTSLV_STATUS_LP_1000_HD_LBN	10
139 #define C22EXT_MSTSLV_STATUS_LP_1000_FD_LBN	11
140 
141 /* Time to wait between powering down the LNPGA and turning off the power
142  * rails */
143 #define LNPGA_PDOWN_WAIT	(HZ / 5)
144 
145 struct tenxpress_phy_data {
146 	enum ef4_loopback_mode loopback_mode;
147 	enum ef4_phy_mode phy_mode;
148 	int bad_lp_tries;
149 };
150 
151 static int tenxpress_init(struct ef4_nic *efx)
152 {
153 	/* Enable 312.5 MHz clock */
154 	ef4_mdio_write(efx, MDIO_MMD_PCS, PCS_TEST_SELECT_REG,
155 		       1 << CLK312_EN_LBN);
156 
157 	/* Set the LEDs up as: Green = Link, Amber = Link/Act, Red = Off */
158 	ef4_mdio_set_flag(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_CTRL_REG,
159 			  1 << PMA_PMA_LED_ACTIVITY_LBN, true);
160 	ef4_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_OVERR_REG,
161 		       SFX7101_PMA_PMD_LED_DEFAULT);
162 
163 	return 0;
164 }
165 
166 static int tenxpress_phy_probe(struct ef4_nic *efx)
167 {
168 	struct tenxpress_phy_data *phy_data;
169 
170 	/* Allocate phy private storage */
171 	phy_data = kzalloc(sizeof(*phy_data), GFP_KERNEL);
172 	if (!phy_data)
173 		return -ENOMEM;
174 	efx->phy_data = phy_data;
175 	phy_data->phy_mode = efx->phy_mode;
176 
177 	efx->mdio.mmds = TENXPRESS_REQUIRED_DEVS;
178 	efx->mdio.mode_support = MDIO_SUPPORTS_C45;
179 
180 	efx->loopback_modes = SFX7101_LOOPBACKS | FALCON_XMAC_LOOPBACKS;
181 
182 	efx->link_advertising = (ADVERTISED_TP | ADVERTISED_Autoneg |
183 				 ADVERTISED_10000baseT_Full);
184 
185 	return 0;
186 }
187 
188 static int tenxpress_phy_init(struct ef4_nic *efx)
189 {
190 	int rc;
191 
192 	falcon_board(efx)->type->init_phy(efx);
193 
194 	if (!(efx->phy_mode & PHY_MODE_SPECIAL)) {
195 		rc = ef4_mdio_wait_reset_mmds(efx, TENXPRESS_REQUIRED_DEVS);
196 		if (rc < 0)
197 			return rc;
198 
199 		rc = ef4_mdio_check_mmds(efx, TENXPRESS_REQUIRED_DEVS);
200 		if (rc < 0)
201 			return rc;
202 	}
203 
204 	rc = tenxpress_init(efx);
205 	if (rc < 0)
206 		return rc;
207 
208 	/* Reinitialise flow control settings */
209 	ef4_link_set_wanted_fc(efx, efx->wanted_fc);
210 	ef4_mdio_an_reconfigure(efx);
211 
212 	schedule_timeout_uninterruptible(HZ / 5); /* 200ms */
213 
214 	/* Let XGXS and SerDes out of reset */
215 	falcon_reset_xaui(efx);
216 
217 	return 0;
218 }
219 
220 /* Perform a "special software reset" on the PHY. The caller is
221  * responsible for saving and restoring the PHY hardware registers
222  * properly, and masking/unmasking LASI */
223 static int tenxpress_special_reset(struct ef4_nic *efx)
224 {
225 	int rc, reg;
226 
227 	/* The XGMAC clock is driven from the SFX7101 312MHz clock, so
228 	 * a special software reset can glitch the XGMAC sufficiently for stats
229 	 * requests to fail. */
230 	falcon_stop_nic_stats(efx);
231 
232 	/* Initiate reset */
233 	reg = ef4_mdio_read(efx, MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG);
234 	reg |= (1 << PMA_PMD_EXT_SSR_LBN);
235 	ef4_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG, reg);
236 
237 	mdelay(200);
238 
239 	/* Wait for the blocks to come out of reset */
240 	rc = ef4_mdio_wait_reset_mmds(efx, TENXPRESS_REQUIRED_DEVS);
241 	if (rc < 0)
242 		goto out;
243 
244 	/* Try and reconfigure the device */
245 	rc = tenxpress_init(efx);
246 	if (rc < 0)
247 		goto out;
248 
249 	/* Wait for the XGXS state machine to churn */
250 	mdelay(10);
251 out:
252 	falcon_start_nic_stats(efx);
253 	return rc;
254 }
255 
256 static void sfx7101_check_bad_lp(struct ef4_nic *efx, bool link_ok)
257 {
258 	struct tenxpress_phy_data *pd = efx->phy_data;
259 	bool bad_lp;
260 	int reg;
261 
262 	if (link_ok) {
263 		bad_lp = false;
264 	} else {
265 		/* Check that AN has started but not completed. */
266 		reg = ef4_mdio_read(efx, MDIO_MMD_AN, MDIO_STAT1);
267 		if (!(reg & MDIO_AN_STAT1_LPABLE))
268 			return; /* LP status is unknown */
269 		bad_lp = !(reg & MDIO_AN_STAT1_COMPLETE);
270 		if (bad_lp)
271 			pd->bad_lp_tries++;
272 	}
273 
274 	/* Nothing to do if all is well and was previously so. */
275 	if (!pd->bad_lp_tries)
276 		return;
277 
278 	/* Use the RX (red) LED as an error indicator once we've seen AN
279 	 * failure several times in a row, and also log a message. */
280 	if (!bad_lp || pd->bad_lp_tries == MAX_BAD_LP_TRIES) {
281 		reg = ef4_mdio_read(efx, MDIO_MMD_PMAPMD,
282 				    PMA_PMD_LED_OVERR_REG);
283 		reg &= ~(PMA_PMD_LED_MASK << PMA_PMD_LED_RX_LBN);
284 		if (!bad_lp) {
285 			reg |= PMA_PMD_LED_OFF << PMA_PMD_LED_RX_LBN;
286 		} else {
287 			reg |= PMA_PMD_LED_FLASH << PMA_PMD_LED_RX_LBN;
288 			netif_err(efx, link, efx->net_dev,
289 				  "appears to be plugged into a port"
290 				  " that is not 10GBASE-T capable. The PHY"
291 				  " supports 10GBASE-T ONLY, so no link can"
292 				  " be established\n");
293 		}
294 		ef4_mdio_write(efx, MDIO_MMD_PMAPMD,
295 			       PMA_PMD_LED_OVERR_REG, reg);
296 		pd->bad_lp_tries = bad_lp;
297 	}
298 }
299 
300 static bool sfx7101_link_ok(struct ef4_nic *efx)
301 {
302 	return ef4_mdio_links_ok(efx,
303 				 MDIO_DEVS_PMAPMD |
304 				 MDIO_DEVS_PCS |
305 				 MDIO_DEVS_PHYXS);
306 }
307 
308 static void tenxpress_ext_loopback(struct ef4_nic *efx)
309 {
310 	ef4_mdio_set_flag(efx, MDIO_MMD_PHYXS, PHYXS_TEST1,
311 			  1 << LOOPBACK_NEAR_LBN,
312 			  efx->loopback_mode == LOOPBACK_PHYXS);
313 }
314 
315 static void tenxpress_low_power(struct ef4_nic *efx)
316 {
317 	ef4_mdio_set_mmds_lpower(
318 		efx, !!(efx->phy_mode & PHY_MODE_LOW_POWER),
319 		TENXPRESS_REQUIRED_DEVS);
320 }
321 
322 static int tenxpress_phy_reconfigure(struct ef4_nic *efx)
323 {
324 	struct tenxpress_phy_data *phy_data = efx->phy_data;
325 	bool phy_mode_change, loop_reset;
326 
327 	if (efx->phy_mode & (PHY_MODE_OFF | PHY_MODE_SPECIAL)) {
328 		phy_data->phy_mode = efx->phy_mode;
329 		return 0;
330 	}
331 
332 	phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
333 			   phy_data->phy_mode != PHY_MODE_NORMAL);
334 	loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, LOOPBACKS_EXTERNAL(efx)) ||
335 		      LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));
336 
337 	if (loop_reset || phy_mode_change) {
338 		tenxpress_special_reset(efx);
339 		falcon_reset_xaui(efx);
340 	}
341 
342 	tenxpress_low_power(efx);
343 	ef4_mdio_transmit_disable(efx);
344 	ef4_mdio_phy_reconfigure(efx);
345 	tenxpress_ext_loopback(efx);
346 	ef4_mdio_an_reconfigure(efx);
347 
348 	phy_data->loopback_mode = efx->loopback_mode;
349 	phy_data->phy_mode = efx->phy_mode;
350 
351 	return 0;
352 }
353 
354 /* Poll for link state changes */
355 static bool tenxpress_phy_poll(struct ef4_nic *efx)
356 {
357 	struct ef4_link_state old_state = efx->link_state;
358 
359 	efx->link_state.up = sfx7101_link_ok(efx);
360 	efx->link_state.speed = 10000;
361 	efx->link_state.fd = true;
362 	efx->link_state.fc = ef4_mdio_get_pause(efx);
363 
364 	sfx7101_check_bad_lp(efx, efx->link_state.up);
365 
366 	return !ef4_link_state_equal(&efx->link_state, &old_state);
367 }
368 
369 static void sfx7101_phy_fini(struct ef4_nic *efx)
370 {
371 	int reg;
372 
373 	/* Power down the LNPGA */
374 	reg = (1 << PMA_PMD_LNPGA_POWERDOWN_LBN);
375 	ef4_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG, reg);
376 
377 	/* Waiting here ensures that the board fini, which can turn
378 	 * off the power to the PHY, won't get run until the LNPGA
379 	 * powerdown has been given long enough to complete. */
380 	schedule_timeout_uninterruptible(LNPGA_PDOWN_WAIT); /* 200 ms */
381 }
382 
383 static void tenxpress_phy_remove(struct ef4_nic *efx)
384 {
385 	kfree(efx->phy_data);
386 	efx->phy_data = NULL;
387 }
388 
389 
390 /* Override the RX, TX and link LEDs */
391 void tenxpress_set_id_led(struct ef4_nic *efx, enum ef4_led_mode mode)
392 {
393 	int reg;
394 
395 	switch (mode) {
396 	case EF4_LED_OFF:
397 		reg = (PMA_PMD_LED_OFF << PMA_PMD_LED_TX_LBN) |
398 			(PMA_PMD_LED_OFF << PMA_PMD_LED_RX_LBN) |
399 			(PMA_PMD_LED_OFF << PMA_PMD_LED_LINK_LBN);
400 		break;
401 	case EF4_LED_ON:
402 		reg = (PMA_PMD_LED_ON << PMA_PMD_LED_TX_LBN) |
403 			(PMA_PMD_LED_ON << PMA_PMD_LED_RX_LBN) |
404 			(PMA_PMD_LED_ON << PMA_PMD_LED_LINK_LBN);
405 		break;
406 	default:
407 		reg = SFX7101_PMA_PMD_LED_DEFAULT;
408 		break;
409 	}
410 
411 	ef4_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_OVERR_REG, reg);
412 }
413 
414 static const char *const sfx7101_test_names[] = {
415 	"bist"
416 };
417 
418 static const char *sfx7101_test_name(struct ef4_nic *efx, unsigned int index)
419 {
420 	if (index < ARRAY_SIZE(sfx7101_test_names))
421 		return sfx7101_test_names[index];
422 	return NULL;
423 }
424 
425 static int
426 sfx7101_run_tests(struct ef4_nic *efx, int *results, unsigned flags)
427 {
428 	int rc;
429 
430 	if (!(flags & ETH_TEST_FL_OFFLINE))
431 		return 0;
432 
433 	/* BIST is automatically run after a special software reset */
434 	rc = tenxpress_special_reset(efx);
435 	results[0] = rc ? -1 : 1;
436 
437 	ef4_mdio_an_reconfigure(efx);
438 
439 	return rc;
440 }
441 
442 static void
443 tenxpress_get_link_ksettings(struct ef4_nic *efx,
444 			     struct ethtool_link_ksettings *cmd)
445 {
446 	u32 adv = 0, lpa = 0;
447 	int reg;
448 
449 	reg = ef4_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL);
450 	if (reg & MDIO_AN_10GBT_CTRL_ADV10G)
451 		adv |= ADVERTISED_10000baseT_Full;
452 	reg = ef4_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
453 	if (reg & MDIO_AN_10GBT_STAT_LP10G)
454 		lpa |= ADVERTISED_10000baseT_Full;
455 
456 	mdio45_ethtool_ksettings_get_npage(&efx->mdio, cmd, adv, lpa);
457 
458 	/* In loopback, the PHY automatically brings up the correct interface,
459 	 * but doesn't advertise the correct speed. So override it */
460 	if (LOOPBACK_EXTERNAL(efx))
461 		cmd->base.speed = SPEED_10000;
462 }
463 
464 static int
465 tenxpress_set_link_ksettings(struct ef4_nic *efx,
466 			     const struct ethtool_link_ksettings *cmd)
467 {
468 	if (!cmd->base.autoneg)
469 		return -EINVAL;
470 
471 	return ef4_mdio_set_link_ksettings(efx, cmd);
472 }
473 
474 static void sfx7101_set_npage_adv(struct ef4_nic *efx, u32 advertising)
475 {
476 	ef4_mdio_set_flag(efx, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
477 			  MDIO_AN_10GBT_CTRL_ADV10G,
478 			  advertising & ADVERTISED_10000baseT_Full);
479 }
480 
481 const struct ef4_phy_operations falcon_sfx7101_phy_ops = {
482 	.probe		  = tenxpress_phy_probe,
483 	.init             = tenxpress_phy_init,
484 	.reconfigure      = tenxpress_phy_reconfigure,
485 	.poll             = tenxpress_phy_poll,
486 	.fini             = sfx7101_phy_fini,
487 	.remove		  = tenxpress_phy_remove,
488 	.get_link_ksettings = tenxpress_get_link_ksettings,
489 	.set_link_ksettings = tenxpress_set_link_ksettings,
490 	.set_npage_adv    = sfx7101_set_npage_adv,
491 	.test_alive	  = ef4_mdio_test_alive,
492 	.test_name	  = sfx7101_test_name,
493 	.run_tests	  = sfx7101_run_tests,
494 };
495