mdio_bus.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /* MDIO Bus interface
  3. *
  4. * Author: Andy Fleming
  5. *
  6. * Copyright (c) 2004 Freescale Semiconductor, Inc.
  7. */
  8. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  9. #include <linux/device.h>
  10. #include <linux/errno.h>
  11. #include <linux/etherdevice.h>
  12. #include <linux/ethtool.h>
  13. #include <linux/gpio/consumer.h>
  14. #include <linux/init.h>
  15. #include <linux/io.h>
  16. #include <linux/kernel.h>
  17. #include <linux/mii.h>
  18. #include <linux/mm.h>
  19. #include <linux/module.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/of_device.h>
  22. #include <linux/of_mdio.h>
  23. #include <linux/phy.h>
  24. #include <linux/reset.h>
  25. #include <linux/slab.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/string.h>
  28. #include <linux/uaccess.h>
  29. #include <linux/unistd.h>
  30. #include "mdio-private.h"
  31. #define CREATE_TRACE_POINTS
  32. #include <trace/events/mdio.h>
  33. int mdiobus_register_device(struct mdio_device *mdiodev)
  34. {
  35. int err;
  36. if (mdiodev->bus->mdio_map[mdiodev->addr])
  37. return -EBUSY;
  38. if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) {
  39. err = mdio_device_register_reset(mdiodev);
  40. if (err)
  41. return err;
  42. /* Assert the reset signal */
  43. mdio_device_reset(mdiodev, 1);
  44. }
  45. mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;
  46. return 0;
  47. }
  48. EXPORT_SYMBOL(mdiobus_register_device);
  49. int mdiobus_unregister_device(struct mdio_device *mdiodev)
  50. {
  51. if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev)
  52. return -EINVAL;
  53. mdio_device_unregister_reset(mdiodev);
  54. mdiodev->bus->mdio_map[mdiodev->addr] = NULL;
  55. return 0;
  56. }
  57. EXPORT_SYMBOL(mdiobus_unregister_device);
  58. static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr)
  59. {
  60. bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map);
  61. if (WARN_ONCE(!addr_valid, "addr %d out of range\n", addr))
  62. return NULL;
  63. return bus->mdio_map[addr];
  64. }
  65. struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr)
  66. {
  67. struct mdio_device *mdiodev;
  68. mdiodev = mdiobus_find_device(bus, addr);
  69. if (!mdiodev)
  70. return NULL;
  71. if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY))
  72. return NULL;
  73. return container_of(mdiodev, struct phy_device, mdio);
  74. }
  75. EXPORT_SYMBOL(mdiobus_get_phy);
  76. bool mdiobus_is_registered_device(struct mii_bus *bus, int addr)
  77. {
  78. return mdiobus_find_device(bus, addr) != NULL;
  79. }
  80. EXPORT_SYMBOL(mdiobus_is_registered_device);
  81. /**
  82. * mdiobus_release - mii_bus device release callback
  83. * @d: the target struct device that contains the mii_bus
  84. *
  85. * Description: called when the last reference to an mii_bus is
  86. * dropped, to free the underlying memory.
  87. */
  88. static void mdiobus_release(struct device *d)
  89. {
  90. struct mii_bus *bus = to_mii_bus(d);
  91. WARN(bus->state != MDIOBUS_RELEASED &&
  92. /* for compatibility with error handling in drivers */
  93. bus->state != MDIOBUS_ALLOCATED,
  94. "%s: not in RELEASED or ALLOCATED state\n",
  95. bus->id);
  96. if (bus->state == MDIOBUS_RELEASED)
  97. fwnode_handle_put(dev_fwnode(d));
  98. kfree(bus);
  99. }
  100. struct mdio_bus_stat_attr {
  101. int addr;
  102. unsigned int field_offset;
  103. };
  104. static u64 mdio_bus_get_stat(struct mdio_bus_stats *s, unsigned int offset)
  105. {
  106. const char *p = (const char *)s + offset;
  107. unsigned int start;
  108. u64 val = 0;
  109. do {
  110. start = u64_stats_fetch_begin(&s->syncp);
  111. val = u64_stats_read((const u64_stats_t *)p);
  112. } while (u64_stats_fetch_retry(&s->syncp, start));
  113. return val;
  114. }
  115. static u64 mdio_bus_get_global_stat(struct mii_bus *bus, unsigned int offset)
  116. {
  117. unsigned int i;
  118. u64 val = 0;
  119. for (i = 0; i < PHY_MAX_ADDR; i++)
  120. val += mdio_bus_get_stat(&bus->stats[i], offset);
  121. return val;
  122. }
  123. static ssize_t mdio_bus_stat_field_show(struct device *dev,
  124. struct device_attribute *attr,
  125. char *buf)
  126. {
  127. struct mii_bus *bus = to_mii_bus(dev);
  128. struct mdio_bus_stat_attr *sattr;
  129. struct dev_ext_attribute *eattr;
  130. u64 val;
  131. eattr = container_of(attr, struct dev_ext_attribute, attr);
  132. sattr = eattr->var;
  133. if (sattr->addr < 0)
  134. val = mdio_bus_get_global_stat(bus, sattr->field_offset);
  135. else
  136. val = mdio_bus_get_stat(&bus->stats[sattr->addr],
  137. sattr->field_offset);
  138. return sysfs_emit(buf, "%llu\n", val);
  139. }
  140. static ssize_t mdio_bus_device_stat_field_show(struct device *dev,
  141. struct device_attribute *attr,
  142. char *buf)
  143. {
  144. struct mdio_device *mdiodev = to_mdio_device(dev);
  145. struct mii_bus *bus = mdiodev->bus;
  146. struct mdio_bus_stat_attr *sattr;
  147. struct dev_ext_attribute *eattr;
  148. int addr = mdiodev->addr;
  149. u64 val;
  150. eattr = container_of(attr, struct dev_ext_attribute, attr);
  151. sattr = eattr->var;
  152. val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset);
  153. return sysfs_emit(buf, "%llu\n", val);
  154. }
  155. #define MDIO_BUS_STATS_ATTR_DECL(field, file) \
  156. static struct dev_ext_attribute dev_attr_mdio_bus_##field = { \
  157. .attr = { .attr = { .name = file, .mode = 0444 }, \
  158. .show = mdio_bus_stat_field_show, \
  159. }, \
  160. .var = &((struct mdio_bus_stat_attr) { \
  161. -1, offsetof(struct mdio_bus_stats, field) \
  162. }), \
  163. }; \
  164. static struct dev_ext_attribute dev_attr_mdio_bus_device_##field = { \
  165. .attr = { .attr = { .name = file, .mode = 0444 }, \
  166. .show = mdio_bus_device_stat_field_show, \
  167. }, \
  168. .var = &((struct mdio_bus_stat_attr) { \
  169. -1, offsetof(struct mdio_bus_stats, field) \
  170. }), \
  171. };
  172. #define MDIO_BUS_STATS_ATTR(field) \
  173. MDIO_BUS_STATS_ATTR_DECL(field, __stringify(field))
  174. MDIO_BUS_STATS_ATTR(transfers);
  175. MDIO_BUS_STATS_ATTR(errors);
  176. MDIO_BUS_STATS_ATTR(writes);
  177. MDIO_BUS_STATS_ATTR(reads);
  178. #define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file) \
  179. static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \
  180. .attr = { .attr = { .name = file, .mode = 0444 }, \
  181. .show = mdio_bus_stat_field_show, \
  182. }, \
  183. .var = &((struct mdio_bus_stat_attr) { \
  184. addr, offsetof(struct mdio_bus_stats, field) \
  185. }), \
  186. }
  187. #define MDIO_BUS_STATS_ADDR_ATTR(field, addr) \
  188. MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, \
  189. __stringify(field) "_" __stringify(addr))
  190. #define MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(addr) \
  191. MDIO_BUS_STATS_ADDR_ATTR(transfers, addr); \
  192. MDIO_BUS_STATS_ADDR_ATTR(errors, addr); \
  193. MDIO_BUS_STATS_ADDR_ATTR(writes, addr); \
  194. MDIO_BUS_STATS_ADDR_ATTR(reads, addr) \
  195. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(0);
  196. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(1);
  197. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(2);
  198. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(3);
  199. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(4);
  200. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(5);
  201. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(6);
  202. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(7);
  203. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(8);
  204. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(9);
  205. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(10);
  206. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(11);
  207. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(12);
  208. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(13);
  209. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(14);
  210. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(15);
  211. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(16);
  212. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(17);
  213. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(18);
  214. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(19);
  215. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(20);
  216. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(21);
  217. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(22);
  218. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(23);
  219. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(24);
  220. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(25);
  221. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(26);
  222. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(27);
  223. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(28);
  224. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(29);
  225. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(30);
  226. MDIO_BUS_STATS_ADDR_ATTR_GROUP_DECL(31);
  227. #define MDIO_BUS_STATS_ADDR_ATTR_GROUP(addr) \
  228. &dev_attr_mdio_bus_addr_transfers_##addr.attr.attr, \
  229. &dev_attr_mdio_bus_addr_errors_##addr.attr.attr, \
  230. &dev_attr_mdio_bus_addr_writes_##addr.attr.attr, \
  231. &dev_attr_mdio_bus_addr_reads_##addr.attr.attr \
  232. static struct attribute *mdio_bus_statistics_attrs[] = {
  233. &dev_attr_mdio_bus_transfers.attr.attr,
  234. &dev_attr_mdio_bus_errors.attr.attr,
  235. &dev_attr_mdio_bus_writes.attr.attr,
  236. &dev_attr_mdio_bus_reads.attr.attr,
  237. MDIO_BUS_STATS_ADDR_ATTR_GROUP(0),
  238. MDIO_BUS_STATS_ADDR_ATTR_GROUP(1),
  239. MDIO_BUS_STATS_ADDR_ATTR_GROUP(2),
  240. MDIO_BUS_STATS_ADDR_ATTR_GROUP(3),
  241. MDIO_BUS_STATS_ADDR_ATTR_GROUP(4),
  242. MDIO_BUS_STATS_ADDR_ATTR_GROUP(5),
  243. MDIO_BUS_STATS_ADDR_ATTR_GROUP(6),
  244. MDIO_BUS_STATS_ADDR_ATTR_GROUP(7),
  245. MDIO_BUS_STATS_ADDR_ATTR_GROUP(8),
  246. MDIO_BUS_STATS_ADDR_ATTR_GROUP(9),
  247. MDIO_BUS_STATS_ADDR_ATTR_GROUP(10),
  248. MDIO_BUS_STATS_ADDR_ATTR_GROUP(11),
  249. MDIO_BUS_STATS_ADDR_ATTR_GROUP(12),
  250. MDIO_BUS_STATS_ADDR_ATTR_GROUP(13),
  251. MDIO_BUS_STATS_ADDR_ATTR_GROUP(14),
  252. MDIO_BUS_STATS_ADDR_ATTR_GROUP(15),
  253. MDIO_BUS_STATS_ADDR_ATTR_GROUP(16),
  254. MDIO_BUS_STATS_ADDR_ATTR_GROUP(17),
  255. MDIO_BUS_STATS_ADDR_ATTR_GROUP(18),
  256. MDIO_BUS_STATS_ADDR_ATTR_GROUP(19),
  257. MDIO_BUS_STATS_ADDR_ATTR_GROUP(20),
  258. MDIO_BUS_STATS_ADDR_ATTR_GROUP(21),
  259. MDIO_BUS_STATS_ADDR_ATTR_GROUP(22),
  260. MDIO_BUS_STATS_ADDR_ATTR_GROUP(23),
  261. MDIO_BUS_STATS_ADDR_ATTR_GROUP(24),
  262. MDIO_BUS_STATS_ADDR_ATTR_GROUP(25),
  263. MDIO_BUS_STATS_ADDR_ATTR_GROUP(26),
  264. MDIO_BUS_STATS_ADDR_ATTR_GROUP(27),
  265. MDIO_BUS_STATS_ADDR_ATTR_GROUP(28),
  266. MDIO_BUS_STATS_ADDR_ATTR_GROUP(29),
  267. MDIO_BUS_STATS_ADDR_ATTR_GROUP(30),
  268. MDIO_BUS_STATS_ADDR_ATTR_GROUP(31),
  269. NULL,
  270. };
  271. static const struct attribute_group mdio_bus_statistics_group = {
  272. .name = "statistics",
  273. .attrs = mdio_bus_statistics_attrs,
  274. };
  275. static const struct attribute_group *mdio_bus_groups[] = {
  276. &mdio_bus_statistics_group,
  277. NULL,
  278. };
  279. const struct class mdio_bus_class = {
  280. .name = "mdio_bus",
  281. .dev_release = mdiobus_release,
  282. .dev_groups = mdio_bus_groups,
  283. };
  284. EXPORT_SYMBOL_GPL(mdio_bus_class);
  285. /**
  286. * mdio_find_bus - Given the name of a mdiobus, find the mii_bus.
  287. * @mdio_name: The name of a mdiobus.
  288. *
  289. * Return: a reference to the mii_bus, or NULL if none found. The
  290. * embedded struct device will have its reference count incremented,
  291. * and this must be put_deviced'ed once the bus is finished with.
  292. */
  293. struct mii_bus *mdio_find_bus(const char *mdio_name)
  294. {
  295. struct device *d;
  296. d = class_find_device_by_name(&mdio_bus_class, mdio_name);
  297. return d ? to_mii_bus(d) : NULL;
  298. }
  299. EXPORT_SYMBOL(mdio_find_bus);
  300. #if IS_ENABLED(CONFIG_OF_MDIO)
  301. /**
  302. * of_mdio_find_bus - Given an mii_bus node, find the mii_bus.
  303. * @mdio_bus_np: Pointer to the mii_bus.
  304. *
  305. * Return: a reference to the mii_bus, or NULL if none found. The
  306. * embedded struct device will have its reference count incremented,
  307. * and this must be put once the bus is finished with.
  308. *
  309. * Because the association of a device_node and mii_bus is made via
  310. * of_mdiobus_register(), the mii_bus cannot be found before it is
  311. * registered with of_mdiobus_register().
  312. *
  313. */
  314. struct mii_bus *of_mdio_find_bus(struct device_node *mdio_bus_np)
  315. {
  316. struct device *d;
  317. if (!mdio_bus_np)
  318. return NULL;
  319. d = class_find_device_by_of_node(&mdio_bus_class, mdio_bus_np);
  320. return d ? to_mii_bus(d) : NULL;
  321. }
  322. EXPORT_SYMBOL(of_mdio_find_bus);
  323. #endif
  324. static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret)
  325. {
  326. preempt_disable();
  327. u64_stats_update_begin(&stats->syncp);
  328. u64_stats_inc(&stats->transfers);
  329. if (ret < 0) {
  330. u64_stats_inc(&stats->errors);
  331. goto out;
  332. }
  333. if (op)
  334. u64_stats_inc(&stats->reads);
  335. else
  336. u64_stats_inc(&stats->writes);
  337. out:
  338. u64_stats_update_end(&stats->syncp);
  339. preempt_enable();
  340. }
  341. /**
  342. * __mdiobus_read - Unlocked version of the mdiobus_read function
  343. * @bus: the mii_bus struct
  344. * @addr: the phy address
  345. * @regnum: register number to read
  346. *
  347. * Return: The register value if successful, negative error code on failure
  348. *
  349. * Read a MDIO bus register. Caller must hold the mdio bus lock.
  350. *
  351. * NOTE: MUST NOT be called from interrupt context.
  352. */
  353. int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
  354. {
  355. int retval;
  356. lockdep_assert_held_once(&bus->mdio_lock);
  357. if (addr >= PHY_MAX_ADDR)
  358. return -ENXIO;
  359. if (bus->read)
  360. retval = bus->read(bus, addr, regnum);
  361. else
  362. retval = -EOPNOTSUPP;
  363. trace_mdio_access(bus, 1, addr, regnum, retval, retval);
  364. mdiobus_stats_acct(&bus->stats[addr], true, retval);
  365. return retval;
  366. }
  367. EXPORT_SYMBOL(__mdiobus_read);
  368. /**
  369. * __mdiobus_write - Unlocked version of the mdiobus_write function
  370. * @bus: the mii_bus struct
  371. * @addr: the phy address
  372. * @regnum: register number to write
  373. * @val: value to write to @regnum
  374. *
  375. * Return: Zero if successful, negative error code on failure
  376. *
  377. * Write a MDIO bus register. Caller must hold the mdio bus lock.
  378. *
  379. * NOTE: MUST NOT be called from interrupt context.
  380. */
  381. int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
  382. {
  383. int err;
  384. lockdep_assert_held_once(&bus->mdio_lock);
  385. if (addr >= PHY_MAX_ADDR)
  386. return -ENXIO;
  387. if (bus->write)
  388. err = bus->write(bus, addr, regnum, val);
  389. else
  390. err = -EOPNOTSUPP;
  391. trace_mdio_access(bus, 0, addr, regnum, val, err);
  392. mdiobus_stats_acct(&bus->stats[addr], false, err);
  393. return err;
  394. }
  395. EXPORT_SYMBOL(__mdiobus_write);
  396. /**
  397. * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function
  398. * @bus: the mii_bus struct
  399. * @addr: the phy address
  400. * @regnum: register number to modify
  401. * @mask: bit mask of bits to clear
  402. * @set: bit mask of bits to set
  403. *
  404. * Return: 1 if the register was modified, 0 if no change was needed,
  405. * negative on any error condition
  406. *
  407. * Read, modify, and if any change, write the register value back to the
  408. * device.
  409. *
  410. * NOTE: MUST NOT be called from interrupt context.
  411. */
  412. int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
  413. u16 mask, u16 set)
  414. {
  415. int new, ret;
  416. ret = __mdiobus_read(bus, addr, regnum);
  417. if (ret < 0)
  418. return ret;
  419. new = (ret & ~mask) | set;
  420. if (new == ret)
  421. return 0;
  422. ret = __mdiobus_write(bus, addr, regnum, new);
  423. return ret < 0 ? ret : 1;
  424. }
  425. EXPORT_SYMBOL_GPL(__mdiobus_modify_changed);
  426. /**
  427. * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function
  428. * @bus: the mii_bus struct
  429. * @addr: the phy address
  430. * @devad: device address to read
  431. * @regnum: register number to read
  432. *
  433. * Return: The register value if successful, negative error code on failure
  434. *
  435. * Read a MDIO bus register. Caller must hold the mdio bus lock.
  436. *
  437. * NOTE: MUST NOT be called from interrupt context.
  438. */
  439. int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum)
  440. {
  441. int retval;
  442. lockdep_assert_held_once(&bus->mdio_lock);
  443. if (addr >= PHY_MAX_ADDR)
  444. return -ENXIO;
  445. if (bus->read_c45)
  446. retval = bus->read_c45(bus, addr, devad, regnum);
  447. else
  448. retval = -EOPNOTSUPP;
  449. trace_mdio_access(bus, 1, addr, regnum, retval, retval);
  450. mdiobus_stats_acct(&bus->stats[addr], true, retval);
  451. return retval;
  452. }
  453. EXPORT_SYMBOL(__mdiobus_c45_read);
  454. /**
  455. * __mdiobus_c45_write - Unlocked version of the mdiobus_write function
  456. * @bus: the mii_bus struct
  457. * @addr: the phy address
  458. * @devad: device address to read
  459. * @regnum: register number to write
  460. * @val: value to write to @regnum
  461. *
  462. * Return: Zero if successful, negative error code on failure
  463. *
  464. * Write a MDIO bus register. Caller must hold the mdio bus lock.
  465. *
  466. * NOTE: MUST NOT be called from interrupt context.
  467. */
  468. int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
  469. u16 val)
  470. {
  471. int err;
  472. lockdep_assert_held_once(&bus->mdio_lock);
  473. if (addr >= PHY_MAX_ADDR)
  474. return -ENXIO;
  475. if (bus->write_c45)
  476. err = bus->write_c45(bus, addr, devad, regnum, val);
  477. else
  478. err = -EOPNOTSUPP;
  479. trace_mdio_access(bus, 0, addr, regnum, val, err);
  480. mdiobus_stats_acct(&bus->stats[addr], false, err);
  481. return err;
  482. }
  483. EXPORT_SYMBOL(__mdiobus_c45_write);
  484. /**
  485. * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function
  486. * @bus: the mii_bus struct
  487. * @addr: the phy address
  488. * @devad: device address to read
  489. * @regnum: register number to modify
  490. * @mask: bit mask of bits to clear
  491. * @set: bit mask of bits to set
  492. *
  493. * Return: 1 if the register was modified, 0 if no change was needed,
  494. * negative on any error condition
  495. *
  496. * Read, modify, and if any change, write the register value back to the
  497. * device. Any error returns a negative number.
  498. *
  499. * NOTE: MUST NOT be called from interrupt context.
  500. */
  501. static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr,
  502. int devad, u32 regnum, u16 mask,
  503. u16 set)
  504. {
  505. int new, ret;
  506. ret = __mdiobus_c45_read(bus, addr, devad, regnum);
  507. if (ret < 0)
  508. return ret;
  509. new = (ret & ~mask) | set;
  510. if (new == ret)
  511. return 0;
  512. ret = __mdiobus_c45_write(bus, addr, devad, regnum, new);
  513. return ret < 0 ? ret : 1;
  514. }
  515. /**
  516. * mdiobus_read_nested - Nested version of the mdiobus_read function
  517. * @bus: the mii_bus struct
  518. * @addr: the phy address
  519. * @regnum: register number to read
  520. *
  521. * Return: The register value if successful, negative error code on failure
  522. *
  523. * In case of nested MDIO bus access avoid lockdep false positives by
  524. * using mutex_lock_nested().
  525. *
  526. * NOTE: MUST NOT be called from interrupt context,
  527. * because the bus read/write functions may wait for an interrupt
  528. * to conclude the operation.
  529. */
  530. int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum)
  531. {
  532. int retval;
  533. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  534. retval = __mdiobus_read(bus, addr, regnum);
  535. mutex_unlock(&bus->mdio_lock);
  536. return retval;
  537. }
  538. EXPORT_SYMBOL(mdiobus_read_nested);
  539. /**
  540. * mdiobus_read - Convenience function for reading a given MII mgmt register
  541. * @bus: the mii_bus struct
  542. * @addr: the phy address
  543. * @regnum: register number to read
  544. *
  545. * Return: The register value if successful, negative error code on failure
  546. *
  547. * NOTE: MUST NOT be called from interrupt context,
  548. * because the bus read/write functions may wait for an interrupt
  549. * to conclude the operation.
  550. */
  551. int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
  552. {
  553. int retval;
  554. mutex_lock(&bus->mdio_lock);
  555. retval = __mdiobus_read(bus, addr, regnum);
  556. mutex_unlock(&bus->mdio_lock);
  557. return retval;
  558. }
  559. EXPORT_SYMBOL(mdiobus_read);
  560. /**
  561. * mdiobus_c45_read - Convenience function for reading a given MII mgmt register
  562. * @bus: the mii_bus struct
  563. * @addr: the phy address
  564. * @devad: device address to read
  565. * @regnum: register number to read
  566. *
  567. * Return: The register value if successful, negative error code on failure
  568. *
  569. * NOTE: MUST NOT be called from interrupt context,
  570. * because the bus read/write functions may wait for an interrupt
  571. * to conclude the operation.
  572. */
  573. int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum)
  574. {
  575. int retval;
  576. mutex_lock(&bus->mdio_lock);
  577. retval = __mdiobus_c45_read(bus, addr, devad, regnum);
  578. mutex_unlock(&bus->mdio_lock);
  579. return retval;
  580. }
  581. EXPORT_SYMBOL(mdiobus_c45_read);
  582. /**
  583. * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function
  584. * @bus: the mii_bus struct
  585. * @addr: the phy address
  586. * @devad: device address to read
  587. * @regnum: register number to read
  588. *
  589. * Return: The register value if successful, negative error code on failure
  590. *
  591. * In case of nested MDIO bus access avoid lockdep false positives by
  592. * using mutex_lock_nested().
  593. *
  594. * NOTE: MUST NOT be called from interrupt context,
  595. * because the bus read/write functions may wait for an interrupt
  596. * to conclude the operation.
  597. */
  598. int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad,
  599. u32 regnum)
  600. {
  601. int retval;
  602. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  603. retval = __mdiobus_c45_read(bus, addr, devad, regnum);
  604. mutex_unlock(&bus->mdio_lock);
  605. return retval;
  606. }
  607. EXPORT_SYMBOL(mdiobus_c45_read_nested);
  608. /**
  609. * mdiobus_write_nested - Nested version of the mdiobus_write function
  610. * @bus: the mii_bus struct
  611. * @addr: the phy address
  612. * @regnum: register number to write
  613. * @val: value to write to @regnum
  614. *
  615. * Return: Zero if successful, negative error code on failure
  616. *
  617. * In case of nested MDIO bus access avoid lockdep false positives by
  618. * using mutex_lock_nested().
  619. *
  620. * NOTE: MUST NOT be called from interrupt context,
  621. * because the bus read/write functions may wait for an interrupt
  622. * to conclude the operation.
  623. */
  624. int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val)
  625. {
  626. int err;
  627. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  628. err = __mdiobus_write(bus, addr, regnum, val);
  629. mutex_unlock(&bus->mdio_lock);
  630. return err;
  631. }
  632. EXPORT_SYMBOL(mdiobus_write_nested);
  633. /**
  634. * mdiobus_write - Convenience function for writing a given MII mgmt register
  635. * @bus: the mii_bus struct
  636. * @addr: the phy address
  637. * @regnum: register number to write
  638. * @val: value to write to @regnum
  639. *
  640. * Return: Zero if successful, negative error code on failure
  641. *
  642. * NOTE: MUST NOT be called from interrupt context,
  643. * because the bus read/write functions may wait for an interrupt
  644. * to conclude the operation.
  645. */
  646. int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
  647. {
  648. int err;
  649. mutex_lock(&bus->mdio_lock);
  650. err = __mdiobus_write(bus, addr, regnum, val);
  651. mutex_unlock(&bus->mdio_lock);
  652. return err;
  653. }
  654. EXPORT_SYMBOL(mdiobus_write);
  655. /**
  656. * mdiobus_c45_write - Convenience function for writing a given MII mgmt register
  657. * @bus: the mii_bus struct
  658. * @addr: the phy address
  659. * @devad: device address to read
  660. * @regnum: register number to write
  661. * @val: value to write to @regnum
  662. *
  663. * Return: Zero if successful, negative error code on failure
  664. *
  665. * NOTE: MUST NOT be called from interrupt context,
  666. * because the bus read/write functions may wait for an interrupt
  667. * to conclude the operation.
  668. */
  669. int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum,
  670. u16 val)
  671. {
  672. int err;
  673. mutex_lock(&bus->mdio_lock);
  674. err = __mdiobus_c45_write(bus, addr, devad, regnum, val);
  675. mutex_unlock(&bus->mdio_lock);
  676. return err;
  677. }
  678. EXPORT_SYMBOL(mdiobus_c45_write);
  679. /**
  680. * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function
  681. * @bus: the mii_bus struct
  682. * @addr: the phy address
  683. * @devad: device address to read
  684. * @regnum: register number to write
  685. * @val: value to write to @regnum
  686. *
  687. * Return: Zero if successful, negative error code on failure
  688. *
  689. * In case of nested MDIO bus access avoid lockdep false positives by
  690. * using mutex_lock_nested().
  691. *
  692. * NOTE: MUST NOT be called from interrupt context,
  693. * because the bus read/write functions may wait for an interrupt
  694. * to conclude the operation.
  695. */
  696. int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad,
  697. u32 regnum, u16 val)
  698. {
  699. int err;
  700. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  701. err = __mdiobus_c45_write(bus, addr, devad, regnum, val);
  702. mutex_unlock(&bus->mdio_lock);
  703. return err;
  704. }
  705. EXPORT_SYMBOL(mdiobus_c45_write_nested);
  706. /*
  707. * __mdiobus_modify - Convenience function for modifying a given mdio device
  708. * register
  709. * @bus: the mii_bus struct
  710. * @addr: the phy address
  711. * @regnum: register number to write
  712. * @mask: bit mask of bits to clear
  713. * @set: bit mask of bits to set
  714. *
  715. * Return: 0 on success, negative on any error condition
  716. */
  717. int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask,
  718. u16 set)
  719. {
  720. int err;
  721. err = __mdiobus_modify_changed(bus, addr, regnum, mask, set);
  722. return err < 0 ? err : 0;
  723. }
  724. EXPORT_SYMBOL_GPL(__mdiobus_modify);
  725. /**
  726. * mdiobus_modify - Convenience function for modifying a given mdio device
  727. * register
  728. * @bus: the mii_bus struct
  729. * @addr: the phy address
  730. * @regnum: register number to write
  731. * @mask: bit mask of bits to clear
  732. * @set: bit mask of bits to set
  733. *
  734. * Return: 0 on success, negative on any error condition
  735. */
  736. int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set)
  737. {
  738. int err;
  739. mutex_lock(&bus->mdio_lock);
  740. err = __mdiobus_modify(bus, addr, regnum, mask, set);
  741. mutex_unlock(&bus->mdio_lock);
  742. return err;
  743. }
  744. EXPORT_SYMBOL_GPL(mdiobus_modify);
  745. /**
  746. * mdiobus_c45_modify - Convenience function for modifying a given mdio device
  747. * register
  748. * @bus: the mii_bus struct
  749. * @addr: the phy address
  750. * @devad: device address to read
  751. * @regnum: register number to write
  752. * @mask: bit mask of bits to clear
  753. * @set: bit mask of bits to set
  754. *
  755. * Return: 0 on success, negative on any error condition
  756. */
  757. int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum,
  758. u16 mask, u16 set)
  759. {
  760. int err;
  761. mutex_lock(&bus->mdio_lock);
  762. err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum,
  763. mask, set);
  764. mutex_unlock(&bus->mdio_lock);
  765. return err < 0 ? err : 0;
  766. }
  767. EXPORT_SYMBOL_GPL(mdiobus_c45_modify);
  768. /**
  769. * mdiobus_modify_changed - Convenience function for modifying a given mdio
  770. * device register and returning if it changed
  771. * @bus: the mii_bus struct
  772. * @addr: the phy address
  773. * @regnum: register number to write
  774. * @mask: bit mask of bits to clear
  775. * @set: bit mask of bits to set
  776. *
  777. * Return: 1 if the register was modified, 0 if no change was needed,
  778. * negative on any error condition
  779. */
  780. int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum,
  781. u16 mask, u16 set)
  782. {
  783. int err;
  784. mutex_lock(&bus->mdio_lock);
  785. err = __mdiobus_modify_changed(bus, addr, regnum, mask, set);
  786. mutex_unlock(&bus->mdio_lock);
  787. return err;
  788. }
  789. EXPORT_SYMBOL_GPL(mdiobus_modify_changed);
  790. /**
  791. * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio
  792. * device register and returning if it changed
  793. * @bus: the mii_bus struct
  794. * @addr: the phy address
  795. * @devad: device address to read
  796. * @regnum: register number to write
  797. * @mask: bit mask of bits to clear
  798. * @set: bit mask of bits to set
  799. *
  800. * Return: 1 if the register was modified, 0 if no change was needed,
  801. * negative on any error condition
  802. */
  803. int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad,
  804. u32 regnum, u16 mask, u16 set)
  805. {
  806. int err;
  807. mutex_lock(&bus->mdio_lock);
  808. err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set);
  809. mutex_unlock(&bus->mdio_lock);
  810. return err;
  811. }
  812. EXPORT_SYMBOL_GPL(mdiobus_c45_modify_changed);
  813. /**
  814. * mdio_bus_match - determine if given MDIO driver supports the given
  815. * MDIO device
  816. * @dev: target MDIO device
  817. * @drv: given MDIO driver
  818. *
  819. * Return: 1 if the driver supports the device, 0 otherwise
  820. *
  821. * Description: This may require calling the devices own match function,
  822. * since different classes of MDIO devices have different match criteria.
  823. */
  824. static int mdio_bus_match(struct device *dev, const struct device_driver *drv)
  825. {
  826. const struct mdio_driver *mdiodrv = to_mdio_driver(drv);
  827. struct mdio_device *mdio = to_mdio_device(dev);
  828. /* Both the driver and device must type-match */
  829. if (!(mdiodrv->mdiodrv.flags & MDIO_DEVICE_IS_PHY) !=
  830. !(mdio->flags & MDIO_DEVICE_FLAG_PHY))
  831. return 0;
  832. if (of_driver_match_device(dev, drv))
  833. return 1;
  834. if (mdio->bus_match)
  835. return mdio->bus_match(dev, drv);
  836. return 0;
  837. }
  838. static int mdio_uevent(const struct device *dev, struct kobj_uevent_env *env)
  839. {
  840. int rc;
  841. /* Some devices have extra OF data and an OF-style MODALIAS */
  842. rc = of_device_uevent_modalias(dev, env);
  843. if (rc != -ENODEV)
  844. return rc;
  845. return 0;
  846. }
  847. static struct attribute *mdio_bus_device_statistics_attrs[] = {
  848. &dev_attr_mdio_bus_device_transfers.attr.attr,
  849. &dev_attr_mdio_bus_device_errors.attr.attr,
  850. &dev_attr_mdio_bus_device_writes.attr.attr,
  851. &dev_attr_mdio_bus_device_reads.attr.attr,
  852. NULL,
  853. };
  854. static const struct attribute_group mdio_bus_device_statistics_group = {
  855. .name = "statistics",
  856. .attrs = mdio_bus_device_statistics_attrs,
  857. };
  858. static const struct attribute_group *mdio_bus_dev_groups[] = {
  859. &mdio_bus_device_statistics_group,
  860. NULL,
  861. };
  862. const struct bus_type mdio_bus_type = {
  863. .name = "mdio_bus",
  864. .dev_groups = mdio_bus_dev_groups,
  865. .match = mdio_bus_match,
  866. .uevent = mdio_uevent,
  867. };
  868. EXPORT_SYMBOL(mdio_bus_type);
  869. static int __init mdio_bus_init(void)
  870. {
  871. int ret;
  872. ret = class_register(&mdio_bus_class);
  873. if (!ret) {
  874. ret = bus_register(&mdio_bus_type);
  875. if (ret)
  876. class_unregister(&mdio_bus_class);
  877. }
  878. return ret;
  879. }
  880. static void __exit mdio_bus_exit(void)
  881. {
  882. class_unregister(&mdio_bus_class);
  883. bus_unregister(&mdio_bus_type);
  884. }
  885. subsys_initcall(mdio_bus_init);
  886. module_exit(mdio_bus_exit);
  887. MODULE_LICENSE("GPL");
  888. MODULE_DESCRIPTION("MDIO bus/device layer");