tenxpress.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. /****************************************************************************
  2. * Driver for Solarflare Solarstorm network controllers and boards
  3. * Copyright 2007-2008 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. #include <linux/delay.h>
  10. #include <linux/rtnetlink.h>
  11. #include <linux/seq_file.h>
  12. #include "efx.h"
  13. #include "mdio_10g.h"
  14. #include "falcon.h"
  15. #include "phy.h"
  16. #include "falcon_hwdefs.h"
  17. #include "boards.h"
  18. #include "workarounds.h"
  19. #include "selftest.h"
  20. /* We expect these MMDs to be in the package. SFT9001 also has a
  21. * clause 22 extension MMD, but since it doesn't have all the generic
  22. * MMD registers it is pointless to include it here.
  23. */
  24. #define TENXPRESS_REQUIRED_DEVS (MDIO_MMDREG_DEVS_PMAPMD | \
  25. MDIO_MMDREG_DEVS_PCS | \
  26. MDIO_MMDREG_DEVS_PHYXS | \
  27. MDIO_MMDREG_DEVS_AN)
  28. #define SFX7101_LOOPBACKS ((1 << LOOPBACK_PHYXS) | \
  29. (1 << LOOPBACK_PCS) | \
  30. (1 << LOOPBACK_PMAPMD) | \
  31. (1 << LOOPBACK_NETWORK))
  32. #define SFT9001_LOOPBACKS ((1 << LOOPBACK_GPHY) | \
  33. (1 << LOOPBACK_PHYXS) | \
  34. (1 << LOOPBACK_PCS) | \
  35. (1 << LOOPBACK_PMAPMD) | \
  36. (1 << LOOPBACK_NETWORK))
  37. /* We complain if we fail to see the link partner as 10G capable this many
  38. * times in a row (must be > 1 as sampling the autoneg. registers is racy)
  39. */
  40. #define MAX_BAD_LP_TRIES (5)
  41. /* LASI Control */
  42. #define PMA_PMD_LASI_CTRL 36866
  43. #define PMA_PMD_LASI_STATUS 36869
  44. #define PMA_PMD_LS_ALARM_LBN 0
  45. #define PMA_PMD_LS_ALARM_WIDTH 1
  46. #define PMA_PMD_TX_ALARM_LBN 1
  47. #define PMA_PMD_TX_ALARM_WIDTH 1
  48. #define PMA_PMD_RX_ALARM_LBN 2
  49. #define PMA_PMD_RX_ALARM_WIDTH 1
  50. #define PMA_PMD_AN_ALARM_LBN 3
  51. #define PMA_PMD_AN_ALARM_WIDTH 1
  52. /* Extended control register */
  53. #define PMA_PMD_XCONTROL_REG 49152
  54. #define PMA_PMD_EXT_GMII_EN_LBN 1
  55. #define PMA_PMD_EXT_GMII_EN_WIDTH 1
  56. #define PMA_PMD_EXT_CLK_OUT_LBN 2
  57. #define PMA_PMD_EXT_CLK_OUT_WIDTH 1
  58. #define PMA_PMD_LNPGA_POWERDOWN_LBN 8 /* SFX7101 only */
  59. #define PMA_PMD_LNPGA_POWERDOWN_WIDTH 1
  60. #define PMA_PMD_EXT_CLK312_LBN 8 /* SFT9001 only */
  61. #define PMA_PMD_EXT_CLK312_WIDTH 1
  62. #define PMA_PMD_EXT_LPOWER_LBN 12
  63. #define PMA_PMD_EXT_LPOWER_WIDTH 1
  64. #define PMA_PMD_EXT_SSR_LBN 15
  65. #define PMA_PMD_EXT_SSR_WIDTH 1
  66. /* extended status register */
  67. #define PMA_PMD_XSTATUS_REG 49153
  68. #define PMA_PMD_XSTAT_FLP_LBN (12)
  69. /* LED control register */
  70. #define PMA_PMD_LED_CTRL_REG 49159
  71. #define PMA_PMA_LED_ACTIVITY_LBN (3)
  72. /* LED function override register */
  73. #define PMA_PMD_LED_OVERR_REG 49161
  74. /* Bit positions for different LEDs (there are more but not wired on SFE4001)*/
  75. #define PMA_PMD_LED_LINK_LBN (0)
  76. #define PMA_PMD_LED_SPEED_LBN (2)
  77. #define PMA_PMD_LED_TX_LBN (4)
  78. #define PMA_PMD_LED_RX_LBN (6)
  79. /* Override settings */
  80. #define PMA_PMD_LED_AUTO (0) /* H/W control */
  81. #define PMA_PMD_LED_ON (1)
  82. #define PMA_PMD_LED_OFF (2)
  83. #define PMA_PMD_LED_FLASH (3)
  84. #define PMA_PMD_LED_MASK 3
  85. /* All LEDs under hardware control */
  86. #define PMA_PMD_LED_FULL_AUTO (0)
  87. /* Green and Amber under hardware control, Red off */
  88. #define PMA_PMD_LED_DEFAULT (PMA_PMD_LED_OFF << PMA_PMD_LED_RX_LBN)
  89. #define PMA_PMD_SPEED_ENABLE_REG 49192
  90. #define PMA_PMD_100TX_ADV_LBN 1
  91. #define PMA_PMD_100TX_ADV_WIDTH 1
  92. #define PMA_PMD_1000T_ADV_LBN 2
  93. #define PMA_PMD_1000T_ADV_WIDTH 1
  94. #define PMA_PMD_10000T_ADV_LBN 3
  95. #define PMA_PMD_10000T_ADV_WIDTH 1
  96. #define PMA_PMD_SPEED_LBN 4
  97. #define PMA_PMD_SPEED_WIDTH 4
  98. /* Cable diagnostics - SFT9001 only */
  99. #define PMA_PMD_CDIAG_CTRL_REG 49213
  100. #define CDIAG_CTRL_IMMED_LBN 15
  101. #define CDIAG_CTRL_BRK_LINK_LBN 12
  102. #define CDIAG_CTRL_IN_PROG_LBN 11
  103. #define CDIAG_CTRL_LEN_UNIT_LBN 10
  104. #define CDIAG_CTRL_LEN_METRES 1
  105. #define PMA_PMD_CDIAG_RES_REG 49174
  106. #define CDIAG_RES_A_LBN 12
  107. #define CDIAG_RES_B_LBN 8
  108. #define CDIAG_RES_C_LBN 4
  109. #define CDIAG_RES_D_LBN 0
  110. #define CDIAG_RES_WIDTH 4
  111. #define CDIAG_RES_OPEN 2
  112. #define CDIAG_RES_OK 1
  113. #define CDIAG_RES_INVALID 0
  114. /* Set of 4 registers for pairs A-D */
  115. #define PMA_PMD_CDIAG_LEN_REG 49175
  116. /* Serdes control registers - SFT9001 only */
  117. #define PMA_PMD_CSERDES_CTRL_REG 64258
  118. /* Set the 156.25 MHz output to 312.5 MHz to drive Falcon's XMAC */
  119. #define PMA_PMD_CSERDES_DEFAULT 0x000f
  120. /* Misc register defines - SFX7101 only */
  121. #define PCS_CLOCK_CTRL_REG 55297
  122. #define PLL312_RST_N_LBN 2
  123. #define PCS_SOFT_RST2_REG 55302
  124. #define SERDES_RST_N_LBN 13
  125. #define XGXS_RST_N_LBN 12
  126. #define PCS_TEST_SELECT_REG 55303 /* PRM 10.5.8 */
  127. #define CLK312_EN_LBN 3
  128. /* PHYXS registers */
  129. #define PHYXS_XCONTROL_REG 49152
  130. #define PHYXS_RESET_LBN 15
  131. #define PHYXS_RESET_WIDTH 1
  132. #define PHYXS_TEST1 (49162)
  133. #define LOOPBACK_NEAR_LBN (8)
  134. #define LOOPBACK_NEAR_WIDTH (1)
  135. #define PCS_10GBASET_STAT1 32
  136. #define PCS_10GBASET_BLKLK_LBN 0
  137. #define PCS_10GBASET_BLKLK_WIDTH 1
  138. /* Boot status register */
  139. #define PCS_BOOT_STATUS_REG 53248
  140. #define PCS_BOOT_FATAL_ERR_LBN (0)
  141. #define PCS_BOOT_PROGRESS_LBN (1)
  142. #define PCS_BOOT_PROGRESS_WIDTH (2)
  143. #define PCS_BOOT_COMPLETE_LBN (3)
  144. #define PCS_BOOT_MAX_DELAY (100)
  145. #define PCS_BOOT_POLL_DELAY (10)
  146. /* 100M/1G PHY registers */
  147. #define GPHY_XCONTROL_REG 49152
  148. #define GPHY_ISOLATE_LBN 10
  149. #define GPHY_ISOLATE_WIDTH 1
  150. #define GPHY_DUPLEX_LBN 8
  151. #define GPHY_DUPLEX_WIDTH 1
  152. #define GPHY_LOOPBACK_NEAR_LBN 14
  153. #define GPHY_LOOPBACK_NEAR_WIDTH 1
  154. #define C22EXT_STATUS_REG 49153
  155. #define C22EXT_STATUS_LINK_LBN 2
  156. #define C22EXT_STATUS_LINK_WIDTH 1
  157. #define C22EXT_MSTSLV_REG 49162
  158. #define C22EXT_MSTSLV_1000_HD_LBN 10
  159. #define C22EXT_MSTSLV_1000_HD_WIDTH 1
  160. #define C22EXT_MSTSLV_1000_FD_LBN 11
  161. #define C22EXT_MSTSLV_1000_FD_WIDTH 1
  162. /* Time to wait between powering down the LNPGA and turning off the power
  163. * rails */
  164. #define LNPGA_PDOWN_WAIT (HZ / 5)
  165. static int crc_error_reset_threshold = 100;
  166. module_param(crc_error_reset_threshold, int, 0644);
  167. MODULE_PARM_DESC(crc_error_reset_threshold,
  168. "Max number of CRC errors before XAUI reset");
  169. struct tenxpress_phy_data {
  170. enum efx_loopback_mode loopback_mode;
  171. atomic_t bad_crc_count;
  172. enum efx_phy_mode phy_mode;
  173. int bad_lp_tries;
  174. };
  175. void tenxpress_crc_err(struct efx_nic *efx)
  176. {
  177. struct tenxpress_phy_data *phy_data = efx->phy_data;
  178. if (phy_data != NULL)
  179. atomic_inc(&phy_data->bad_crc_count);
  180. }
  181. static ssize_t show_phy_short_reach(struct device *dev,
  182. struct device_attribute *attr, char *buf)
  183. {
  184. struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev));
  185. int reg;
  186. reg = mdio_clause45_read(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  187. MDIO_PMAPMD_10GBT_TXPWR);
  188. return sprintf(buf, "%d\n",
  189. !!(reg & (1 << MDIO_PMAPMD_10GBT_TXPWR_SHORT_LBN)));
  190. }
  191. static ssize_t set_phy_short_reach(struct device *dev,
  192. struct device_attribute *attr,
  193. const char *buf, size_t count)
  194. {
  195. struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev));
  196. rtnl_lock();
  197. mdio_clause45_set_flag(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  198. MDIO_PMAPMD_10GBT_TXPWR,
  199. MDIO_PMAPMD_10GBT_TXPWR_SHORT_LBN,
  200. count != 0 && *buf != '0');
  201. efx_reconfigure_port(efx);
  202. rtnl_unlock();
  203. return count;
  204. }
  205. static DEVICE_ATTR(phy_short_reach, 0644, show_phy_short_reach,
  206. set_phy_short_reach);
  207. /* Check that the C166 has booted successfully */
  208. static int tenxpress_phy_check(struct efx_nic *efx)
  209. {
  210. int phy_id = efx->mii.phy_id;
  211. int count = PCS_BOOT_MAX_DELAY / PCS_BOOT_POLL_DELAY;
  212. int boot_stat;
  213. /* Wait for the boot to complete (or not) */
  214. while (count) {
  215. boot_stat = mdio_clause45_read(efx, phy_id,
  216. MDIO_MMD_PCS,
  217. PCS_BOOT_STATUS_REG);
  218. if (boot_stat & (1 << PCS_BOOT_COMPLETE_LBN))
  219. break;
  220. count--;
  221. udelay(PCS_BOOT_POLL_DELAY);
  222. }
  223. if (!count) {
  224. EFX_ERR(efx, "%s: PHY boot timed out. Last status "
  225. "%x\n", __func__,
  226. (boot_stat >> PCS_BOOT_PROGRESS_LBN) &
  227. ((1 << PCS_BOOT_PROGRESS_WIDTH) - 1));
  228. return -ETIMEDOUT;
  229. }
  230. return 0;
  231. }
  232. static int tenxpress_init(struct efx_nic *efx)
  233. {
  234. int phy_id = efx->mii.phy_id;
  235. int reg;
  236. int rc;
  237. if (efx->phy_type == PHY_TYPE_SFX7101) {
  238. /* Enable 312.5 MHz clock */
  239. mdio_clause45_write(efx, phy_id,
  240. MDIO_MMD_PCS, PCS_TEST_SELECT_REG,
  241. 1 << CLK312_EN_LBN);
  242. } else {
  243. /* Enable 312.5 MHz clock and GMII */
  244. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
  245. PMA_PMD_XCONTROL_REG);
  246. reg |= ((1 << PMA_PMD_EXT_GMII_EN_LBN) |
  247. (1 << PMA_PMD_EXT_CLK_OUT_LBN) |
  248. (1 << PMA_PMD_EXT_CLK312_LBN));
  249. mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
  250. PMA_PMD_XCONTROL_REG, reg);
  251. mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
  252. GPHY_XCONTROL_REG, GPHY_ISOLATE_LBN,
  253. false);
  254. }
  255. rc = tenxpress_phy_check(efx);
  256. if (rc < 0)
  257. return rc;
  258. /* Set the LEDs up as: Green = Link, Amber = Link/Act, Red = Off */
  259. if (efx->phy_type == PHY_TYPE_SFX7101) {
  260. mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_PMAPMD,
  261. PMA_PMD_LED_CTRL_REG,
  262. PMA_PMA_LED_ACTIVITY_LBN,
  263. true);
  264. mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
  265. PMA_PMD_LED_OVERR_REG, PMA_PMD_LED_DEFAULT);
  266. }
  267. return rc;
  268. }
  269. static int tenxpress_phy_init(struct efx_nic *efx)
  270. {
  271. struct tenxpress_phy_data *phy_data;
  272. int rc = 0;
  273. phy_data = kzalloc(sizeof(*phy_data), GFP_KERNEL);
  274. if (!phy_data)
  275. return -ENOMEM;
  276. efx->phy_data = phy_data;
  277. phy_data->phy_mode = efx->phy_mode;
  278. if (!(efx->phy_mode & PHY_MODE_SPECIAL)) {
  279. if (efx->phy_type == PHY_TYPE_SFT9001A) {
  280. int reg;
  281. reg = mdio_clause45_read(efx, efx->mii.phy_id,
  282. MDIO_MMD_PMAPMD,
  283. PMA_PMD_XCONTROL_REG);
  284. reg |= (1 << PMA_PMD_EXT_SSR_LBN);
  285. mdio_clause45_write(efx, efx->mii.phy_id,
  286. MDIO_MMD_PMAPMD,
  287. PMA_PMD_XCONTROL_REG, reg);
  288. mdelay(200);
  289. }
  290. rc = mdio_clause45_wait_reset_mmds(efx,
  291. TENXPRESS_REQUIRED_DEVS);
  292. if (rc < 0)
  293. goto fail;
  294. rc = mdio_clause45_check_mmds(efx, TENXPRESS_REQUIRED_DEVS, 0);
  295. if (rc < 0)
  296. goto fail;
  297. }
  298. rc = tenxpress_init(efx);
  299. if (rc < 0)
  300. goto fail;
  301. if (efx->phy_type == PHY_TYPE_SFT9001B) {
  302. rc = device_create_file(&efx->pci_dev->dev,
  303. &dev_attr_phy_short_reach);
  304. if (rc)
  305. goto fail;
  306. }
  307. schedule_timeout_uninterruptible(HZ / 5); /* 200ms */
  308. /* Let XGXS and SerDes out of reset */
  309. falcon_reset_xaui(efx);
  310. return 0;
  311. fail:
  312. kfree(efx->phy_data);
  313. efx->phy_data = NULL;
  314. return rc;
  315. }
  316. /* Perform a "special software reset" on the PHY. The caller is
  317. * responsible for saving and restoring the PHY hardware registers
  318. * properly, and masking/unmasking LASI */
  319. static int tenxpress_special_reset(struct efx_nic *efx)
  320. {
  321. int rc, reg;
  322. /* The XGMAC clock is driven from the SFC7101/SFT9001 312MHz clock, so
  323. * a special software reset can glitch the XGMAC sufficiently for stats
  324. * requests to fail. Since we don't often special_reset, just lock. */
  325. spin_lock(&efx->stats_lock);
  326. /* Initiate reset */
  327. reg = mdio_clause45_read(efx, efx->mii.phy_id,
  328. MDIO_MMD_PMAPMD, PMA_PMD_XCONTROL_REG);
  329. reg |= (1 << PMA_PMD_EXT_SSR_LBN);
  330. mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  331. PMA_PMD_XCONTROL_REG, reg);
  332. mdelay(200);
  333. /* Wait for the blocks to come out of reset */
  334. rc = mdio_clause45_wait_reset_mmds(efx,
  335. TENXPRESS_REQUIRED_DEVS);
  336. if (rc < 0)
  337. goto unlock;
  338. /* Try and reconfigure the device */
  339. rc = tenxpress_init(efx);
  340. if (rc < 0)
  341. goto unlock;
  342. /* Wait for the XGXS state machine to churn */
  343. mdelay(10);
  344. unlock:
  345. spin_unlock(&efx->stats_lock);
  346. return rc;
  347. }
  348. static void sfx7101_check_bad_lp(struct efx_nic *efx, bool link_ok)
  349. {
  350. struct tenxpress_phy_data *pd = efx->phy_data;
  351. int phy_id = efx->mii.phy_id;
  352. bool bad_lp;
  353. int reg;
  354. if (link_ok) {
  355. bad_lp = false;
  356. } else {
  357. /* Check that AN has started but not completed. */
  358. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_AN,
  359. MDIO_AN_STATUS);
  360. if (!(reg & (1 << MDIO_AN_STATUS_LP_AN_CAP_LBN)))
  361. return; /* LP status is unknown */
  362. bad_lp = !(reg & (1 << MDIO_AN_STATUS_AN_DONE_LBN));
  363. if (bad_lp)
  364. pd->bad_lp_tries++;
  365. }
  366. /* Nothing to do if all is well and was previously so. */
  367. if (!pd->bad_lp_tries)
  368. return;
  369. /* Use the RX (red) LED as an error indicator once we've seen AN
  370. * failure several times in a row, and also log a message. */
  371. if (!bad_lp || pd->bad_lp_tries == MAX_BAD_LP_TRIES) {
  372. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
  373. PMA_PMD_LED_OVERR_REG);
  374. reg &= ~(PMA_PMD_LED_MASK << PMA_PMD_LED_RX_LBN);
  375. if (!bad_lp) {
  376. reg |= PMA_PMD_LED_OFF << PMA_PMD_LED_RX_LBN;
  377. } else {
  378. reg |= PMA_PMD_LED_FLASH << PMA_PMD_LED_RX_LBN;
  379. EFX_ERR(efx, "appears to be plugged into a port"
  380. " that is not 10GBASE-T capable. The PHY"
  381. " supports 10GBASE-T ONLY, so no link can"
  382. " be established\n");
  383. }
  384. mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
  385. PMA_PMD_LED_OVERR_REG, reg);
  386. pd->bad_lp_tries = bad_lp;
  387. }
  388. }
  389. static bool sfx7101_link_ok(struct efx_nic *efx)
  390. {
  391. return mdio_clause45_links_ok(efx,
  392. MDIO_MMDREG_DEVS_PMAPMD |
  393. MDIO_MMDREG_DEVS_PCS |
  394. MDIO_MMDREG_DEVS_PHYXS);
  395. }
  396. static bool sft9001_link_ok(struct efx_nic *efx, struct ethtool_cmd *ecmd)
  397. {
  398. int phy_id = efx->mii.phy_id;
  399. u32 reg;
  400. if (efx_phy_mode_disabled(efx->phy_mode))
  401. return false;
  402. else if (efx->loopback_mode == LOOPBACK_GPHY)
  403. return true;
  404. else if (efx->loopback_mode)
  405. return mdio_clause45_links_ok(efx,
  406. MDIO_MMDREG_DEVS_PMAPMD |
  407. MDIO_MMDREG_DEVS_PHYXS);
  408. /* We must use the same definition of link state as LASI,
  409. * otherwise we can miss a link state transition
  410. */
  411. if (ecmd->speed == 10000) {
  412. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PCS,
  413. PCS_10GBASET_STAT1);
  414. return reg & (1 << PCS_10GBASET_BLKLK_LBN);
  415. } else {
  416. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
  417. C22EXT_STATUS_REG);
  418. return reg & (1 << C22EXT_STATUS_LINK_LBN);
  419. }
  420. }
  421. static void tenxpress_ext_loopback(struct efx_nic *efx)
  422. {
  423. int phy_id = efx->mii.phy_id;
  424. mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_PHYXS,
  425. PHYXS_TEST1, LOOPBACK_NEAR_LBN,
  426. efx->loopback_mode == LOOPBACK_PHYXS);
  427. if (efx->phy_type != PHY_TYPE_SFX7101)
  428. mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
  429. GPHY_XCONTROL_REG,
  430. GPHY_LOOPBACK_NEAR_LBN,
  431. efx->loopback_mode == LOOPBACK_GPHY);
  432. }
  433. static void tenxpress_low_power(struct efx_nic *efx)
  434. {
  435. int phy_id = efx->mii.phy_id;
  436. if (efx->phy_type == PHY_TYPE_SFX7101)
  437. mdio_clause45_set_mmds_lpower(
  438. efx, !!(efx->phy_mode & PHY_MODE_LOW_POWER),
  439. TENXPRESS_REQUIRED_DEVS);
  440. else
  441. mdio_clause45_set_flag(
  442. efx, phy_id, MDIO_MMD_PMAPMD,
  443. PMA_PMD_XCONTROL_REG, PMA_PMD_EXT_LPOWER_LBN,
  444. !!(efx->phy_mode & PHY_MODE_LOW_POWER));
  445. }
  446. static void tenxpress_phy_reconfigure(struct efx_nic *efx)
  447. {
  448. struct tenxpress_phy_data *phy_data = efx->phy_data;
  449. struct ethtool_cmd ecmd;
  450. bool phy_mode_change, loop_reset, loop_toggle, loopback;
  451. if (efx->phy_mode & (PHY_MODE_OFF | PHY_MODE_SPECIAL)) {
  452. phy_data->phy_mode = efx->phy_mode;
  453. return;
  454. }
  455. tenxpress_low_power(efx);
  456. phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
  457. phy_data->phy_mode != PHY_MODE_NORMAL);
  458. loopback = LOOPBACK_MASK(efx) & efx->phy_op->loopbacks;
  459. loop_toggle = LOOPBACK_CHANGED(phy_data, efx, efx->phy_op->loopbacks);
  460. loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, efx->phy_op->loopbacks) ||
  461. LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));
  462. if (loop_reset || loop_toggle || loopback || phy_mode_change) {
  463. int rc;
  464. efx->phy_op->get_settings(efx, &ecmd);
  465. if (loop_reset || phy_mode_change) {
  466. tenxpress_special_reset(efx);
  467. /* Reset XAUI if we were in 10G, and are staying
  468. * in 10G. If we're moving into and out of 10G
  469. * then xaui will be reset anyway */
  470. if (EFX_IS10G(efx))
  471. falcon_reset_xaui(efx);
  472. }
  473. if (efx->phy_type != PHY_TYPE_SFX7101) {
  474. /* Only change autoneg once, on coming out or
  475. * going into loopback */
  476. if (loop_toggle)
  477. ecmd.autoneg = !loopback;
  478. if (loopback) {
  479. ecmd.duplex = DUPLEX_FULL;
  480. if (efx->loopback_mode == LOOPBACK_GPHY)
  481. ecmd.speed = SPEED_1000;
  482. else
  483. ecmd.speed = SPEED_10000;
  484. }
  485. }
  486. rc = efx->phy_op->set_settings(efx, &ecmd);
  487. WARN_ON(rc);
  488. }
  489. mdio_clause45_transmit_disable(efx);
  490. mdio_clause45_phy_reconfigure(efx);
  491. tenxpress_ext_loopback(efx);
  492. phy_data->loopback_mode = efx->loopback_mode;
  493. phy_data->phy_mode = efx->phy_mode;
  494. if (efx->phy_type == PHY_TYPE_SFX7101) {
  495. efx->link_speed = 10000;
  496. efx->link_fd = true;
  497. efx->link_up = sfx7101_link_ok(efx);
  498. } else {
  499. efx->phy_op->get_settings(efx, &ecmd);
  500. efx->link_speed = ecmd.speed;
  501. efx->link_fd = ecmd.duplex == DUPLEX_FULL;
  502. efx->link_up = sft9001_link_ok(efx, &ecmd);
  503. }
  504. efx->link_fc = mdio_clause45_get_pause(efx);
  505. }
  506. /* Poll PHY for interrupt */
  507. static void tenxpress_phy_poll(struct efx_nic *efx)
  508. {
  509. struct tenxpress_phy_data *phy_data = efx->phy_data;
  510. bool change = false, link_ok;
  511. unsigned link_fc;
  512. if (efx->phy_type == PHY_TYPE_SFX7101) {
  513. link_ok = sfx7101_link_ok(efx);
  514. if (link_ok != efx->link_up) {
  515. change = true;
  516. } else {
  517. link_fc = mdio_clause45_get_pause(efx);
  518. if (link_fc != efx->link_fc)
  519. change = true;
  520. }
  521. sfx7101_check_bad_lp(efx, link_ok);
  522. } else if (efx->loopback_mode) {
  523. bool link_ok = sft9001_link_ok(efx, NULL);
  524. if (link_ok != efx->link_up)
  525. change = true;
  526. } else {
  527. u32 status = mdio_clause45_read(efx, efx->mii.phy_id,
  528. MDIO_MMD_PMAPMD,
  529. PMA_PMD_LASI_STATUS);
  530. if (status & (1 << PMA_PMD_LS_ALARM_LBN))
  531. change = true;
  532. }
  533. if (change)
  534. falcon_sim_phy_event(efx);
  535. if (phy_data->phy_mode != PHY_MODE_NORMAL)
  536. return;
  537. if (EFX_WORKAROUND_10750(efx) &&
  538. atomic_read(&phy_data->bad_crc_count) > crc_error_reset_threshold) {
  539. EFX_ERR(efx, "Resetting XAUI due to too many CRC errors\n");
  540. falcon_reset_xaui(efx);
  541. atomic_set(&phy_data->bad_crc_count, 0);
  542. }
  543. }
  544. static void tenxpress_phy_fini(struct efx_nic *efx)
  545. {
  546. int reg;
  547. if (efx->phy_type == PHY_TYPE_SFT9001B)
  548. device_remove_file(&efx->pci_dev->dev,
  549. &dev_attr_phy_short_reach);
  550. if (efx->phy_type == PHY_TYPE_SFX7101) {
  551. /* Power down the LNPGA */
  552. reg = (1 << PMA_PMD_LNPGA_POWERDOWN_LBN);
  553. mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  554. PMA_PMD_XCONTROL_REG, reg);
  555. /* Waiting here ensures that the board fini, which can turn
  556. * off the power to the PHY, won't get run until the LNPGA
  557. * powerdown has been given long enough to complete. */
  558. schedule_timeout_uninterruptible(LNPGA_PDOWN_WAIT); /* 200 ms */
  559. }
  560. kfree(efx->phy_data);
  561. efx->phy_data = NULL;
  562. }
  563. /* Set the RX and TX LEDs and Link LED flashing. The other LEDs
  564. * (which probably aren't wired anyway) are left in AUTO mode */
  565. void tenxpress_phy_blink(struct efx_nic *efx, bool blink)
  566. {
  567. int reg;
  568. if (blink)
  569. reg = (PMA_PMD_LED_FLASH << PMA_PMD_LED_TX_LBN) |
  570. (PMA_PMD_LED_FLASH << PMA_PMD_LED_RX_LBN) |
  571. (PMA_PMD_LED_FLASH << PMA_PMD_LED_LINK_LBN);
  572. else
  573. reg = PMA_PMD_LED_DEFAULT;
  574. mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  575. PMA_PMD_LED_OVERR_REG, reg);
  576. }
  577. static const char *const sfx7101_test_names[] = {
  578. "bist"
  579. };
  580. static int
  581. sfx7101_run_tests(struct efx_nic *efx, int *results, unsigned flags)
  582. {
  583. int rc;
  584. if (!(flags & ETH_TEST_FL_OFFLINE))
  585. return 0;
  586. /* BIST is automatically run after a special software reset */
  587. rc = tenxpress_special_reset(efx);
  588. results[0] = rc ? -1 : 1;
  589. return rc;
  590. }
  591. static const char *const sft9001_test_names[] = {
  592. "bist",
  593. "cable.pairA.status",
  594. "cable.pairB.status",
  595. "cable.pairC.status",
  596. "cable.pairD.status",
  597. "cable.pairA.length",
  598. "cable.pairB.length",
  599. "cable.pairC.length",
  600. "cable.pairD.length",
  601. };
  602. static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)
  603. {
  604. struct ethtool_cmd ecmd;
  605. int phy_id = efx->mii.phy_id;
  606. int rc = 0, rc2, i, res_reg;
  607. if (!(flags & ETH_TEST_FL_OFFLINE))
  608. return 0;
  609. efx->phy_op->get_settings(efx, &ecmd);
  610. /* Initialise cable diagnostic results to unknown failure */
  611. for (i = 1; i < 9; ++i)
  612. results[i] = -1;
  613. /* Run cable diagnostics; wait up to 5 seconds for them to complete.
  614. * A cable fault is not a self-test failure, but a timeout is. */
  615. mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
  616. PMA_PMD_CDIAG_CTRL_REG,
  617. (1 << CDIAG_CTRL_IMMED_LBN) |
  618. (1 << CDIAG_CTRL_BRK_LINK_LBN) |
  619. (CDIAG_CTRL_LEN_METRES << CDIAG_CTRL_LEN_UNIT_LBN));
  620. i = 0;
  621. while (mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
  622. PMA_PMD_CDIAG_CTRL_REG) &
  623. (1 << CDIAG_CTRL_IN_PROG_LBN)) {
  624. if (++i == 50) {
  625. rc = -ETIMEDOUT;
  626. goto reset;
  627. }
  628. msleep(100);
  629. }
  630. res_reg = mdio_clause45_read(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD,
  631. PMA_PMD_CDIAG_RES_REG);
  632. for (i = 0; i < 4; i++) {
  633. int pair_res =
  634. (res_reg >> (CDIAG_RES_A_LBN - i * CDIAG_RES_WIDTH))
  635. & ((1 << CDIAG_RES_WIDTH) - 1);
  636. int len_reg = mdio_clause45_read(efx, efx->mii.phy_id,
  637. MDIO_MMD_PMAPMD,
  638. PMA_PMD_CDIAG_LEN_REG + i);
  639. if (pair_res == CDIAG_RES_OK)
  640. results[1 + i] = 1;
  641. else if (pair_res == CDIAG_RES_INVALID)
  642. results[1 + i] = -1;
  643. else
  644. results[1 + i] = -pair_res;
  645. if (pair_res != CDIAG_RES_INVALID &&
  646. pair_res != CDIAG_RES_OPEN &&
  647. len_reg != 0xffff)
  648. results[5 + i] = len_reg;
  649. }
  650. /* We must reset to exit cable diagnostic mode. The BIST will
  651. * also run when we do this. */
  652. reset:
  653. rc2 = tenxpress_special_reset(efx);
  654. results[0] = rc2 ? -1 : 1;
  655. if (!rc)
  656. rc = rc2;
  657. rc2 = efx->phy_op->set_settings(efx, &ecmd);
  658. if (!rc)
  659. rc = rc2;
  660. return rc;
  661. }
  662. static u32 tenxpress_get_xnp_lpa(struct efx_nic *efx)
  663. {
  664. int phy = efx->mii.phy_id;
  665. u32 lpa = 0;
  666. int reg;
  667. if (efx->phy_type != PHY_TYPE_SFX7101) {
  668. reg = mdio_clause45_read(efx, phy, MDIO_MMD_C22EXT,
  669. C22EXT_MSTSLV_REG);
  670. if (reg & (1 << C22EXT_MSTSLV_1000_HD_LBN))
  671. lpa |= ADVERTISED_1000baseT_Half;
  672. if (reg & (1 << C22EXT_MSTSLV_1000_FD_LBN))
  673. lpa |= ADVERTISED_1000baseT_Full;
  674. }
  675. reg = mdio_clause45_read(efx, phy, MDIO_MMD_AN, MDIO_AN_10GBT_STATUS);
  676. if (reg & (1 << MDIO_AN_10GBT_STATUS_LP_10G_LBN))
  677. lpa |= ADVERTISED_10000baseT_Full;
  678. return lpa;
  679. }
  680. static void sfx7101_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
  681. {
  682. mdio_clause45_get_settings_ext(efx, ecmd, ADVERTISED_10000baseT_Full,
  683. tenxpress_get_xnp_lpa(efx));
  684. ecmd->supported |= SUPPORTED_10000baseT_Full;
  685. ecmd->advertising |= ADVERTISED_10000baseT_Full;
  686. }
  687. static void sft9001_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
  688. {
  689. int phy_id = efx->mii.phy_id;
  690. u32 xnp_adv = 0;
  691. int reg;
  692. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
  693. PMA_PMD_SPEED_ENABLE_REG);
  694. if (EFX_WORKAROUND_13204(efx) && (reg & (1 << PMA_PMD_100TX_ADV_LBN)))
  695. xnp_adv |= ADVERTISED_100baseT_Full;
  696. if (reg & (1 << PMA_PMD_1000T_ADV_LBN))
  697. xnp_adv |= ADVERTISED_1000baseT_Full;
  698. if (reg & (1 << PMA_PMD_10000T_ADV_LBN))
  699. xnp_adv |= ADVERTISED_10000baseT_Full;
  700. mdio_clause45_get_settings_ext(efx, ecmd, xnp_adv,
  701. tenxpress_get_xnp_lpa(efx));
  702. ecmd->supported |= (SUPPORTED_100baseT_Half |
  703. SUPPORTED_100baseT_Full |
  704. SUPPORTED_1000baseT_Full);
  705. /* Use the vendor defined C22ext register for duplex settings */
  706. if (ecmd->speed != SPEED_10000 && !ecmd->autoneg) {
  707. reg = mdio_clause45_read(efx, phy_id, MDIO_MMD_C22EXT,
  708. GPHY_XCONTROL_REG);
  709. ecmd->duplex = (reg & (1 << GPHY_DUPLEX_LBN) ?
  710. DUPLEX_FULL : DUPLEX_HALF);
  711. }
  712. }
  713. static int sft9001_set_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
  714. {
  715. int phy_id = efx->mii.phy_id;
  716. int rc;
  717. rc = mdio_clause45_set_settings(efx, ecmd);
  718. if (rc)
  719. return rc;
  720. if (ecmd->speed != SPEED_10000 && !ecmd->autoneg)
  721. mdio_clause45_set_flag(efx, phy_id, MDIO_MMD_C22EXT,
  722. GPHY_XCONTROL_REG, GPHY_DUPLEX_LBN,
  723. ecmd->duplex == DUPLEX_FULL);
  724. return rc;
  725. }
  726. static bool sft9001_set_xnp_advertise(struct efx_nic *efx, u32 advertising)
  727. {
  728. int phy = efx->mii.phy_id;
  729. int reg = mdio_clause45_read(efx, phy, MDIO_MMD_PMAPMD,
  730. PMA_PMD_SPEED_ENABLE_REG);
  731. bool enabled;
  732. reg &= ~((1 << 2) | (1 << 3));
  733. if (EFX_WORKAROUND_13204(efx) &&
  734. (advertising & ADVERTISED_100baseT_Full))
  735. reg |= 1 << PMA_PMD_100TX_ADV_LBN;
  736. if (advertising & ADVERTISED_1000baseT_Full)
  737. reg |= 1 << PMA_PMD_1000T_ADV_LBN;
  738. if (advertising & ADVERTISED_10000baseT_Full)
  739. reg |= 1 << PMA_PMD_10000T_ADV_LBN;
  740. mdio_clause45_write(efx, phy, MDIO_MMD_PMAPMD,
  741. PMA_PMD_SPEED_ENABLE_REG, reg);
  742. enabled = (advertising &
  743. (ADVERTISED_1000baseT_Half |
  744. ADVERTISED_1000baseT_Full |
  745. ADVERTISED_10000baseT_Full));
  746. if (EFX_WORKAROUND_13204(efx))
  747. enabled |= (advertising & ADVERTISED_100baseT_Full);
  748. return enabled;
  749. }
  750. struct efx_phy_operations falcon_sfx7101_phy_ops = {
  751. .macs = EFX_XMAC,
  752. .init = tenxpress_phy_init,
  753. .reconfigure = tenxpress_phy_reconfigure,
  754. .poll = tenxpress_phy_poll,
  755. .fini = tenxpress_phy_fini,
  756. .clear_interrupt = efx_port_dummy_op_void,
  757. .get_settings = sfx7101_get_settings,
  758. .set_settings = mdio_clause45_set_settings,
  759. .num_tests = ARRAY_SIZE(sfx7101_test_names),
  760. .test_names = sfx7101_test_names,
  761. .run_tests = sfx7101_run_tests,
  762. .mmds = TENXPRESS_REQUIRED_DEVS,
  763. .loopbacks = SFX7101_LOOPBACKS,
  764. };
  765. struct efx_phy_operations falcon_sft9001_phy_ops = {
  766. .macs = EFX_GMAC | EFX_XMAC,
  767. .init = tenxpress_phy_init,
  768. .reconfigure = tenxpress_phy_reconfigure,
  769. .poll = tenxpress_phy_poll,
  770. .fini = tenxpress_phy_fini,
  771. .clear_interrupt = efx_port_dummy_op_void,
  772. .get_settings = sft9001_get_settings,
  773. .set_settings = sft9001_set_settings,
  774. .set_xnp_advertise = sft9001_set_xnp_advertise,
  775. .num_tests = ARRAY_SIZE(sft9001_test_names),
  776. .test_names = sft9001_test_names,
  777. .run_tests = sft9001_run_tests,
  778. .mmds = TENXPRESS_REQUIRED_DEVS,
  779. .loopbacks = SFT9001_LOOPBACKS,
  780. };