marvell10g.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Marvell 10G 88x3310 PHY driver
  4. *
  5. * Based upon the ID registers, this PHY appears to be a mixture of IPs
  6. * from two different companies.
  7. *
  8. * There appears to be several different data paths through the PHY which
  9. * are automatically managed by the PHY. The following has been determined
  10. * via observation and experimentation for a setup using single-lane Serdes:
  11. *
  12. * SGMII PHYXS -- BASE-T PCS -- 10G PMA -- AN -- Copper (for <= 1G)
  13. * 10GBASE-KR PHYXS -- BASE-T PCS -- 10G PMA -- AN -- Copper (for 10G)
  14. * 10GBASE-KR PHYXS -- BASE-R PCS -- Fiber
  15. *
  16. * With XAUI, observation shows:
  17. *
  18. * XAUI PHYXS -- <appropriate PCS as above>
  19. *
  20. * and no switching of the host interface mode occurs.
  21. *
  22. * If both the fiber and copper ports are connected, the first to gain
  23. * link takes priority and the other port is completely locked out.
  24. */
  25. #include <linux/bitfield.h>
  26. #include <linux/ctype.h>
  27. #include <linux/delay.h>
  28. #include <linux/hwmon.h>
  29. #include <linux/marvell_phy.h>
  30. #include <linux/phy.h>
  31. #include <linux/phy_port.h>
  32. #include <linux/netdevice.h>
  33. #define MV_PHY_ALASKA_NBT_QUIRK_MASK 0xfffffffe
  34. #define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa)
  35. #define MV_VERSION(a,b,c,d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
  36. enum {
  37. MV_PMA_FW_VER0 = 0xc011,
  38. MV_PMA_FW_VER1 = 0xc012,
  39. MV_PMA_21X0_PORT_CTRL = 0xc04a,
  40. MV_PMA_21X0_PORT_CTRL_SWRST = BIT(15),
  41. MV_PMA_21X0_PORT_CTRL_MACTYPE_MASK = 0x7,
  42. MV_PMA_21X0_PORT_CTRL_MACTYPE_USXGMII = 0x0,
  43. MV_PMA_2180_PORT_CTRL_MACTYPE_DXGMII = 0x1,
  44. MV_PMA_2180_PORT_CTRL_MACTYPE_QXGMII = 0x2,
  45. MV_PMA_21X0_PORT_CTRL_MACTYPE_5GBASER = 0x4,
  46. MV_PMA_21X0_PORT_CTRL_MACTYPE_5GBASER_NO_SGMII_AN = 0x5,
  47. MV_PMA_21X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH = 0x6,
  48. MV_PMA_BOOT = 0xc050,
  49. MV_PMA_BOOT_FATAL = BIT(0),
  50. MV_PCS_BASE_T = 0x0000,
  51. MV_PCS_BASE_R = 0x1000,
  52. MV_PCS_1000BASEX = 0x2000,
  53. MV_PCS_CSCR1 = 0x8000,
  54. MV_PCS_CSCR1_ED_MASK = 0x0300,
  55. MV_PCS_CSCR1_ED_OFF = 0x0000,
  56. MV_PCS_CSCR1_ED_RX = 0x0200,
  57. MV_PCS_CSCR1_ED_NLP = 0x0300,
  58. MV_PCS_CSCR1_MDIX_MASK = 0x0060,
  59. MV_PCS_CSCR1_MDIX_MDI = 0x0000,
  60. MV_PCS_CSCR1_MDIX_MDIX = 0x0020,
  61. MV_PCS_CSCR1_MDIX_AUTO = 0x0060,
  62. MV_PCS_DSC1 = 0x8003,
  63. MV_PCS_DSC1_ENABLE = BIT(9),
  64. MV_PCS_DSC1_10GBT = 0x01c0,
  65. MV_PCS_DSC1_1GBR = 0x0038,
  66. MV_PCS_DSC1_100BTX = 0x0007,
  67. MV_PCS_DSC2 = 0x8004,
  68. MV_PCS_DSC2_2P5G = 0xf000,
  69. MV_PCS_DSC2_5G = 0x0f00,
  70. MV_PCS_CSSR1 = 0x8008,
  71. MV_PCS_CSSR1_SPD1_MASK = 0xc000,
  72. MV_PCS_CSSR1_SPD1_SPD2 = 0xc000,
  73. MV_PCS_CSSR1_SPD1_1000 = 0x8000,
  74. MV_PCS_CSSR1_SPD1_100 = 0x4000,
  75. MV_PCS_CSSR1_SPD1_10 = 0x0000,
  76. MV_PCS_CSSR1_DUPLEX_FULL= BIT(13),
  77. MV_PCS_CSSR1_RESOLVED = BIT(11),
  78. MV_PCS_CSSR1_MDIX = BIT(6),
  79. MV_PCS_CSSR1_SPD2_MASK = 0x000c,
  80. MV_PCS_CSSR1_SPD2_5000 = 0x0008,
  81. MV_PCS_CSSR1_SPD2_2500 = 0x0004,
  82. MV_PCS_CSSR1_SPD2_10000 = 0x0000,
  83. /* Temperature read register (88E2110 only) */
  84. MV_PCS_TEMP = 0x8042,
  85. /* Number of ports on the device */
  86. MV_PCS_PORT_INFO = 0xd00d,
  87. MV_PCS_PORT_INFO_NPORTS_MASK = 0x0380,
  88. MV_PCS_PORT_INFO_NPORTS_SHIFT = 7,
  89. /* SerDes reinitialization 88E21X0 */
  90. MV_AN_21X0_SERDES_CTRL2 = 0x800f,
  91. MV_AN_21X0_SERDES_CTRL2_AUTO_INIT_DIS = BIT(13),
  92. MV_AN_21X0_SERDES_CTRL2_RUN_INIT = BIT(15),
  93. /* These registers appear at 0x800X and 0xa00X - the 0xa00X control
  94. * registers appear to set themselves to the 0x800X when AN is
  95. * restarted, but status registers appear readable from either.
  96. */
  97. MV_AN_CTRL1000 = 0x8000, /* 1000base-T control register */
  98. MV_AN_STAT1000 = 0x8001, /* 1000base-T status register */
  99. /* Vendor2 MMD registers */
  100. MV_V2_PORT_CTRL = 0xf001,
  101. MV_V2_PORT_CTRL_PWRDOWN = BIT(11),
  102. MV_V2_33X0_PORT_CTRL_SWRST = BIT(15),
  103. MV_V2_33X0_PORT_CTRL_MACTYPE_MASK = 0x7,
  104. MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI = 0x0,
  105. MV_V2_3310_PORT_CTRL_MACTYPE_XAUI_RATE_MATCH = 0x1,
  106. MV_V2_3340_PORT_CTRL_MACTYPE_RXAUI_NO_SGMII_AN = 0x1,
  107. MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI_RATE_MATCH = 0x2,
  108. MV_V2_3310_PORT_CTRL_MACTYPE_XAUI = 0x3,
  109. MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER = 0x4,
  110. MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_NO_SGMII_AN = 0x5,
  111. MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH = 0x6,
  112. MV_V2_33X0_PORT_CTRL_MACTYPE_USXGMII = 0x7,
  113. MV_V2_PORT_INTR_STS = 0xf040,
  114. MV_V2_PORT_INTR_MASK = 0xf043,
  115. MV_V2_PORT_INTR_STS_WOL_EN = BIT(8),
  116. MV_V2_MAGIC_PKT_WORD0 = 0xf06b,
  117. MV_V2_MAGIC_PKT_WORD1 = 0xf06c,
  118. MV_V2_MAGIC_PKT_WORD2 = 0xf06d,
  119. /* Wake on LAN registers */
  120. MV_V2_WOL_CTRL = 0xf06e,
  121. MV_V2_WOL_CTRL_CLEAR_STS = BIT(15),
  122. MV_V2_WOL_CTRL_MAGIC_PKT_EN = BIT(0),
  123. /* Temperature control/read registers (88X3310 only) */
  124. MV_V2_TEMP_CTRL = 0xf08a,
  125. MV_V2_TEMP_CTRL_MASK = 0xc000,
  126. MV_V2_TEMP_CTRL_SAMPLE = 0x0000,
  127. MV_V2_TEMP_CTRL_DISABLE = 0xc000,
  128. MV_V2_TEMP = 0xf08c,
  129. MV_V2_TEMP_UNKNOWN = 0x9600, /* unknown function */
  130. };
  131. struct mv3310_mactype {
  132. bool valid;
  133. bool fixed_interface;
  134. phy_interface_t interface_10g;
  135. };
  136. struct mv3310_chip {
  137. bool (*has_downshift)(struct phy_device *phydev);
  138. void (*init_supported_interfaces)(unsigned long *mask);
  139. int (*get_mactype)(struct phy_device *phydev);
  140. int (*set_mactype)(struct phy_device *phydev, int mactype);
  141. int (*select_mactype)(unsigned long *interfaces);
  142. const struct mv3310_mactype *mactypes;
  143. size_t n_mactypes;
  144. #ifdef CONFIG_HWMON
  145. int (*hwmon_read_temp_reg)(struct phy_device *phydev);
  146. #endif
  147. };
  148. struct mv3310_priv {
  149. DECLARE_BITMAP(supported_interfaces, PHY_INTERFACE_MODE_MAX);
  150. const struct mv3310_mactype *mactype;
  151. u32 firmware_ver;
  152. bool has_downshift;
  153. struct device *hwmon_dev;
  154. char *hwmon_name;
  155. };
  156. static const struct mv3310_chip *to_mv3310_chip(struct phy_device *phydev)
  157. {
  158. return phydev->drv->driver_data;
  159. }
  160. #ifdef CONFIG_HWMON
  161. static umode_t mv3310_hwmon_is_visible(const void *data,
  162. enum hwmon_sensor_types type,
  163. u32 attr, int channel)
  164. {
  165. if (type == hwmon_chip && attr == hwmon_chip_update_interval)
  166. return 0444;
  167. if (type == hwmon_temp && attr == hwmon_temp_input)
  168. return 0444;
  169. return 0;
  170. }
  171. static int mv3310_hwmon_read_temp_reg(struct phy_device *phydev)
  172. {
  173. return phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP);
  174. }
  175. static int mv2110_hwmon_read_temp_reg(struct phy_device *phydev)
  176. {
  177. return phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_TEMP);
  178. }
  179. static int mv3310_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
  180. u32 attr, int channel, long *value)
  181. {
  182. struct phy_device *phydev = dev_get_drvdata(dev);
  183. const struct mv3310_chip *chip = to_mv3310_chip(phydev);
  184. int temp;
  185. if (type == hwmon_chip && attr == hwmon_chip_update_interval) {
  186. *value = MSEC_PER_SEC;
  187. return 0;
  188. }
  189. if (type == hwmon_temp && attr == hwmon_temp_input) {
  190. temp = chip->hwmon_read_temp_reg(phydev);
  191. if (temp < 0)
  192. return temp;
  193. *value = ((temp & 0xff) - 75) * 1000;
  194. return 0;
  195. }
  196. return -EOPNOTSUPP;
  197. }
  198. static const struct hwmon_ops mv3310_hwmon_ops = {
  199. .is_visible = mv3310_hwmon_is_visible,
  200. .read = mv3310_hwmon_read,
  201. };
  202. static const struct hwmon_channel_info * const mv3310_hwmon_info[] = {
  203. HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ | HWMON_C_UPDATE_INTERVAL),
  204. HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
  205. NULL,
  206. };
  207. static const struct hwmon_chip_info mv3310_hwmon_chip_info = {
  208. .ops = &mv3310_hwmon_ops,
  209. .info = mv3310_hwmon_info,
  210. };
  211. static int mv3310_hwmon_config(struct phy_device *phydev, bool enable)
  212. {
  213. u16 val;
  214. int ret;
  215. if (phydev->drv->phy_id != MARVELL_PHY_ID_88X3310)
  216. return 0;
  217. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP,
  218. MV_V2_TEMP_UNKNOWN);
  219. if (ret < 0)
  220. return ret;
  221. val = enable ? MV_V2_TEMP_CTRL_SAMPLE : MV_V2_TEMP_CTRL_DISABLE;
  222. return phy_modify_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP_CTRL,
  223. MV_V2_TEMP_CTRL_MASK, val);
  224. }
  225. static int mv3310_hwmon_probe(struct phy_device *phydev)
  226. {
  227. struct device *dev = &phydev->mdio.dev;
  228. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  229. int i, j, ret;
  230. priv->hwmon_name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
  231. if (!priv->hwmon_name)
  232. return -ENODEV;
  233. for (i = j = 0; priv->hwmon_name[i]; i++) {
  234. if (isalnum(priv->hwmon_name[i])) {
  235. if (i != j)
  236. priv->hwmon_name[j] = priv->hwmon_name[i];
  237. j++;
  238. }
  239. }
  240. priv->hwmon_name[j] = '\0';
  241. ret = mv3310_hwmon_config(phydev, true);
  242. if (ret)
  243. return ret;
  244. priv->hwmon_dev = devm_hwmon_device_register_with_info(dev,
  245. priv->hwmon_name, phydev,
  246. &mv3310_hwmon_chip_info, NULL);
  247. return PTR_ERR_OR_ZERO(priv->hwmon_dev);
  248. }
  249. #else
  250. static inline int mv3310_hwmon_config(struct phy_device *phydev, bool enable)
  251. {
  252. return 0;
  253. }
  254. static int mv3310_hwmon_probe(struct phy_device *phydev)
  255. {
  256. return 0;
  257. }
  258. #endif
  259. static int mv3310_power_down(struct phy_device *phydev)
  260. {
  261. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL,
  262. MV_V2_PORT_CTRL_PWRDOWN);
  263. }
  264. static int mv3310_power_up(struct phy_device *phydev)
  265. {
  266. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  267. int ret;
  268. ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL,
  269. MV_V2_PORT_CTRL_PWRDOWN);
  270. /* Sometimes, the power down bit doesn't clear immediately, and
  271. * a read of this register causes the bit not to clear. Delay
  272. * 100us to allow the PHY to come out of power down mode before
  273. * the next access.
  274. */
  275. udelay(100);
  276. if (phydev->drv->phy_id != MARVELL_PHY_ID_88X3310 ||
  277. priv->firmware_ver < 0x00030000)
  278. return ret;
  279. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL,
  280. MV_V2_33X0_PORT_CTRL_SWRST);
  281. }
  282. static int mv3310_reset(struct phy_device *phydev, u32 unit)
  283. {
  284. int val, err;
  285. err = phy_modify_mmd(phydev, MDIO_MMD_PCS, unit + MDIO_CTRL1,
  286. MDIO_CTRL1_RESET, MDIO_CTRL1_RESET);
  287. if (err < 0)
  288. return err;
  289. return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_PCS,
  290. unit + MDIO_CTRL1, val,
  291. !(val & MDIO_CTRL1_RESET),
  292. 5000, 100000, true);
  293. }
  294. static int mv3310_get_downshift(struct phy_device *phydev, u8 *ds)
  295. {
  296. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  297. int val;
  298. if (!priv->has_downshift)
  299. return -EOPNOTSUPP;
  300. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_DSC1);
  301. if (val < 0)
  302. return val;
  303. if (val & MV_PCS_DSC1_ENABLE)
  304. /* assume that all fields are the same */
  305. *ds = 1 + FIELD_GET(MV_PCS_DSC1_10GBT, (u16)val);
  306. else
  307. *ds = DOWNSHIFT_DEV_DISABLE;
  308. return 0;
  309. }
  310. static int mv3310_set_downshift(struct phy_device *phydev, u8 ds)
  311. {
  312. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  313. u16 val;
  314. int err;
  315. if (!priv->has_downshift)
  316. return -EOPNOTSUPP;
  317. if (ds == DOWNSHIFT_DEV_DISABLE)
  318. return phy_clear_bits_mmd(phydev, MDIO_MMD_PCS, MV_PCS_DSC1,
  319. MV_PCS_DSC1_ENABLE);
  320. /* DOWNSHIFT_DEV_DEFAULT_COUNT is confusing. It looks like it should
  321. * set the default settings for the PHY. However, it is used for
  322. * "ethtool --set-phy-tunable ethN downshift on". The intention is
  323. * to enable downshift at a default number of retries. The default
  324. * settings for 88x3310 are for two retries with downshift disabled.
  325. * So let's use two retries with downshift enabled.
  326. */
  327. if (ds == DOWNSHIFT_DEV_DEFAULT_COUNT)
  328. ds = 2;
  329. if (ds > 8)
  330. return -E2BIG;
  331. ds -= 1;
  332. val = FIELD_PREP(MV_PCS_DSC2_2P5G, ds);
  333. val |= FIELD_PREP(MV_PCS_DSC2_5G, ds);
  334. err = phy_modify_mmd(phydev, MDIO_MMD_PCS, MV_PCS_DSC2,
  335. MV_PCS_DSC2_2P5G | MV_PCS_DSC2_5G, val);
  336. if (err < 0)
  337. return err;
  338. val = MV_PCS_DSC1_ENABLE;
  339. val |= FIELD_PREP(MV_PCS_DSC1_10GBT, ds);
  340. val |= FIELD_PREP(MV_PCS_DSC1_1GBR, ds);
  341. val |= FIELD_PREP(MV_PCS_DSC1_100BTX, ds);
  342. return phy_modify_mmd(phydev, MDIO_MMD_PCS, MV_PCS_DSC1,
  343. MV_PCS_DSC1_ENABLE | MV_PCS_DSC1_10GBT |
  344. MV_PCS_DSC1_1GBR | MV_PCS_DSC1_100BTX, val);
  345. }
  346. static int mv3310_get_edpd(struct phy_device *phydev, u16 *edpd)
  347. {
  348. int val;
  349. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1);
  350. if (val < 0)
  351. return val;
  352. switch (val & MV_PCS_CSCR1_ED_MASK) {
  353. case MV_PCS_CSCR1_ED_NLP:
  354. *edpd = 1000;
  355. break;
  356. case MV_PCS_CSCR1_ED_RX:
  357. *edpd = ETHTOOL_PHY_EDPD_NO_TX;
  358. break;
  359. default:
  360. *edpd = ETHTOOL_PHY_EDPD_DISABLE;
  361. break;
  362. }
  363. return 0;
  364. }
  365. static int mv3310_set_edpd(struct phy_device *phydev, u16 edpd)
  366. {
  367. u16 val;
  368. int err;
  369. switch (edpd) {
  370. case 1000:
  371. case ETHTOOL_PHY_EDPD_DFLT_TX_MSECS:
  372. val = MV_PCS_CSCR1_ED_NLP;
  373. break;
  374. case ETHTOOL_PHY_EDPD_NO_TX:
  375. val = MV_PCS_CSCR1_ED_RX;
  376. break;
  377. case ETHTOOL_PHY_EDPD_DISABLE:
  378. val = MV_PCS_CSCR1_ED_OFF;
  379. break;
  380. default:
  381. return -EINVAL;
  382. }
  383. err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1,
  384. MV_PCS_CSCR1_ED_MASK, val);
  385. if (err > 0)
  386. err = mv3310_reset(phydev, MV_PCS_BASE_T);
  387. return err;
  388. }
  389. static int mv3310_attach_mii_port(struct phy_device *phydev,
  390. struct phy_port *port)
  391. {
  392. __set_bit(PHY_INTERFACE_MODE_10GBASER, port->interfaces);
  393. return 0;
  394. }
  395. static int mv3310_attach_mdi_port(struct phy_device *phydev,
  396. struct phy_port *port)
  397. {
  398. /* This PHY can do combo-ports, i.e. 2 MDI outputs, usually one
  399. * of them going to an SFP and the other one to a RJ45
  400. * connector. If we don't have any representation for the port
  401. * in DT, and we are dealing with a non-SFP port, then we
  402. * mask the port's capabilities to report BaseT-only modes
  403. */
  404. if (port->not_described)
  405. return phy_port_restrict_mediums(port,
  406. BIT(ETHTOOL_LINK_MEDIUM_BASET));
  407. return 0;
  408. }
  409. static int mv3310_probe(struct phy_device *phydev)
  410. {
  411. const struct mv3310_chip *chip = to_mv3310_chip(phydev);
  412. struct mv3310_priv *priv;
  413. u32 mmd_mask = MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
  414. int ret;
  415. if (!phydev->is_c45 ||
  416. (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask)
  417. return -ENODEV;
  418. ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT);
  419. if (ret < 0)
  420. return ret;
  421. if (ret & MV_PMA_BOOT_FATAL) {
  422. dev_warn(&phydev->mdio.dev,
  423. "PHY failed to boot firmware, status=%04x\n", ret);
  424. return -ENODEV;
  425. }
  426. priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
  427. if (!priv)
  428. return -ENOMEM;
  429. dev_set_drvdata(&phydev->mdio.dev, priv);
  430. ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER0);
  431. if (ret < 0)
  432. return ret;
  433. priv->firmware_ver = ret << 16;
  434. ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER1);
  435. if (ret < 0)
  436. return ret;
  437. priv->firmware_ver |= ret;
  438. phydev_info(phydev, "Firmware version %u.%u.%u.%u\n",
  439. priv->firmware_ver >> 24, (priv->firmware_ver >> 16) & 255,
  440. (priv->firmware_ver >> 8) & 255, priv->firmware_ver & 255);
  441. if (chip->has_downshift)
  442. priv->has_downshift = chip->has_downshift(phydev);
  443. /* Powering down the port when not in use saves about 600mW */
  444. ret = mv3310_power_down(phydev);
  445. if (ret)
  446. return ret;
  447. ret = mv3310_hwmon_probe(phydev);
  448. if (ret)
  449. return ret;
  450. chip->init_supported_interfaces(priv->supported_interfaces);
  451. phydev->max_n_ports = 2;
  452. return 0;
  453. }
  454. static void mv3310_remove(struct phy_device *phydev)
  455. {
  456. mv3310_hwmon_config(phydev, false);
  457. }
  458. static int mv3310_suspend(struct phy_device *phydev)
  459. {
  460. return mv3310_power_down(phydev);
  461. }
  462. static int mv3310_resume(struct phy_device *phydev)
  463. {
  464. int ret;
  465. ret = mv3310_power_up(phydev);
  466. if (ret)
  467. return ret;
  468. return mv3310_hwmon_config(phydev, true);
  469. }
  470. /* Some PHYs in the Alaska family such as the 88X3310 and the 88E2010
  471. * don't set bit 14 in PMA Extended Abilities (1.11), although they do
  472. * support 2.5GBASET and 5GBASET. For these models, we can still read their
  473. * 2.5G/5G extended abilities register (1.21). We detect these models based on
  474. * the PMA device identifier, with a mask matching models known to have this
  475. * issue
  476. */
  477. static bool mv3310_has_pma_ngbaset_quirk(struct phy_device *phydev)
  478. {
  479. if (!(phydev->c45_ids.devices_in_package & MDIO_DEVS_PMAPMD))
  480. return false;
  481. /* Only some revisions of the 88X3310 family PMA seem to be impacted */
  482. return (phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
  483. MV_PHY_ALASKA_NBT_QUIRK_MASK) == MV_PHY_ALASKA_NBT_QUIRK_REV;
  484. }
  485. static int mv2110_get_mactype(struct phy_device *phydev)
  486. {
  487. int mactype;
  488. mactype = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_21X0_PORT_CTRL);
  489. if (mactype < 0)
  490. return mactype;
  491. return mactype & MV_PMA_21X0_PORT_CTRL_MACTYPE_MASK;
  492. }
  493. static int mv2110_set_mactype(struct phy_device *phydev, int mactype)
  494. {
  495. int err, val;
  496. mactype &= MV_PMA_21X0_PORT_CTRL_MACTYPE_MASK;
  497. err = phy_modify_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_21X0_PORT_CTRL,
  498. MV_PMA_21X0_PORT_CTRL_SWRST |
  499. MV_PMA_21X0_PORT_CTRL_MACTYPE_MASK,
  500. MV_PMA_21X0_PORT_CTRL_SWRST | mactype);
  501. if (err)
  502. return err;
  503. err = phy_set_bits_mmd(phydev, MDIO_MMD_AN, MV_AN_21X0_SERDES_CTRL2,
  504. MV_AN_21X0_SERDES_CTRL2_AUTO_INIT_DIS |
  505. MV_AN_21X0_SERDES_CTRL2_RUN_INIT);
  506. if (err)
  507. return err;
  508. err = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_AN,
  509. MV_AN_21X0_SERDES_CTRL2, val,
  510. !(val &
  511. MV_AN_21X0_SERDES_CTRL2_RUN_INIT),
  512. 5000, 100000, true);
  513. if (err)
  514. return err;
  515. return phy_clear_bits_mmd(phydev, MDIO_MMD_AN, MV_AN_21X0_SERDES_CTRL2,
  516. MV_AN_21X0_SERDES_CTRL2_AUTO_INIT_DIS);
  517. }
  518. static int mv2110_select_mactype(unsigned long *interfaces)
  519. {
  520. if (test_bit(PHY_INTERFACE_MODE_USXGMII, interfaces))
  521. return MV_PMA_21X0_PORT_CTRL_MACTYPE_USXGMII;
  522. else if (test_bit(PHY_INTERFACE_MODE_SGMII, interfaces) &&
  523. !test_bit(PHY_INTERFACE_MODE_10GBASER, interfaces))
  524. return MV_PMA_21X0_PORT_CTRL_MACTYPE_5GBASER;
  525. else if (test_bit(PHY_INTERFACE_MODE_10GBASER, interfaces))
  526. return MV_PMA_21X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH;
  527. else
  528. return -1;
  529. }
  530. static int mv3310_get_mactype(struct phy_device *phydev)
  531. {
  532. int mactype;
  533. mactype = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL);
  534. if (mactype < 0)
  535. return mactype;
  536. return mactype & MV_V2_33X0_PORT_CTRL_MACTYPE_MASK;
  537. }
  538. static int mv3310_set_mactype(struct phy_device *phydev, int mactype)
  539. {
  540. int ret;
  541. mactype &= MV_V2_33X0_PORT_CTRL_MACTYPE_MASK;
  542. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL,
  543. MV_V2_33X0_PORT_CTRL_MACTYPE_MASK,
  544. mactype);
  545. if (ret <= 0)
  546. return ret;
  547. return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL,
  548. MV_V2_33X0_PORT_CTRL_SWRST);
  549. }
  550. static int mv3310_select_mactype(unsigned long *interfaces)
  551. {
  552. if (test_bit(PHY_INTERFACE_MODE_USXGMII, interfaces))
  553. return MV_V2_33X0_PORT_CTRL_MACTYPE_USXGMII;
  554. else if (test_bit(PHY_INTERFACE_MODE_SGMII, interfaces) &&
  555. test_bit(PHY_INTERFACE_MODE_10GBASER, interfaces))
  556. return MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER;
  557. else if (test_bit(PHY_INTERFACE_MODE_SGMII, interfaces) &&
  558. test_bit(PHY_INTERFACE_MODE_RXAUI, interfaces))
  559. return MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI;
  560. else if (test_bit(PHY_INTERFACE_MODE_SGMII, interfaces) &&
  561. test_bit(PHY_INTERFACE_MODE_XAUI, interfaces))
  562. return MV_V2_3310_PORT_CTRL_MACTYPE_XAUI;
  563. else if (test_bit(PHY_INTERFACE_MODE_10GBASER, interfaces))
  564. return MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH;
  565. else if (test_bit(PHY_INTERFACE_MODE_RXAUI, interfaces))
  566. return MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI_RATE_MATCH;
  567. else if (test_bit(PHY_INTERFACE_MODE_XAUI, interfaces))
  568. return MV_V2_3310_PORT_CTRL_MACTYPE_XAUI_RATE_MATCH;
  569. else if (test_bit(PHY_INTERFACE_MODE_SGMII, interfaces))
  570. return MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER;
  571. else
  572. return -1;
  573. }
  574. static const struct mv3310_mactype mv2110_mactypes[] = {
  575. [MV_PMA_21X0_PORT_CTRL_MACTYPE_USXGMII] = {
  576. .valid = true,
  577. .fixed_interface = true,
  578. .interface_10g = PHY_INTERFACE_MODE_USXGMII,
  579. },
  580. [MV_PMA_21X0_PORT_CTRL_MACTYPE_5GBASER] = {
  581. .valid = true,
  582. .interface_10g = PHY_INTERFACE_MODE_NA,
  583. },
  584. [MV_PMA_21X0_PORT_CTRL_MACTYPE_5GBASER_NO_SGMII_AN] = {
  585. .valid = true,
  586. .interface_10g = PHY_INTERFACE_MODE_NA,
  587. },
  588. [MV_PMA_21X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH] = {
  589. .valid = true,
  590. .fixed_interface = true,
  591. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  592. },
  593. };
  594. static const struct mv3310_mactype mv3310_mactypes[] = {
  595. [MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI] = {
  596. .valid = true,
  597. .interface_10g = PHY_INTERFACE_MODE_RXAUI,
  598. },
  599. [MV_V2_3310_PORT_CTRL_MACTYPE_XAUI_RATE_MATCH] = {
  600. .valid = true,
  601. .fixed_interface = true,
  602. .interface_10g = PHY_INTERFACE_MODE_XAUI,
  603. },
  604. [MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI_RATE_MATCH] = {
  605. .valid = true,
  606. .fixed_interface = true,
  607. .interface_10g = PHY_INTERFACE_MODE_RXAUI,
  608. },
  609. [MV_V2_3310_PORT_CTRL_MACTYPE_XAUI] = {
  610. .valid = true,
  611. .interface_10g = PHY_INTERFACE_MODE_XAUI,
  612. },
  613. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER] = {
  614. .valid = true,
  615. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  616. },
  617. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_NO_SGMII_AN] = {
  618. .valid = true,
  619. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  620. },
  621. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH] = {
  622. .valid = true,
  623. .fixed_interface = true,
  624. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  625. },
  626. [MV_V2_33X0_PORT_CTRL_MACTYPE_USXGMII] = {
  627. .valid = true,
  628. .fixed_interface = true,
  629. .interface_10g = PHY_INTERFACE_MODE_USXGMII,
  630. },
  631. };
  632. static const struct mv3310_mactype mv3340_mactypes[] = {
  633. [MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI] = {
  634. .valid = true,
  635. .interface_10g = PHY_INTERFACE_MODE_RXAUI,
  636. },
  637. [MV_V2_3340_PORT_CTRL_MACTYPE_RXAUI_NO_SGMII_AN] = {
  638. .valid = true,
  639. .interface_10g = PHY_INTERFACE_MODE_RXAUI,
  640. },
  641. [MV_V2_33X0_PORT_CTRL_MACTYPE_RXAUI_RATE_MATCH] = {
  642. .valid = true,
  643. .fixed_interface = true,
  644. .interface_10g = PHY_INTERFACE_MODE_RXAUI,
  645. },
  646. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER] = {
  647. .valid = true,
  648. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  649. },
  650. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_NO_SGMII_AN] = {
  651. .valid = true,
  652. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  653. },
  654. [MV_V2_33X0_PORT_CTRL_MACTYPE_10GBASER_RATE_MATCH] = {
  655. .valid = true,
  656. .fixed_interface = true,
  657. .interface_10g = PHY_INTERFACE_MODE_10GBASER,
  658. },
  659. [MV_V2_33X0_PORT_CTRL_MACTYPE_USXGMII] = {
  660. .valid = true,
  661. .fixed_interface = true,
  662. .interface_10g = PHY_INTERFACE_MODE_USXGMII,
  663. },
  664. };
  665. static void mv3310_fill_possible_interfaces(struct phy_device *phydev)
  666. {
  667. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  668. unsigned long *possible = phydev->possible_interfaces;
  669. const struct mv3310_mactype *mactype = priv->mactype;
  670. if (mactype->interface_10g != PHY_INTERFACE_MODE_NA)
  671. __set_bit(priv->mactype->interface_10g, possible);
  672. if (!mactype->fixed_interface) {
  673. __set_bit(PHY_INTERFACE_MODE_5GBASER, possible);
  674. __set_bit(PHY_INTERFACE_MODE_2500BASEX, possible);
  675. __set_bit(PHY_INTERFACE_MODE_SGMII, possible);
  676. }
  677. }
  678. static int mv3310_config_init(struct phy_device *phydev)
  679. {
  680. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  681. const struct mv3310_chip *chip = to_mv3310_chip(phydev);
  682. int err, mactype;
  683. /* Check that the PHY interface type is compatible */
  684. if (!test_bit(phydev->interface, priv->supported_interfaces))
  685. return -ENODEV;
  686. phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
  687. /* Power up so reset works */
  688. err = mv3310_power_up(phydev);
  689. if (err)
  690. return err;
  691. /* If host provided host supported interface modes, try to select the
  692. * best one
  693. */
  694. if (!phy_interface_empty(phydev->host_interfaces)) {
  695. mactype = chip->select_mactype(phydev->host_interfaces);
  696. if (mactype >= 0) {
  697. phydev_info(phydev, "Changing MACTYPE to %i\n",
  698. mactype);
  699. err = chip->set_mactype(phydev, mactype);
  700. if (err)
  701. return err;
  702. }
  703. }
  704. mactype = chip->get_mactype(phydev);
  705. if (mactype < 0)
  706. return mactype;
  707. if (mactype >= chip->n_mactypes || !chip->mactypes[mactype].valid) {
  708. phydev_err(phydev, "MACTYPE configuration invalid\n");
  709. return -EINVAL;
  710. }
  711. priv->mactype = &chip->mactypes[mactype];
  712. mv3310_fill_possible_interfaces(phydev);
  713. /* Enable EDPD mode - saving 600mW */
  714. err = mv3310_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS);
  715. if (err)
  716. return err;
  717. /* Allow downshift */
  718. err = mv3310_set_downshift(phydev, DOWNSHIFT_DEV_DEFAULT_COUNT);
  719. if (err && err != -EOPNOTSUPP)
  720. return err;
  721. return 0;
  722. }
  723. static int mv3310_get_features(struct phy_device *phydev)
  724. {
  725. int ret, val;
  726. ret = genphy_c45_pma_read_abilities(phydev);
  727. if (ret)
  728. return ret;
  729. if (mv3310_has_pma_ngbaset_quirk(phydev)) {
  730. val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD,
  731. MDIO_PMA_NG_EXTABLE);
  732. if (val < 0)
  733. return val;
  734. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  735. phydev->supported,
  736. val & MDIO_PMA_NG_EXTABLE_2_5GBT);
  737. linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
  738. phydev->supported,
  739. val & MDIO_PMA_NG_EXTABLE_5GBT);
  740. }
  741. return 0;
  742. }
  743. static int mv3310_config_mdix(struct phy_device *phydev)
  744. {
  745. u16 val;
  746. int err;
  747. switch (phydev->mdix_ctrl) {
  748. case ETH_TP_MDI_AUTO:
  749. val = MV_PCS_CSCR1_MDIX_AUTO;
  750. break;
  751. case ETH_TP_MDI_X:
  752. val = MV_PCS_CSCR1_MDIX_MDIX;
  753. break;
  754. case ETH_TP_MDI:
  755. val = MV_PCS_CSCR1_MDIX_MDI;
  756. break;
  757. default:
  758. return -EINVAL;
  759. }
  760. err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1,
  761. MV_PCS_CSCR1_MDIX_MASK, val);
  762. if (err > 0)
  763. err = mv3310_reset(phydev, MV_PCS_BASE_T);
  764. return err;
  765. }
  766. static int mv3310_config_aneg(struct phy_device *phydev)
  767. {
  768. bool changed = false;
  769. u16 reg;
  770. int ret;
  771. ret = mv3310_config_mdix(phydev);
  772. if (ret < 0)
  773. return ret;
  774. if (phydev->autoneg == AUTONEG_DISABLE)
  775. return genphy_c45_pma_setup_forced(phydev);
  776. ret = genphy_c45_an_config_aneg(phydev);
  777. if (ret < 0)
  778. return ret;
  779. if (ret > 0)
  780. changed = true;
  781. /* Clause 45 has no standardized support for 1000BaseT, therefore
  782. * use vendor registers for this mode.
  783. */
  784. reg = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
  785. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MV_AN_CTRL1000,
  786. ADVERTISE_1000FULL | ADVERTISE_1000HALF, reg);
  787. if (ret < 0)
  788. return ret;
  789. if (ret > 0)
  790. changed = true;
  791. return genphy_c45_check_and_restart_aneg(phydev, changed);
  792. }
  793. static int mv3310_aneg_done(struct phy_device *phydev)
  794. {
  795. int val;
  796. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1);
  797. if (val < 0)
  798. return val;
  799. if (val & MDIO_STAT1_LSTATUS)
  800. return 1;
  801. return genphy_c45_aneg_done(phydev);
  802. }
  803. static void mv3310_update_interface(struct phy_device *phydev)
  804. {
  805. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  806. if (!phydev->link)
  807. return;
  808. /* In all of the "* with Rate Matching" modes the PHY interface is fixed
  809. * at 10Gb. The PHY adapts the rate to actual wire speed with help of
  810. * internal 16KB buffer.
  811. *
  812. * In USXGMII mode the PHY interface mode is also fixed.
  813. */
  814. if (priv->mactype->fixed_interface) {
  815. phydev->interface = priv->mactype->interface_10g;
  816. return;
  817. }
  818. /* The PHY automatically switches its serdes interface (and active PHYXS
  819. * instance) between Cisco SGMII, 2500BaseX, 5GBase-R and 10GBase-R /
  820. * xaui / rxaui modes according to the speed.
  821. * Florian suggests setting phydev->interface to communicate this to the
  822. * MAC. Only do this if we are already in one of the above modes.
  823. */
  824. switch (phydev->speed) {
  825. case SPEED_10000:
  826. phydev->interface = priv->mactype->interface_10g;
  827. break;
  828. case SPEED_5000:
  829. phydev->interface = PHY_INTERFACE_MODE_5GBASER;
  830. break;
  831. case SPEED_2500:
  832. phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  833. break;
  834. case SPEED_1000:
  835. case SPEED_100:
  836. case SPEED_10:
  837. phydev->interface = PHY_INTERFACE_MODE_SGMII;
  838. break;
  839. default:
  840. break;
  841. }
  842. }
  843. /* 10GBASE-ER,LR,LRM,SR do not support autonegotiation. */
  844. static int mv3310_read_status_10gbaser(struct phy_device *phydev)
  845. {
  846. phydev->link = 1;
  847. phydev->speed = SPEED_10000;
  848. phydev->duplex = DUPLEX_FULL;
  849. phydev->port = PORT_FIBRE;
  850. return 0;
  851. }
  852. static int mv3310_read_status_copper(struct phy_device *phydev)
  853. {
  854. int cssr1, speed, val;
  855. val = genphy_c45_read_link(phydev);
  856. if (val < 0)
  857. return val;
  858. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
  859. if (val < 0)
  860. return val;
  861. cssr1 = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSSR1);
  862. if (cssr1 < 0)
  863. return cssr1;
  864. /* If the link settings are not resolved, mark the link down */
  865. if (!(cssr1 & MV_PCS_CSSR1_RESOLVED)) {
  866. phydev->link = 0;
  867. return 0;
  868. }
  869. /* Read the copper link settings */
  870. speed = cssr1 & MV_PCS_CSSR1_SPD1_MASK;
  871. if (speed == MV_PCS_CSSR1_SPD1_SPD2)
  872. speed |= cssr1 & MV_PCS_CSSR1_SPD2_MASK;
  873. switch (speed) {
  874. case MV_PCS_CSSR1_SPD1_SPD2 | MV_PCS_CSSR1_SPD2_10000:
  875. phydev->speed = SPEED_10000;
  876. break;
  877. case MV_PCS_CSSR1_SPD1_SPD2 | MV_PCS_CSSR1_SPD2_5000:
  878. phydev->speed = SPEED_5000;
  879. break;
  880. case MV_PCS_CSSR1_SPD1_SPD2 | MV_PCS_CSSR1_SPD2_2500:
  881. phydev->speed = SPEED_2500;
  882. break;
  883. case MV_PCS_CSSR1_SPD1_1000:
  884. phydev->speed = SPEED_1000;
  885. break;
  886. case MV_PCS_CSSR1_SPD1_100:
  887. phydev->speed = SPEED_100;
  888. break;
  889. case MV_PCS_CSSR1_SPD1_10:
  890. phydev->speed = SPEED_10;
  891. break;
  892. }
  893. phydev->duplex = cssr1 & MV_PCS_CSSR1_DUPLEX_FULL ?
  894. DUPLEX_FULL : DUPLEX_HALF;
  895. phydev->port = PORT_TP;
  896. phydev->mdix = cssr1 & MV_PCS_CSSR1_MDIX ?
  897. ETH_TP_MDI_X : ETH_TP_MDI;
  898. if (val & MDIO_AN_STAT1_COMPLETE) {
  899. val = genphy_c45_read_lpa(phydev);
  900. if (val < 0)
  901. return val;
  902. /* Read the link partner's 1G advertisement */
  903. val = phy_read_mmd(phydev, MDIO_MMD_AN, MV_AN_STAT1000);
  904. if (val < 0)
  905. return val;
  906. mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
  907. /* Update the pause status */
  908. phy_resolve_aneg_pause(phydev);
  909. }
  910. return 0;
  911. }
  912. static int mv3310_read_status(struct phy_device *phydev)
  913. {
  914. int err, val;
  915. phydev->speed = SPEED_UNKNOWN;
  916. phydev->duplex = DUPLEX_UNKNOWN;
  917. linkmode_zero(phydev->lp_advertising);
  918. phydev->link = 0;
  919. phydev->pause = 0;
  920. phydev->asym_pause = 0;
  921. phydev->mdix = ETH_TP_MDI_INVALID;
  922. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1);
  923. if (val < 0)
  924. return val;
  925. if (val & MDIO_STAT1_LSTATUS)
  926. err = mv3310_read_status_10gbaser(phydev);
  927. else
  928. err = mv3310_read_status_copper(phydev);
  929. if (err < 0)
  930. return err;
  931. if (phydev->link)
  932. mv3310_update_interface(phydev);
  933. return 0;
  934. }
  935. static int mv3310_get_tunable(struct phy_device *phydev,
  936. struct ethtool_tunable *tuna, void *data)
  937. {
  938. switch (tuna->id) {
  939. case ETHTOOL_PHY_DOWNSHIFT:
  940. return mv3310_get_downshift(phydev, data);
  941. case ETHTOOL_PHY_EDPD:
  942. return mv3310_get_edpd(phydev, data);
  943. default:
  944. return -EOPNOTSUPP;
  945. }
  946. }
  947. static int mv3310_set_tunable(struct phy_device *phydev,
  948. struct ethtool_tunable *tuna, const void *data)
  949. {
  950. switch (tuna->id) {
  951. case ETHTOOL_PHY_DOWNSHIFT:
  952. return mv3310_set_downshift(phydev, *(u8 *)data);
  953. case ETHTOOL_PHY_EDPD:
  954. return mv3310_set_edpd(phydev, *(u16 *)data);
  955. default:
  956. return -EOPNOTSUPP;
  957. }
  958. }
  959. static bool mv3310_has_downshift(struct phy_device *phydev)
  960. {
  961. struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev);
  962. /* Fails to downshift with firmware older than v0.3.5.0 */
  963. return priv->firmware_ver >= MV_VERSION(0,3,5,0);
  964. }
  965. static void mv3310_init_supported_interfaces(unsigned long *mask)
  966. {
  967. __set_bit(PHY_INTERFACE_MODE_SGMII, mask);
  968. __set_bit(PHY_INTERFACE_MODE_2500BASEX, mask);
  969. __set_bit(PHY_INTERFACE_MODE_5GBASER, mask);
  970. __set_bit(PHY_INTERFACE_MODE_XAUI, mask);
  971. __set_bit(PHY_INTERFACE_MODE_RXAUI, mask);
  972. __set_bit(PHY_INTERFACE_MODE_10GBASER, mask);
  973. __set_bit(PHY_INTERFACE_MODE_USXGMII, mask);
  974. }
  975. static void mv3340_init_supported_interfaces(unsigned long *mask)
  976. {
  977. __set_bit(PHY_INTERFACE_MODE_SGMII, mask);
  978. __set_bit(PHY_INTERFACE_MODE_2500BASEX, mask);
  979. __set_bit(PHY_INTERFACE_MODE_5GBASER, mask);
  980. __set_bit(PHY_INTERFACE_MODE_RXAUI, mask);
  981. __set_bit(PHY_INTERFACE_MODE_10GBASER, mask);
  982. __set_bit(PHY_INTERFACE_MODE_USXGMII, mask);
  983. }
  984. static void mv2110_init_supported_interfaces(unsigned long *mask)
  985. {
  986. __set_bit(PHY_INTERFACE_MODE_SGMII, mask);
  987. __set_bit(PHY_INTERFACE_MODE_2500BASEX, mask);
  988. __set_bit(PHY_INTERFACE_MODE_5GBASER, mask);
  989. __set_bit(PHY_INTERFACE_MODE_10GBASER, mask);
  990. __set_bit(PHY_INTERFACE_MODE_USXGMII, mask);
  991. }
  992. static void mv2111_init_supported_interfaces(unsigned long *mask)
  993. {
  994. __set_bit(PHY_INTERFACE_MODE_SGMII, mask);
  995. __set_bit(PHY_INTERFACE_MODE_2500BASEX, mask);
  996. __set_bit(PHY_INTERFACE_MODE_10GBASER, mask);
  997. __set_bit(PHY_INTERFACE_MODE_USXGMII, mask);
  998. }
  999. static const struct mv3310_chip mv3310_type = {
  1000. .has_downshift = mv3310_has_downshift,
  1001. .init_supported_interfaces = mv3310_init_supported_interfaces,
  1002. .get_mactype = mv3310_get_mactype,
  1003. .set_mactype = mv3310_set_mactype,
  1004. .select_mactype = mv3310_select_mactype,
  1005. .mactypes = mv3310_mactypes,
  1006. .n_mactypes = ARRAY_SIZE(mv3310_mactypes),
  1007. #ifdef CONFIG_HWMON
  1008. .hwmon_read_temp_reg = mv3310_hwmon_read_temp_reg,
  1009. #endif
  1010. };
  1011. static const struct mv3310_chip mv3340_type = {
  1012. .has_downshift = mv3310_has_downshift,
  1013. .init_supported_interfaces = mv3340_init_supported_interfaces,
  1014. .get_mactype = mv3310_get_mactype,
  1015. .set_mactype = mv3310_set_mactype,
  1016. .select_mactype = mv3310_select_mactype,
  1017. .mactypes = mv3340_mactypes,
  1018. .n_mactypes = ARRAY_SIZE(mv3340_mactypes),
  1019. #ifdef CONFIG_HWMON
  1020. .hwmon_read_temp_reg = mv3310_hwmon_read_temp_reg,
  1021. #endif
  1022. };
  1023. static const struct mv3310_chip mv2110_type = {
  1024. .init_supported_interfaces = mv2110_init_supported_interfaces,
  1025. .get_mactype = mv2110_get_mactype,
  1026. .set_mactype = mv2110_set_mactype,
  1027. .select_mactype = mv2110_select_mactype,
  1028. .mactypes = mv2110_mactypes,
  1029. .n_mactypes = ARRAY_SIZE(mv2110_mactypes),
  1030. #ifdef CONFIG_HWMON
  1031. .hwmon_read_temp_reg = mv2110_hwmon_read_temp_reg,
  1032. #endif
  1033. };
  1034. static const struct mv3310_chip mv2111_type = {
  1035. .init_supported_interfaces = mv2111_init_supported_interfaces,
  1036. .get_mactype = mv2110_get_mactype,
  1037. .set_mactype = mv2110_set_mactype,
  1038. .select_mactype = mv2110_select_mactype,
  1039. .mactypes = mv2110_mactypes,
  1040. .n_mactypes = ARRAY_SIZE(mv2110_mactypes),
  1041. #ifdef CONFIG_HWMON
  1042. .hwmon_read_temp_reg = mv2110_hwmon_read_temp_reg,
  1043. #endif
  1044. };
  1045. static int mv3310_get_number_of_ports(struct phy_device *phydev)
  1046. {
  1047. int ret;
  1048. ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_PORT_INFO);
  1049. if (ret < 0)
  1050. return ret;
  1051. ret &= MV_PCS_PORT_INFO_NPORTS_MASK;
  1052. ret >>= MV_PCS_PORT_INFO_NPORTS_SHIFT;
  1053. return ret + 1;
  1054. }
  1055. static int mv3310_match_phy_device(struct phy_device *phydev,
  1056. const struct phy_driver *phydrv)
  1057. {
  1058. if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
  1059. MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
  1060. return 0;
  1061. return mv3310_get_number_of_ports(phydev) == 1;
  1062. }
  1063. static int mv3340_match_phy_device(struct phy_device *phydev,
  1064. const struct phy_driver *phydrv)
  1065. {
  1066. if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
  1067. MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88X3310)
  1068. return 0;
  1069. return mv3310_get_number_of_ports(phydev) == 4;
  1070. }
  1071. static int mv211x_match_phy_device(struct phy_device *phydev, bool has_5g)
  1072. {
  1073. int val;
  1074. if ((phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] &
  1075. MARVELL_PHY_ID_MASK) != MARVELL_PHY_ID_88E2110)
  1076. return 0;
  1077. val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_SPEED);
  1078. if (val < 0)
  1079. return val;
  1080. return !!(val & MDIO_PCS_SPEED_5G) == has_5g;
  1081. }
  1082. static int mv2110_match_phy_device(struct phy_device *phydev,
  1083. const struct phy_driver *phydrv)
  1084. {
  1085. return mv211x_match_phy_device(phydev, true);
  1086. }
  1087. static int mv2111_match_phy_device(struct phy_device *phydev,
  1088. const struct phy_driver *phydrv)
  1089. {
  1090. return mv211x_match_phy_device(phydev, false);
  1091. }
  1092. static void mv3110_get_wol(struct phy_device *phydev,
  1093. struct ethtool_wolinfo *wol)
  1094. {
  1095. int ret;
  1096. wol->supported = WAKE_MAGIC;
  1097. wol->wolopts = 0;
  1098. ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_WOL_CTRL);
  1099. if (ret < 0)
  1100. return;
  1101. if (ret & MV_V2_WOL_CTRL_MAGIC_PKT_EN)
  1102. wol->wolopts |= WAKE_MAGIC;
  1103. }
  1104. static int mv3110_set_wol(struct phy_device *phydev,
  1105. struct ethtool_wolinfo *wol)
  1106. {
  1107. int ret;
  1108. if (wol->wolopts & WAKE_MAGIC) {
  1109. /* Enable the WOL interrupt */
  1110. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2,
  1111. MV_V2_PORT_INTR_MASK,
  1112. MV_V2_PORT_INTR_STS_WOL_EN);
  1113. if (ret < 0)
  1114. return ret;
  1115. /* Store the device address for the magic packet */
  1116. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1117. MV_V2_MAGIC_PKT_WORD2,
  1118. ((phydev->attached_dev->dev_addr[5] << 8) |
  1119. phydev->attached_dev->dev_addr[4]));
  1120. if (ret < 0)
  1121. return ret;
  1122. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1123. MV_V2_MAGIC_PKT_WORD1,
  1124. ((phydev->attached_dev->dev_addr[3] << 8) |
  1125. phydev->attached_dev->dev_addr[2]));
  1126. if (ret < 0)
  1127. return ret;
  1128. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
  1129. MV_V2_MAGIC_PKT_WORD0,
  1130. ((phydev->attached_dev->dev_addr[1] << 8) |
  1131. phydev->attached_dev->dev_addr[0]));
  1132. if (ret < 0)
  1133. return ret;
  1134. /* Clear WOL status and enable magic packet matching */
  1135. ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2,
  1136. MV_V2_WOL_CTRL,
  1137. MV_V2_WOL_CTRL_MAGIC_PKT_EN |
  1138. MV_V2_WOL_CTRL_CLEAR_STS);
  1139. if (ret < 0)
  1140. return ret;
  1141. } else {
  1142. /* Disable magic packet matching & reset WOL status bit */
  1143. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2,
  1144. MV_V2_WOL_CTRL,
  1145. MV_V2_WOL_CTRL_MAGIC_PKT_EN,
  1146. MV_V2_WOL_CTRL_CLEAR_STS);
  1147. if (ret < 0)
  1148. return ret;
  1149. }
  1150. /* Reset the clear WOL status bit as it does not self-clear */
  1151. return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
  1152. MV_V2_WOL_CTRL,
  1153. MV_V2_WOL_CTRL_CLEAR_STS);
  1154. }
  1155. static struct phy_driver mv3310_drivers[] = {
  1156. {
  1157. .phy_id = MARVELL_PHY_ID_88X3310,
  1158. .phy_id_mask = MARVELL_PHY_ID_MASK,
  1159. .match_phy_device = mv3310_match_phy_device,
  1160. .name = "mv88x3310",
  1161. .driver_data = &mv3310_type,
  1162. .get_features = mv3310_get_features,
  1163. .config_init = mv3310_config_init,
  1164. .probe = mv3310_probe,
  1165. .suspend = mv3310_suspend,
  1166. .resume = mv3310_resume,
  1167. .config_aneg = mv3310_config_aneg,
  1168. .aneg_done = mv3310_aneg_done,
  1169. .read_status = mv3310_read_status,
  1170. .get_tunable = mv3310_get_tunable,
  1171. .set_tunable = mv3310_set_tunable,
  1172. .remove = mv3310_remove,
  1173. .set_loopback = genphy_c45_loopback,
  1174. .get_wol = mv3110_get_wol,
  1175. .set_wol = mv3110_set_wol,
  1176. .attach_mii_port = mv3310_attach_mii_port,
  1177. .attach_mdi_port = mv3310_attach_mdi_port,
  1178. },
  1179. {
  1180. .phy_id = MARVELL_PHY_ID_88X3310,
  1181. .phy_id_mask = MARVELL_PHY_ID_MASK,
  1182. .match_phy_device = mv3340_match_phy_device,
  1183. .name = "mv88x3340",
  1184. .driver_data = &mv3340_type,
  1185. .get_features = mv3310_get_features,
  1186. .config_init = mv3310_config_init,
  1187. .probe = mv3310_probe,
  1188. .suspend = mv3310_suspend,
  1189. .resume = mv3310_resume,
  1190. .config_aneg = mv3310_config_aneg,
  1191. .aneg_done = mv3310_aneg_done,
  1192. .read_status = mv3310_read_status,
  1193. .get_tunable = mv3310_get_tunable,
  1194. .set_tunable = mv3310_set_tunable,
  1195. .remove = mv3310_remove,
  1196. .set_loopback = genphy_c45_loopback,
  1197. .attach_mii_port = mv3310_attach_mii_port,
  1198. .attach_mdi_port = mv3310_attach_mdi_port,
  1199. },
  1200. {
  1201. .phy_id = MARVELL_PHY_ID_88E2110,
  1202. .phy_id_mask = MARVELL_PHY_ID_MASK,
  1203. .match_phy_device = mv2110_match_phy_device,
  1204. .name = "mv88e2110",
  1205. .driver_data = &mv2110_type,
  1206. .probe = mv3310_probe,
  1207. .suspend = mv3310_suspend,
  1208. .resume = mv3310_resume,
  1209. .config_init = mv3310_config_init,
  1210. .config_aneg = mv3310_config_aneg,
  1211. .aneg_done = mv3310_aneg_done,
  1212. .read_status = mv3310_read_status,
  1213. .get_tunable = mv3310_get_tunable,
  1214. .set_tunable = mv3310_set_tunable,
  1215. .remove = mv3310_remove,
  1216. .set_loopback = genphy_c45_loopback,
  1217. .get_wol = mv3110_get_wol,
  1218. .set_wol = mv3110_set_wol,
  1219. .attach_mii_port = mv3310_attach_mii_port,
  1220. .attach_mdi_port = mv3310_attach_mdi_port,
  1221. },
  1222. {
  1223. .phy_id = MARVELL_PHY_ID_88E2110,
  1224. .phy_id_mask = MARVELL_PHY_ID_MASK,
  1225. .match_phy_device = mv2111_match_phy_device,
  1226. .name = "mv88e2111",
  1227. .driver_data = &mv2111_type,
  1228. .probe = mv3310_probe,
  1229. .suspend = mv3310_suspend,
  1230. .resume = mv3310_resume,
  1231. .config_init = mv3310_config_init,
  1232. .config_aneg = mv3310_config_aneg,
  1233. .aneg_done = mv3310_aneg_done,
  1234. .read_status = mv3310_read_status,
  1235. .get_tunable = mv3310_get_tunable,
  1236. .set_tunable = mv3310_set_tunable,
  1237. .remove = mv3310_remove,
  1238. .set_loopback = genphy_c45_loopback,
  1239. .attach_mii_port = mv3310_attach_mii_port,
  1240. .attach_mdi_port = mv3310_attach_mdi_port,
  1241. },
  1242. };
  1243. module_phy_driver(mv3310_drivers);
  1244. static const struct mdio_device_id __maybe_unused mv3310_tbl[] = {
  1245. { MARVELL_PHY_ID_88X3310, MARVELL_PHY_ID_MASK },
  1246. { MARVELL_PHY_ID_88E2110, MARVELL_PHY_ID_MASK },
  1247. { },
  1248. };
  1249. MODULE_DEVICE_TABLE(mdio, mv3310_tbl);
  1250. MODULE_DESCRIPTION("Marvell Alaska X/M multi-gigabit Ethernet PHY driver");
  1251. MODULE_LICENSE("GPL");