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

net: dsa: microchip: ksz8: Enable MIIM PHY Control reg access

Provide access to MIIM PHY Control register (Reg. 31) through
ksz8_r_phy_ctrl() and ksz8_w_phy_ctrl() functions. Necessary for
upcoming micrel.c patch to address forced link mode configuration.

Closes: https://lore.kernel.org/oe-kbuild-all/202310112224.iYgvjBUy-lkp@intel.com/
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Oleksij Rempel and committed by
David S. Miller
f600bb61 c0518571

+87 -3
+83 -3
drivers/net/dsa/microchip/ksz8795.c
··· 632 632 ksz8_w_table(dev, TABLE_VLAN, addr, buf); 633 633 } 634 634 635 + /** 636 + * ksz8_r_phy_ctrl - Translates and reads from the SMI interface to a MIIM PHY 637 + * Control register (Reg. 31). 638 + * @dev: The KSZ device instance. 639 + * @port: The port number to be read. 640 + * @val: The value read from the SMI interface. 641 + * 642 + * This function reads the SMI interface and translates the hardware register 643 + * bit values into their corresponding control settings for a MIIM PHY Control 644 + * register. 645 + * 646 + * Return: 0 on success, error code on failure. 647 + */ 648 + static int ksz8_r_phy_ctrl(struct ksz_device *dev, int port, u16 *val) 649 + { 650 + const u16 *regs = dev->info->regs; 651 + u8 reg_val; 652 + int ret; 653 + 654 + *val = 0; 655 + 656 + ret = ksz_pread8(dev, port, regs[P_LINK_STATUS], &reg_val); 657 + if (ret < 0) 658 + return ret; 659 + 660 + if (reg_val & PORT_MDIX_STATUS) 661 + *val |= KSZ886X_CTRL_MDIX_STAT; 662 + 663 + ret = ksz_pread8(dev, port, REG_PORT_LINK_MD_CTRL, &reg_val); 664 + if (ret < 0) 665 + return ret; 666 + 667 + if (reg_val & PORT_FORCE_LINK) 668 + *val |= KSZ886X_CTRL_FORCE_LINK; 669 + 670 + if (reg_val & PORT_POWER_SAVING) 671 + *val |= KSZ886X_CTRL_PWRSAVE; 672 + 673 + if (reg_val & PORT_PHY_REMOTE_LOOPBACK) 674 + *val |= KSZ886X_CTRL_REMOTE_LOOPBACK; 675 + 676 + return 0; 677 + } 678 + 635 679 int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val) 636 680 { 637 681 u8 restart, speed, ctrl, link; ··· 813 769 FIELD_GET(PORT_CABLE_FAULT_COUNTER_L, val2)); 814 770 break; 815 771 case PHY_REG_PHY_CTRL: 816 - ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link); 772 + ret = ksz8_r_phy_ctrl(dev, p, &data); 817 773 if (ret) 818 774 return ret; 819 775 820 - if (link & PORT_MDIX_STATUS) 821 - data |= KSZ886X_CTRL_MDIX_STAT; 822 776 break; 823 777 default: 824 778 processed = false; ··· 826 784 *val = data; 827 785 828 786 return 0; 787 + } 788 + 789 + /** 790 + * ksz8_w_phy_ctrl - Translates and writes to the SMI interface from a MIIM PHY 791 + * Control register (Reg. 31). 792 + * @dev: The KSZ device instance. 793 + * @port: The port number to be configured. 794 + * @val: The register value to be written. 795 + * 796 + * This function translates control settings from a MIIM PHY Control register 797 + * into their corresponding hardware register bit values for the SMI 798 + * interface. 799 + * 800 + * Return: 0 on success, error code on failure. 801 + */ 802 + static int ksz8_w_phy_ctrl(struct ksz_device *dev, int port, u16 val) 803 + { 804 + u8 reg_val = 0; 805 + int ret; 806 + 807 + if (val & KSZ886X_CTRL_FORCE_LINK) 808 + reg_val |= PORT_FORCE_LINK; 809 + 810 + if (val & KSZ886X_CTRL_PWRSAVE) 811 + reg_val |= PORT_POWER_SAVING; 812 + 813 + if (val & KSZ886X_CTRL_REMOTE_LOOPBACK) 814 + reg_val |= PORT_PHY_REMOTE_LOOPBACK; 815 + 816 + ret = ksz_prmw8(dev, port, REG_PORT_LINK_MD_CTRL, PORT_FORCE_LINK | 817 + PORT_POWER_SAVING | PORT_PHY_REMOTE_LOOPBACK, reg_val); 818 + return ret; 829 819 } 830 820 831 821 int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) ··· 999 925 case PHY_REG_LINK_MD: 1000 926 if (val & PHY_START_CABLE_DIAG) 1001 927 ksz_port_cfg(dev, p, REG_PORT_LINK_MD_CTRL, PORT_START_CABLE_DIAG, true); 928 + break; 929 + 930 + case PHY_REG_PHY_CTRL: 931 + ret = ksz8_w_phy_ctrl(dev, p, val); 932 + if (ret) 933 + return ret; 1002 934 break; 1003 935 default: 1004 936 break;
+4
include/linux/micrel_phy.h
··· 64 64 #define KSZ886X_BMCR_DISABLE_TRANSMIT BIT(1) 65 65 #define KSZ886X_BMCR_DISABLE_LED BIT(0) 66 66 67 + /* PHY Special Control/Status Register (Reg 31) */ 67 68 #define KSZ886X_CTRL_MDIX_STAT BIT(4) 69 + #define KSZ886X_CTRL_FORCE_LINK BIT(3) 70 + #define KSZ886X_CTRL_PWRSAVE BIT(2) 71 + #define KSZ886X_CTRL_REMOTE_LOOPBACK BIT(1) 68 72 69 73 #endif /* _MICREL_PHY_H */