Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: enhance GPY115 loopback disable function

GPY115 need reset PHY when it comes out from loopback mode if the firmware
version number (lower 8 bits) is equal to or below 0x76.

Fixes: 7d901a1e878a ("net: phy: add Maxlinear GPY115/21x/24x driver")
Signed-off-by: Xu Liang <lxu@maxlinear.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Xu Liang and committed by
David S. Miller
3b1b6e82 ca48aa4a

+21 -2
+21 -2
drivers/net/phy/mxl-gpy.c
··· 493 493 return ret; 494 494 } 495 495 496 + static int gpy115_loopback(struct phy_device *phydev, bool enable) 497 + { 498 + int ret; 499 + int fw_minor; 500 + 501 + if (enable) 502 + return gpy_loopback(phydev, enable); 503 + 504 + ret = phy_read(phydev, PHY_FWV); 505 + if (ret < 0) 506 + return ret; 507 + 508 + fw_minor = FIELD_GET(PHY_FWV_MINOR_MASK, ret); 509 + if (fw_minor > 0x0076) 510 + return gpy_loopback(phydev, 0); 511 + 512 + return genphy_soft_reset(phydev); 513 + } 514 + 496 515 static struct phy_driver gpy_drivers[] = { 497 516 { 498 517 PHY_ID_MATCH_MODEL(PHY_ID_GPY2xx), ··· 546 527 .handle_interrupt = gpy_handle_interrupt, 547 528 .set_wol = gpy_set_wol, 548 529 .get_wol = gpy_get_wol, 549 - .set_loopback = gpy_loopback, 530 + .set_loopback = gpy115_loopback, 550 531 }, 551 532 { 552 533 PHY_ID_MATCH_MODEL(PHY_ID_GPY115C), ··· 563 544 .handle_interrupt = gpy_handle_interrupt, 564 545 .set_wol = gpy_set_wol, 565 546 .get_wol = gpy_get_wol, 566 - .set_loopback = gpy_loopback, 547 + .set_loopback = gpy115_loopback, 567 548 }, 568 549 { 569 550 .phy_id = PHY_ID_GPY211B,