2
0

702-01-v6.7-net-phy-aquantia-move-to-separate-directory.patch 66 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306
  1. From d2213db3f49bce8e7a87c8de05b9a091f78f654e Mon Sep 17 00:00:00 2001
  2. From: Christian Marangi <[email protected]>
  3. Date: Tue, 14 Nov 2023 15:08:41 +0100
  4. Subject: [PATCH 1/3] net: phy: aquantia: move to separate directory
  5. Move aquantia PHY driver to separate driectory in preparation for
  6. firmware loading support to keep things tidy.
  7. Signed-off-by: Christian Marangi <[email protected]>
  8. Reviewed-by: Andrew Lunn <[email protected]>
  9. Signed-off-by: David S. Miller <[email protected]>
  10. ---
  11. drivers/net/phy/Kconfig | 5 +----
  12. drivers/net/phy/Makefile | 6 +-----
  13. drivers/net/phy/aquantia/Kconfig | 5 +++++
  14. drivers/net/phy/aquantia/Makefile | 6 ++++++
  15. drivers/net/phy/{ => aquantia}/aquantia.h | 0
  16. drivers/net/phy/{ => aquantia}/aquantia_hwmon.c | 0
  17. drivers/net/phy/{ => aquantia}/aquantia_main.c | 0
  18. 7 files changed, 13 insertions(+), 9 deletions(-)
  19. create mode 100644 drivers/net/phy/aquantia/Kconfig
  20. create mode 100644 drivers/net/phy/aquantia/Makefile
  21. rename drivers/net/phy/{ => aquantia}/aquantia.h (100%)
  22. rename drivers/net/phy/{ => aquantia}/aquantia_hwmon.c (100%)
  23. rename drivers/net/phy/{ => aquantia}/aquantia_main.c (100%)
  24. --- a/drivers/net/phy/Kconfig
  25. +++ b/drivers/net/phy/Kconfig
  26. @@ -90,10 +90,7 @@ config ADIN1100_PHY
  27. Currently supports the:
  28. - ADIN1100 - Robust,Industrial, Low Power 10BASE-T1L Ethernet PHY
  29. -config AQUANTIA_PHY
  30. - tristate "Aquantia PHYs"
  31. - help
  32. - Currently supports the Aquantia AQ1202, AQ2104, AQR105, AQR405
  33. +source "drivers/net/phy/aquantia/Kconfig"
  34. config AX88796B_PHY
  35. tristate "Asix PHYs"
  36. --- a/drivers/net/phy/Makefile
  37. +++ b/drivers/net/phy/Makefile
  38. @@ -33,11 +33,7 @@ obj-y += $(sfp-obj-y) $(sfp-obj-m)
  39. obj-$(CONFIG_ADIN_PHY) += adin.o
  40. obj-$(CONFIG_ADIN1100_PHY) += adin1100.o
  41. obj-$(CONFIG_AMD_PHY) += amd.o
  42. -aquantia-objs += aquantia_main.o
  43. -ifdef CONFIG_HWMON
  44. -aquantia-objs += aquantia_hwmon.o
  45. -endif
  46. -obj-$(CONFIG_AQUANTIA_PHY) += aquantia.o
  47. +obj-$(CONFIG_AQUANTIA_PHY) += aquantia/
  48. obj-$(CONFIG_AT803X_PHY) += at803x.o
  49. obj-$(CONFIG_AX88796B_PHY) += ax88796b.o
  50. obj-$(CONFIG_BCM54140_PHY) += bcm54140.o
  51. --- /dev/null
  52. +++ b/drivers/net/phy/aquantia/Kconfig
  53. @@ -0,0 +1,5 @@
  54. +# SPDX-License-Identifier: GPL-2.0-only
  55. +config AQUANTIA_PHY
  56. + tristate "Aquantia PHYs"
  57. + help
  58. + Currently supports the Aquantia AQ1202, AQ2104, AQR105, AQR405
  59. --- /dev/null
  60. +++ b/drivers/net/phy/aquantia/Makefile
  61. @@ -0,0 +1,6 @@
  62. +# SPDX-License-Identifier: GPL-2.0
  63. +aquantia-objs += aquantia_main.o
  64. +ifdef CONFIG_HWMON
  65. +aquantia-objs += aquantia_hwmon.o
  66. +endif
  67. +obj-$(CONFIG_AQUANTIA_PHY) += aquantia.o
  68. --- a/drivers/net/phy/aquantia.h
  69. +++ /dev/null
  70. @@ -1,16 +0,0 @@
  71. -/* SPDX-License-Identifier: GPL-2.0 */
  72. -/* HWMON driver for Aquantia PHY
  73. - *
  74. - * Author: Nikita Yushchenko <[email protected]>
  75. - * Author: Andrew Lunn <[email protected]>
  76. - * Author: Heiner Kallweit <[email protected]>
  77. - */
  78. -
  79. -#include <linux/device.h>
  80. -#include <linux/phy.h>
  81. -
  82. -#if IS_REACHABLE(CONFIG_HWMON)
  83. -int aqr_hwmon_probe(struct phy_device *phydev);
  84. -#else
  85. -static inline int aqr_hwmon_probe(struct phy_device *phydev) { return 0; }
  86. -#endif
  87. --- /dev/null
  88. +++ b/drivers/net/phy/aquantia/aquantia.h
  89. @@ -0,0 +1,16 @@
  90. +/* SPDX-License-Identifier: GPL-2.0 */
  91. +/* HWMON driver for Aquantia PHY
  92. + *
  93. + * Author: Nikita Yushchenko <[email protected]>
  94. + * Author: Andrew Lunn <[email protected]>
  95. + * Author: Heiner Kallweit <[email protected]>
  96. + */
  97. +
  98. +#include <linux/device.h>
  99. +#include <linux/phy.h>
  100. +
  101. +#if IS_REACHABLE(CONFIG_HWMON)
  102. +int aqr_hwmon_probe(struct phy_device *phydev);
  103. +#else
  104. +static inline int aqr_hwmon_probe(struct phy_device *phydev) { return 0; }
  105. +#endif
  106. --- /dev/null
  107. +++ b/drivers/net/phy/aquantia/aquantia_hwmon.c
  108. @@ -0,0 +1,250 @@
  109. +// SPDX-License-Identifier: GPL-2.0
  110. +/* HWMON driver for Aquantia PHY
  111. + *
  112. + * Author: Nikita Yushchenko <[email protected]>
  113. + * Author: Andrew Lunn <[email protected]>
  114. + * Author: Heiner Kallweit <[email protected]>
  115. + */
  116. +
  117. +#include <linux/phy.h>
  118. +#include <linux/device.h>
  119. +#include <linux/ctype.h>
  120. +#include <linux/hwmon.h>
  121. +
  122. +#include "aquantia.h"
  123. +
  124. +/* Vendor specific 1, MDIO_MMD_VEND2 */
  125. +#define VEND1_THERMAL_PROV_HIGH_TEMP_FAIL 0xc421
  126. +#define VEND1_THERMAL_PROV_LOW_TEMP_FAIL 0xc422
  127. +#define VEND1_THERMAL_PROV_HIGH_TEMP_WARN 0xc423
  128. +#define VEND1_THERMAL_PROV_LOW_TEMP_WARN 0xc424
  129. +#define VEND1_THERMAL_STAT1 0xc820
  130. +#define VEND1_THERMAL_STAT2 0xc821
  131. +#define VEND1_THERMAL_STAT2_VALID BIT(0)
  132. +#define VEND1_GENERAL_STAT1 0xc830
  133. +#define VEND1_GENERAL_STAT1_HIGH_TEMP_FAIL BIT(14)
  134. +#define VEND1_GENERAL_STAT1_LOW_TEMP_FAIL BIT(13)
  135. +#define VEND1_GENERAL_STAT1_HIGH_TEMP_WARN BIT(12)
  136. +#define VEND1_GENERAL_STAT1_LOW_TEMP_WARN BIT(11)
  137. +
  138. +#if IS_REACHABLE(CONFIG_HWMON)
  139. +
  140. +static umode_t aqr_hwmon_is_visible(const void *data,
  141. + enum hwmon_sensor_types type,
  142. + u32 attr, int channel)
  143. +{
  144. + if (type != hwmon_temp)
  145. + return 0;
  146. +
  147. + switch (attr) {
  148. + case hwmon_temp_input:
  149. + case hwmon_temp_min_alarm:
  150. + case hwmon_temp_max_alarm:
  151. + case hwmon_temp_lcrit_alarm:
  152. + case hwmon_temp_crit_alarm:
  153. + return 0444;
  154. + case hwmon_temp_min:
  155. + case hwmon_temp_max:
  156. + case hwmon_temp_lcrit:
  157. + case hwmon_temp_crit:
  158. + return 0644;
  159. + default:
  160. + return 0;
  161. + }
  162. +}
  163. +
  164. +static int aqr_hwmon_get(struct phy_device *phydev, int reg, long *value)
  165. +{
  166. + int temp = phy_read_mmd(phydev, MDIO_MMD_VEND1, reg);
  167. +
  168. + if (temp < 0)
  169. + return temp;
  170. +
  171. + /* 16 bit value is 2's complement with LSB = 1/256th degree Celsius */
  172. + *value = (s16)temp * 1000 / 256;
  173. +
  174. + return 0;
  175. +}
  176. +
  177. +static int aqr_hwmon_set(struct phy_device *phydev, int reg, long value)
  178. +{
  179. + int temp;
  180. +
  181. + if (value >= 128000 || value < -128000)
  182. + return -ERANGE;
  183. +
  184. + temp = value * 256 / 1000;
  185. +
  186. + /* temp is in s16 range and we're interested in lower 16 bits only */
  187. + return phy_write_mmd(phydev, MDIO_MMD_VEND1, reg, (u16)temp);
  188. +}
  189. +
  190. +static int aqr_hwmon_test_bit(struct phy_device *phydev, int reg, int bit)
  191. +{
  192. + int val = phy_read_mmd(phydev, MDIO_MMD_VEND1, reg);
  193. +
  194. + if (val < 0)
  195. + return val;
  196. +
  197. + return !!(val & bit);
  198. +}
  199. +
  200. +static int aqr_hwmon_status1(struct phy_device *phydev, int bit, long *value)
  201. +{
  202. + int val = aqr_hwmon_test_bit(phydev, VEND1_GENERAL_STAT1, bit);
  203. +
  204. + if (val < 0)
  205. + return val;
  206. +
  207. + *value = val;
  208. +
  209. + return 0;
  210. +}
  211. +
  212. +static int aqr_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
  213. + u32 attr, int channel, long *value)
  214. +{
  215. + struct phy_device *phydev = dev_get_drvdata(dev);
  216. + int reg;
  217. +
  218. + if (type != hwmon_temp)
  219. + return -EOPNOTSUPP;
  220. +
  221. + switch (attr) {
  222. + case hwmon_temp_input:
  223. + reg = aqr_hwmon_test_bit(phydev, VEND1_THERMAL_STAT2,
  224. + VEND1_THERMAL_STAT2_VALID);
  225. + if (reg < 0)
  226. + return reg;
  227. + if (!reg)
  228. + return -EBUSY;
  229. +
  230. + return aqr_hwmon_get(phydev, VEND1_THERMAL_STAT1, value);
  231. +
  232. + case hwmon_temp_lcrit:
  233. + return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_LOW_TEMP_FAIL,
  234. + value);
  235. + case hwmon_temp_min:
  236. + return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_LOW_TEMP_WARN,
  237. + value);
  238. + case hwmon_temp_max:
  239. + return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_WARN,
  240. + value);
  241. + case hwmon_temp_crit:
  242. + return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_FAIL,
  243. + value);
  244. + case hwmon_temp_lcrit_alarm:
  245. + return aqr_hwmon_status1(phydev,
  246. + VEND1_GENERAL_STAT1_LOW_TEMP_FAIL,
  247. + value);
  248. + case hwmon_temp_min_alarm:
  249. + return aqr_hwmon_status1(phydev,
  250. + VEND1_GENERAL_STAT1_LOW_TEMP_WARN,
  251. + value);
  252. + case hwmon_temp_max_alarm:
  253. + return aqr_hwmon_status1(phydev,
  254. + VEND1_GENERAL_STAT1_HIGH_TEMP_WARN,
  255. + value);
  256. + case hwmon_temp_crit_alarm:
  257. + return aqr_hwmon_status1(phydev,
  258. + VEND1_GENERAL_STAT1_HIGH_TEMP_FAIL,
  259. + value);
  260. + default:
  261. + return -EOPNOTSUPP;
  262. + }
  263. +}
  264. +
  265. +static int aqr_hwmon_write(struct device *dev, enum hwmon_sensor_types type,
  266. + u32 attr, int channel, long value)
  267. +{
  268. + struct phy_device *phydev = dev_get_drvdata(dev);
  269. +
  270. + if (type != hwmon_temp)
  271. + return -EOPNOTSUPP;
  272. +
  273. + switch (attr) {
  274. + case hwmon_temp_lcrit:
  275. + return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_LOW_TEMP_FAIL,
  276. + value);
  277. + case hwmon_temp_min:
  278. + return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_LOW_TEMP_WARN,
  279. + value);
  280. + case hwmon_temp_max:
  281. + return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_WARN,
  282. + value);
  283. + case hwmon_temp_crit:
  284. + return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_FAIL,
  285. + value);
  286. + default:
  287. + return -EOPNOTSUPP;
  288. + }
  289. +}
  290. +
  291. +static const struct hwmon_ops aqr_hwmon_ops = {
  292. + .is_visible = aqr_hwmon_is_visible,
  293. + .read = aqr_hwmon_read,
  294. + .write = aqr_hwmon_write,
  295. +};
  296. +
  297. +static u32 aqr_hwmon_chip_config[] = {
  298. + HWMON_C_REGISTER_TZ,
  299. + 0,
  300. +};
  301. +
  302. +static const struct hwmon_channel_info aqr_hwmon_chip = {
  303. + .type = hwmon_chip,
  304. + .config = aqr_hwmon_chip_config,
  305. +};
  306. +
  307. +static u32 aqr_hwmon_temp_config[] = {
  308. + HWMON_T_INPUT |
  309. + HWMON_T_MAX | HWMON_T_MIN |
  310. + HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM |
  311. + HWMON_T_CRIT | HWMON_T_LCRIT |
  312. + HWMON_T_CRIT_ALARM | HWMON_T_LCRIT_ALARM,
  313. + 0,
  314. +};
  315. +
  316. +static const struct hwmon_channel_info aqr_hwmon_temp = {
  317. + .type = hwmon_temp,
  318. + .config = aqr_hwmon_temp_config,
  319. +};
  320. +
  321. +static const struct hwmon_channel_info *aqr_hwmon_info[] = {
  322. + &aqr_hwmon_chip,
  323. + &aqr_hwmon_temp,
  324. + NULL,
  325. +};
  326. +
  327. +static const struct hwmon_chip_info aqr_hwmon_chip_info = {
  328. + .ops = &aqr_hwmon_ops,
  329. + .info = aqr_hwmon_info,
  330. +};
  331. +
  332. +int aqr_hwmon_probe(struct phy_device *phydev)
  333. +{
  334. + struct device *dev = &phydev->mdio.dev;
  335. + struct device *hwmon_dev;
  336. + char *hwmon_name;
  337. + int i, j;
  338. +
  339. + hwmon_name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
  340. + if (!hwmon_name)
  341. + return -ENOMEM;
  342. +
  343. + for (i = j = 0; hwmon_name[i]; i++) {
  344. + if (isalnum(hwmon_name[i])) {
  345. + if (i != j)
  346. + hwmon_name[j] = hwmon_name[i];
  347. + j++;
  348. + }
  349. + }
  350. + hwmon_name[j] = '\0';
  351. +
  352. + hwmon_dev = devm_hwmon_device_register_with_info(dev, hwmon_name,
  353. + phydev, &aqr_hwmon_chip_info, NULL);
  354. +
  355. + return PTR_ERR_OR_ZERO(hwmon_dev);
  356. +}
  357. +
  358. +#endif
  359. --- /dev/null
  360. +++ b/drivers/net/phy/aquantia/aquantia_main.c
  361. @@ -0,0 +1,842 @@
  362. +// SPDX-License-Identifier: GPL-2.0
  363. +/*
  364. + * Driver for Aquantia PHY
  365. + *
  366. + * Author: Shaohui Xie <[email protected]>
  367. + *
  368. + * Copyright 2015 Freescale Semiconductor, Inc.
  369. + */
  370. +
  371. +#include <linux/kernel.h>
  372. +#include <linux/module.h>
  373. +#include <linux/delay.h>
  374. +#include <linux/bitfield.h>
  375. +#include <linux/phy.h>
  376. +
  377. +#include "aquantia.h"
  378. +
  379. +#define PHY_ID_AQ1202 0x03a1b445
  380. +#define PHY_ID_AQ2104 0x03a1b460
  381. +#define PHY_ID_AQR105 0x03a1b4a2
  382. +#define PHY_ID_AQR106 0x03a1b4d0
  383. +#define PHY_ID_AQR107 0x03a1b4e0
  384. +#define PHY_ID_AQCS109 0x03a1b5c2
  385. +#define PHY_ID_AQR405 0x03a1b4b0
  386. +#define PHY_ID_AQR113C 0x31c31c12
  387. +
  388. +#define MDIO_PHYXS_VEND_IF_STATUS 0xe812
  389. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
  390. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR 0
  391. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KX 1
  392. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI 2
  393. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII 3
  394. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_XAUI 4
  395. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII 6
  396. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_RXAUI 7
  397. +#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII 10
  398. +
  399. +#define MDIO_AN_VEND_PROV 0xc400
  400. +#define MDIO_AN_VEND_PROV_1000BASET_FULL BIT(15)
  401. +#define MDIO_AN_VEND_PROV_1000BASET_HALF BIT(14)
  402. +#define MDIO_AN_VEND_PROV_5000BASET_FULL BIT(11)
  403. +#define MDIO_AN_VEND_PROV_2500BASET_FULL BIT(10)
  404. +#define MDIO_AN_VEND_PROV_DOWNSHIFT_EN BIT(4)
  405. +#define MDIO_AN_VEND_PROV_DOWNSHIFT_MASK GENMASK(3, 0)
  406. +#define MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT 4
  407. +
  408. +#define MDIO_AN_TX_VEND_STATUS1 0xc800
  409. +#define MDIO_AN_TX_VEND_STATUS1_RATE_MASK GENMASK(3, 1)
  410. +#define MDIO_AN_TX_VEND_STATUS1_10BASET 0
  411. +#define MDIO_AN_TX_VEND_STATUS1_100BASETX 1
  412. +#define MDIO_AN_TX_VEND_STATUS1_1000BASET 2
  413. +#define MDIO_AN_TX_VEND_STATUS1_10GBASET 3
  414. +#define MDIO_AN_TX_VEND_STATUS1_2500BASET 4
  415. +#define MDIO_AN_TX_VEND_STATUS1_5000BASET 5
  416. +#define MDIO_AN_TX_VEND_STATUS1_FULL_DUPLEX BIT(0)
  417. +
  418. +#define MDIO_AN_TX_VEND_INT_STATUS1 0xcc00
  419. +#define MDIO_AN_TX_VEND_INT_STATUS1_DOWNSHIFT BIT(1)
  420. +
  421. +#define MDIO_AN_TX_VEND_INT_STATUS2 0xcc01
  422. +#define MDIO_AN_TX_VEND_INT_STATUS2_MASK BIT(0)
  423. +
  424. +#define MDIO_AN_TX_VEND_INT_MASK2 0xd401
  425. +#define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0)
  426. +
  427. +#define MDIO_AN_RX_LP_STAT1 0xe820
  428. +#define MDIO_AN_RX_LP_STAT1_1000BASET_FULL BIT(15)
  429. +#define MDIO_AN_RX_LP_STAT1_1000BASET_HALF BIT(14)
  430. +#define MDIO_AN_RX_LP_STAT1_SHORT_REACH BIT(13)
  431. +#define MDIO_AN_RX_LP_STAT1_AQRATE_DOWNSHIFT BIT(12)
  432. +#define MDIO_AN_RX_LP_STAT1_AQ_PHY BIT(2)
  433. +
  434. +#define MDIO_AN_RX_LP_STAT4 0xe823
  435. +#define MDIO_AN_RX_LP_STAT4_FW_MAJOR GENMASK(15, 8)
  436. +#define MDIO_AN_RX_LP_STAT4_FW_MINOR GENMASK(7, 0)
  437. +
  438. +#define MDIO_AN_RX_VEND_STAT3 0xe832
  439. +#define MDIO_AN_RX_VEND_STAT3_AFR BIT(0)
  440. +
  441. +/* MDIO_MMD_C22EXT */
  442. +#define MDIO_C22EXT_STAT_SGMII_RX_GOOD_FRAMES 0xd292
  443. +#define MDIO_C22EXT_STAT_SGMII_RX_BAD_FRAMES 0xd294
  444. +#define MDIO_C22EXT_STAT_SGMII_RX_FALSE_CARRIER 0xd297
  445. +#define MDIO_C22EXT_STAT_SGMII_TX_GOOD_FRAMES 0xd313
  446. +#define MDIO_C22EXT_STAT_SGMII_TX_BAD_FRAMES 0xd315
  447. +#define MDIO_C22EXT_STAT_SGMII_TX_FALSE_CARRIER 0xd317
  448. +#define MDIO_C22EXT_STAT_SGMII_TX_COLLISIONS 0xd318
  449. +#define MDIO_C22EXT_STAT_SGMII_TX_LINE_COLLISIONS 0xd319
  450. +#define MDIO_C22EXT_STAT_SGMII_TX_FRAME_ALIGN_ERR 0xd31a
  451. +#define MDIO_C22EXT_STAT_SGMII_TX_RUNT_FRAMES 0xd31b
  452. +
  453. +/* Vendor specific 1, MDIO_MMD_VEND1 */
  454. +#define VEND1_GLOBAL_FW_ID 0x0020
  455. +#define VEND1_GLOBAL_FW_ID_MAJOR GENMASK(15, 8)
  456. +#define VEND1_GLOBAL_FW_ID_MINOR GENMASK(7, 0)
  457. +
  458. +#define VEND1_GLOBAL_GEN_STAT2 0xc831
  459. +#define VEND1_GLOBAL_GEN_STAT2_OP_IN_PROG BIT(15)
  460. +
  461. +/* The following registers all have similar layouts; first the registers... */
  462. +#define VEND1_GLOBAL_CFG_10M 0x0310
  463. +#define VEND1_GLOBAL_CFG_100M 0x031b
  464. +#define VEND1_GLOBAL_CFG_1G 0x031c
  465. +#define VEND1_GLOBAL_CFG_2_5G 0x031d
  466. +#define VEND1_GLOBAL_CFG_5G 0x031e
  467. +#define VEND1_GLOBAL_CFG_10G 0x031f
  468. +/* ...and now the fields */
  469. +#define VEND1_GLOBAL_CFG_RATE_ADAPT GENMASK(8, 7)
  470. +#define VEND1_GLOBAL_CFG_RATE_ADAPT_NONE 0
  471. +#define VEND1_GLOBAL_CFG_RATE_ADAPT_USX 1
  472. +#define VEND1_GLOBAL_CFG_RATE_ADAPT_PAUSE 2
  473. +
  474. +#define VEND1_GLOBAL_RSVD_STAT1 0xc885
  475. +#define VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID GENMASK(7, 4)
  476. +#define VEND1_GLOBAL_RSVD_STAT1_PROV_ID GENMASK(3, 0)
  477. +
  478. +#define VEND1_GLOBAL_RSVD_STAT9 0xc88d
  479. +#define VEND1_GLOBAL_RSVD_STAT9_MODE GENMASK(7, 0)
  480. +#define VEND1_GLOBAL_RSVD_STAT9_1000BT2 0x23
  481. +
  482. +#define VEND1_GLOBAL_INT_STD_STATUS 0xfc00
  483. +#define VEND1_GLOBAL_INT_VEND_STATUS 0xfc01
  484. +
  485. +#define VEND1_GLOBAL_INT_STD_MASK 0xff00
  486. +#define VEND1_GLOBAL_INT_STD_MASK_PMA1 BIT(15)
  487. +#define VEND1_GLOBAL_INT_STD_MASK_PMA2 BIT(14)
  488. +#define VEND1_GLOBAL_INT_STD_MASK_PCS1 BIT(13)
  489. +#define VEND1_GLOBAL_INT_STD_MASK_PCS2 BIT(12)
  490. +#define VEND1_GLOBAL_INT_STD_MASK_PCS3 BIT(11)
  491. +#define VEND1_GLOBAL_INT_STD_MASK_PHY_XS1 BIT(10)
  492. +#define VEND1_GLOBAL_INT_STD_MASK_PHY_XS2 BIT(9)
  493. +#define VEND1_GLOBAL_INT_STD_MASK_AN1 BIT(8)
  494. +#define VEND1_GLOBAL_INT_STD_MASK_AN2 BIT(7)
  495. +#define VEND1_GLOBAL_INT_STD_MASK_GBE BIT(6)
  496. +#define VEND1_GLOBAL_INT_STD_MASK_ALL BIT(0)
  497. +
  498. +#define VEND1_GLOBAL_INT_VEND_MASK 0xff01
  499. +#define VEND1_GLOBAL_INT_VEND_MASK_PMA BIT(15)
  500. +#define VEND1_GLOBAL_INT_VEND_MASK_PCS BIT(14)
  501. +#define VEND1_GLOBAL_INT_VEND_MASK_PHY_XS BIT(13)
  502. +#define VEND1_GLOBAL_INT_VEND_MASK_AN BIT(12)
  503. +#define VEND1_GLOBAL_INT_VEND_MASK_GBE BIT(11)
  504. +#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL1 BIT(2)
  505. +#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL2 BIT(1)
  506. +#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL3 BIT(0)
  507. +
  508. +/* Sleep and timeout for checking if the Processor-Intensive
  509. + * MDIO operation is finished
  510. + */
  511. +#define AQR107_OP_IN_PROG_SLEEP 1000
  512. +#define AQR107_OP_IN_PROG_TIMEOUT 100000
  513. +
  514. +struct aqr107_hw_stat {
  515. + const char *name;
  516. + int reg;
  517. + int size;
  518. +};
  519. +
  520. +#define SGMII_STAT(n, r, s) { n, MDIO_C22EXT_STAT_SGMII_ ## r, s }
  521. +static const struct aqr107_hw_stat aqr107_hw_stats[] = {
  522. + SGMII_STAT("sgmii_rx_good_frames", RX_GOOD_FRAMES, 26),
  523. + SGMII_STAT("sgmii_rx_bad_frames", RX_BAD_FRAMES, 26),
  524. + SGMII_STAT("sgmii_rx_false_carrier_events", RX_FALSE_CARRIER, 8),
  525. + SGMII_STAT("sgmii_tx_good_frames", TX_GOOD_FRAMES, 26),
  526. + SGMII_STAT("sgmii_tx_bad_frames", TX_BAD_FRAMES, 26),
  527. + SGMII_STAT("sgmii_tx_false_carrier_events", TX_FALSE_CARRIER, 8),
  528. + SGMII_STAT("sgmii_tx_collisions", TX_COLLISIONS, 8),
  529. + SGMII_STAT("sgmii_tx_line_collisions", TX_LINE_COLLISIONS, 8),
  530. + SGMII_STAT("sgmii_tx_frame_alignment_err", TX_FRAME_ALIGN_ERR, 16),
  531. + SGMII_STAT("sgmii_tx_runt_frames", TX_RUNT_FRAMES, 22),
  532. +};
  533. +#define AQR107_SGMII_STAT_SZ ARRAY_SIZE(aqr107_hw_stats)
  534. +
  535. +struct aqr107_priv {
  536. + u64 sgmii_stats[AQR107_SGMII_STAT_SZ];
  537. +};
  538. +
  539. +static int aqr107_get_sset_count(struct phy_device *phydev)
  540. +{
  541. + return AQR107_SGMII_STAT_SZ;
  542. +}
  543. +
  544. +static void aqr107_get_strings(struct phy_device *phydev, u8 *data)
  545. +{
  546. + int i;
  547. +
  548. + for (i = 0; i < AQR107_SGMII_STAT_SZ; i++)
  549. + strscpy(data + i * ETH_GSTRING_LEN, aqr107_hw_stats[i].name,
  550. + ETH_GSTRING_LEN);
  551. +}
  552. +
  553. +static u64 aqr107_get_stat(struct phy_device *phydev, int index)
  554. +{
  555. + const struct aqr107_hw_stat *stat = aqr107_hw_stats + index;
  556. + int len_l = min(stat->size, 16);
  557. + int len_h = stat->size - len_l;
  558. + u64 ret;
  559. + int val;
  560. +
  561. + val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
  562. + if (val < 0)
  563. + return U64_MAX;
  564. +
  565. + ret = val & GENMASK(len_l - 1, 0);
  566. + if (len_h) {
  567. + val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg + 1);
  568. + if (val < 0)
  569. + return U64_MAX;
  570. +
  571. + ret += (val & GENMASK(len_h - 1, 0)) << 16;
  572. + }
  573. +
  574. + return ret;
  575. +}
  576. +
  577. +static void aqr107_get_stats(struct phy_device *phydev,
  578. + struct ethtool_stats *stats, u64 *data)
  579. +{
  580. + struct aqr107_priv *priv = phydev->priv;
  581. + u64 val;
  582. + int i;
  583. +
  584. + for (i = 0; i < AQR107_SGMII_STAT_SZ; i++) {
  585. + val = aqr107_get_stat(phydev, i);
  586. + if (val == U64_MAX)
  587. + phydev_err(phydev, "Reading HW Statistics failed for %s\n",
  588. + aqr107_hw_stats[i].name);
  589. + else
  590. + priv->sgmii_stats[i] += val;
  591. +
  592. + data[i] = priv->sgmii_stats[i];
  593. + }
  594. +}
  595. +
  596. +static int aqr_config_aneg(struct phy_device *phydev)
  597. +{
  598. + bool changed = false;
  599. + u16 reg;
  600. + int ret;
  601. +
  602. + if (phydev->autoneg == AUTONEG_DISABLE)
  603. + return genphy_c45_pma_setup_forced(phydev);
  604. +
  605. + ret = genphy_c45_an_config_aneg(phydev);
  606. + if (ret < 0)
  607. + return ret;
  608. + if (ret > 0)
  609. + changed = true;
  610. +
  611. + /* Clause 45 has no standardized support for 1000BaseT, therefore
  612. + * use vendor registers for this mode.
  613. + */
  614. + reg = 0;
  615. + if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  616. + phydev->advertising))
  617. + reg |= MDIO_AN_VEND_PROV_1000BASET_FULL;
  618. +
  619. + if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
  620. + phydev->advertising))
  621. + reg |= MDIO_AN_VEND_PROV_1000BASET_HALF;
  622. +
  623. + /* Handle the case when the 2.5G and 5G speeds are not advertised */
  624. + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  625. + phydev->advertising))
  626. + reg |= MDIO_AN_VEND_PROV_2500BASET_FULL;
  627. +
  628. + if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
  629. + phydev->advertising))
  630. + reg |= MDIO_AN_VEND_PROV_5000BASET_FULL;
  631. +
  632. + ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV,
  633. + MDIO_AN_VEND_PROV_1000BASET_HALF |
  634. + MDIO_AN_VEND_PROV_1000BASET_FULL |
  635. + MDIO_AN_VEND_PROV_2500BASET_FULL |
  636. + MDIO_AN_VEND_PROV_5000BASET_FULL, reg);
  637. + if (ret < 0)
  638. + return ret;
  639. + if (ret > 0)
  640. + changed = true;
  641. +
  642. + return genphy_c45_check_and_restart_aneg(phydev, changed);
  643. +}
  644. +
  645. +static int aqr_config_intr(struct phy_device *phydev)
  646. +{
  647. + bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED;
  648. + int err;
  649. +
  650. + if (en) {
  651. + /* Clear any pending interrupts before enabling them */
  652. + err = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_STATUS2);
  653. + if (err < 0)
  654. + return err;
  655. + }
  656. +
  657. + err = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_MASK2,
  658. + en ? MDIO_AN_TX_VEND_INT_MASK2_LINK : 0);
  659. + if (err < 0)
  660. + return err;
  661. +
  662. + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_INT_STD_MASK,
  663. + en ? VEND1_GLOBAL_INT_STD_MASK_ALL : 0);
  664. + if (err < 0)
  665. + return err;
  666. +
  667. + err = phy_write_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_INT_VEND_MASK,
  668. + en ? VEND1_GLOBAL_INT_VEND_MASK_GLOBAL3 |
  669. + VEND1_GLOBAL_INT_VEND_MASK_AN : 0);
  670. + if (err < 0)
  671. + return err;
  672. +
  673. + if (!en) {
  674. + /* Clear any pending interrupts after we have disabled them */
  675. + err = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_STATUS2);
  676. + if (err < 0)
  677. + return err;
  678. + }
  679. +
  680. + return 0;
  681. +}
  682. +
  683. +static irqreturn_t aqr_handle_interrupt(struct phy_device *phydev)
  684. +{
  685. + int irq_status;
  686. +
  687. + irq_status = phy_read_mmd(phydev, MDIO_MMD_AN,
  688. + MDIO_AN_TX_VEND_INT_STATUS2);
  689. + if (irq_status < 0) {
  690. + phy_error(phydev);
  691. + return IRQ_NONE;
  692. + }
  693. +
  694. + if (!(irq_status & MDIO_AN_TX_VEND_INT_STATUS2_MASK))
  695. + return IRQ_NONE;
  696. +
  697. + phy_trigger_machine(phydev);
  698. +
  699. + return IRQ_HANDLED;
  700. +}
  701. +
  702. +static int aqr_read_status(struct phy_device *phydev)
  703. +{
  704. + int val;
  705. +
  706. + if (phydev->autoneg == AUTONEG_ENABLE) {
  707. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT1);
  708. + if (val < 0)
  709. + return val;
  710. +
  711. + linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  712. + phydev->lp_advertising,
  713. + val & MDIO_AN_RX_LP_STAT1_1000BASET_FULL);
  714. + linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
  715. + phydev->lp_advertising,
  716. + val & MDIO_AN_RX_LP_STAT1_1000BASET_HALF);
  717. + }
  718. +
  719. + return genphy_c45_read_status(phydev);
  720. +}
  721. +
  722. +static int aqr107_read_rate(struct phy_device *phydev)
  723. +{
  724. + u32 config_reg;
  725. + int val;
  726. +
  727. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_STATUS1);
  728. + if (val < 0)
  729. + return val;
  730. +
  731. + if (val & MDIO_AN_TX_VEND_STATUS1_FULL_DUPLEX)
  732. + phydev->duplex = DUPLEX_FULL;
  733. + else
  734. + phydev->duplex = DUPLEX_HALF;
  735. +
  736. + switch (FIELD_GET(MDIO_AN_TX_VEND_STATUS1_RATE_MASK, val)) {
  737. + case MDIO_AN_TX_VEND_STATUS1_10BASET:
  738. + phydev->speed = SPEED_10;
  739. + config_reg = VEND1_GLOBAL_CFG_10M;
  740. + break;
  741. + case MDIO_AN_TX_VEND_STATUS1_100BASETX:
  742. + phydev->speed = SPEED_100;
  743. + config_reg = VEND1_GLOBAL_CFG_100M;
  744. + break;
  745. + case MDIO_AN_TX_VEND_STATUS1_1000BASET:
  746. + phydev->speed = SPEED_1000;
  747. + config_reg = VEND1_GLOBAL_CFG_1G;
  748. + break;
  749. + case MDIO_AN_TX_VEND_STATUS1_2500BASET:
  750. + phydev->speed = SPEED_2500;
  751. + config_reg = VEND1_GLOBAL_CFG_2_5G;
  752. + break;
  753. + case MDIO_AN_TX_VEND_STATUS1_5000BASET:
  754. + phydev->speed = SPEED_5000;
  755. + config_reg = VEND1_GLOBAL_CFG_5G;
  756. + break;
  757. + case MDIO_AN_TX_VEND_STATUS1_10GBASET:
  758. + phydev->speed = SPEED_10000;
  759. + config_reg = VEND1_GLOBAL_CFG_10G;
  760. + break;
  761. + default:
  762. + phydev->speed = SPEED_UNKNOWN;
  763. + return 0;
  764. + }
  765. +
  766. + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, config_reg);
  767. + if (val < 0)
  768. + return val;
  769. +
  770. + if (FIELD_GET(VEND1_GLOBAL_CFG_RATE_ADAPT, val) ==
  771. + VEND1_GLOBAL_CFG_RATE_ADAPT_PAUSE)
  772. + phydev->rate_matching = RATE_MATCH_PAUSE;
  773. + else
  774. + phydev->rate_matching = RATE_MATCH_NONE;
  775. +
  776. + return 0;
  777. +}
  778. +
  779. +static int aqr107_read_status(struct phy_device *phydev)
  780. +{
  781. + int val, ret;
  782. +
  783. + ret = aqr_read_status(phydev);
  784. + if (ret)
  785. + return ret;
  786. +
  787. + if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
  788. + return 0;
  789. +
  790. + val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
  791. + if (val < 0)
  792. + return val;
  793. +
  794. + switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
  795. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
  796. + phydev->interface = PHY_INTERFACE_MODE_10GKR;
  797. + break;
  798. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KX:
  799. + phydev->interface = PHY_INTERFACE_MODE_1000BASEKX;
  800. + break;
  801. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
  802. + phydev->interface = PHY_INTERFACE_MODE_10GBASER;
  803. + break;
  804. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
  805. + phydev->interface = PHY_INTERFACE_MODE_USXGMII;
  806. + break;
  807. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XAUI:
  808. + phydev->interface = PHY_INTERFACE_MODE_XAUI;
  809. + break;
  810. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
  811. + phydev->interface = PHY_INTERFACE_MODE_SGMII;
  812. + break;
  813. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_RXAUI:
  814. + phydev->interface = PHY_INTERFACE_MODE_RXAUI;
  815. + break;
  816. + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
  817. + phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  818. + break;
  819. + default:
  820. + phydev->interface = PHY_INTERFACE_MODE_NA;
  821. + break;
  822. + }
  823. +
  824. + /* Read possibly downshifted rate from vendor register */
  825. + return aqr107_read_rate(phydev);
  826. +}
  827. +
  828. +static int aqr107_get_downshift(struct phy_device *phydev, u8 *data)
  829. +{
  830. + int val, cnt, enable;
  831. +
  832. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV);
  833. + if (val < 0)
  834. + return val;
  835. +
  836. + enable = FIELD_GET(MDIO_AN_VEND_PROV_DOWNSHIFT_EN, val);
  837. + cnt = FIELD_GET(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, val);
  838. +
  839. + *data = enable && cnt ? cnt : DOWNSHIFT_DEV_DISABLE;
  840. +
  841. + return 0;
  842. +}
  843. +
  844. +static int aqr107_set_downshift(struct phy_device *phydev, u8 cnt)
  845. +{
  846. + int val = 0;
  847. +
  848. + if (!FIELD_FIT(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, cnt))
  849. + return -E2BIG;
  850. +
  851. + if (cnt != DOWNSHIFT_DEV_DISABLE) {
  852. + val = MDIO_AN_VEND_PROV_DOWNSHIFT_EN;
  853. + val |= FIELD_PREP(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, cnt);
  854. + }
  855. +
  856. + return phy_modify_mmd(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV,
  857. + MDIO_AN_VEND_PROV_DOWNSHIFT_EN |
  858. + MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, val);
  859. +}
  860. +
  861. +static int aqr107_get_tunable(struct phy_device *phydev,
  862. + struct ethtool_tunable *tuna, void *data)
  863. +{
  864. + switch (tuna->id) {
  865. + case ETHTOOL_PHY_DOWNSHIFT:
  866. + return aqr107_get_downshift(phydev, data);
  867. + default:
  868. + return -EOPNOTSUPP;
  869. + }
  870. +}
  871. +
  872. +static int aqr107_set_tunable(struct phy_device *phydev,
  873. + struct ethtool_tunable *tuna, const void *data)
  874. +{
  875. + switch (tuna->id) {
  876. + case ETHTOOL_PHY_DOWNSHIFT:
  877. + return aqr107_set_downshift(phydev, *(const u8 *)data);
  878. + default:
  879. + return -EOPNOTSUPP;
  880. + }
  881. +}
  882. +
  883. +/* If we configure settings whilst firmware is still initializing the chip,
  884. + * then these settings may be overwritten. Therefore make sure chip
  885. + * initialization has completed. Use presence of the firmware ID as
  886. + * indicator for initialization having completed.
  887. + * The chip also provides a "reset completed" bit, but it's cleared after
  888. + * read. Therefore function would time out if called again.
  889. + */
  890. +static int aqr107_wait_reset_complete(struct phy_device *phydev)
  891. +{
  892. + int val;
  893. +
  894. + return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  895. + VEND1_GLOBAL_FW_ID, val, val != 0,
  896. + 20000, 2000000, false);
  897. +}
  898. +
  899. +static void aqr107_chip_info(struct phy_device *phydev)
  900. +{
  901. + u8 fw_major, fw_minor, build_id, prov_id;
  902. + int val;
  903. +
  904. + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_FW_ID);
  905. + if (val < 0)
  906. + return;
  907. +
  908. + fw_major = FIELD_GET(VEND1_GLOBAL_FW_ID_MAJOR, val);
  909. + fw_minor = FIELD_GET(VEND1_GLOBAL_FW_ID_MINOR, val);
  910. +
  911. + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_RSVD_STAT1);
  912. + if (val < 0)
  913. + return;
  914. +
  915. + build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
  916. + prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
  917. +
  918. + phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
  919. + fw_major, fw_minor, build_id, prov_id);
  920. +}
  921. +
  922. +static int aqr107_config_init(struct phy_device *phydev)
  923. +{
  924. + int ret;
  925. +
  926. + /* Check that the PHY interface type is compatible */
  927. + if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
  928. + phydev->interface != PHY_INTERFACE_MODE_1000BASEKX &&
  929. + phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
  930. + phydev->interface != PHY_INTERFACE_MODE_XGMII &&
  931. + phydev->interface != PHY_INTERFACE_MODE_USXGMII &&
  932. + phydev->interface != PHY_INTERFACE_MODE_10GKR &&
  933. + phydev->interface != PHY_INTERFACE_MODE_10GBASER &&
  934. + phydev->interface != PHY_INTERFACE_MODE_XAUI &&
  935. + phydev->interface != PHY_INTERFACE_MODE_RXAUI)
  936. + return -ENODEV;
  937. +
  938. + WARN(phydev->interface == PHY_INTERFACE_MODE_XGMII,
  939. + "Your devicetree is out of date, please update it. The AQR107 family doesn't support XGMII, maybe you mean USXGMII.\n");
  940. +
  941. + ret = aqr107_wait_reset_complete(phydev);
  942. + if (!ret)
  943. + aqr107_chip_info(phydev);
  944. +
  945. + return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
  946. +}
  947. +
  948. +static int aqcs109_config_init(struct phy_device *phydev)
  949. +{
  950. + int ret;
  951. +
  952. + /* Check that the PHY interface type is compatible */
  953. + if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
  954. + phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
  955. + return -ENODEV;
  956. +
  957. + ret = aqr107_wait_reset_complete(phydev);
  958. + if (!ret)
  959. + aqr107_chip_info(phydev);
  960. +
  961. + /* AQCS109 belongs to a chip family partially supporting 10G and 5G.
  962. + * PMA speed ability bits are the same for all members of the family,
  963. + * AQCS109 however supports speeds up to 2.5G only.
  964. + */
  965. + phy_set_max_speed(phydev, SPEED_2500);
  966. +
  967. + return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
  968. +}
  969. +
  970. +static void aqr107_link_change_notify(struct phy_device *phydev)
  971. +{
  972. + u8 fw_major, fw_minor;
  973. + bool downshift, short_reach, afr;
  974. + int mode, val;
  975. +
  976. + if (phydev->state != PHY_RUNNING || phydev->autoneg == AUTONEG_DISABLE)
  977. + return;
  978. +
  979. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT1);
  980. + /* call failed or link partner is no Aquantia PHY */
  981. + if (val < 0 || !(val & MDIO_AN_RX_LP_STAT1_AQ_PHY))
  982. + return;
  983. +
  984. + short_reach = val & MDIO_AN_RX_LP_STAT1_SHORT_REACH;
  985. + downshift = val & MDIO_AN_RX_LP_STAT1_AQRATE_DOWNSHIFT;
  986. +
  987. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT4);
  988. + if (val < 0)
  989. + return;
  990. +
  991. + fw_major = FIELD_GET(MDIO_AN_RX_LP_STAT4_FW_MAJOR, val);
  992. + fw_minor = FIELD_GET(MDIO_AN_RX_LP_STAT4_FW_MINOR, val);
  993. +
  994. + val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_VEND_STAT3);
  995. + if (val < 0)
  996. + return;
  997. +
  998. + afr = val & MDIO_AN_RX_VEND_STAT3_AFR;
  999. +
  1000. + phydev_dbg(phydev, "Link partner is Aquantia PHY, FW %u.%u%s%s%s\n",
  1001. + fw_major, fw_minor,
  1002. + short_reach ? ", short reach mode" : "",
  1003. + downshift ? ", fast-retrain downshift advertised" : "",
  1004. + afr ? ", fast reframe advertised" : "");
  1005. +
  1006. + val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_RSVD_STAT9);
  1007. + if (val < 0)
  1008. + return;
  1009. +
  1010. + mode = FIELD_GET(VEND1_GLOBAL_RSVD_STAT9_MODE, val);
  1011. + if (mode == VEND1_GLOBAL_RSVD_STAT9_1000BT2)
  1012. + phydev_info(phydev, "Aquantia 1000Base-T2 mode active\n");
  1013. +}
  1014. +
  1015. +static int aqr107_wait_processor_intensive_op(struct phy_device *phydev)
  1016. +{
  1017. + int val, err;
  1018. +
  1019. + /* The datasheet notes to wait at least 1ms after issuing a
  1020. + * processor intensive operation before checking.
  1021. + * We cannot use the 'sleep_before_read' parameter of read_poll_timeout
  1022. + * because that just determines the maximum time slept, not the minimum.
  1023. + */
  1024. + usleep_range(1000, 5000);
  1025. +
  1026. + err = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  1027. + VEND1_GLOBAL_GEN_STAT2, val,
  1028. + !(val & VEND1_GLOBAL_GEN_STAT2_OP_IN_PROG),
  1029. + AQR107_OP_IN_PROG_SLEEP,
  1030. + AQR107_OP_IN_PROG_TIMEOUT, false);
  1031. + if (err) {
  1032. + phydev_err(phydev, "timeout: processor-intensive MDIO operation\n");
  1033. + return err;
  1034. + }
  1035. +
  1036. + return 0;
  1037. +}
  1038. +
  1039. +static int aqr107_get_rate_matching(struct phy_device *phydev,
  1040. + phy_interface_t iface)
  1041. +{
  1042. + if (iface == PHY_INTERFACE_MODE_10GBASER ||
  1043. + iface == PHY_INTERFACE_MODE_2500BASEX ||
  1044. + iface == PHY_INTERFACE_MODE_NA)
  1045. + return RATE_MATCH_PAUSE;
  1046. + return RATE_MATCH_NONE;
  1047. +}
  1048. +
  1049. +static int aqr107_suspend(struct phy_device *phydev)
  1050. +{
  1051. + int err;
  1052. +
  1053. + err = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1,
  1054. + MDIO_CTRL1_LPOWER);
  1055. + if (err)
  1056. + return err;
  1057. +
  1058. + return aqr107_wait_processor_intensive_op(phydev);
  1059. +}
  1060. +
  1061. +static int aqr107_resume(struct phy_device *phydev)
  1062. +{
  1063. + int err;
  1064. +
  1065. + err = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1,
  1066. + MDIO_CTRL1_LPOWER);
  1067. + if (err)
  1068. + return err;
  1069. +
  1070. + return aqr107_wait_processor_intensive_op(phydev);
  1071. +}
  1072. +
  1073. +static int aqr107_probe(struct phy_device *phydev)
  1074. +{
  1075. + phydev->priv = devm_kzalloc(&phydev->mdio.dev,
  1076. + sizeof(struct aqr107_priv), GFP_KERNEL);
  1077. + if (!phydev->priv)
  1078. + return -ENOMEM;
  1079. +
  1080. + return aqr_hwmon_probe(phydev);
  1081. +}
  1082. +
  1083. +static struct phy_driver aqr_driver[] = {
  1084. +{
  1085. + PHY_ID_MATCH_MODEL(PHY_ID_AQ1202),
  1086. + .name = "Aquantia AQ1202",
  1087. + .config_aneg = aqr_config_aneg,
  1088. + .config_intr = aqr_config_intr,
  1089. + .handle_interrupt = aqr_handle_interrupt,
  1090. + .read_status = aqr_read_status,
  1091. +},
  1092. +{
  1093. + PHY_ID_MATCH_MODEL(PHY_ID_AQ2104),
  1094. + .name = "Aquantia AQ2104",
  1095. + .config_aneg = aqr_config_aneg,
  1096. + .config_intr = aqr_config_intr,
  1097. + .handle_interrupt = aqr_handle_interrupt,
  1098. + .read_status = aqr_read_status,
  1099. +},
  1100. +{
  1101. + PHY_ID_MATCH_MODEL(PHY_ID_AQR105),
  1102. + .name = "Aquantia AQR105",
  1103. + .config_aneg = aqr_config_aneg,
  1104. + .config_intr = aqr_config_intr,
  1105. + .handle_interrupt = aqr_handle_interrupt,
  1106. + .read_status = aqr_read_status,
  1107. + .suspend = aqr107_suspend,
  1108. + .resume = aqr107_resume,
  1109. +},
  1110. +{
  1111. + PHY_ID_MATCH_MODEL(PHY_ID_AQR106),
  1112. + .name = "Aquantia AQR106",
  1113. + .config_aneg = aqr_config_aneg,
  1114. + .config_intr = aqr_config_intr,
  1115. + .handle_interrupt = aqr_handle_interrupt,
  1116. + .read_status = aqr_read_status,
  1117. +},
  1118. +{
  1119. + PHY_ID_MATCH_MODEL(PHY_ID_AQR107),
  1120. + .name = "Aquantia AQR107",
  1121. + .probe = aqr107_probe,
  1122. + .get_rate_matching = aqr107_get_rate_matching,
  1123. + .config_init = aqr107_config_init,
  1124. + .config_aneg = aqr_config_aneg,
  1125. + .config_intr = aqr_config_intr,
  1126. + .handle_interrupt = aqr_handle_interrupt,
  1127. + .read_status = aqr107_read_status,
  1128. + .get_tunable = aqr107_get_tunable,
  1129. + .set_tunable = aqr107_set_tunable,
  1130. + .suspend = aqr107_suspend,
  1131. + .resume = aqr107_resume,
  1132. + .get_sset_count = aqr107_get_sset_count,
  1133. + .get_strings = aqr107_get_strings,
  1134. + .get_stats = aqr107_get_stats,
  1135. + .link_change_notify = aqr107_link_change_notify,
  1136. +},
  1137. +{
  1138. + PHY_ID_MATCH_MODEL(PHY_ID_AQCS109),
  1139. + .name = "Aquantia AQCS109",
  1140. + .probe = aqr107_probe,
  1141. + .get_rate_matching = aqr107_get_rate_matching,
  1142. + .config_init = aqcs109_config_init,
  1143. + .config_aneg = aqr_config_aneg,
  1144. + .config_intr = aqr_config_intr,
  1145. + .handle_interrupt = aqr_handle_interrupt,
  1146. + .read_status = aqr107_read_status,
  1147. + .get_tunable = aqr107_get_tunable,
  1148. + .set_tunable = aqr107_set_tunable,
  1149. + .suspend = aqr107_suspend,
  1150. + .resume = aqr107_resume,
  1151. + .get_sset_count = aqr107_get_sset_count,
  1152. + .get_strings = aqr107_get_strings,
  1153. + .get_stats = aqr107_get_stats,
  1154. + .link_change_notify = aqr107_link_change_notify,
  1155. +},
  1156. +{
  1157. + PHY_ID_MATCH_MODEL(PHY_ID_AQR405),
  1158. + .name = "Aquantia AQR405",
  1159. + .config_aneg = aqr_config_aneg,
  1160. + .config_intr = aqr_config_intr,
  1161. + .handle_interrupt = aqr_handle_interrupt,
  1162. + .read_status = aqr_read_status,
  1163. +},
  1164. +{
  1165. + PHY_ID_MATCH_MODEL(PHY_ID_AQR113C),
  1166. + .name = "Aquantia AQR113C",
  1167. + .probe = aqr107_probe,
  1168. + .get_rate_matching = aqr107_get_rate_matching,
  1169. + .config_init = aqr107_config_init,
  1170. + .config_aneg = aqr_config_aneg,
  1171. + .config_intr = aqr_config_intr,
  1172. + .handle_interrupt = aqr_handle_interrupt,
  1173. + .read_status = aqr107_read_status,
  1174. + .get_tunable = aqr107_get_tunable,
  1175. + .set_tunable = aqr107_set_tunable,
  1176. + .suspend = aqr107_suspend,
  1177. + .resume = aqr107_resume,
  1178. + .get_sset_count = aqr107_get_sset_count,
  1179. + .get_strings = aqr107_get_strings,
  1180. + .get_stats = aqr107_get_stats,
  1181. + .link_change_notify = aqr107_link_change_notify,
  1182. +},
  1183. +};
  1184. +
  1185. +module_phy_driver(aqr_driver);
  1186. +
  1187. +static struct mdio_device_id __maybe_unused aqr_tbl[] = {
  1188. + { PHY_ID_MATCH_MODEL(PHY_ID_AQ1202) },
  1189. + { PHY_ID_MATCH_MODEL(PHY_ID_AQ2104) },
  1190. + { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) },
  1191. + { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) },
  1192. + { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) },
  1193. + { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
  1194. + { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
  1195. + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
  1196. + { }
  1197. +};
  1198. +
  1199. +MODULE_DEVICE_TABLE(mdio, aqr_tbl);
  1200. +
  1201. +MODULE_DESCRIPTION("Aquantia PHY driver");
  1202. +MODULE_AUTHOR("Shaohui Xie <[email protected]>");
  1203. +MODULE_LICENSE("GPL v2");
  1204. --- a/drivers/net/phy/aquantia_hwmon.c
  1205. +++ /dev/null
  1206. @@ -1,250 +0,0 @@
  1207. -// SPDX-License-Identifier: GPL-2.0
  1208. -/* HWMON driver for Aquantia PHY
  1209. - *
  1210. - * Author: Nikita Yushchenko <[email protected]>
  1211. - * Author: Andrew Lunn <[email protected]>
  1212. - * Author: Heiner Kallweit <[email protected]>
  1213. - */
  1214. -
  1215. -#include <linux/phy.h>
  1216. -#include <linux/device.h>
  1217. -#include <linux/ctype.h>
  1218. -#include <linux/hwmon.h>
  1219. -
  1220. -#include "aquantia.h"
  1221. -
  1222. -/* Vendor specific 1, MDIO_MMD_VEND2 */
  1223. -#define VEND1_THERMAL_PROV_HIGH_TEMP_FAIL 0xc421
  1224. -#define VEND1_THERMAL_PROV_LOW_TEMP_FAIL 0xc422
  1225. -#define VEND1_THERMAL_PROV_HIGH_TEMP_WARN 0xc423
  1226. -#define VEND1_THERMAL_PROV_LOW_TEMP_WARN 0xc424
  1227. -#define VEND1_THERMAL_STAT1 0xc820
  1228. -#define VEND1_THERMAL_STAT2 0xc821
  1229. -#define VEND1_THERMAL_STAT2_VALID BIT(0)
  1230. -#define VEND1_GENERAL_STAT1 0xc830
  1231. -#define VEND1_GENERAL_STAT1_HIGH_TEMP_FAIL BIT(14)
  1232. -#define VEND1_GENERAL_STAT1_LOW_TEMP_FAIL BIT(13)
  1233. -#define VEND1_GENERAL_STAT1_HIGH_TEMP_WARN BIT(12)
  1234. -#define VEND1_GENERAL_STAT1_LOW_TEMP_WARN BIT(11)
  1235. -
  1236. -#if IS_REACHABLE(CONFIG_HWMON)
  1237. -
  1238. -static umode_t aqr_hwmon_is_visible(const void *data,
  1239. - enum hwmon_sensor_types type,
  1240. - u32 attr, int channel)
  1241. -{
  1242. - if (type != hwmon_temp)
  1243. - return 0;
  1244. -
  1245. - switch (attr) {
  1246. - case hwmon_temp_input:
  1247. - case hwmon_temp_min_alarm:
  1248. - case hwmon_temp_max_alarm:
  1249. - case hwmon_temp_lcrit_alarm:
  1250. - case hwmon_temp_crit_alarm:
  1251. - return 0444;
  1252. - case hwmon_temp_min:
  1253. - case hwmon_temp_max:
  1254. - case hwmon_temp_lcrit:
  1255. - case hwmon_temp_crit:
  1256. - return 0644;
  1257. - default:
  1258. - return 0;
  1259. - }
  1260. -}
  1261. -
  1262. -static int aqr_hwmon_get(struct phy_device *phydev, int reg, long *value)
  1263. -{
  1264. - int temp = phy_read_mmd(phydev, MDIO_MMD_VEND1, reg);
  1265. -
  1266. - if (temp < 0)
  1267. - return temp;
  1268. -
  1269. - /* 16 bit value is 2's complement with LSB = 1/256th degree Celsius */
  1270. - *value = (s16)temp * 1000 / 256;
  1271. -
  1272. - return 0;
  1273. -}
  1274. -
  1275. -static int aqr_hwmon_set(struct phy_device *phydev, int reg, long value)
  1276. -{
  1277. - int temp;
  1278. -
  1279. - if (value >= 128000 || value < -128000)
  1280. - return -ERANGE;
  1281. -
  1282. - temp = value * 256 / 1000;
  1283. -
  1284. - /* temp is in s16 range and we're interested in lower 16 bits only */
  1285. - return phy_write_mmd(phydev, MDIO_MMD_VEND1, reg, (u16)temp);
  1286. -}
  1287. -
  1288. -static int aqr_hwmon_test_bit(struct phy_device *phydev, int reg, int bit)
  1289. -{
  1290. - int val = phy_read_mmd(phydev, MDIO_MMD_VEND1, reg);
  1291. -
  1292. - if (val < 0)
  1293. - return val;
  1294. -
  1295. - return !!(val & bit);
  1296. -}
  1297. -
  1298. -static int aqr_hwmon_status1(struct phy_device *phydev, int bit, long *value)
  1299. -{
  1300. - int val = aqr_hwmon_test_bit(phydev, VEND1_GENERAL_STAT1, bit);
  1301. -
  1302. - if (val < 0)
  1303. - return val;
  1304. -
  1305. - *value = val;
  1306. -
  1307. - return 0;
  1308. -}
  1309. -
  1310. -static int aqr_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
  1311. - u32 attr, int channel, long *value)
  1312. -{
  1313. - struct phy_device *phydev = dev_get_drvdata(dev);
  1314. - int reg;
  1315. -
  1316. - if (type != hwmon_temp)
  1317. - return -EOPNOTSUPP;
  1318. -
  1319. - switch (attr) {
  1320. - case hwmon_temp_input:
  1321. - reg = aqr_hwmon_test_bit(phydev, VEND1_THERMAL_STAT2,
  1322. - VEND1_THERMAL_STAT2_VALID);
  1323. - if (reg < 0)
  1324. - return reg;
  1325. - if (!reg)
  1326. - return -EBUSY;
  1327. -
  1328. - return aqr_hwmon_get(phydev, VEND1_THERMAL_STAT1, value);
  1329. -
  1330. - case hwmon_temp_lcrit:
  1331. - return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_LOW_TEMP_FAIL,
  1332. - value);
  1333. - case hwmon_temp_min:
  1334. - return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_LOW_TEMP_WARN,
  1335. - value);
  1336. - case hwmon_temp_max:
  1337. - return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_WARN,
  1338. - value);
  1339. - case hwmon_temp_crit:
  1340. - return aqr_hwmon_get(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_FAIL,
  1341. - value);
  1342. - case hwmon_temp_lcrit_alarm:
  1343. - return aqr_hwmon_status1(phydev,
  1344. - VEND1_GENERAL_STAT1_LOW_TEMP_FAIL,
  1345. - value);
  1346. - case hwmon_temp_min_alarm:
  1347. - return aqr_hwmon_status1(phydev,
  1348. - VEND1_GENERAL_STAT1_LOW_TEMP_WARN,
  1349. - value);
  1350. - case hwmon_temp_max_alarm:
  1351. - return aqr_hwmon_status1(phydev,
  1352. - VEND1_GENERAL_STAT1_HIGH_TEMP_WARN,
  1353. - value);
  1354. - case hwmon_temp_crit_alarm:
  1355. - return aqr_hwmon_status1(phydev,
  1356. - VEND1_GENERAL_STAT1_HIGH_TEMP_FAIL,
  1357. - value);
  1358. - default:
  1359. - return -EOPNOTSUPP;
  1360. - }
  1361. -}
  1362. -
  1363. -static int aqr_hwmon_write(struct device *dev, enum hwmon_sensor_types type,
  1364. - u32 attr, int channel, long value)
  1365. -{
  1366. - struct phy_device *phydev = dev_get_drvdata(dev);
  1367. -
  1368. - if (type != hwmon_temp)
  1369. - return -EOPNOTSUPP;
  1370. -
  1371. - switch (attr) {
  1372. - case hwmon_temp_lcrit:
  1373. - return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_LOW_TEMP_FAIL,
  1374. - value);
  1375. - case hwmon_temp_min:
  1376. - return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_LOW_TEMP_WARN,
  1377. - value);
  1378. - case hwmon_temp_max:
  1379. - return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_WARN,
  1380. - value);
  1381. - case hwmon_temp_crit:
  1382. - return aqr_hwmon_set(phydev, VEND1_THERMAL_PROV_HIGH_TEMP_FAIL,
  1383. - value);
  1384. - default:
  1385. - return -EOPNOTSUPP;
  1386. - }
  1387. -}
  1388. -
  1389. -static const struct hwmon_ops aqr_hwmon_ops = {
  1390. - .is_visible = aqr_hwmon_is_visible,
  1391. - .read = aqr_hwmon_read,
  1392. - .write = aqr_hwmon_write,
  1393. -};
  1394. -
  1395. -static u32 aqr_hwmon_chip_config[] = {
  1396. - HWMON_C_REGISTER_TZ,
  1397. - 0,
  1398. -};
  1399. -
  1400. -static const struct hwmon_channel_info aqr_hwmon_chip = {
  1401. - .type = hwmon_chip,
  1402. - .config = aqr_hwmon_chip_config,
  1403. -};
  1404. -
  1405. -static u32 aqr_hwmon_temp_config[] = {
  1406. - HWMON_T_INPUT |
  1407. - HWMON_T_MAX | HWMON_T_MIN |
  1408. - HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM |
  1409. - HWMON_T_CRIT | HWMON_T_LCRIT |
  1410. - HWMON_T_CRIT_ALARM | HWMON_T_LCRIT_ALARM,
  1411. - 0,
  1412. -};
  1413. -
  1414. -static const struct hwmon_channel_info aqr_hwmon_temp = {
  1415. - .type = hwmon_temp,
  1416. - .config = aqr_hwmon_temp_config,
  1417. -};
  1418. -
  1419. -static const struct hwmon_channel_info *aqr_hwmon_info[] = {
  1420. - &aqr_hwmon_chip,
  1421. - &aqr_hwmon_temp,
  1422. - NULL,
  1423. -};
  1424. -
  1425. -static const struct hwmon_chip_info aqr_hwmon_chip_info = {
  1426. - .ops = &aqr_hwmon_ops,
  1427. - .info = aqr_hwmon_info,
  1428. -};
  1429. -
  1430. -int aqr_hwmon_probe(struct phy_device *phydev)
  1431. -{
  1432. - struct device *dev = &phydev->mdio.dev;
  1433. - struct device *hwmon_dev;
  1434. - char *hwmon_name;
  1435. - int i, j;
  1436. -
  1437. - hwmon_name = devm_kstrdup(dev, dev_name(dev), GFP_KERNEL);
  1438. - if (!hwmon_name)
  1439. - return -ENOMEM;
  1440. -
  1441. - for (i = j = 0; hwmon_name[i]; i++) {
  1442. - if (isalnum(hwmon_name[i])) {
  1443. - if (i != j)
  1444. - hwmon_name[j] = hwmon_name[i];
  1445. - j++;
  1446. - }
  1447. - }
  1448. - hwmon_name[j] = '\0';
  1449. -
  1450. - hwmon_dev = devm_hwmon_device_register_with_info(dev, hwmon_name,
  1451. - phydev, &aqr_hwmon_chip_info, NULL);
  1452. -
  1453. - return PTR_ERR_OR_ZERO(hwmon_dev);
  1454. -}
  1455. -
  1456. -#endif
  1457. --- a/drivers/net/phy/aquantia_main.c
  1458. +++ /dev/null
  1459. @@ -1,842 +0,0 @@
  1460. -// SPDX-License-Identifier: GPL-2.0
  1461. -/*
  1462. - * Driver for Aquantia PHY
  1463. - *
  1464. - * Author: Shaohui Xie <[email protected]>
  1465. - *
  1466. - * Copyright 2015 Freescale Semiconductor, Inc.
  1467. - */
  1468. -
  1469. -#include <linux/kernel.h>
  1470. -#include <linux/module.h>
  1471. -#include <linux/delay.h>
  1472. -#include <linux/bitfield.h>
  1473. -#include <linux/phy.h>
  1474. -
  1475. -#include "aquantia.h"
  1476. -
  1477. -#define PHY_ID_AQ1202 0x03a1b445
  1478. -#define PHY_ID_AQ2104 0x03a1b460
  1479. -#define PHY_ID_AQR105 0x03a1b4a2
  1480. -#define PHY_ID_AQR106 0x03a1b4d0
  1481. -#define PHY_ID_AQR107 0x03a1b4e0
  1482. -#define PHY_ID_AQCS109 0x03a1b5c2
  1483. -#define PHY_ID_AQR405 0x03a1b4b0
  1484. -#define PHY_ID_AQR113C 0x31c31c12
  1485. -
  1486. -#define MDIO_PHYXS_VEND_IF_STATUS 0xe812
  1487. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
  1488. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR 0
  1489. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_KX 1
  1490. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI 2
  1491. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII 3
  1492. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_XAUI 4
  1493. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII 6
  1494. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_RXAUI 7
  1495. -#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII 10
  1496. -
  1497. -#define MDIO_AN_VEND_PROV 0xc400
  1498. -#define MDIO_AN_VEND_PROV_1000BASET_FULL BIT(15)
  1499. -#define MDIO_AN_VEND_PROV_1000BASET_HALF BIT(14)
  1500. -#define MDIO_AN_VEND_PROV_5000BASET_FULL BIT(11)
  1501. -#define MDIO_AN_VEND_PROV_2500BASET_FULL BIT(10)
  1502. -#define MDIO_AN_VEND_PROV_DOWNSHIFT_EN BIT(4)
  1503. -#define MDIO_AN_VEND_PROV_DOWNSHIFT_MASK GENMASK(3, 0)
  1504. -#define MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT 4
  1505. -
  1506. -#define MDIO_AN_TX_VEND_STATUS1 0xc800
  1507. -#define MDIO_AN_TX_VEND_STATUS1_RATE_MASK GENMASK(3, 1)
  1508. -#define MDIO_AN_TX_VEND_STATUS1_10BASET 0
  1509. -#define MDIO_AN_TX_VEND_STATUS1_100BASETX 1
  1510. -#define MDIO_AN_TX_VEND_STATUS1_1000BASET 2
  1511. -#define MDIO_AN_TX_VEND_STATUS1_10GBASET 3
  1512. -#define MDIO_AN_TX_VEND_STATUS1_2500BASET 4
  1513. -#define MDIO_AN_TX_VEND_STATUS1_5000BASET 5
  1514. -#define MDIO_AN_TX_VEND_STATUS1_FULL_DUPLEX BIT(0)
  1515. -
  1516. -#define MDIO_AN_TX_VEND_INT_STATUS1 0xcc00
  1517. -#define MDIO_AN_TX_VEND_INT_STATUS1_DOWNSHIFT BIT(1)
  1518. -
  1519. -#define MDIO_AN_TX_VEND_INT_STATUS2 0xcc01
  1520. -#define MDIO_AN_TX_VEND_INT_STATUS2_MASK BIT(0)
  1521. -
  1522. -#define MDIO_AN_TX_VEND_INT_MASK2 0xd401
  1523. -#define MDIO_AN_TX_VEND_INT_MASK2_LINK BIT(0)
  1524. -
  1525. -#define MDIO_AN_RX_LP_STAT1 0xe820
  1526. -#define MDIO_AN_RX_LP_STAT1_1000BASET_FULL BIT(15)
  1527. -#define MDIO_AN_RX_LP_STAT1_1000BASET_HALF BIT(14)
  1528. -#define MDIO_AN_RX_LP_STAT1_SHORT_REACH BIT(13)
  1529. -#define MDIO_AN_RX_LP_STAT1_AQRATE_DOWNSHIFT BIT(12)
  1530. -#define MDIO_AN_RX_LP_STAT1_AQ_PHY BIT(2)
  1531. -
  1532. -#define MDIO_AN_RX_LP_STAT4 0xe823
  1533. -#define MDIO_AN_RX_LP_STAT4_FW_MAJOR GENMASK(15, 8)
  1534. -#define MDIO_AN_RX_LP_STAT4_FW_MINOR GENMASK(7, 0)
  1535. -
  1536. -#define MDIO_AN_RX_VEND_STAT3 0xe832
  1537. -#define MDIO_AN_RX_VEND_STAT3_AFR BIT(0)
  1538. -
  1539. -/* MDIO_MMD_C22EXT */
  1540. -#define MDIO_C22EXT_STAT_SGMII_RX_GOOD_FRAMES 0xd292
  1541. -#define MDIO_C22EXT_STAT_SGMII_RX_BAD_FRAMES 0xd294
  1542. -#define MDIO_C22EXT_STAT_SGMII_RX_FALSE_CARRIER 0xd297
  1543. -#define MDIO_C22EXT_STAT_SGMII_TX_GOOD_FRAMES 0xd313
  1544. -#define MDIO_C22EXT_STAT_SGMII_TX_BAD_FRAMES 0xd315
  1545. -#define MDIO_C22EXT_STAT_SGMII_TX_FALSE_CARRIER 0xd317
  1546. -#define MDIO_C22EXT_STAT_SGMII_TX_COLLISIONS 0xd318
  1547. -#define MDIO_C22EXT_STAT_SGMII_TX_LINE_COLLISIONS 0xd319
  1548. -#define MDIO_C22EXT_STAT_SGMII_TX_FRAME_ALIGN_ERR 0xd31a
  1549. -#define MDIO_C22EXT_STAT_SGMII_TX_RUNT_FRAMES 0xd31b
  1550. -
  1551. -/* Vendor specific 1, MDIO_MMD_VEND1 */
  1552. -#define VEND1_GLOBAL_FW_ID 0x0020
  1553. -#define VEND1_GLOBAL_FW_ID_MAJOR GENMASK(15, 8)
  1554. -#define VEND1_GLOBAL_FW_ID_MINOR GENMASK(7, 0)
  1555. -
  1556. -#define VEND1_GLOBAL_GEN_STAT2 0xc831
  1557. -#define VEND1_GLOBAL_GEN_STAT2_OP_IN_PROG BIT(15)
  1558. -
  1559. -/* The following registers all have similar layouts; first the registers... */
  1560. -#define VEND1_GLOBAL_CFG_10M 0x0310
  1561. -#define VEND1_GLOBAL_CFG_100M 0x031b
  1562. -#define VEND1_GLOBAL_CFG_1G 0x031c
  1563. -#define VEND1_GLOBAL_CFG_2_5G 0x031d
  1564. -#define VEND1_GLOBAL_CFG_5G 0x031e
  1565. -#define VEND1_GLOBAL_CFG_10G 0x031f
  1566. -/* ...and now the fields */
  1567. -#define VEND1_GLOBAL_CFG_RATE_ADAPT GENMASK(8, 7)
  1568. -#define VEND1_GLOBAL_CFG_RATE_ADAPT_NONE 0
  1569. -#define VEND1_GLOBAL_CFG_RATE_ADAPT_USX 1
  1570. -#define VEND1_GLOBAL_CFG_RATE_ADAPT_PAUSE 2
  1571. -
  1572. -#define VEND1_GLOBAL_RSVD_STAT1 0xc885
  1573. -#define VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID GENMASK(7, 4)
  1574. -#define VEND1_GLOBAL_RSVD_STAT1_PROV_ID GENMASK(3, 0)
  1575. -
  1576. -#define VEND1_GLOBAL_RSVD_STAT9 0xc88d
  1577. -#define VEND1_GLOBAL_RSVD_STAT9_MODE GENMASK(7, 0)
  1578. -#define VEND1_GLOBAL_RSVD_STAT9_1000BT2 0x23
  1579. -
  1580. -#define VEND1_GLOBAL_INT_STD_STATUS 0xfc00
  1581. -#define VEND1_GLOBAL_INT_VEND_STATUS 0xfc01
  1582. -
  1583. -#define VEND1_GLOBAL_INT_STD_MASK 0xff00
  1584. -#define VEND1_GLOBAL_INT_STD_MASK_PMA1 BIT(15)
  1585. -#define VEND1_GLOBAL_INT_STD_MASK_PMA2 BIT(14)
  1586. -#define VEND1_GLOBAL_INT_STD_MASK_PCS1 BIT(13)
  1587. -#define VEND1_GLOBAL_INT_STD_MASK_PCS2 BIT(12)
  1588. -#define VEND1_GLOBAL_INT_STD_MASK_PCS3 BIT(11)
  1589. -#define VEND1_GLOBAL_INT_STD_MASK_PHY_XS1 BIT(10)
  1590. -#define VEND1_GLOBAL_INT_STD_MASK_PHY_XS2 BIT(9)
  1591. -#define VEND1_GLOBAL_INT_STD_MASK_AN1 BIT(8)
  1592. -#define VEND1_GLOBAL_INT_STD_MASK_AN2 BIT(7)
  1593. -#define VEND1_GLOBAL_INT_STD_MASK_GBE BIT(6)
  1594. -#define VEND1_GLOBAL_INT_STD_MASK_ALL BIT(0)
  1595. -
  1596. -#define VEND1_GLOBAL_INT_VEND_MASK 0xff01
  1597. -#define VEND1_GLOBAL_INT_VEND_MASK_PMA BIT(15)
  1598. -#define VEND1_GLOBAL_INT_VEND_MASK_PCS BIT(14)
  1599. -#define VEND1_GLOBAL_INT_VEND_MASK_PHY_XS BIT(13)
  1600. -#define VEND1_GLOBAL_INT_VEND_MASK_AN BIT(12)
  1601. -#define VEND1_GLOBAL_INT_VEND_MASK_GBE BIT(11)
  1602. -#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL1 BIT(2)
  1603. -#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL2 BIT(1)
  1604. -#define VEND1_GLOBAL_INT_VEND_MASK_GLOBAL3 BIT(0)
  1605. -
  1606. -/* Sleep and timeout for checking if the Processor-Intensive
  1607. - * MDIO operation is finished
  1608. - */
  1609. -#define AQR107_OP_IN_PROG_SLEEP 1000
  1610. -#define AQR107_OP_IN_PROG_TIMEOUT 100000
  1611. -
  1612. -struct aqr107_hw_stat {
  1613. - const char *name;
  1614. - int reg;
  1615. - int size;
  1616. -};
  1617. -
  1618. -#define SGMII_STAT(n, r, s) { n, MDIO_C22EXT_STAT_SGMII_ ## r, s }
  1619. -static const struct aqr107_hw_stat aqr107_hw_stats[] = {
  1620. - SGMII_STAT("sgmii_rx_good_frames", RX_GOOD_FRAMES, 26),
  1621. - SGMII_STAT("sgmii_rx_bad_frames", RX_BAD_FRAMES, 26),
  1622. - SGMII_STAT("sgmii_rx_false_carrier_events", RX_FALSE_CARRIER, 8),
  1623. - SGMII_STAT("sgmii_tx_good_frames", TX_GOOD_FRAMES, 26),
  1624. - SGMII_STAT("sgmii_tx_bad_frames", TX_BAD_FRAMES, 26),
  1625. - SGMII_STAT("sgmii_tx_false_carrier_events", TX_FALSE_CARRIER, 8),
  1626. - SGMII_STAT("sgmii_tx_collisions", TX_COLLISIONS, 8),
  1627. - SGMII_STAT("sgmii_tx_line_collisions", TX_LINE_COLLISIONS, 8),
  1628. - SGMII_STAT("sgmii_tx_frame_alignment_err", TX_FRAME_ALIGN_ERR, 16),
  1629. - SGMII_STAT("sgmii_tx_runt_frames", TX_RUNT_FRAMES, 22),
  1630. -};
  1631. -#define AQR107_SGMII_STAT_SZ ARRAY_SIZE(aqr107_hw_stats)
  1632. -
  1633. -struct aqr107_priv {
  1634. - u64 sgmii_stats[AQR107_SGMII_STAT_SZ];
  1635. -};
  1636. -
  1637. -static int aqr107_get_sset_count(struct phy_device *phydev)
  1638. -{
  1639. - return AQR107_SGMII_STAT_SZ;
  1640. -}
  1641. -
  1642. -static void aqr107_get_strings(struct phy_device *phydev, u8 *data)
  1643. -{
  1644. - int i;
  1645. -
  1646. - for (i = 0; i < AQR107_SGMII_STAT_SZ; i++)
  1647. - strscpy(data + i * ETH_GSTRING_LEN, aqr107_hw_stats[i].name,
  1648. - ETH_GSTRING_LEN);
  1649. -}
  1650. -
  1651. -static u64 aqr107_get_stat(struct phy_device *phydev, int index)
  1652. -{
  1653. - const struct aqr107_hw_stat *stat = aqr107_hw_stats + index;
  1654. - int len_l = min(stat->size, 16);
  1655. - int len_h = stat->size - len_l;
  1656. - u64 ret;
  1657. - int val;
  1658. -
  1659. - val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
  1660. - if (val < 0)
  1661. - return U64_MAX;
  1662. -
  1663. - ret = val & GENMASK(len_l - 1, 0);
  1664. - if (len_h) {
  1665. - val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg + 1);
  1666. - if (val < 0)
  1667. - return U64_MAX;
  1668. -
  1669. - ret += (val & GENMASK(len_h - 1, 0)) << 16;
  1670. - }
  1671. -
  1672. - return ret;
  1673. -}
  1674. -
  1675. -static void aqr107_get_stats(struct phy_device *phydev,
  1676. - struct ethtool_stats *stats, u64 *data)
  1677. -{
  1678. - struct aqr107_priv *priv = phydev->priv;
  1679. - u64 val;
  1680. - int i;
  1681. -
  1682. - for (i = 0; i < AQR107_SGMII_STAT_SZ; i++) {
  1683. - val = aqr107_get_stat(phydev, i);
  1684. - if (val == U64_MAX)
  1685. - phydev_err(phydev, "Reading HW Statistics failed for %s\n",
  1686. - aqr107_hw_stats[i].name);
  1687. - else
  1688. - priv->sgmii_stats[i] += val;
  1689. -
  1690. - data[i] = priv->sgmii_stats[i];
  1691. - }
  1692. -}
  1693. -
  1694. -static int aqr_config_aneg(struct phy_device *phydev)
  1695. -{
  1696. - bool changed = false;
  1697. - u16 reg;
  1698. - int ret;
  1699. -
  1700. - if (phydev->autoneg == AUTONEG_DISABLE)
  1701. - return genphy_c45_pma_setup_forced(phydev);
  1702. -
  1703. - ret = genphy_c45_an_config_aneg(phydev);
  1704. - if (ret < 0)
  1705. - return ret;
  1706. - if (ret > 0)
  1707. - changed = true;
  1708. -
  1709. - /* Clause 45 has no standardized support for 1000BaseT, therefore
  1710. - * use vendor registers for this mode.
  1711. - */
  1712. - reg = 0;
  1713. - if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  1714. - phydev->advertising))
  1715. - reg |= MDIO_AN_VEND_PROV_1000BASET_FULL;
  1716. -
  1717. - if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
  1718. - phydev->advertising))
  1719. - reg |= MDIO_AN_VEND_PROV_1000BASET_HALF;
  1720. -
  1721. - /* Handle the case when the 2.5G and 5G speeds are not advertised */
  1722. - if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1723. - phydev->advertising))
  1724. - reg |= MDIO_AN_VEND_PROV_2500BASET_FULL;
  1725. -
  1726. - if (linkmode_test_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT,
  1727. - phydev->advertising))
  1728. - reg |= MDIO_AN_VEND_PROV_5000BASET_FULL;
  1729. -
  1730. - ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV,
  1731. - MDIO_AN_VEND_PROV_1000BASET_HALF |
  1732. - MDIO_AN_VEND_PROV_1000BASET_FULL |
  1733. - MDIO_AN_VEND_PROV_2500BASET_FULL |
  1734. - MDIO_AN_VEND_PROV_5000BASET_FULL, reg);
  1735. - if (ret < 0)
  1736. - return ret;
  1737. - if (ret > 0)
  1738. - changed = true;
  1739. -
  1740. - return genphy_c45_check_and_restart_aneg(phydev, changed);
  1741. -}
  1742. -
  1743. -static int aqr_config_intr(struct phy_device *phydev)
  1744. -{
  1745. - bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED;
  1746. - int err;
  1747. -
  1748. - if (en) {
  1749. - /* Clear any pending interrupts before enabling them */
  1750. - err = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_STATUS2);
  1751. - if (err < 0)
  1752. - return err;
  1753. - }
  1754. -
  1755. - err = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_MASK2,
  1756. - en ? MDIO_AN_TX_VEND_INT_MASK2_LINK : 0);
  1757. - if (err < 0)
  1758. - return err;
  1759. -
  1760. - err = phy_write_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_INT_STD_MASK,
  1761. - en ? VEND1_GLOBAL_INT_STD_MASK_ALL : 0);
  1762. - if (err < 0)
  1763. - return err;
  1764. -
  1765. - err = phy_write_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_INT_VEND_MASK,
  1766. - en ? VEND1_GLOBAL_INT_VEND_MASK_GLOBAL3 |
  1767. - VEND1_GLOBAL_INT_VEND_MASK_AN : 0);
  1768. - if (err < 0)
  1769. - return err;
  1770. -
  1771. - if (!en) {
  1772. - /* Clear any pending interrupts after we have disabled them */
  1773. - err = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_INT_STATUS2);
  1774. - if (err < 0)
  1775. - return err;
  1776. - }
  1777. -
  1778. - return 0;
  1779. -}
  1780. -
  1781. -static irqreturn_t aqr_handle_interrupt(struct phy_device *phydev)
  1782. -{
  1783. - int irq_status;
  1784. -
  1785. - irq_status = phy_read_mmd(phydev, MDIO_MMD_AN,
  1786. - MDIO_AN_TX_VEND_INT_STATUS2);
  1787. - if (irq_status < 0) {
  1788. - phy_error(phydev);
  1789. - return IRQ_NONE;
  1790. - }
  1791. -
  1792. - if (!(irq_status & MDIO_AN_TX_VEND_INT_STATUS2_MASK))
  1793. - return IRQ_NONE;
  1794. -
  1795. - phy_trigger_machine(phydev);
  1796. -
  1797. - return IRQ_HANDLED;
  1798. -}
  1799. -
  1800. -static int aqr_read_status(struct phy_device *phydev)
  1801. -{
  1802. - int val;
  1803. -
  1804. - if (phydev->autoneg == AUTONEG_ENABLE) {
  1805. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT1);
  1806. - if (val < 0)
  1807. - return val;
  1808. -
  1809. - linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  1810. - phydev->lp_advertising,
  1811. - val & MDIO_AN_RX_LP_STAT1_1000BASET_FULL);
  1812. - linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
  1813. - phydev->lp_advertising,
  1814. - val & MDIO_AN_RX_LP_STAT1_1000BASET_HALF);
  1815. - }
  1816. -
  1817. - return genphy_c45_read_status(phydev);
  1818. -}
  1819. -
  1820. -static int aqr107_read_rate(struct phy_device *phydev)
  1821. -{
  1822. - u32 config_reg;
  1823. - int val;
  1824. -
  1825. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_TX_VEND_STATUS1);
  1826. - if (val < 0)
  1827. - return val;
  1828. -
  1829. - if (val & MDIO_AN_TX_VEND_STATUS1_FULL_DUPLEX)
  1830. - phydev->duplex = DUPLEX_FULL;
  1831. - else
  1832. - phydev->duplex = DUPLEX_HALF;
  1833. -
  1834. - switch (FIELD_GET(MDIO_AN_TX_VEND_STATUS1_RATE_MASK, val)) {
  1835. - case MDIO_AN_TX_VEND_STATUS1_10BASET:
  1836. - phydev->speed = SPEED_10;
  1837. - config_reg = VEND1_GLOBAL_CFG_10M;
  1838. - break;
  1839. - case MDIO_AN_TX_VEND_STATUS1_100BASETX:
  1840. - phydev->speed = SPEED_100;
  1841. - config_reg = VEND1_GLOBAL_CFG_100M;
  1842. - break;
  1843. - case MDIO_AN_TX_VEND_STATUS1_1000BASET:
  1844. - phydev->speed = SPEED_1000;
  1845. - config_reg = VEND1_GLOBAL_CFG_1G;
  1846. - break;
  1847. - case MDIO_AN_TX_VEND_STATUS1_2500BASET:
  1848. - phydev->speed = SPEED_2500;
  1849. - config_reg = VEND1_GLOBAL_CFG_2_5G;
  1850. - break;
  1851. - case MDIO_AN_TX_VEND_STATUS1_5000BASET:
  1852. - phydev->speed = SPEED_5000;
  1853. - config_reg = VEND1_GLOBAL_CFG_5G;
  1854. - break;
  1855. - case MDIO_AN_TX_VEND_STATUS1_10GBASET:
  1856. - phydev->speed = SPEED_10000;
  1857. - config_reg = VEND1_GLOBAL_CFG_10G;
  1858. - break;
  1859. - default:
  1860. - phydev->speed = SPEED_UNKNOWN;
  1861. - return 0;
  1862. - }
  1863. -
  1864. - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, config_reg);
  1865. - if (val < 0)
  1866. - return val;
  1867. -
  1868. - if (FIELD_GET(VEND1_GLOBAL_CFG_RATE_ADAPT, val) ==
  1869. - VEND1_GLOBAL_CFG_RATE_ADAPT_PAUSE)
  1870. - phydev->rate_matching = RATE_MATCH_PAUSE;
  1871. - else
  1872. - phydev->rate_matching = RATE_MATCH_NONE;
  1873. -
  1874. - return 0;
  1875. -}
  1876. -
  1877. -static int aqr107_read_status(struct phy_device *phydev)
  1878. -{
  1879. - int val, ret;
  1880. -
  1881. - ret = aqr_read_status(phydev);
  1882. - if (ret)
  1883. - return ret;
  1884. -
  1885. - if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
  1886. - return 0;
  1887. -
  1888. - val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
  1889. - if (val < 0)
  1890. - return val;
  1891. -
  1892. - switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
  1893. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
  1894. - phydev->interface = PHY_INTERFACE_MODE_10GKR;
  1895. - break;
  1896. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KX:
  1897. - phydev->interface = PHY_INTERFACE_MODE_1000BASEKX;
  1898. - break;
  1899. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
  1900. - phydev->interface = PHY_INTERFACE_MODE_10GBASER;
  1901. - break;
  1902. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
  1903. - phydev->interface = PHY_INTERFACE_MODE_USXGMII;
  1904. - break;
  1905. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XAUI:
  1906. - phydev->interface = PHY_INTERFACE_MODE_XAUI;
  1907. - break;
  1908. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
  1909. - phydev->interface = PHY_INTERFACE_MODE_SGMII;
  1910. - break;
  1911. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_RXAUI:
  1912. - phydev->interface = PHY_INTERFACE_MODE_RXAUI;
  1913. - break;
  1914. - case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
  1915. - phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  1916. - break;
  1917. - default:
  1918. - phydev->interface = PHY_INTERFACE_MODE_NA;
  1919. - break;
  1920. - }
  1921. -
  1922. - /* Read possibly downshifted rate from vendor register */
  1923. - return aqr107_read_rate(phydev);
  1924. -}
  1925. -
  1926. -static int aqr107_get_downshift(struct phy_device *phydev, u8 *data)
  1927. -{
  1928. - int val, cnt, enable;
  1929. -
  1930. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV);
  1931. - if (val < 0)
  1932. - return val;
  1933. -
  1934. - enable = FIELD_GET(MDIO_AN_VEND_PROV_DOWNSHIFT_EN, val);
  1935. - cnt = FIELD_GET(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, val);
  1936. -
  1937. - *data = enable && cnt ? cnt : DOWNSHIFT_DEV_DISABLE;
  1938. -
  1939. - return 0;
  1940. -}
  1941. -
  1942. -static int aqr107_set_downshift(struct phy_device *phydev, u8 cnt)
  1943. -{
  1944. - int val = 0;
  1945. -
  1946. - if (!FIELD_FIT(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, cnt))
  1947. - return -E2BIG;
  1948. -
  1949. - if (cnt != DOWNSHIFT_DEV_DISABLE) {
  1950. - val = MDIO_AN_VEND_PROV_DOWNSHIFT_EN;
  1951. - val |= FIELD_PREP(MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, cnt);
  1952. - }
  1953. -
  1954. - return phy_modify_mmd(phydev, MDIO_MMD_AN, MDIO_AN_VEND_PROV,
  1955. - MDIO_AN_VEND_PROV_DOWNSHIFT_EN |
  1956. - MDIO_AN_VEND_PROV_DOWNSHIFT_MASK, val);
  1957. -}
  1958. -
  1959. -static int aqr107_get_tunable(struct phy_device *phydev,
  1960. - struct ethtool_tunable *tuna, void *data)
  1961. -{
  1962. - switch (tuna->id) {
  1963. - case ETHTOOL_PHY_DOWNSHIFT:
  1964. - return aqr107_get_downshift(phydev, data);
  1965. - default:
  1966. - return -EOPNOTSUPP;
  1967. - }
  1968. -}
  1969. -
  1970. -static int aqr107_set_tunable(struct phy_device *phydev,
  1971. - struct ethtool_tunable *tuna, const void *data)
  1972. -{
  1973. - switch (tuna->id) {
  1974. - case ETHTOOL_PHY_DOWNSHIFT:
  1975. - return aqr107_set_downshift(phydev, *(const u8 *)data);
  1976. - default:
  1977. - return -EOPNOTSUPP;
  1978. - }
  1979. -}
  1980. -
  1981. -/* If we configure settings whilst firmware is still initializing the chip,
  1982. - * then these settings may be overwritten. Therefore make sure chip
  1983. - * initialization has completed. Use presence of the firmware ID as
  1984. - * indicator for initialization having completed.
  1985. - * The chip also provides a "reset completed" bit, but it's cleared after
  1986. - * read. Therefore function would time out if called again.
  1987. - */
  1988. -static int aqr107_wait_reset_complete(struct phy_device *phydev)
  1989. -{
  1990. - int val;
  1991. -
  1992. - return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  1993. - VEND1_GLOBAL_FW_ID, val, val != 0,
  1994. - 20000, 2000000, false);
  1995. -}
  1996. -
  1997. -static void aqr107_chip_info(struct phy_device *phydev)
  1998. -{
  1999. - u8 fw_major, fw_minor, build_id, prov_id;
  2000. - int val;
  2001. -
  2002. - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_FW_ID);
  2003. - if (val < 0)
  2004. - return;
  2005. -
  2006. - fw_major = FIELD_GET(VEND1_GLOBAL_FW_ID_MAJOR, val);
  2007. - fw_minor = FIELD_GET(VEND1_GLOBAL_FW_ID_MINOR, val);
  2008. -
  2009. - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_RSVD_STAT1);
  2010. - if (val < 0)
  2011. - return;
  2012. -
  2013. - build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
  2014. - prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
  2015. -
  2016. - phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
  2017. - fw_major, fw_minor, build_id, prov_id);
  2018. -}
  2019. -
  2020. -static int aqr107_config_init(struct phy_device *phydev)
  2021. -{
  2022. - int ret;
  2023. -
  2024. - /* Check that the PHY interface type is compatible */
  2025. - if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
  2026. - phydev->interface != PHY_INTERFACE_MODE_1000BASEKX &&
  2027. - phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
  2028. - phydev->interface != PHY_INTERFACE_MODE_XGMII &&
  2029. - phydev->interface != PHY_INTERFACE_MODE_USXGMII &&
  2030. - phydev->interface != PHY_INTERFACE_MODE_10GKR &&
  2031. - phydev->interface != PHY_INTERFACE_MODE_10GBASER &&
  2032. - phydev->interface != PHY_INTERFACE_MODE_XAUI &&
  2033. - phydev->interface != PHY_INTERFACE_MODE_RXAUI)
  2034. - return -ENODEV;
  2035. -
  2036. - WARN(phydev->interface == PHY_INTERFACE_MODE_XGMII,
  2037. - "Your devicetree is out of date, please update it. The AQR107 family doesn't support XGMII, maybe you mean USXGMII.\n");
  2038. -
  2039. - ret = aqr107_wait_reset_complete(phydev);
  2040. - if (!ret)
  2041. - aqr107_chip_info(phydev);
  2042. -
  2043. - return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
  2044. -}
  2045. -
  2046. -static int aqcs109_config_init(struct phy_device *phydev)
  2047. -{
  2048. - int ret;
  2049. -
  2050. - /* Check that the PHY interface type is compatible */
  2051. - if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
  2052. - phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
  2053. - return -ENODEV;
  2054. -
  2055. - ret = aqr107_wait_reset_complete(phydev);
  2056. - if (!ret)
  2057. - aqr107_chip_info(phydev);
  2058. -
  2059. - /* AQCS109 belongs to a chip family partially supporting 10G and 5G.
  2060. - * PMA speed ability bits are the same for all members of the family,
  2061. - * AQCS109 however supports speeds up to 2.5G only.
  2062. - */
  2063. - phy_set_max_speed(phydev, SPEED_2500);
  2064. -
  2065. - return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
  2066. -}
  2067. -
  2068. -static void aqr107_link_change_notify(struct phy_device *phydev)
  2069. -{
  2070. - u8 fw_major, fw_minor;
  2071. - bool downshift, short_reach, afr;
  2072. - int mode, val;
  2073. -
  2074. - if (phydev->state != PHY_RUNNING || phydev->autoneg == AUTONEG_DISABLE)
  2075. - return;
  2076. -
  2077. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT1);
  2078. - /* call failed or link partner is no Aquantia PHY */
  2079. - if (val < 0 || !(val & MDIO_AN_RX_LP_STAT1_AQ_PHY))
  2080. - return;
  2081. -
  2082. - short_reach = val & MDIO_AN_RX_LP_STAT1_SHORT_REACH;
  2083. - downshift = val & MDIO_AN_RX_LP_STAT1_AQRATE_DOWNSHIFT;
  2084. -
  2085. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_LP_STAT4);
  2086. - if (val < 0)
  2087. - return;
  2088. -
  2089. - fw_major = FIELD_GET(MDIO_AN_RX_LP_STAT4_FW_MAJOR, val);
  2090. - fw_minor = FIELD_GET(MDIO_AN_RX_LP_STAT4_FW_MINOR, val);
  2091. -
  2092. - val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_RX_VEND_STAT3);
  2093. - if (val < 0)
  2094. - return;
  2095. -
  2096. - afr = val & MDIO_AN_RX_VEND_STAT3_AFR;
  2097. -
  2098. - phydev_dbg(phydev, "Link partner is Aquantia PHY, FW %u.%u%s%s%s\n",
  2099. - fw_major, fw_minor,
  2100. - short_reach ? ", short reach mode" : "",
  2101. - downshift ? ", fast-retrain downshift advertised" : "",
  2102. - afr ? ", fast reframe advertised" : "");
  2103. -
  2104. - val = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_GLOBAL_RSVD_STAT9);
  2105. - if (val < 0)
  2106. - return;
  2107. -
  2108. - mode = FIELD_GET(VEND1_GLOBAL_RSVD_STAT9_MODE, val);
  2109. - if (mode == VEND1_GLOBAL_RSVD_STAT9_1000BT2)
  2110. - phydev_info(phydev, "Aquantia 1000Base-T2 mode active\n");
  2111. -}
  2112. -
  2113. -static int aqr107_wait_processor_intensive_op(struct phy_device *phydev)
  2114. -{
  2115. - int val, err;
  2116. -
  2117. - /* The datasheet notes to wait at least 1ms after issuing a
  2118. - * processor intensive operation before checking.
  2119. - * We cannot use the 'sleep_before_read' parameter of read_poll_timeout
  2120. - * because that just determines the maximum time slept, not the minimum.
  2121. - */
  2122. - usleep_range(1000, 5000);
  2123. -
  2124. - err = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  2125. - VEND1_GLOBAL_GEN_STAT2, val,
  2126. - !(val & VEND1_GLOBAL_GEN_STAT2_OP_IN_PROG),
  2127. - AQR107_OP_IN_PROG_SLEEP,
  2128. - AQR107_OP_IN_PROG_TIMEOUT, false);
  2129. - if (err) {
  2130. - phydev_err(phydev, "timeout: processor-intensive MDIO operation\n");
  2131. - return err;
  2132. - }
  2133. -
  2134. - return 0;
  2135. -}
  2136. -
  2137. -static int aqr107_get_rate_matching(struct phy_device *phydev,
  2138. - phy_interface_t iface)
  2139. -{
  2140. - if (iface == PHY_INTERFACE_MODE_10GBASER ||
  2141. - iface == PHY_INTERFACE_MODE_2500BASEX ||
  2142. - iface == PHY_INTERFACE_MODE_NA)
  2143. - return RATE_MATCH_PAUSE;
  2144. - return RATE_MATCH_NONE;
  2145. -}
  2146. -
  2147. -static int aqr107_suspend(struct phy_device *phydev)
  2148. -{
  2149. - int err;
  2150. -
  2151. - err = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1,
  2152. - MDIO_CTRL1_LPOWER);
  2153. - if (err)
  2154. - return err;
  2155. -
  2156. - return aqr107_wait_processor_intensive_op(phydev);
  2157. -}
  2158. -
  2159. -static int aqr107_resume(struct phy_device *phydev)
  2160. -{
  2161. - int err;
  2162. -
  2163. - err = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1,
  2164. - MDIO_CTRL1_LPOWER);
  2165. - if (err)
  2166. - return err;
  2167. -
  2168. - return aqr107_wait_processor_intensive_op(phydev);
  2169. -}
  2170. -
  2171. -static int aqr107_probe(struct phy_device *phydev)
  2172. -{
  2173. - phydev->priv = devm_kzalloc(&phydev->mdio.dev,
  2174. - sizeof(struct aqr107_priv), GFP_KERNEL);
  2175. - if (!phydev->priv)
  2176. - return -ENOMEM;
  2177. -
  2178. - return aqr_hwmon_probe(phydev);
  2179. -}
  2180. -
  2181. -static struct phy_driver aqr_driver[] = {
  2182. -{
  2183. - PHY_ID_MATCH_MODEL(PHY_ID_AQ1202),
  2184. - .name = "Aquantia AQ1202",
  2185. - .config_aneg = aqr_config_aneg,
  2186. - .config_intr = aqr_config_intr,
  2187. - .handle_interrupt = aqr_handle_interrupt,
  2188. - .read_status = aqr_read_status,
  2189. -},
  2190. -{
  2191. - PHY_ID_MATCH_MODEL(PHY_ID_AQ2104),
  2192. - .name = "Aquantia AQ2104",
  2193. - .config_aneg = aqr_config_aneg,
  2194. - .config_intr = aqr_config_intr,
  2195. - .handle_interrupt = aqr_handle_interrupt,
  2196. - .read_status = aqr_read_status,
  2197. -},
  2198. -{
  2199. - PHY_ID_MATCH_MODEL(PHY_ID_AQR105),
  2200. - .name = "Aquantia AQR105",
  2201. - .config_aneg = aqr_config_aneg,
  2202. - .config_intr = aqr_config_intr,
  2203. - .handle_interrupt = aqr_handle_interrupt,
  2204. - .read_status = aqr_read_status,
  2205. - .suspend = aqr107_suspend,
  2206. - .resume = aqr107_resume,
  2207. -},
  2208. -{
  2209. - PHY_ID_MATCH_MODEL(PHY_ID_AQR106),
  2210. - .name = "Aquantia AQR106",
  2211. - .config_aneg = aqr_config_aneg,
  2212. - .config_intr = aqr_config_intr,
  2213. - .handle_interrupt = aqr_handle_interrupt,
  2214. - .read_status = aqr_read_status,
  2215. -},
  2216. -{
  2217. - PHY_ID_MATCH_MODEL(PHY_ID_AQR107),
  2218. - .name = "Aquantia AQR107",
  2219. - .probe = aqr107_probe,
  2220. - .get_rate_matching = aqr107_get_rate_matching,
  2221. - .config_init = aqr107_config_init,
  2222. - .config_aneg = aqr_config_aneg,
  2223. - .config_intr = aqr_config_intr,
  2224. - .handle_interrupt = aqr_handle_interrupt,
  2225. - .read_status = aqr107_read_status,
  2226. - .get_tunable = aqr107_get_tunable,
  2227. - .set_tunable = aqr107_set_tunable,
  2228. - .suspend = aqr107_suspend,
  2229. - .resume = aqr107_resume,
  2230. - .get_sset_count = aqr107_get_sset_count,
  2231. - .get_strings = aqr107_get_strings,
  2232. - .get_stats = aqr107_get_stats,
  2233. - .link_change_notify = aqr107_link_change_notify,
  2234. -},
  2235. -{
  2236. - PHY_ID_MATCH_MODEL(PHY_ID_AQCS109),
  2237. - .name = "Aquantia AQCS109",
  2238. - .probe = aqr107_probe,
  2239. - .get_rate_matching = aqr107_get_rate_matching,
  2240. - .config_init = aqcs109_config_init,
  2241. - .config_aneg = aqr_config_aneg,
  2242. - .config_intr = aqr_config_intr,
  2243. - .handle_interrupt = aqr_handle_interrupt,
  2244. - .read_status = aqr107_read_status,
  2245. - .get_tunable = aqr107_get_tunable,
  2246. - .set_tunable = aqr107_set_tunable,
  2247. - .suspend = aqr107_suspend,
  2248. - .resume = aqr107_resume,
  2249. - .get_sset_count = aqr107_get_sset_count,
  2250. - .get_strings = aqr107_get_strings,
  2251. - .get_stats = aqr107_get_stats,
  2252. - .link_change_notify = aqr107_link_change_notify,
  2253. -},
  2254. -{
  2255. - PHY_ID_MATCH_MODEL(PHY_ID_AQR405),
  2256. - .name = "Aquantia AQR405",
  2257. - .config_aneg = aqr_config_aneg,
  2258. - .config_intr = aqr_config_intr,
  2259. - .handle_interrupt = aqr_handle_interrupt,
  2260. - .read_status = aqr_read_status,
  2261. -},
  2262. -{
  2263. - PHY_ID_MATCH_MODEL(PHY_ID_AQR113C),
  2264. - .name = "Aquantia AQR113C",
  2265. - .probe = aqr107_probe,
  2266. - .get_rate_matching = aqr107_get_rate_matching,
  2267. - .config_init = aqr107_config_init,
  2268. - .config_aneg = aqr_config_aneg,
  2269. - .config_intr = aqr_config_intr,
  2270. - .handle_interrupt = aqr_handle_interrupt,
  2271. - .read_status = aqr107_read_status,
  2272. - .get_tunable = aqr107_get_tunable,
  2273. - .set_tunable = aqr107_set_tunable,
  2274. - .suspend = aqr107_suspend,
  2275. - .resume = aqr107_resume,
  2276. - .get_sset_count = aqr107_get_sset_count,
  2277. - .get_strings = aqr107_get_strings,
  2278. - .get_stats = aqr107_get_stats,
  2279. - .link_change_notify = aqr107_link_change_notify,
  2280. -},
  2281. -};
  2282. -
  2283. -module_phy_driver(aqr_driver);
  2284. -
  2285. -static struct mdio_device_id __maybe_unused aqr_tbl[] = {
  2286. - { PHY_ID_MATCH_MODEL(PHY_ID_AQ1202) },
  2287. - { PHY_ID_MATCH_MODEL(PHY_ID_AQ2104) },
  2288. - { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) },
  2289. - { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) },
  2290. - { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) },
  2291. - { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
  2292. - { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
  2293. - { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
  2294. - { }
  2295. -};
  2296. -
  2297. -MODULE_DEVICE_TABLE(mdio, aqr_tbl);
  2298. -
  2299. -MODULE_DESCRIPTION("Aquantia PHY driver");
  2300. -MODULE_AUTHOR("Shaohui Xie <[email protected]>");
  2301. -MODULE_LICENSE("GPL v2");