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

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