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 9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 11 #include <linux/device.h> 12 #include <linux/errno.h> 13 #include <linux/ethtool.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/phy.h> 21 #include <linux/slab.h> 22 #include <linux/spinlock.h> 23 #include <linux/string.h> 24 #include <linux/uaccess.h> 25 #include <linux/unistd.h> 26 27 #define CREATE_TRACE_POINTS 28 #include <trace/events/mdio.h> 29 30 static struct mdio_device *mdiobus_find_device(struct mii_bus *bus, int addr) 31 { 32 bool addr_valid = addr >= 0 && addr < ARRAY_SIZE(bus->mdio_map); 33 34 if (WARN_ONCE(!addr_valid, "addr %d out of range\n", addr)) 35 return NULL; 36 37 return bus->mdio_map[addr]; 38 } 39 40 struct phy_device *mdiobus_get_phy(struct mii_bus *bus, int addr) 41 { 42 struct mdio_device *mdiodev; 43 44 mdiodev = mdiobus_find_device(bus, addr); 45 if (!mdiodev) 46 return NULL; 47 48 if (!(mdiodev->flags & MDIO_DEVICE_FLAG_PHY)) 49 return NULL; 50 51 return container_of(mdiodev, struct phy_device, mdio); 52 } 53 EXPORT_SYMBOL(mdiobus_get_phy); 54 55 bool mdiobus_is_registered_device(struct mii_bus *bus, int addr) 56 { 57 return mdiobus_find_device(bus, addr) != NULL; 58 } 59 EXPORT_SYMBOL(mdiobus_is_registered_device); 60 61 static void mdiobus_stats_acct(struct mdio_bus_stats *stats, bool op, int ret) 62 { 63 preempt_disable(); 64 u64_stats_update_begin(&stats->syncp); 65 66 u64_stats_inc(&stats->transfers); 67 if (ret < 0) { 68 u64_stats_inc(&stats->errors); 69 goto out; 70 } 71 72 if (op) 73 u64_stats_inc(&stats->reads); 74 else 75 u64_stats_inc(&stats->writes); 76 out: 77 u64_stats_update_end(&stats->syncp); 78 preempt_enable(); 79 } 80 81 /** 82 * __mdiobus_read - Unlocked version of the mdiobus_read function 83 * @bus: the mii_bus struct 84 * @addr: the phy address 85 * @regnum: register number to read 86 * 87 * Return: The register value if successful, negative error code on failure 88 * 89 * Read a MDIO bus register. Caller must hold the mdio bus lock. 90 * 91 * NOTE: MUST NOT be called from interrupt context. 92 */ 93 int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) 94 { 95 int retval; 96 97 lockdep_assert_held_once(&bus->mdio_lock); 98 99 if (addr >= PHY_MAX_ADDR) 100 return -ENXIO; 101 102 if (bus->read) 103 retval = bus->read(bus, addr, regnum); 104 else 105 retval = -EOPNOTSUPP; 106 107 trace_mdio_access(bus, 1, addr, regnum, retval, retval); 108 mdiobus_stats_acct(&bus->stats[addr], true, retval); 109 110 return retval; 111 } 112 EXPORT_SYMBOL(__mdiobus_read); 113 114 /** 115 * __mdiobus_write - Unlocked version of the mdiobus_write function 116 * @bus: the mii_bus struct 117 * @addr: the phy address 118 * @regnum: register number to write 119 * @val: value to write to @regnum 120 * 121 * Return: Zero if successful, negative error code on failure 122 * 123 * Write a MDIO bus register. Caller must hold the mdio bus lock. 124 * 125 * NOTE: MUST NOT be called from interrupt context. 126 */ 127 int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) 128 { 129 int err; 130 131 lockdep_assert_held_once(&bus->mdio_lock); 132 133 if (addr >= PHY_MAX_ADDR) 134 return -ENXIO; 135 136 if (bus->write) 137 err = bus->write(bus, addr, regnum, val); 138 else 139 err = -EOPNOTSUPP; 140 141 trace_mdio_access(bus, 0, addr, regnum, val, err); 142 mdiobus_stats_acct(&bus->stats[addr], false, err); 143 144 return err; 145 } 146 EXPORT_SYMBOL(__mdiobus_write); 147 148 /** 149 * __mdiobus_modify_changed - Unlocked version of the mdiobus_modify function 150 * @bus: the mii_bus struct 151 * @addr: the phy address 152 * @regnum: register number to modify 153 * @mask: bit mask of bits to clear 154 * @set: bit mask of bits to set 155 * 156 * Return: 1 if the register was modified, 0 if no change was needed, 157 * negative on any error condition 158 * 159 * Read, modify, and if any change, write the register value back to the 160 * device. 161 * 162 * NOTE: MUST NOT be called from interrupt context. 163 */ 164 int __mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, 165 u16 mask, u16 set) 166 { 167 int new, ret; 168 169 ret = __mdiobus_read(bus, addr, regnum); 170 if (ret < 0) 171 return ret; 172 173 new = (ret & ~mask) | set; 174 if (new == ret) 175 return 0; 176 177 ret = __mdiobus_write(bus, addr, regnum, new); 178 179 return ret < 0 ? ret : 1; 180 } 181 EXPORT_SYMBOL_GPL(__mdiobus_modify_changed); 182 183 /** 184 * __mdiobus_c45_read - Unlocked version of the mdiobus_c45_read function 185 * @bus: the mii_bus struct 186 * @addr: the phy address 187 * @devad: device address to read 188 * @regnum: register number to read 189 * 190 * Return: The register value if successful, negative error code on failure 191 * 192 * Read a MDIO bus register. Caller must hold the mdio bus lock. 193 * 194 * NOTE: MUST NOT be called from interrupt context. 195 */ 196 int __mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) 197 { 198 int retval; 199 200 lockdep_assert_held_once(&bus->mdio_lock); 201 202 if (addr >= PHY_MAX_ADDR) 203 return -ENXIO; 204 205 if (bus->read_c45) 206 retval = bus->read_c45(bus, addr, devad, regnum); 207 else 208 retval = -EOPNOTSUPP; 209 210 trace_mdio_access(bus, 1, addr, regnum, retval, retval); 211 mdiobus_stats_acct(&bus->stats[addr], true, retval); 212 213 return retval; 214 } 215 EXPORT_SYMBOL(__mdiobus_c45_read); 216 217 /** 218 * __mdiobus_c45_write - Unlocked version of the mdiobus_write function 219 * @bus: the mii_bus struct 220 * @addr: the phy address 221 * @devad: device address to read 222 * @regnum: register number to write 223 * @val: value to write to @regnum 224 * 225 * Return: Zero if successful, negative error code on failure 226 * 227 * Write a MDIO bus register. Caller must hold the mdio bus lock. 228 * 229 * NOTE: MUST NOT be called from interrupt context. 230 */ 231 int __mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, 232 u16 val) 233 { 234 int err; 235 236 lockdep_assert_held_once(&bus->mdio_lock); 237 238 if (addr >= PHY_MAX_ADDR) 239 return -ENXIO; 240 241 if (bus->write_c45) 242 err = bus->write_c45(bus, addr, devad, regnum, val); 243 else 244 err = -EOPNOTSUPP; 245 246 trace_mdio_access(bus, 0, addr, regnum, val, err); 247 mdiobus_stats_acct(&bus->stats[addr], false, err); 248 249 return err; 250 } 251 EXPORT_SYMBOL(__mdiobus_c45_write); 252 253 /** 254 * __mdiobus_c45_modify_changed - Unlocked version of the mdiobus_modify function 255 * @bus: the mii_bus struct 256 * @addr: the phy address 257 * @devad: device address to read 258 * @regnum: register number to modify 259 * @mask: bit mask of bits to clear 260 * @set: bit mask of bits to set 261 * 262 * Return: 1 if the register was modified, 0 if no change was needed, 263 * negative on any error condition 264 * 265 * Read, modify, and if any change, write the register value back to the 266 * device. Any error returns a negative number. 267 * 268 * NOTE: MUST NOT be called from interrupt context. 269 */ 270 static int __mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, 271 int devad, u32 regnum, u16 mask, 272 u16 set) 273 { 274 int new, ret; 275 276 ret = __mdiobus_c45_read(bus, addr, devad, regnum); 277 if (ret < 0) 278 return ret; 279 280 new = (ret & ~mask) | set; 281 if (new == ret) 282 return 0; 283 284 ret = __mdiobus_c45_write(bus, addr, devad, regnum, new); 285 286 return ret < 0 ? ret : 1; 287 } 288 289 /** 290 * mdiobus_read_nested - Nested version of the mdiobus_read function 291 * @bus: the mii_bus struct 292 * @addr: the phy address 293 * @regnum: register number to read 294 * 295 * Return: The register value if successful, negative error code on failure 296 * 297 * In case of nested MDIO bus access avoid lockdep false positives by 298 * using mutex_lock_nested(). 299 * 300 * NOTE: MUST NOT be called from interrupt context, 301 * because the bus read/write functions may wait for an interrupt 302 * to conclude the operation. 303 */ 304 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) 305 { 306 int retval; 307 308 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 309 retval = __mdiobus_read(bus, addr, regnum); 310 mutex_unlock(&bus->mdio_lock); 311 312 return retval; 313 } 314 EXPORT_SYMBOL(mdiobus_read_nested); 315 316 /** 317 * mdiobus_read - Convenience function for reading a given MII mgmt register 318 * @bus: the mii_bus struct 319 * @addr: the phy address 320 * @regnum: register number to read 321 * 322 * Return: The register value if successful, negative error code on failure 323 * 324 * NOTE: MUST NOT be called from interrupt context, 325 * because the bus read/write functions may wait for an interrupt 326 * to conclude the operation. 327 */ 328 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) 329 { 330 int retval; 331 332 mutex_lock(&bus->mdio_lock); 333 retval = __mdiobus_read(bus, addr, regnum); 334 mutex_unlock(&bus->mdio_lock); 335 336 return retval; 337 } 338 EXPORT_SYMBOL(mdiobus_read); 339 340 /** 341 * mdiobus_c45_read - Convenience function for reading a given MII mgmt register 342 * @bus: the mii_bus struct 343 * @addr: the phy address 344 * @devad: device address to read 345 * @regnum: register number to read 346 * 347 * Return: The register value if successful, negative error code on failure 348 * 349 * NOTE: MUST NOT be called from interrupt context, 350 * because the bus read/write functions may wait for an interrupt 351 * to conclude the operation. 352 */ 353 int mdiobus_c45_read(struct mii_bus *bus, int addr, int devad, u32 regnum) 354 { 355 int retval; 356 357 mutex_lock(&bus->mdio_lock); 358 retval = __mdiobus_c45_read(bus, addr, devad, regnum); 359 mutex_unlock(&bus->mdio_lock); 360 361 return retval; 362 } 363 EXPORT_SYMBOL(mdiobus_c45_read); 364 365 /** 366 * mdiobus_c45_read_nested - Nested version of the mdiobus_c45_read function 367 * @bus: the mii_bus struct 368 * @addr: the phy address 369 * @devad: device address to read 370 * @regnum: register number to read 371 * 372 * Return: The register value if successful, negative error code on failure 373 * 374 * In case of nested MDIO bus access avoid lockdep false positives by 375 * using mutex_lock_nested(). 376 * 377 * NOTE: MUST NOT be called from interrupt context, 378 * because the bus read/write functions may wait for an interrupt 379 * to conclude the operation. 380 */ 381 int mdiobus_c45_read_nested(struct mii_bus *bus, int addr, int devad, 382 u32 regnum) 383 { 384 int retval; 385 386 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 387 retval = __mdiobus_c45_read(bus, addr, devad, regnum); 388 mutex_unlock(&bus->mdio_lock); 389 390 return retval; 391 } 392 EXPORT_SYMBOL(mdiobus_c45_read_nested); 393 394 /** 395 * mdiobus_write_nested - Nested version of the mdiobus_write function 396 * @bus: the mii_bus struct 397 * @addr: the phy address 398 * @regnum: register number to write 399 * @val: value to write to @regnum 400 * 401 * Return: Zero if successful, negative error code on failure 402 * 403 * In case of nested MDIO bus access avoid lockdep false positives by 404 * using mutex_lock_nested(). 405 * 406 * NOTE: MUST NOT be called from interrupt context, 407 * because the bus read/write functions may wait for an interrupt 408 * to conclude the operation. 409 */ 410 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) 411 { 412 int err; 413 414 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 415 err = __mdiobus_write(bus, addr, regnum, val); 416 mutex_unlock(&bus->mdio_lock); 417 418 return err; 419 } 420 EXPORT_SYMBOL(mdiobus_write_nested); 421 422 /** 423 * mdiobus_write - Convenience function for writing a given MII mgmt register 424 * @bus: the mii_bus struct 425 * @addr: the phy address 426 * @regnum: register number to write 427 * @val: value to write to @regnum 428 * 429 * Return: Zero if successful, negative error code on failure 430 * 431 * NOTE: MUST NOT be called from interrupt context, 432 * because the bus read/write functions may wait for an interrupt 433 * to conclude the operation. 434 */ 435 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val) 436 { 437 int err; 438 439 mutex_lock(&bus->mdio_lock); 440 err = __mdiobus_write(bus, addr, regnum, val); 441 mutex_unlock(&bus->mdio_lock); 442 443 return err; 444 } 445 EXPORT_SYMBOL(mdiobus_write); 446 447 /** 448 * mdiobus_c45_write - Convenience function for writing a given MII mgmt register 449 * @bus: the mii_bus struct 450 * @addr: the phy address 451 * @devad: device address to read 452 * @regnum: register number to write 453 * @val: value to write to @regnum 454 * 455 * Return: Zero if successful, negative error code on failure 456 * 457 * NOTE: MUST NOT be called from interrupt context, 458 * because the bus read/write functions may wait for an interrupt 459 * to conclude the operation. 460 */ 461 int mdiobus_c45_write(struct mii_bus *bus, int addr, int devad, u32 regnum, 462 u16 val) 463 { 464 int err; 465 466 mutex_lock(&bus->mdio_lock); 467 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); 468 mutex_unlock(&bus->mdio_lock); 469 470 return err; 471 } 472 EXPORT_SYMBOL(mdiobus_c45_write); 473 474 /** 475 * mdiobus_c45_write_nested - Nested version of the mdiobus_c45_write function 476 * @bus: the mii_bus struct 477 * @addr: the phy address 478 * @devad: device address to read 479 * @regnum: register number to write 480 * @val: value to write to @regnum 481 * 482 * Return: Zero if successful, negative error code on failure 483 * 484 * In case of nested MDIO bus access avoid lockdep false positives by 485 * using mutex_lock_nested(). 486 * 487 * NOTE: MUST NOT be called from interrupt context, 488 * because the bus read/write functions may wait for an interrupt 489 * to conclude the operation. 490 */ 491 int mdiobus_c45_write_nested(struct mii_bus *bus, int addr, int devad, 492 u32 regnum, u16 val) 493 { 494 int err; 495 496 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 497 err = __mdiobus_c45_write(bus, addr, devad, regnum, val); 498 mutex_unlock(&bus->mdio_lock); 499 500 return err; 501 } 502 EXPORT_SYMBOL(mdiobus_c45_write_nested); 503 504 /* 505 * __mdiobus_modify - Convenience function for modifying a given mdio device 506 * register 507 * @bus: the mii_bus struct 508 * @addr: the phy address 509 * @regnum: register number to write 510 * @mask: bit mask of bits to clear 511 * @set: bit mask of bits to set 512 * 513 * Return: 0 on success, negative on any error condition 514 */ 515 int __mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, 516 u16 set) 517 { 518 int err; 519 520 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); 521 522 return err < 0 ? err : 0; 523 } 524 EXPORT_SYMBOL_GPL(__mdiobus_modify); 525 526 /** 527 * mdiobus_modify - Convenience function for modifying a given mdio device 528 * register 529 * @bus: the mii_bus struct 530 * @addr: the phy address 531 * @regnum: register number to write 532 * @mask: bit mask of bits to clear 533 * @set: bit mask of bits to set 534 * 535 * Return: 0 on success, negative on any error condition 536 */ 537 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, u16 set) 538 { 539 int err; 540 541 mutex_lock(&bus->mdio_lock); 542 err = __mdiobus_modify(bus, addr, regnum, mask, set); 543 mutex_unlock(&bus->mdio_lock); 544 545 return err; 546 } 547 EXPORT_SYMBOL_GPL(mdiobus_modify); 548 549 /** 550 * mdiobus_c45_modify - Convenience function for modifying a given mdio device 551 * register 552 * @bus: the mii_bus struct 553 * @addr: the phy address 554 * @devad: device address to read 555 * @regnum: register number to write 556 * @mask: bit mask of bits to clear 557 * @set: bit mask of bits to set 558 * 559 * Return: 0 on success, negative on any error condition 560 */ 561 int mdiobus_c45_modify(struct mii_bus *bus, int addr, int devad, u32 regnum, 562 u16 mask, u16 set) 563 { 564 int err; 565 566 mutex_lock(&bus->mdio_lock); 567 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, 568 mask, set); 569 mutex_unlock(&bus->mdio_lock); 570 571 return err < 0 ? err : 0; 572 } 573 EXPORT_SYMBOL_GPL(mdiobus_c45_modify); 574 575 /** 576 * mdiobus_modify_changed - Convenience function for modifying a given mdio 577 * device register and returning if it changed 578 * @bus: the mii_bus struct 579 * @addr: the phy address 580 * @regnum: register number to write 581 * @mask: bit mask of bits to clear 582 * @set: bit mask of bits to set 583 * 584 * Return: 1 if the register was modified, 0 if no change was needed, 585 * negative on any error condition 586 */ 587 int mdiobus_modify_changed(struct mii_bus *bus, int addr, u32 regnum, 588 u16 mask, u16 set) 589 { 590 int err; 591 592 mutex_lock(&bus->mdio_lock); 593 err = __mdiobus_modify_changed(bus, addr, regnum, mask, set); 594 mutex_unlock(&bus->mdio_lock); 595 596 return err; 597 } 598 EXPORT_SYMBOL_GPL(mdiobus_modify_changed); 599 600 /** 601 * mdiobus_c45_modify_changed - Convenience function for modifying a given mdio 602 * device register and returning if it changed 603 * @bus: the mii_bus struct 604 * @addr: the phy address 605 * @devad: device address to read 606 * @regnum: register number to write 607 * @mask: bit mask of bits to clear 608 * @set: bit mask of bits to set 609 * 610 * Return: 1 if the register was modified, 0 if no change was needed, 611 * negative on any error condition 612 */ 613 int mdiobus_c45_modify_changed(struct mii_bus *bus, int addr, int devad, 614 u32 regnum, u16 mask, u16 set) 615 { 616 int err; 617 618 mutex_lock(&bus->mdio_lock); 619 err = __mdiobus_c45_modify_changed(bus, addr, devad, regnum, mask, set); 620 mutex_unlock(&bus->mdio_lock); 621 622 return err; 623 } 624 EXPORT_SYMBOL_GPL(mdiobus_c45_modify_changed); 625 626 MODULE_LICENSE("GPL"); 627 MODULE_DESCRIPTION("MDIO bus/device layer"); 628