Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tenxpress.c
Go to the documentation of this file.
1 /****************************************************************************
2  * Driver for Solarflare Solarstorm 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 
149 };
150 
151 static int tenxpress_init(struct efx_nic *efx)
152 {
153  /* Enable 312.5 MHz clock */
154  efx_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  efx_mdio_set_flag(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_CTRL_REG,
159  1 << PMA_PMA_LED_ACTIVITY_LBN, true);
160  efx_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_OVERR_REG,
162 
163  return 0;
164 }
165 
166 static int tenxpress_phy_probe(struct efx_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 
181 
184 
185  return 0;
186 }
187 
188 static int tenxpress_phy_init(struct efx_nic *efx)
189 {
190  int rc;
191 
192  falcon_board(efx)->type->init_phy(efx);
193 
194  if (!(efx->phy_mode & PHY_MODE_SPECIAL)) {
196  if (rc < 0)
197  return rc;
198 
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 */
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 efx_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. */
231 
232  /* Initiate reset */
233  reg = efx_mdio_read(efx, MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG);
234  reg |= (1 << PMA_PMD_EXT_SSR_LBN);
235  efx_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 */
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:
253  return rc;
254 }
255 
256 static void sfx7101_check_bad_lp(struct efx_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 = efx_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 = efx_mdio_read(efx, MDIO_MMD_PMAPMD,
284  if (!bad_lp) {
286  } else {
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  efx_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 efx_nic *efx)
301 {
302  return efx_mdio_links_ok(efx,
304  MDIO_DEVS_PCS |
306 }
307 
308 static void tenxpress_ext_loopback(struct efx_nic *efx)
309 {
310  efx_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 efx_nic *efx)
316 {
318  efx, !!(efx->phy_mode & PHY_MODE_LOW_POWER),
320 }
321 
322 static int tenxpress_phy_reconfigure(struct efx_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);
345  tenxpress_ext_loopback(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 static void
355 tenxpress_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd);
356 
357 /* Poll for link state changes */
358 static bool tenxpress_phy_poll(struct efx_nic *efx)
359 {
360  struct efx_link_state old_state = efx->link_state;
361 
362  efx->link_state.up = sfx7101_link_ok(efx);
363  efx->link_state.speed = 10000;
364  efx->link_state.fd = true;
365  efx->link_state.fc = efx_mdio_get_pause(efx);
366 
367  sfx7101_check_bad_lp(efx, efx->link_state.up);
368 
369  return !efx_link_state_equal(&efx->link_state, &old_state);
370 }
371 
372 static void sfx7101_phy_fini(struct efx_nic *efx)
373 {
374  int reg;
375 
376  /* Power down the LNPGA */
377  reg = (1 << PMA_PMD_LNPGA_POWERDOWN_LBN);
378  efx_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG, reg);
379 
380  /* Waiting here ensures that the board fini, which can turn
381  * off the power to the PHY, won't get run until the LNPGA
382  * powerdown has been given long enough to complete. */
384 }
385 
386 static void tenxpress_phy_remove(struct efx_nic *efx)
387 {
388  kfree(efx->phy_data);
389  efx->phy_data = NULL;
390 }
391 
392 
393 /* Override the RX, TX and link LEDs */
395 {
396  int reg;
397 
398  switch (mode) {
399  case EFX_LED_OFF:
403  break;
404  case EFX_LED_ON:
408  break;
409  default:
411  break;
412  }
413 
414  efx_mdio_write(efx, MDIO_MMD_PMAPMD, PMA_PMD_LED_OVERR_REG, reg);
415 }
416 
417 static const char *const sfx7101_test_names[] = {
418  "bist"
419 };
420 
421 static const char *sfx7101_test_name(struct efx_nic *efx, unsigned int index)
422 {
423  if (index < ARRAY_SIZE(sfx7101_test_names))
424  return sfx7101_test_names[index];
425  return NULL;
426 }
427 
428 static int
429 sfx7101_run_tests(struct efx_nic *efx, int *results, unsigned flags)
430 {
431  int rc;
432 
433  if (!(flags & ETH_TEST_FL_OFFLINE))
434  return 0;
435 
436  /* BIST is automatically run after a special software reset */
437  rc = tenxpress_special_reset(efx);
438  results[0] = rc ? -1 : 1;
439 
441 
442  return rc;
443 }
444 
445 static void
446 tenxpress_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
447 {
448  u32 adv = 0, lpa = 0;
449  int reg;
450 
451  reg = efx_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL);
452  if (reg & MDIO_AN_10GBT_CTRL_ADV10G)
454  reg = efx_mdio_read(efx, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
455  if (reg & MDIO_AN_10GBT_STAT_LP10G)
457 
458  mdio45_ethtool_gset_npage(&efx->mdio, ecmd, adv, lpa);
459 
460  /* In loopback, the PHY automatically brings up the correct interface,
461  * but doesn't advertise the correct speed. So override it */
462  if (LOOPBACK_EXTERNAL(efx))
463  ethtool_cmd_speed_set(ecmd, SPEED_10000);
464 }
465 
466 static int tenxpress_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
467 {
468  if (!ecmd->autoneg)
469  return -EINVAL;
470 
471  return efx_mdio_set_settings(efx, ecmd);
472 }
473 
474 static void sfx7101_set_npage_adv(struct efx_nic *efx, u32 advertising)
475 {
476  efx_mdio_set_flag(efx, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
477  MDIO_AN_10GBT_CTRL_ADV10G,
478  advertising & ADVERTISED_10000baseT_Full);
479 }
480 
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_settings = tenxpress_get_settings,
489  .set_settings = tenxpress_set_settings,
490  .set_npage_adv = sfx7101_set_npage_adv,
491  .test_alive = efx_mdio_test_alive,
492  .test_name = sfx7101_test_name,
493  .run_tests = sfx7101_run_tests,
494 };