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

Merge branch 'net-mdio-continue-separating-c22-and-c45'

Michael Walle says:

====================
net: mdio: Continue separating C22 and C45

I've picked this older series from Andrew up and rebased it onto
the latest net-next.

This is the third (and hopefully last) patch set in the series which
separates the C22 and C45 MDIO bus transactions at the API level to the
MDIO bus drivers.

The first patch is a newer version of the former "net: dsa: Separate C22
and C45 MDIO bus transaction methods", which only contains the mt7530
changes. Although posted as v1, because this is a new series, there
is a changelog included in the patch comment section.

The last patch is a new one, which isn't from Andrew's tree.
====================

Link: https://lore.kernel.org/r/20230116-net-next-c45-seperation-part-3-v1-0-0c53afa56aad@walle.cc
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+937 -497
+54 -53
drivers/net/dsa/mt7530.c
··· 608 608 mt7530_write(priv, MT7530_MIB_CCR, CCR_MIB_ACTIVATE); 609 609 } 610 610 611 - static int mt7530_phy_read(struct mt7530_priv *priv, int port, int regnum) 611 + static int mt7530_phy_read_c22(struct mt7530_priv *priv, int port, int regnum) 612 612 { 613 613 return mdiobus_read_nested(priv->bus, port, regnum); 614 614 } 615 615 616 - static int mt7530_phy_write(struct mt7530_priv *priv, int port, int regnum, 617 - u16 val) 616 + static int mt7530_phy_write_c22(struct mt7530_priv *priv, int port, int regnum, 617 + u16 val) 618 618 { 619 619 return mdiobus_write_nested(priv->bus, port, regnum, val); 620 + } 621 + 622 + static int mt7530_phy_read_c45(struct mt7530_priv *priv, int port, 623 + int devad, int regnum) 624 + { 625 + return mdiobus_c45_read_nested(priv->bus, port, devad, regnum); 626 + } 627 + 628 + static int mt7530_phy_write_c45(struct mt7530_priv *priv, int port, int devad, 629 + int regnum, u16 val) 630 + { 631 + return mdiobus_c45_write_nested(priv->bus, port, devad, regnum, val); 620 632 } 621 633 622 634 static int ··· 682 670 683 671 static int 684 672 mt7531_ind_c45_phy_write(struct mt7530_priv *priv, int port, int devad, 685 - int regnum, u32 data) 673 + int regnum, u16 data) 686 674 { 687 675 struct mii_bus *bus = priv->bus; 688 676 struct mt7530_dummy_poll p; ··· 805 793 } 806 794 807 795 static int 808 - mt7531_ind_phy_read(struct mt7530_priv *priv, int port, int regnum) 809 - { 810 - int devad; 811 - int ret; 812 - 813 - if (regnum & MII_ADDR_C45) { 814 - devad = (regnum >> MII_DEVADDR_C45_SHIFT) & 0x1f; 815 - ret = mt7531_ind_c45_phy_read(priv, port, devad, 816 - regnum & MII_REGADDR_C45_MASK); 817 - } else { 818 - ret = mt7531_ind_c22_phy_read(priv, port, regnum); 819 - } 820 - 821 - return ret; 822 - } 823 - 824 - static int 825 - mt7531_ind_phy_write(struct mt7530_priv *priv, int port, int regnum, 826 - u16 data) 827 - { 828 - int devad; 829 - int ret; 830 - 831 - if (regnum & MII_ADDR_C45) { 832 - devad = (regnum >> MII_DEVADDR_C45_SHIFT) & 0x1f; 833 - ret = mt7531_ind_c45_phy_write(priv, port, devad, 834 - regnum & MII_REGADDR_C45_MASK, 835 - data); 836 - } else { 837 - ret = mt7531_ind_c22_phy_write(priv, port, regnum, data); 838 - } 839 - 840 - return ret; 841 - } 842 - 843 - static int 844 - mt753x_phy_read(struct mii_bus *bus, int port, int regnum) 796 + mt753x_phy_read_c22(struct mii_bus *bus, int port, int regnum) 845 797 { 846 798 struct mt7530_priv *priv = bus->priv; 847 799 848 - return priv->info->phy_read(priv, port, regnum); 800 + return priv->info->phy_read_c22(priv, port, regnum); 849 801 } 850 802 851 803 static int 852 - mt753x_phy_write(struct mii_bus *bus, int port, int regnum, u16 val) 804 + mt753x_phy_read_c45(struct mii_bus *bus, int port, int devad, int regnum) 853 805 { 854 806 struct mt7530_priv *priv = bus->priv; 855 807 856 - return priv->info->phy_write(priv, port, regnum, val); 808 + return priv->info->phy_read_c45(priv, port, devad, regnum); 809 + } 810 + 811 + static int 812 + mt753x_phy_write_c22(struct mii_bus *bus, int port, int regnum, u16 val) 813 + { 814 + struct mt7530_priv *priv = bus->priv; 815 + 816 + return priv->info->phy_write_c22(priv, port, regnum, val); 817 + } 818 + 819 + static int 820 + mt753x_phy_write_c45(struct mii_bus *bus, int port, int devad, int regnum, 821 + u16 val) 822 + { 823 + struct mt7530_priv *priv = bus->priv; 824 + 825 + return priv->info->phy_write_c45(priv, port, devad, regnum, val); 857 826 } 858 827 859 828 static void ··· 2079 2086 bus->priv = priv; 2080 2087 bus->name = KBUILD_MODNAME "-mii"; 2081 2088 snprintf(bus->id, MII_BUS_ID_SIZE, KBUILD_MODNAME "-%d", idx++); 2082 - bus->read = mt753x_phy_read; 2083 - bus->write = mt753x_phy_write; 2089 + bus->read = mt753x_phy_read_c22; 2090 + bus->write = mt753x_phy_write_c22; 2091 + bus->read_c45 = mt753x_phy_read_c45; 2092 + bus->write_c45 = mt753x_phy_write_c45; 2084 2093 bus->parent = dev; 2085 2094 bus->phy_mask = ~ds->phys_mii_mask; 2086 2095 ··· 3177 3182 .id = ID_MT7621, 3178 3183 .pcs_ops = &mt7530_pcs_ops, 3179 3184 .sw_setup = mt7530_setup, 3180 - .phy_read = mt7530_phy_read, 3181 - .phy_write = mt7530_phy_write, 3185 + .phy_read_c22 = mt7530_phy_read_c22, 3186 + .phy_write_c22 = mt7530_phy_write_c22, 3187 + .phy_read_c45 = mt7530_phy_read_c45, 3188 + .phy_write_c45 = mt7530_phy_write_c45, 3182 3189 .pad_setup = mt7530_pad_clk_setup, 3183 3190 .mac_port_get_caps = mt7530_mac_port_get_caps, 3184 3191 .mac_port_config = mt7530_mac_config, ··· 3189 3192 .id = ID_MT7530, 3190 3193 .pcs_ops = &mt7530_pcs_ops, 3191 3194 .sw_setup = mt7530_setup, 3192 - .phy_read = mt7530_phy_read, 3193 - .phy_write = mt7530_phy_write, 3195 + .phy_read_c22 = mt7530_phy_read_c22, 3196 + .phy_write_c22 = mt7530_phy_write_c22, 3197 + .phy_read_c45 = mt7530_phy_read_c45, 3198 + .phy_write_c45 = mt7530_phy_write_c45, 3194 3199 .pad_setup = mt7530_pad_clk_setup, 3195 3200 .mac_port_get_caps = mt7530_mac_port_get_caps, 3196 3201 .mac_port_config = mt7530_mac_config, ··· 3201 3202 .id = ID_MT7531, 3202 3203 .pcs_ops = &mt7531_pcs_ops, 3203 3204 .sw_setup = mt7531_setup, 3204 - .phy_read = mt7531_ind_phy_read, 3205 - .phy_write = mt7531_ind_phy_write, 3205 + .phy_read_c22 = mt7531_ind_c22_phy_read, 3206 + .phy_write_c22 = mt7531_ind_c22_phy_write, 3207 + .phy_read_c45 = mt7531_ind_c45_phy_read, 3208 + .phy_write_c45 = mt7531_ind_c45_phy_write, 3206 3209 .pad_setup = mt7531_pad_setup, 3207 3210 .cpu_port_config = mt7531_cpu_port_config, 3208 3211 .mac_port_get_caps = mt7531_mac_port_get_caps, ··· 3264 3263 * properly. 3265 3264 */ 3266 3265 if (!priv->info->sw_setup || !priv->info->pad_setup || 3267 - !priv->info->phy_read || !priv->info->phy_write || 3266 + !priv->info->phy_read_c22 || !priv->info->phy_write_c22 || 3268 3267 !priv->info->mac_port_get_caps || 3269 3268 !priv->info->mac_port_config) 3270 3269 return -EINVAL;
+11 -4
drivers/net/dsa/mt7530.h
··· 750 750 /* struct mt753x_info - This is the main data structure for holding the specific 751 751 * part for each supported device 752 752 * @sw_setup: Holding the handler to a device initialization 753 - * @phy_read: Holding the way reading PHY port 754 - * @phy_write: Holding the way writing PHY port 753 + * @phy_read_c22: Holding the way reading PHY port using C22 754 + * @phy_write_c22: Holding the way writing PHY port using C22 755 + * @phy_read_c45: Holding the way reading PHY port using C45 756 + * @phy_write_c45: Holding the way writing PHY port using C45 755 757 * @pad_setup: Holding the way setting up the bus pad for a certain 756 758 * MAC port 757 759 * @phy_mode_supported: Check if the PHY type is being supported on a certain ··· 769 767 const struct phylink_pcs_ops *pcs_ops; 770 768 771 769 int (*sw_setup)(struct dsa_switch *ds); 772 - int (*phy_read)(struct mt7530_priv *priv, int port, int regnum); 773 - int (*phy_write)(struct mt7530_priv *priv, int port, int regnum, u16 val); 770 + int (*phy_read_c22)(struct mt7530_priv *priv, int port, int regnum); 771 + int (*phy_write_c22)(struct mt7530_priv *priv, int port, int regnum, 772 + u16 val); 773 + int (*phy_read_c45)(struct mt7530_priv *priv, int port, int devad, 774 + int regnum); 775 + int (*phy_write_c45)(struct mt7530_priv *priv, int port, int devad, 776 + int regnum, u16 val); 774 777 int (*pad_setup)(struct dsa_switch *ds, phy_interface_t interface); 775 778 int (*cpu_port_config)(struct dsa_switch *ds, int port); 776 779 void (*mac_port_get_caps)(struct dsa_switch *ds, int port,
+10 -6
drivers/net/dsa/sja1105/sja1105.h
··· 149 149 bool (*rxtstamp)(struct dsa_switch *ds, int port, struct sk_buff *skb); 150 150 void (*txtstamp)(struct dsa_switch *ds, int port, struct sk_buff *skb); 151 151 int (*clocking_setup)(struct sja1105_private *priv); 152 - int (*pcs_mdio_read)(struct mii_bus *bus, int phy, int reg); 153 - int (*pcs_mdio_write)(struct mii_bus *bus, int phy, int reg, u16 val); 152 + int (*pcs_mdio_read_c45)(struct mii_bus *bus, int phy, int mmd, 153 + int reg); 154 + int (*pcs_mdio_write_c45)(struct mii_bus *bus, int phy, int mmd, 155 + int reg, u16 val); 154 156 int (*disable_microcontroller)(struct sja1105_private *priv); 155 157 const char *name; 156 158 bool supports_mii[SJA1105_MAX_NUM_PORTS]; ··· 305 303 /* From sja1105_mdio.c */ 306 304 int sja1105_mdiobus_register(struct dsa_switch *ds); 307 305 void sja1105_mdiobus_unregister(struct dsa_switch *ds); 308 - int sja1105_pcs_mdio_read(struct mii_bus *bus, int phy, int reg); 309 - int sja1105_pcs_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val); 310 - int sja1110_pcs_mdio_read(struct mii_bus *bus, int phy, int reg); 311 - int sja1110_pcs_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val); 306 + int sja1105_pcs_mdio_read_c45(struct mii_bus *bus, int phy, int mmd, int reg); 307 + int sja1105_pcs_mdio_write_c45(struct mii_bus *bus, int phy, int mmd, int reg, 308 + u16 val); 309 + int sja1110_pcs_mdio_read_c45(struct mii_bus *bus, int phy, int mmd, int reg); 310 + int sja1110_pcs_mdio_write_c45(struct mii_bus *bus, int phy, int mmd, int reg, 311 + u16 val); 312 312 313 313 /* From sja1105_devlink.c */ 314 314 int sja1105_devlink_setup(struct dsa_switch *ds);
+59 -78
drivers/net/dsa/sja1105/sja1105_mdio.c
··· 7 7 8 8 #define SJA1110_PCS_BANK_REG SJA1110_SPI_ADDR(0x3fc) 9 9 10 - int sja1105_pcs_mdio_read(struct mii_bus *bus, int phy, int reg) 10 + int sja1105_pcs_mdio_read_c45(struct mii_bus *bus, int phy, int mmd, int reg) 11 11 { 12 12 struct sja1105_mdio_private *mdio_priv = bus->priv; 13 13 struct sja1105_private *priv = mdio_priv->priv; 14 14 u64 addr; 15 15 u32 tmp; 16 - u16 mmd; 17 16 int rc; 18 17 19 - if (!(reg & MII_ADDR_C45)) 20 - return -EINVAL; 21 - 22 - mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 23 - addr = (mmd << 16) | (reg & GENMASK(15, 0)); 18 + addr = (mmd << 16) | reg; 24 19 25 20 if (mmd != MDIO_MMD_VEND1 && mmd != MDIO_MMD_VEND2) 26 21 return 0xffff; ··· 32 37 return tmp & 0xffff; 33 38 } 34 39 35 - int sja1105_pcs_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val) 40 + int sja1105_pcs_mdio_write_c45(struct mii_bus *bus, int phy, int mmd, 41 + int reg, u16 val) 36 42 { 37 43 struct sja1105_mdio_private *mdio_priv = bus->priv; 38 44 struct sja1105_private *priv = mdio_priv->priv; 39 45 u64 addr; 40 46 u32 tmp; 41 - u16 mmd; 42 47 43 - if (!(reg & MII_ADDR_C45)) 44 - return -EINVAL; 45 - 46 - mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 47 - addr = (mmd << 16) | (reg & GENMASK(15, 0)); 48 + addr = (mmd << 16) | reg; 48 49 tmp = val; 49 50 50 51 if (mmd != MDIO_MMD_VEND1 && mmd != MDIO_MMD_VEND2) ··· 49 58 return sja1105_xfer_u32(priv, SPI_WRITE, addr, &tmp, NULL); 50 59 } 51 60 52 - int sja1110_pcs_mdio_read(struct mii_bus *bus, int phy, int reg) 61 + int sja1110_pcs_mdio_read_c45(struct mii_bus *bus, int phy, int mmd, int reg) 53 62 { 54 63 struct sja1105_mdio_private *mdio_priv = bus->priv; 55 64 struct sja1105_private *priv = mdio_priv->priv; ··· 57 66 int offset, bank; 58 67 u64 addr; 59 68 u32 tmp; 60 - u16 mmd; 61 69 int rc; 62 - 63 - if (!(reg & MII_ADDR_C45)) 64 - return -EINVAL; 65 70 66 71 if (regs->pcs_base[phy] == SJA1105_RSV_ADDR) 67 72 return -ENODEV; 68 73 69 - mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 70 - addr = (mmd << 16) | (reg & GENMASK(15, 0)); 74 + addr = (mmd << 16) | reg; 71 75 72 76 if (mmd == MDIO_MMD_VEND2 && (reg & GENMASK(15, 0)) == MII_PHYSID1) 73 77 return NXP_SJA1110_XPCS_ID >> 16; ··· 94 108 return tmp & 0xffff; 95 109 } 96 110 97 - int sja1110_pcs_mdio_write(struct mii_bus *bus, int phy, int reg, u16 val) 111 + int sja1110_pcs_mdio_write_c45(struct mii_bus *bus, int phy, int reg, int mmd, 112 + u16 val) 98 113 { 99 114 struct sja1105_mdio_private *mdio_priv = bus->priv; 100 115 struct sja1105_private *priv = mdio_priv->priv; ··· 103 116 int offset, bank; 104 117 u64 addr; 105 118 u32 tmp; 106 - u16 mmd; 107 119 int rc; 108 - 109 - if (!(reg & MII_ADDR_C45)) 110 - return -EINVAL; 111 120 112 121 if (regs->pcs_base[phy] == SJA1105_RSV_ADDR) 113 122 return -ENODEV; 114 123 115 - mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 116 - addr = (mmd << 16) | (reg & GENMASK(15, 0)); 124 + addr = (mmd << 16) | reg; 117 125 118 126 bank = addr >> 8; 119 127 offset = addr & GENMASK(7, 0); ··· 149 167 return regs->mdio_100base_t1 | (phy << 7) | (op << 5) | (xad << 0); 150 168 } 151 169 152 - static int sja1105_base_t1_mdio_read(struct mii_bus *bus, int phy, int reg) 170 + static int sja1105_base_t1_mdio_read_c22(struct mii_bus *bus, int phy, int reg) 153 171 { 154 172 struct sja1105_mdio_private *mdio_priv = bus->priv; 155 173 struct sja1105_private *priv = mdio_priv->priv; ··· 157 175 u32 tmp; 158 176 int rc; 159 177 160 - if (reg & MII_ADDR_C45) { 161 - u16 mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 162 - 163 - addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_ADDR, 164 - mmd); 165 - 166 - tmp = reg & MII_REGADDR_C45_MASK; 167 - 168 - rc = sja1105_xfer_u32(priv, SPI_WRITE, addr, &tmp, NULL); 169 - if (rc < 0) 170 - return rc; 171 - 172 - addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_DATA, 173 - mmd); 174 - 175 - rc = sja1105_xfer_u32(priv, SPI_READ, addr, &tmp, NULL); 176 - if (rc < 0) 177 - return rc; 178 - 179 - return tmp & 0xffff; 180 - } 181 - 182 - /* Clause 22 read */ 183 178 addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C22, reg & 0x1f); 184 179 185 180 rc = sja1105_xfer_u32(priv, SPI_READ, addr, &tmp, NULL); ··· 166 207 return tmp & 0xffff; 167 208 } 168 209 169 - static int sja1105_base_t1_mdio_write(struct mii_bus *bus, int phy, int reg, 170 - u16 val) 210 + static int sja1105_base_t1_mdio_read_c45(struct mii_bus *bus, int phy, 211 + int mmd, int reg) 171 212 { 172 213 struct sja1105_mdio_private *mdio_priv = bus->priv; 173 214 struct sja1105_private *priv = mdio_priv->priv; ··· 175 216 u32 tmp; 176 217 int rc; 177 218 178 - if (reg & MII_ADDR_C45) { 179 - u16 mmd = (reg >> MII_DEVADDR_C45_SHIFT) & 0x1f; 219 + addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_ADDR, mmd); 180 220 181 - addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_ADDR, 182 - mmd); 221 + rc = sja1105_xfer_u32(priv, SPI_WRITE, addr, &reg, NULL); 222 + if (rc < 0) 223 + return rc; 183 224 184 - tmp = reg & MII_REGADDR_C45_MASK; 225 + addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_DATA, mmd); 185 226 186 - rc = sja1105_xfer_u32(priv, SPI_WRITE, addr, &tmp, NULL); 187 - if (rc < 0) 188 - return rc; 227 + rc = sja1105_xfer_u32(priv, SPI_READ, addr, &tmp, NULL); 228 + if (rc < 0) 229 + return rc; 189 230 190 - addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_DATA, 191 - mmd); 231 + return tmp & 0xffff; 232 + } 192 233 193 - tmp = val & 0xffff; 234 + static int sja1105_base_t1_mdio_write_c22(struct mii_bus *bus, int phy, int reg, 235 + u16 val) 236 + { 237 + struct sja1105_mdio_private *mdio_priv = bus->priv; 238 + struct sja1105_private *priv = mdio_priv->priv; 239 + u64 addr; 240 + u32 tmp; 194 241 195 - rc = sja1105_xfer_u32(priv, SPI_WRITE, addr, &tmp, NULL); 196 - if (rc < 0) 197 - return rc; 198 - 199 - return 0; 200 - } 201 - 202 - /* Clause 22 write */ 203 242 addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C22, reg & 0x1f); 243 + 244 + tmp = val & 0xffff; 245 + 246 + return sja1105_xfer_u32(priv, SPI_WRITE, addr, &tmp, NULL); 247 + } 248 + 249 + static int sja1105_base_t1_mdio_write_c45(struct mii_bus *bus, int phy, 250 + int mmd, int reg, u16 val) 251 + { 252 + struct sja1105_mdio_private *mdio_priv = bus->priv; 253 + struct sja1105_private *priv = mdio_priv->priv; 254 + u64 addr; 255 + u32 tmp; 256 + int rc; 257 + 258 + addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_ADDR, mmd); 259 + 260 + rc = sja1105_xfer_u32(priv, SPI_WRITE, addr, &reg, NULL); 261 + if (rc < 0) 262 + return rc; 263 + 264 + addr = sja1105_base_t1_encode_addr(priv, phy, SJA1105_C45_DATA, mmd); 204 265 205 266 tmp = val & 0xffff; 206 267 ··· 339 360 bus->name = "SJA1110 100base-T1 MDIO bus"; 340 361 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-base-t1", 341 362 dev_name(priv->ds->dev)); 342 - bus->read = sja1105_base_t1_mdio_read; 343 - bus->write = sja1105_base_t1_mdio_write; 363 + bus->read = sja1105_base_t1_mdio_read_c22; 364 + bus->write = sja1105_base_t1_mdio_write_c22; 365 + bus->read_c45 = sja1105_base_t1_mdio_read_c45; 366 + bus->write_c45 = sja1105_base_t1_mdio_write_c45; 344 367 bus->parent = priv->ds->dev; 345 368 mdio_priv = bus->priv; 346 369 mdio_priv->priv = priv; ··· 379 398 int rc = 0; 380 399 int port; 381 400 382 - if (!priv->info->pcs_mdio_read || !priv->info->pcs_mdio_write) 401 + if (!priv->info->pcs_mdio_read_c45 || !priv->info->pcs_mdio_write_c45) 383 402 return 0; 384 403 385 404 bus = mdiobus_alloc_size(sizeof(*mdio_priv)); ··· 389 408 bus->name = "SJA1105 PCS MDIO bus"; 390 409 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-pcs", 391 410 dev_name(ds->dev)); 392 - bus->read = priv->info->pcs_mdio_read; 393 - bus->write = priv->info->pcs_mdio_write; 411 + bus->read_c45 = priv->info->pcs_mdio_read_c45; 412 + bus->write_c45 = priv->info->pcs_mdio_write_c45; 394 413 bus->parent = ds->dev; 395 414 /* There is no PHY on this MDIO bus => mask out all PHY addresses 396 415 * from auto probing.
+12 -12
drivers/net/dsa/sja1105/sja1105_spi.c
··· 719 719 .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing, 720 720 .rxtstamp = sja1105_rxtstamp, 721 721 .clocking_setup = sja1105_clocking_setup, 722 - .pcs_mdio_read = sja1105_pcs_mdio_read, 723 - .pcs_mdio_write = sja1105_pcs_mdio_write, 722 + .pcs_mdio_read_c45 = sja1105_pcs_mdio_read_c45, 723 + .pcs_mdio_write_c45 = sja1105_pcs_mdio_write_c45, 724 724 .regs = &sja1105pqrs_regs, 725 725 .port_speed = { 726 726 [SJA1105_SPEED_AUTO] = 0, ··· 756 756 .ptp_cmd_packing = sja1105pqrs_ptp_cmd_packing, 757 757 .rxtstamp = sja1105_rxtstamp, 758 758 .clocking_setup = sja1105_clocking_setup, 759 - .pcs_mdio_read = sja1105_pcs_mdio_read, 760 - .pcs_mdio_write = sja1105_pcs_mdio_write, 759 + .pcs_mdio_read_c45 = sja1105_pcs_mdio_read_c45, 760 + .pcs_mdio_write_c45 = sja1105_pcs_mdio_write_c45, 761 761 .port_speed = { 762 762 [SJA1105_SPEED_AUTO] = 0, 763 763 [SJA1105_SPEED_10MBPS] = 3, ··· 794 794 .rxtstamp = sja1110_rxtstamp, 795 795 .txtstamp = sja1110_txtstamp, 796 796 .disable_microcontroller = sja1110_disable_microcontroller, 797 - .pcs_mdio_read = sja1110_pcs_mdio_read, 798 - .pcs_mdio_write = sja1110_pcs_mdio_write, 797 + .pcs_mdio_read_c45 = sja1110_pcs_mdio_read_c45, 798 + .pcs_mdio_write_c45 = sja1110_pcs_mdio_write_c45, 799 799 .port_speed = { 800 800 [SJA1105_SPEED_AUTO] = 0, 801 801 [SJA1105_SPEED_10MBPS] = 4, ··· 844 844 .rxtstamp = sja1110_rxtstamp, 845 845 .txtstamp = sja1110_txtstamp, 846 846 .disable_microcontroller = sja1110_disable_microcontroller, 847 - .pcs_mdio_read = sja1110_pcs_mdio_read, 848 - .pcs_mdio_write = sja1110_pcs_mdio_write, 847 + .pcs_mdio_read_c45 = sja1110_pcs_mdio_read_c45, 848 + .pcs_mdio_write_c45 = sja1110_pcs_mdio_write_c45, 849 849 .port_speed = { 850 850 [SJA1105_SPEED_AUTO] = 0, 851 851 [SJA1105_SPEED_10MBPS] = 4, ··· 894 894 .rxtstamp = sja1110_rxtstamp, 895 895 .txtstamp = sja1110_txtstamp, 896 896 .disable_microcontroller = sja1110_disable_microcontroller, 897 - .pcs_mdio_read = sja1110_pcs_mdio_read, 898 - .pcs_mdio_write = sja1110_pcs_mdio_write, 897 + .pcs_mdio_read_c45 = sja1110_pcs_mdio_read_c45, 898 + .pcs_mdio_write_c45 = sja1110_pcs_mdio_write_c45, 899 899 .port_speed = { 900 900 [SJA1105_SPEED_AUTO] = 0, 901 901 [SJA1105_SPEED_10MBPS] = 4, ··· 944 944 .rxtstamp = sja1110_rxtstamp, 945 945 .txtstamp = sja1110_txtstamp, 946 946 .disable_microcontroller = sja1110_disable_microcontroller, 947 - .pcs_mdio_read = sja1110_pcs_mdio_read, 948 - .pcs_mdio_write = sja1110_pcs_mdio_write, 947 + .pcs_mdio_read_c45 = sja1110_pcs_mdio_read_c45, 948 + .pcs_mdio_write_c45 = sja1110_pcs_mdio_write_c45, 949 949 .port_speed = { 950 950 [SJA1105_SPEED_AUTO] = 0, 951 951 [SJA1105_SPEED_10MBPS] = 4,
+6 -5
drivers/net/ethernet/amd/xgbe/xgbe-common.h
··· 1699 1699 } while (0) 1700 1700 1701 1701 /* Macros for building, reading or writing register values or bits 1702 - * using MDIO. Different from above because of the use of standardized 1703 - * Linux include values. No shifting is performed with the bit 1704 - * operations, everything works on mask values. 1702 + * using MDIO. 1705 1703 */ 1704 + 1705 + #define XGBE_ADDR_C45 BIT(30) 1706 + 1706 1707 #define XMDIO_READ(_pdata, _mmd, _reg) \ 1707 1708 ((_pdata)->hw_if.read_mmd_regs((_pdata), 0, \ 1708 - MII_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff))) 1709 + XGBE_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff))) 1709 1710 1710 1711 #define XMDIO_READ_BITS(_pdata, _mmd, _reg, _mask) \ 1711 1712 (XMDIO_READ((_pdata), _mmd, _reg) & _mask) 1712 1713 1713 1714 #define XMDIO_WRITE(_pdata, _mmd, _reg, _val) \ 1714 1715 ((_pdata)->hw_if.write_mmd_regs((_pdata), 0, \ 1715 - MII_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff), (_val))) 1716 + XGBE_ADDR_C45 | (_mmd << 16) | ((_reg) & 0xffff), (_val))) 1716 1717 1717 1718 #define XMDIO_WRITE_BITS(_pdata, _mmd, _reg, _mask, _val) \ 1718 1719 do { \
+70 -21
drivers/net/ethernet/amd/xgbe/xgbe-dev.c
··· 1150 1150 unsigned int mmd_address, index, offset; 1151 1151 int mmd_data; 1152 1152 1153 - if (mmd_reg & MII_ADDR_C45) 1154 - mmd_address = mmd_reg & ~MII_ADDR_C45; 1153 + if (mmd_reg & XGBE_ADDR_C45) 1154 + mmd_address = mmd_reg & ~XGBE_ADDR_C45; 1155 1155 else 1156 1156 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); 1157 1157 ··· 1182 1182 unsigned long flags; 1183 1183 unsigned int mmd_address, index, offset; 1184 1184 1185 - if (mmd_reg & MII_ADDR_C45) 1186 - mmd_address = mmd_reg & ~MII_ADDR_C45; 1185 + if (mmd_reg & XGBE_ADDR_C45) 1186 + mmd_address = mmd_reg & ~XGBE_ADDR_C45; 1187 1187 else 1188 1188 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); 1189 1189 ··· 1213 1213 unsigned int mmd_address; 1214 1214 int mmd_data; 1215 1215 1216 - if (mmd_reg & MII_ADDR_C45) 1217 - mmd_address = mmd_reg & ~MII_ADDR_C45; 1216 + if (mmd_reg & XGBE_ADDR_C45) 1217 + mmd_address = mmd_reg & ~XGBE_ADDR_C45; 1218 1218 else 1219 1219 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); 1220 1220 ··· 1241 1241 unsigned int mmd_address; 1242 1242 unsigned long flags; 1243 1243 1244 - if (mmd_reg & MII_ADDR_C45) 1245 - mmd_address = mmd_reg & ~MII_ADDR_C45; 1244 + if (mmd_reg & XGBE_ADDR_C45) 1245 + mmd_address = mmd_reg & ~XGBE_ADDR_C45; 1246 1246 else 1247 1247 mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff); 1248 1248 ··· 1287 1287 } 1288 1288 } 1289 1289 1290 - static unsigned int xgbe_create_mdio_sca(int port, int reg) 1290 + static unsigned int xgbe_create_mdio_sca_c22(int port, int reg) 1291 1291 { 1292 - unsigned int mdio_sca, da; 1292 + unsigned int mdio_sca; 1293 1293 1294 - da = (reg & MII_ADDR_C45) ? reg >> 16 : 0; 1294 + mdio_sca = 0; 1295 + XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, RA, reg); 1296 + XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, PA, port); 1297 + 1298 + return mdio_sca; 1299 + } 1300 + 1301 + static unsigned int xgbe_create_mdio_sca_c45(int port, unsigned int da, int reg) 1302 + { 1303 + unsigned int mdio_sca; 1295 1304 1296 1305 mdio_sca = 0; 1297 1306 XGMAC_SET_BITS(mdio_sca, MAC_MDIOSCAR, RA, reg); ··· 1310 1301 return mdio_sca; 1311 1302 } 1312 1303 1313 - static int xgbe_write_ext_mii_regs(struct xgbe_prv_data *pdata, int addr, 1314 - int reg, u16 val) 1304 + static int xgbe_write_ext_mii_regs(struct xgbe_prv_data *pdata, 1305 + unsigned int mdio_sca, u16 val) 1315 1306 { 1316 - unsigned int mdio_sca, mdio_sccd; 1307 + unsigned int mdio_sccd; 1317 1308 1318 1309 reinit_completion(&pdata->mdio_complete); 1319 1310 1320 - mdio_sca = xgbe_create_mdio_sca(addr, reg); 1321 1311 XGMAC_IOWRITE(pdata, MAC_MDIOSCAR, mdio_sca); 1322 1312 1323 1313 mdio_sccd = 0; ··· 1333 1325 return 0; 1334 1326 } 1335 1327 1336 - static int xgbe_read_ext_mii_regs(struct xgbe_prv_data *pdata, int addr, 1337 - int reg) 1328 + static int xgbe_write_ext_mii_regs_c22(struct xgbe_prv_data *pdata, int addr, 1329 + int reg, u16 val) 1338 1330 { 1339 - unsigned int mdio_sca, mdio_sccd; 1331 + unsigned int mdio_sca; 1332 + 1333 + mdio_sca = xgbe_create_mdio_sca_c22(addr, reg); 1334 + 1335 + return xgbe_write_ext_mii_regs(pdata, mdio_sca, val); 1336 + } 1337 + 1338 + static int xgbe_write_ext_mii_regs_c45(struct xgbe_prv_data *pdata, int addr, 1339 + int devad, int reg, u16 val) 1340 + { 1341 + unsigned int mdio_sca; 1342 + 1343 + mdio_sca = xgbe_create_mdio_sca_c45(addr, devad, reg); 1344 + 1345 + return xgbe_write_ext_mii_regs(pdata, mdio_sca, val); 1346 + } 1347 + 1348 + static int xgbe_read_ext_mii_regs(struct xgbe_prv_data *pdata, 1349 + unsigned int mdio_sca) 1350 + { 1351 + unsigned int mdio_sccd; 1340 1352 1341 1353 reinit_completion(&pdata->mdio_complete); 1342 1354 1343 - mdio_sca = xgbe_create_mdio_sca(addr, reg); 1344 1355 XGMAC_IOWRITE(pdata, MAC_MDIOSCAR, mdio_sca); 1345 1356 1346 1357 mdio_sccd = 0; ··· 1373 1346 } 1374 1347 1375 1348 return XGMAC_IOREAD_BITS(pdata, MAC_MDIOSCCDR, DATA); 1349 + } 1350 + 1351 + static int xgbe_read_ext_mii_regs_c22(struct xgbe_prv_data *pdata, int addr, 1352 + int reg) 1353 + { 1354 + unsigned int mdio_sca; 1355 + 1356 + mdio_sca = xgbe_create_mdio_sca_c22(addr, reg); 1357 + 1358 + return xgbe_read_ext_mii_regs(pdata, mdio_sca); 1359 + } 1360 + 1361 + static int xgbe_read_ext_mii_regs_c45(struct xgbe_prv_data *pdata, int addr, 1362 + int devad, int reg) 1363 + { 1364 + unsigned int mdio_sca; 1365 + 1366 + mdio_sca = xgbe_create_mdio_sca_c45(addr, devad, reg); 1367 + 1368 + return xgbe_read_ext_mii_regs(pdata, mdio_sca); 1376 1369 } 1377 1370 1378 1371 static int xgbe_set_ext_mii_mode(struct xgbe_prv_data *pdata, unsigned int port, ··· 3608 3561 hw_if->set_speed = xgbe_set_speed; 3609 3562 3610 3563 hw_if->set_ext_mii_mode = xgbe_set_ext_mii_mode; 3611 - hw_if->read_ext_mii_regs = xgbe_read_ext_mii_regs; 3612 - hw_if->write_ext_mii_regs = xgbe_write_ext_mii_regs; 3564 + hw_if->read_ext_mii_regs_c22 = xgbe_read_ext_mii_regs_c22; 3565 + hw_if->write_ext_mii_regs_c22 = xgbe_write_ext_mii_regs_c22; 3566 + hw_if->read_ext_mii_regs_c45 = xgbe_read_ext_mii_regs_c45; 3567 + hw_if->write_ext_mii_regs_c45 = xgbe_write_ext_mii_regs_c45; 3613 3568 3614 3569 hw_if->set_gpio = xgbe_set_gpio; 3615 3570 hw_if->clr_gpio = xgbe_clr_gpio;
+91 -29
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
··· 600 600 return -ETIMEDOUT; 601 601 } 602 602 603 - static int xgbe_phy_mdio_mii_write(struct xgbe_prv_data *pdata, int addr, 604 - int reg, u16 val) 603 + static int xgbe_phy_mdio_mii_write_c22(struct xgbe_prv_data *pdata, int addr, 604 + int reg, u16 val) 605 605 { 606 606 struct xgbe_phy_data *phy_data = pdata->phy_data; 607 607 608 - if (reg & MII_ADDR_C45) { 609 - if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45) 610 - return -ENOTSUPP; 611 - } else { 612 - if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22) 613 - return -ENOTSUPP; 614 - } 608 + if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22) 609 + return -EOPNOTSUPP; 615 610 616 - return pdata->hw_if.write_ext_mii_regs(pdata, addr, reg, val); 611 + return pdata->hw_if.write_ext_mii_regs_c22(pdata, addr, reg, val); 612 + } 613 + 614 + static int xgbe_phy_mdio_mii_write_c45(struct xgbe_prv_data *pdata, int addr, 615 + int devad, int reg, u16 val) 616 + { 617 + struct xgbe_phy_data *phy_data = pdata->phy_data; 618 + 619 + if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45) 620 + return -EOPNOTSUPP; 621 + 622 + return pdata->hw_if.write_ext_mii_regs_c45(pdata, addr, devad, 623 + reg, val); 617 624 } 618 625 619 626 static int xgbe_phy_i2c_mii_write(struct xgbe_prv_data *pdata, int reg, u16 val) ··· 645 638 return ret; 646 639 } 647 640 648 - static int xgbe_phy_mii_write(struct mii_bus *mii, int addr, int reg, u16 val) 641 + static int xgbe_phy_mii_write_c22(struct mii_bus *mii, int addr, int reg, 642 + u16 val) 649 643 { 650 644 struct xgbe_prv_data *pdata = mii->priv; 651 645 struct xgbe_phy_data *phy_data = pdata->phy_data; ··· 659 651 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP) 660 652 ret = xgbe_phy_i2c_mii_write(pdata, reg, val); 661 653 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO) 662 - ret = xgbe_phy_mdio_mii_write(pdata, addr, reg, val); 654 + ret = xgbe_phy_mdio_mii_write_c22(pdata, addr, reg, val); 663 655 else 664 - ret = -ENOTSUPP; 656 + ret = -EOPNOTSUPP; 665 657 666 658 xgbe_phy_put_comm_ownership(pdata); 667 659 668 660 return ret; 669 661 } 670 662 671 - static int xgbe_phy_mdio_mii_read(struct xgbe_prv_data *pdata, int addr, 672 - int reg) 663 + static int xgbe_phy_mii_write_c45(struct mii_bus *mii, int addr, int devad, 664 + int reg, u16 val) 665 + { 666 + struct xgbe_prv_data *pdata = mii->priv; 667 + struct xgbe_phy_data *phy_data = pdata->phy_data; 668 + int ret; 669 + 670 + ret = xgbe_phy_get_comm_ownership(pdata); 671 + if (ret) 672 + return ret; 673 + 674 + if (phy_data->conn_type == XGBE_CONN_TYPE_SFP) 675 + ret = -EOPNOTSUPP; 676 + else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO) 677 + ret = xgbe_phy_mdio_mii_write_c45(pdata, addr, devad, reg, val); 678 + else 679 + ret = -EOPNOTSUPP; 680 + 681 + xgbe_phy_put_comm_ownership(pdata); 682 + 683 + return ret; 684 + } 685 + 686 + static int xgbe_phy_mdio_mii_read_c22(struct xgbe_prv_data *pdata, int addr, 687 + int reg) 673 688 { 674 689 struct xgbe_phy_data *phy_data = pdata->phy_data; 675 690 676 - if (reg & MII_ADDR_C45) { 677 - if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45) 678 - return -ENOTSUPP; 679 - } else { 680 - if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22) 681 - return -ENOTSUPP; 682 - } 691 + if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL22) 692 + return -EOPNOTSUPP; 683 693 684 - return pdata->hw_if.read_ext_mii_regs(pdata, addr, reg); 694 + return pdata->hw_if.read_ext_mii_regs_c22(pdata, addr, reg); 695 + } 696 + 697 + static int xgbe_phy_mdio_mii_read_c45(struct xgbe_prv_data *pdata, int addr, 698 + int devad, int reg) 699 + { 700 + struct xgbe_phy_data *phy_data = pdata->phy_data; 701 + 702 + if (phy_data->phydev_mode != XGBE_MDIO_MODE_CL45) 703 + return -EOPNOTSUPP; 704 + 705 + return pdata->hw_if.read_ext_mii_regs_c45(pdata, addr, devad, reg); 685 706 } 686 707 687 708 static int xgbe_phy_i2c_mii_read(struct xgbe_prv_data *pdata, int reg) ··· 735 698 return ret; 736 699 } 737 700 738 - static int xgbe_phy_mii_read(struct mii_bus *mii, int addr, int reg) 701 + static int xgbe_phy_mii_read_c22(struct mii_bus *mii, int addr, int reg) 739 702 { 740 703 struct xgbe_prv_data *pdata = mii->priv; 741 704 struct xgbe_phy_data *phy_data = pdata->phy_data; ··· 748 711 if (phy_data->conn_type == XGBE_CONN_TYPE_SFP) 749 712 ret = xgbe_phy_i2c_mii_read(pdata, reg); 750 713 else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO) 751 - ret = xgbe_phy_mdio_mii_read(pdata, addr, reg); 714 + ret = xgbe_phy_mdio_mii_read_c22(pdata, addr, reg); 715 + else 716 + ret = -EOPNOTSUPP; 717 + 718 + xgbe_phy_put_comm_ownership(pdata); 719 + 720 + return ret; 721 + } 722 + 723 + static int xgbe_phy_mii_read_c45(struct mii_bus *mii, int addr, int devad, 724 + int reg) 725 + { 726 + struct xgbe_prv_data *pdata = mii->priv; 727 + struct xgbe_phy_data *phy_data = pdata->phy_data; 728 + int ret; 729 + 730 + ret = xgbe_phy_get_comm_ownership(pdata); 731 + if (ret) 732 + return ret; 733 + 734 + if (phy_data->conn_type == XGBE_CONN_TYPE_SFP) 735 + ret = -EOPNOTSUPP; 736 + else if (phy_data->conn_type & XGBE_CONN_TYPE_MDIO) 737 + ret = xgbe_phy_mdio_mii_read_c45(pdata, addr, devad, reg); 752 738 else 753 739 ret = -ENOTSUPP; 754 740 ··· 1989 1929 redrv_reg = XGBE_PHY_REDRV_MODE_REG + (phy_data->redrv_lane * 0x1000); 1990 1930 redrv_val = (u16)mode; 1991 1931 1992 - return pdata->hw_if.write_ext_mii_regs(pdata, phy_data->redrv_addr, 1993 - redrv_reg, redrv_val); 1932 + return pdata->hw_if.write_ext_mii_regs_c22(pdata, phy_data->redrv_addr, 1933 + redrv_reg, redrv_val); 1994 1934 } 1995 1935 1996 1936 static int xgbe_phy_set_redrv_mode_i2c(struct xgbe_prv_data *pdata, ··· 3562 3502 3563 3503 mii->priv = pdata; 3564 3504 mii->name = "amd-xgbe-mii"; 3565 - mii->read = xgbe_phy_mii_read; 3566 - mii->write = xgbe_phy_mii_write; 3505 + mii->read = xgbe_phy_mii_read_c22; 3506 + mii->write = xgbe_phy_mii_write_c22; 3507 + mii->read_c45 = xgbe_phy_mii_read_c45; 3508 + mii->write_c45 = xgbe_phy_mii_write_c45; 3567 3509 mii->parent = pdata->dev; 3568 3510 mii->phy_mask = ~0; 3569 3511 snprintf(mii->id, sizeof(mii->id), "%s", dev_name(pdata->dev));
+5 -2
drivers/net/ethernet/amd/xgbe/xgbe.h
··· 775 775 776 776 int (*set_ext_mii_mode)(struct xgbe_prv_data *, unsigned int, 777 777 enum xgbe_mdio_mode); 778 - int (*read_ext_mii_regs)(struct xgbe_prv_data *, int, int); 779 - int (*write_ext_mii_regs)(struct xgbe_prv_data *, int, int, u16); 778 + int (*read_ext_mii_regs_c22)(struct xgbe_prv_data *, int, int); 779 + int (*write_ext_mii_regs_c22)(struct xgbe_prv_data *, int, int, u16); 780 + int (*read_ext_mii_regs_c45)(struct xgbe_prv_data *, int, int, int); 781 + int (*write_ext_mii_regs_c45)(struct xgbe_prv_data *, int, int, int, 782 + u16); 780 783 781 784 int (*set_gpio)(struct xgbe_prv_data *, unsigned int); 782 785 int (*clr_gpio)(struct xgbe_prv_data *, unsigned int);
+107 -52
drivers/net/ethernet/cadence/macb_main.c
··· 334 334 1, MACB_MDIO_TIMEOUT); 335 335 } 336 336 337 - static int macb_mdio_read(struct mii_bus *bus, int mii_id, int regnum) 337 + static int macb_mdio_read_c22(struct mii_bus *bus, int mii_id, int regnum) 338 338 { 339 339 struct macb *bp = bus->priv; 340 340 int status; ··· 347 347 if (status < 0) 348 348 goto mdio_read_exit; 349 349 350 - if (regnum & MII_ADDR_C45) { 351 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 352 - | MACB_BF(RW, MACB_MAN_C45_ADDR) 353 - | MACB_BF(PHYA, mii_id) 354 - | MACB_BF(REGA, (regnum >> 16) & 0x1F) 355 - | MACB_BF(DATA, regnum & 0xFFFF) 356 - | MACB_BF(CODE, MACB_MAN_C45_CODE))); 357 - 358 - status = macb_mdio_wait_for_idle(bp); 359 - if (status < 0) 360 - goto mdio_read_exit; 361 - 362 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 363 - | MACB_BF(RW, MACB_MAN_C45_READ) 364 - | MACB_BF(PHYA, mii_id) 365 - | MACB_BF(REGA, (regnum >> 16) & 0x1F) 366 - | MACB_BF(CODE, MACB_MAN_C45_CODE))); 367 - } else { 368 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C22_SOF) 369 - | MACB_BF(RW, MACB_MAN_C22_READ) 370 - | MACB_BF(PHYA, mii_id) 371 - | MACB_BF(REGA, regnum) 372 - | MACB_BF(CODE, MACB_MAN_C22_CODE))); 373 - } 350 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C22_SOF) 351 + | MACB_BF(RW, MACB_MAN_C22_READ) 352 + | MACB_BF(PHYA, mii_id) 353 + | MACB_BF(REGA, regnum) 354 + | MACB_BF(CODE, MACB_MAN_C22_CODE))); 374 355 375 356 status = macb_mdio_wait_for_idle(bp); 376 357 if (status < 0) ··· 366 385 return status; 367 386 } 368 387 369 - static int macb_mdio_write(struct mii_bus *bus, int mii_id, int regnum, 370 - u16 value) 388 + static int macb_mdio_read_c45(struct mii_bus *bus, int mii_id, int devad, 389 + int regnum) 390 + { 391 + struct macb *bp = bus->priv; 392 + int status; 393 + 394 + status = pm_runtime_get_sync(&bp->pdev->dev); 395 + if (status < 0) { 396 + pm_runtime_put_noidle(&bp->pdev->dev); 397 + goto mdio_pm_exit; 398 + } 399 + 400 + status = macb_mdio_wait_for_idle(bp); 401 + if (status < 0) 402 + goto mdio_read_exit; 403 + 404 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 405 + | MACB_BF(RW, MACB_MAN_C45_ADDR) 406 + | MACB_BF(PHYA, mii_id) 407 + | MACB_BF(REGA, devad & 0x1F) 408 + | MACB_BF(DATA, regnum & 0xFFFF) 409 + | MACB_BF(CODE, MACB_MAN_C45_CODE))); 410 + 411 + status = macb_mdio_wait_for_idle(bp); 412 + if (status < 0) 413 + goto mdio_read_exit; 414 + 415 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 416 + | MACB_BF(RW, MACB_MAN_C45_READ) 417 + | MACB_BF(PHYA, mii_id) 418 + | MACB_BF(REGA, devad & 0x1F) 419 + | MACB_BF(CODE, MACB_MAN_C45_CODE))); 420 + 421 + status = macb_mdio_wait_for_idle(bp); 422 + if (status < 0) 423 + goto mdio_read_exit; 424 + 425 + status = MACB_BFEXT(DATA, macb_readl(bp, MAN)); 426 + 427 + mdio_read_exit: 428 + pm_runtime_mark_last_busy(&bp->pdev->dev); 429 + pm_runtime_put_autosuspend(&bp->pdev->dev); 430 + mdio_pm_exit: 431 + return status; 432 + } 433 + 434 + static int macb_mdio_write_c22(struct mii_bus *bus, int mii_id, int regnum, 435 + u16 value) 371 436 { 372 437 struct macb *bp = bus->priv; 373 438 int status; ··· 426 399 if (status < 0) 427 400 goto mdio_write_exit; 428 401 429 - if (regnum & MII_ADDR_C45) { 430 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 431 - | MACB_BF(RW, MACB_MAN_C45_ADDR) 432 - | MACB_BF(PHYA, mii_id) 433 - | MACB_BF(REGA, (regnum >> 16) & 0x1F) 434 - | MACB_BF(DATA, regnum & 0xFFFF) 435 - | MACB_BF(CODE, MACB_MAN_C45_CODE))); 402 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C22_SOF) 403 + | MACB_BF(RW, MACB_MAN_C22_WRITE) 404 + | MACB_BF(PHYA, mii_id) 405 + | MACB_BF(REGA, regnum) 406 + | MACB_BF(CODE, MACB_MAN_C22_CODE) 407 + | MACB_BF(DATA, value))); 436 408 437 - status = macb_mdio_wait_for_idle(bp); 438 - if (status < 0) 439 - goto mdio_write_exit; 409 + status = macb_mdio_wait_for_idle(bp); 410 + if (status < 0) 411 + goto mdio_write_exit; 440 412 441 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 442 - | MACB_BF(RW, MACB_MAN_C45_WRITE) 443 - | MACB_BF(PHYA, mii_id) 444 - | MACB_BF(REGA, (regnum >> 16) & 0x1F) 445 - | MACB_BF(CODE, MACB_MAN_C45_CODE) 446 - | MACB_BF(DATA, value))); 447 - } else { 448 - macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C22_SOF) 449 - | MACB_BF(RW, MACB_MAN_C22_WRITE) 450 - | MACB_BF(PHYA, mii_id) 451 - | MACB_BF(REGA, regnum) 452 - | MACB_BF(CODE, MACB_MAN_C22_CODE) 453 - | MACB_BF(DATA, value))); 413 + mdio_write_exit: 414 + pm_runtime_mark_last_busy(&bp->pdev->dev); 415 + pm_runtime_put_autosuspend(&bp->pdev->dev); 416 + mdio_pm_exit: 417 + return status; 418 + } 419 + 420 + static int macb_mdio_write_c45(struct mii_bus *bus, int mii_id, 421 + int devad, int regnum, 422 + u16 value) 423 + { 424 + struct macb *bp = bus->priv; 425 + int status; 426 + 427 + status = pm_runtime_get_sync(&bp->pdev->dev); 428 + if (status < 0) { 429 + pm_runtime_put_noidle(&bp->pdev->dev); 430 + goto mdio_pm_exit; 454 431 } 432 + 433 + status = macb_mdio_wait_for_idle(bp); 434 + if (status < 0) 435 + goto mdio_write_exit; 436 + 437 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 438 + | MACB_BF(RW, MACB_MAN_C45_ADDR) 439 + | MACB_BF(PHYA, mii_id) 440 + | MACB_BF(REGA, devad & 0x1F) 441 + | MACB_BF(DATA, regnum & 0xFFFF) 442 + | MACB_BF(CODE, MACB_MAN_C45_CODE))); 443 + 444 + status = macb_mdio_wait_for_idle(bp); 445 + if (status < 0) 446 + goto mdio_write_exit; 447 + 448 + macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_C45_SOF) 449 + | MACB_BF(RW, MACB_MAN_C45_WRITE) 450 + | MACB_BF(PHYA, mii_id) 451 + | MACB_BF(REGA, devad & 0x1F) 452 + | MACB_BF(CODE, MACB_MAN_C45_CODE) 453 + | MACB_BF(DATA, value))); 455 454 456 455 status = macb_mdio_wait_for_idle(bp); 457 456 if (status < 0) ··· 955 902 } 956 903 957 904 bp->mii_bus->name = "MACB_mii_bus"; 958 - bp->mii_bus->read = &macb_mdio_read; 959 - bp->mii_bus->write = &macb_mdio_write; 905 + bp->mii_bus->read = &macb_mdio_read_c22; 906 + bp->mii_bus->write = &macb_mdio_write_c22; 907 + bp->mii_bus->read_c45 = &macb_mdio_read_c45; 908 + bp->mii_bus->write_c45 = &macb_mdio_write_c45; 960 909 snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", 961 910 bp->pdev->name, bp->pdev->id); 962 911 bp->mii_bus->priv = bp;
+141 -63
drivers/net/ethernet/hisilicon/hns_mdio.c
··· 206 206 } 207 207 208 208 /** 209 - * hns_mdio_write - access phy register 209 + * hns_mdio_write_c22 - access phy register 210 210 * @bus: mdio bus 211 211 * @phy_id: phy id 212 212 * @regnum: register num ··· 214 214 * 215 215 * Return 0 on success, negative on failure 216 216 */ 217 - static int hns_mdio_write(struct mii_bus *bus, 218 - int phy_id, int regnum, u16 data) 217 + static int hns_mdio_write_c22(struct mii_bus *bus, 218 + int phy_id, int regnum, u16 data) 219 219 { 220 - int ret; 221 220 struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv; 222 - u8 devad = ((regnum >> 16) & 0x1f); 223 - u8 is_c45 = !!(regnum & MII_ADDR_C45); 224 221 u16 reg = (u16)(regnum & 0xffff); 225 - u8 op; 226 222 u16 cmd_reg_cfg; 223 + int ret; 224 + u8 op; 227 225 228 226 dev_dbg(&bus->dev, "mdio write %s,base is %p\n", 229 227 bus->id, mdio_dev->vbase); 230 - dev_dbg(&bus->dev, "phy id=%d, is_c45=%d, devad=%d, reg=%#x, write data=%d\n", 231 - phy_id, is_c45, devad, reg, data); 228 + dev_dbg(&bus->dev, "phy id=%d, reg=%#x, write data=%d\n", 229 + phy_id, reg, data); 232 230 233 231 /* wait for ready */ 234 232 ret = hns_mdio_wait_ready(bus); ··· 235 237 return ret; 236 238 } 237 239 238 - if (!is_c45) { 239 - cmd_reg_cfg = reg; 240 - op = MDIO_C22_WRITE; 241 - } else { 242 - /* config the cmd-reg to write addr*/ 243 - MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M, 244 - MDIO_ADDR_DATA_S, reg); 245 - 246 - hns_mdio_cmd_write(mdio_dev, is_c45, 247 - MDIO_C45_WRITE_ADDR, phy_id, devad); 248 - 249 - /* check for read or write opt is finished */ 250 - ret = hns_mdio_wait_ready(bus); 251 - if (ret) { 252 - dev_err(&bus->dev, "MDIO bus is busy\n"); 253 - return ret; 254 - } 255 - 256 - /* config the data needed writing */ 257 - cmd_reg_cfg = devad; 258 - op = MDIO_C45_WRITE_DATA; 259 - } 240 + cmd_reg_cfg = reg; 241 + op = MDIO_C22_WRITE; 260 242 261 243 MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M, 262 244 MDIO_WDATA_DATA_S, data); 263 245 264 - hns_mdio_cmd_write(mdio_dev, is_c45, op, phy_id, cmd_reg_cfg); 246 + hns_mdio_cmd_write(mdio_dev, false, op, phy_id, cmd_reg_cfg); 265 247 266 248 return 0; 267 249 } 268 250 269 251 /** 270 - * hns_mdio_read - access phy register 252 + * hns_mdio_write_c45 - access phy register 253 + * @bus: mdio bus 254 + * @phy_id: phy id 255 + * @devad: device address to read 256 + * @regnum: register num 257 + * @data: register value 258 + * 259 + * Return 0 on success, negative on failure 260 + */ 261 + static int hns_mdio_write_c45(struct mii_bus *bus, int phy_id, int devad, 262 + int regnum, u16 data) 263 + { 264 + struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv; 265 + u16 reg = (u16)(regnum & 0xffff); 266 + u16 cmd_reg_cfg; 267 + int ret; 268 + u8 op; 269 + 270 + dev_dbg(&bus->dev, "mdio write %s,base is %p\n", 271 + bus->id, mdio_dev->vbase); 272 + dev_dbg(&bus->dev, "phy id=%d, devad=%d, reg=%#x, write data=%d\n", 273 + phy_id, devad, reg, data); 274 + 275 + /* wait for ready */ 276 + ret = hns_mdio_wait_ready(bus); 277 + if (ret) { 278 + dev_err(&bus->dev, "MDIO bus is busy\n"); 279 + return ret; 280 + } 281 + 282 + /* config the cmd-reg to write addr*/ 283 + MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M, 284 + MDIO_ADDR_DATA_S, reg); 285 + 286 + hns_mdio_cmd_write(mdio_dev, true, MDIO_C45_WRITE_ADDR, phy_id, devad); 287 + 288 + /* check for read or write opt is finished */ 289 + ret = hns_mdio_wait_ready(bus); 290 + if (ret) { 291 + dev_err(&bus->dev, "MDIO bus is busy\n"); 292 + return ret; 293 + } 294 + 295 + /* config the data needed writing */ 296 + cmd_reg_cfg = devad; 297 + op = MDIO_C45_WRITE_DATA; 298 + 299 + MDIO_SET_REG_FIELD(mdio_dev, MDIO_WDATA_REG, MDIO_WDATA_DATA_M, 300 + MDIO_WDATA_DATA_S, data); 301 + 302 + hns_mdio_cmd_write(mdio_dev, true, op, phy_id, cmd_reg_cfg); 303 + 304 + return 0; 305 + } 306 + 307 + /** 308 + * hns_mdio_read_c22 - access phy register 271 309 * @bus: mdio bus 272 310 * @phy_id: phy id 273 311 * @regnum: register num 274 312 * 275 313 * Return phy register value 276 314 */ 277 - static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum) 315 + static int hns_mdio_read_c22(struct mii_bus *bus, int phy_id, int regnum) 278 316 { 279 - int ret; 280 - u16 reg_val; 281 - u8 devad = ((regnum >> 16) & 0x1f); 282 - u8 is_c45 = !!(regnum & MII_ADDR_C45); 283 - u16 reg = (u16)(regnum & 0xffff); 284 317 struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv; 318 + u16 reg = (u16)(regnum & 0xffff); 319 + u16 reg_val; 320 + int ret; 285 321 286 322 dev_dbg(&bus->dev, "mdio read %s,base is %p\n", 287 323 bus->id, mdio_dev->vbase); 288 - dev_dbg(&bus->dev, "phy id=%d, is_c45=%d, devad=%d, reg=%#x!\n", 289 - phy_id, is_c45, devad, reg); 324 + dev_dbg(&bus->dev, "phy id=%d, reg=%#x!\n", phy_id, reg); 290 325 291 326 /* Step 1: wait for ready */ 292 327 ret = hns_mdio_wait_ready(bus); ··· 328 297 return ret; 329 298 } 330 299 331 - if (!is_c45) { 332 - hns_mdio_cmd_write(mdio_dev, is_c45, 333 - MDIO_C22_READ, phy_id, reg); 334 - } else { 335 - MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M, 336 - MDIO_ADDR_DATA_S, reg); 300 + hns_mdio_cmd_write(mdio_dev, false, MDIO_C22_READ, phy_id, reg); 337 301 338 - /* Step 2; config the cmd-reg to write addr*/ 339 - hns_mdio_cmd_write(mdio_dev, is_c45, 340 - MDIO_C45_WRITE_ADDR, phy_id, devad); 341 - 342 - /* Step 3: check for read or write opt is finished */ 343 - ret = hns_mdio_wait_ready(bus); 344 - if (ret) { 345 - dev_err(&bus->dev, "MDIO bus is busy\n"); 346 - return ret; 347 - } 348 - 349 - hns_mdio_cmd_write(mdio_dev, is_c45, 350 - MDIO_C45_READ, phy_id, devad); 302 + /* Step 2: waiting for MDIO_COMMAND_REG 's mdio_start==0,*/ 303 + /* check for read or write opt is finished */ 304 + ret = hns_mdio_wait_ready(bus); 305 + if (ret) { 306 + dev_err(&bus->dev, "MDIO bus is busy\n"); 307 + return ret; 351 308 } 352 309 353 - /* Step 5: waiting for MDIO_COMMAND_REG's mdio_start==0,*/ 310 + reg_val = MDIO_GET_REG_BIT(mdio_dev, MDIO_STA_REG, MDIO_STATE_STA_B); 311 + if (reg_val) { 312 + dev_err(&bus->dev, " ERROR! MDIO Read failed!\n"); 313 + return -EBUSY; 314 + } 315 + 316 + /* Step 3; get out data*/ 317 + reg_val = (u16)MDIO_GET_REG_FIELD(mdio_dev, MDIO_RDATA_REG, 318 + MDIO_RDATA_DATA_M, MDIO_RDATA_DATA_S); 319 + 320 + return reg_val; 321 + } 322 + 323 + /** 324 + * hns_mdio_read_c45 - access phy register 325 + * @bus: mdio bus 326 + * @phy_id: phy id 327 + * @devad: device address to read 328 + * @regnum: register num 329 + * 330 + * Return phy register value 331 + */ 332 + static int hns_mdio_read_c45(struct mii_bus *bus, int phy_id, int devad, 333 + int regnum) 334 + { 335 + struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv; 336 + u16 reg = (u16)(regnum & 0xffff); 337 + u16 reg_val; 338 + int ret; 339 + 340 + dev_dbg(&bus->dev, "mdio read %s,base is %p\n", 341 + bus->id, mdio_dev->vbase); 342 + dev_dbg(&bus->dev, "phy id=%d, devad=%d, reg=%#x!\n", 343 + phy_id, devad, reg); 344 + 345 + /* Step 1: wait for ready */ 346 + ret = hns_mdio_wait_ready(bus); 347 + if (ret) { 348 + dev_err(&bus->dev, "MDIO bus is busy\n"); 349 + return ret; 350 + } 351 + 352 + MDIO_SET_REG_FIELD(mdio_dev, MDIO_ADDR_REG, MDIO_ADDR_DATA_M, 353 + MDIO_ADDR_DATA_S, reg); 354 + 355 + /* Step 2; config the cmd-reg to write addr*/ 356 + hns_mdio_cmd_write(mdio_dev, true, MDIO_C45_WRITE_ADDR, phy_id, devad); 357 + 358 + /* Step 3: check for read or write opt is finished */ 359 + ret = hns_mdio_wait_ready(bus); 360 + if (ret) { 361 + dev_err(&bus->dev, "MDIO bus is busy\n"); 362 + return ret; 363 + } 364 + 365 + hns_mdio_cmd_write(mdio_dev, true, MDIO_C45_READ, phy_id, devad); 366 + 367 + /* Step 5: waiting for MDIO_COMMAND_REG 's mdio_start==0,*/ 354 368 /* check for read or write opt is finished */ 355 369 ret = hns_mdio_wait_ready(bus); 356 370 if (ret) { ··· 514 438 } 515 439 516 440 new_bus->name = MDIO_BUS_NAME; 517 - new_bus->read = hns_mdio_read; 518 - new_bus->write = hns_mdio_write; 441 + new_bus->read = hns_mdio_read_c22; 442 + new_bus->write = hns_mdio_write_c22; 443 + new_bus->read_c45 = hns_mdio_read_c45; 444 + new_bus->write_c45 = hns_mdio_write_c45; 519 445 new_bus->reset = hns_mdio_reset; 520 446 new_bus->priv = mdio_dev; 521 447 new_bus->parent = &pdev->dev;
+4 -2
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
··· 8937 8937 int regnum = addr; 8938 8938 8939 8939 if (devad != MDIO_DEVAD_NONE) 8940 - regnum |= (devad << 16) | MII_ADDR_C45; 8940 + return mdiobus_c45_read(adapter->mii_bus, prtad, 8941 + devad, regnum); 8941 8942 8942 8943 return mdiobus_read(adapter->mii_bus, prtad, regnum); 8943 8944 } ··· 8961 8960 int regnum = addr; 8962 8961 8963 8962 if (devad != MDIO_DEVAD_NONE) 8964 - regnum |= (devad << 16) | MII_ADDR_C45; 8963 + return mdiobus_c45_write(adapter->mii_bus, prtad, devad, 8964 + regnum, value); 8965 8965 8966 8966 return mdiobus_write(adapter->mii_bus, prtad, regnum, value); 8967 8967 }
+189 -62
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
··· 680 680 } 681 681 682 682 /** 683 - * ixgbe_mii_bus_read_generic - Read a clause 22/45 register with gssr flags 683 + * ixgbe_mii_bus_read_generic_c22 - Read a clause 22 register with gssr flags 684 684 * @hw: pointer to hardware structure 685 685 * @addr: address 686 686 * @regnum: register number 687 687 * @gssr: semaphore flags to acquire 688 688 **/ 689 - static s32 ixgbe_mii_bus_read_generic(struct ixgbe_hw *hw, int addr, 690 - int regnum, u32 gssr) 689 + static s32 ixgbe_mii_bus_read_generic_c22(struct ixgbe_hw *hw, int addr, 690 + int regnum, u32 gssr) 691 691 { 692 692 u32 hwaddr, cmd; 693 693 s32 data; ··· 696 696 return -EBUSY; 697 697 698 698 hwaddr = addr << IXGBE_MSCA_PHY_ADDR_SHIFT; 699 - if (regnum & MII_ADDR_C45) { 700 - hwaddr |= regnum & GENMASK(21, 0); 701 - cmd = hwaddr | IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND; 702 - } else { 703 - hwaddr |= (regnum & GENMASK(5, 0)) << IXGBE_MSCA_DEV_TYPE_SHIFT; 704 - cmd = hwaddr | IXGBE_MSCA_OLD_PROTOCOL | 705 - IXGBE_MSCA_READ_AUTOINC | IXGBE_MSCA_MDI_COMMAND; 706 - } 699 + hwaddr |= (regnum & GENMASK(5, 0)) << IXGBE_MSCA_DEV_TYPE_SHIFT; 700 + cmd = hwaddr | IXGBE_MSCA_OLD_PROTOCOL | 701 + IXGBE_MSCA_READ_AUTOINC | IXGBE_MSCA_MDI_COMMAND; 707 702 708 703 data = ixgbe_msca_cmd(hw, cmd); 709 704 if (data < 0) 710 705 goto mii_bus_read_done; 711 706 712 - /* For a clause 45 access the address cycle just completed, we still 713 - * need to do the read command, otherwise just get the data 714 - */ 715 - if (!(regnum & MII_ADDR_C45)) 716 - goto do_mii_bus_read; 717 - 718 - cmd = hwaddr | IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND; 719 - data = ixgbe_msca_cmd(hw, cmd); 720 - if (data < 0) 721 - goto mii_bus_read_done; 722 - 723 - do_mii_bus_read: 724 707 data = IXGBE_READ_REG(hw, IXGBE_MSRWD); 725 708 data = (data >> IXGBE_MSRWD_READ_DATA_SHIFT) & GENMASK(16, 0); 726 709 ··· 713 730 } 714 731 715 732 /** 716 - * ixgbe_mii_bus_write_generic - Write a clause 22/45 register with gssr flags 733 + * ixgbe_mii_bus_read_generic_c45 - Read a clause 45 register with gssr flags 734 + * @hw: pointer to hardware structure 735 + * @addr: address 736 + * @devad: device address to read 737 + * @regnum: register number 738 + * @gssr: semaphore flags to acquire 739 + **/ 740 + static s32 ixgbe_mii_bus_read_generic_c45(struct ixgbe_hw *hw, int addr, 741 + int devad, int regnum, u32 gssr) 742 + { 743 + u32 hwaddr, cmd; 744 + s32 data; 745 + 746 + if (hw->mac.ops.acquire_swfw_sync(hw, gssr)) 747 + return -EBUSY; 748 + 749 + hwaddr = addr << IXGBE_MSCA_PHY_ADDR_SHIFT; 750 + hwaddr |= devad << 16 | regnum; 751 + cmd = hwaddr | IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND; 752 + 753 + data = ixgbe_msca_cmd(hw, cmd); 754 + if (data < 0) 755 + goto mii_bus_read_done; 756 + 757 + cmd = hwaddr | IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND; 758 + data = ixgbe_msca_cmd(hw, cmd); 759 + if (data < 0) 760 + goto mii_bus_read_done; 761 + 762 + data = IXGBE_READ_REG(hw, IXGBE_MSRWD); 763 + data = (data >> IXGBE_MSRWD_READ_DATA_SHIFT) & GENMASK(16, 0); 764 + 765 + mii_bus_read_done: 766 + hw->mac.ops.release_swfw_sync(hw, gssr); 767 + return data; 768 + } 769 + 770 + /** 771 + * ixgbe_mii_bus_write_generic_c22 - Write a clause 22 register with gssr flags 717 772 * @hw: pointer to hardware structure 718 773 * @addr: address 719 774 * @regnum: register number 720 775 * @val: value to write 721 776 * @gssr: semaphore flags to acquire 722 777 **/ 723 - static s32 ixgbe_mii_bus_write_generic(struct ixgbe_hw *hw, int addr, 724 - int regnum, u16 val, u32 gssr) 778 + static s32 ixgbe_mii_bus_write_generic_c22(struct ixgbe_hw *hw, int addr, 779 + int regnum, u16 val, u32 gssr) 725 780 { 726 781 u32 hwaddr, cmd; 727 782 s32 err; ··· 770 749 IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)val); 771 750 772 751 hwaddr = addr << IXGBE_MSCA_PHY_ADDR_SHIFT; 773 - if (regnum & MII_ADDR_C45) { 774 - hwaddr |= regnum & GENMASK(21, 0); 775 - cmd = hwaddr | IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND; 776 - } else { 777 - hwaddr |= (regnum & GENMASK(5, 0)) << IXGBE_MSCA_DEV_TYPE_SHIFT; 778 - cmd = hwaddr | IXGBE_MSCA_OLD_PROTOCOL | IXGBE_MSCA_WRITE | 779 - IXGBE_MSCA_MDI_COMMAND; 780 - } 752 + hwaddr |= (regnum & GENMASK(5, 0)) << IXGBE_MSCA_DEV_TYPE_SHIFT; 753 + cmd = hwaddr | IXGBE_MSCA_OLD_PROTOCOL | IXGBE_MSCA_WRITE | 754 + IXGBE_MSCA_MDI_COMMAND; 781 755 782 - /* For clause 45 this is an address cycle, for clause 22 this is the 783 - * entire transaction 784 - */ 785 756 err = ixgbe_msca_cmd(hw, cmd); 786 - if (err < 0 || !(regnum & MII_ADDR_C45)) 757 + 758 + hw->mac.ops.release_swfw_sync(hw, gssr); 759 + return err; 760 + } 761 + 762 + /** 763 + * ixgbe_mii_bus_write_generic_c45 - Write a clause 45 register with gssr flags 764 + * @hw: pointer to hardware structure 765 + * @addr: address 766 + * @devad: device address to read 767 + * @regnum: register number 768 + * @val: value to write 769 + * @gssr: semaphore flags to acquire 770 + **/ 771 + static s32 ixgbe_mii_bus_write_generic_c45(struct ixgbe_hw *hw, int addr, 772 + int devad, int regnum, u16 val, 773 + u32 gssr) 774 + { 775 + u32 hwaddr, cmd; 776 + s32 err; 777 + 778 + if (hw->mac.ops.acquire_swfw_sync(hw, gssr)) 779 + return -EBUSY; 780 + 781 + IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)val); 782 + 783 + hwaddr = addr << IXGBE_MSCA_PHY_ADDR_SHIFT; 784 + hwaddr |= devad << 16 | regnum; 785 + cmd = hwaddr | IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND; 786 + 787 + err = ixgbe_msca_cmd(hw, cmd); 788 + if (err < 0) 787 789 goto mii_bus_write_done; 788 790 789 791 cmd = hwaddr | IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND; ··· 818 774 } 819 775 820 776 /** 821 - * ixgbe_mii_bus_read - Read a clause 22/45 register 777 + * ixgbe_mii_bus_read_c22 - Read a clause 22 register 822 778 * @bus: pointer to mii_bus structure which points to our driver private 823 779 * @addr: address 824 780 * @regnum: register number 825 781 **/ 826 - static s32 ixgbe_mii_bus_read(struct mii_bus *bus, int addr, int regnum) 782 + static s32 ixgbe_mii_bus_read_c22(struct mii_bus *bus, int addr, int regnum) 827 783 { 828 784 struct ixgbe_adapter *adapter = bus->priv; 829 785 struct ixgbe_hw *hw = &adapter->hw; 830 786 u32 gssr = hw->phy.phy_semaphore_mask; 831 787 832 - return ixgbe_mii_bus_read_generic(hw, addr, regnum, gssr); 788 + return ixgbe_mii_bus_read_generic_c22(hw, addr, regnum, gssr); 833 789 } 834 790 835 791 /** 836 - * ixgbe_mii_bus_write - Write a clause 22/45 register 792 + * ixgbe_mii_bus_read_c45 - Read a clause 45 register 793 + * @bus: pointer to mii_bus structure which points to our driver private 794 + * @devad: device address to read 795 + * @addr: address 796 + * @regnum: register number 797 + **/ 798 + static s32 ixgbe_mii_bus_read_c45(struct mii_bus *bus, int devad, int addr, 799 + int regnum) 800 + { 801 + struct ixgbe_adapter *adapter = bus->priv; 802 + struct ixgbe_hw *hw = &adapter->hw; 803 + u32 gssr = hw->phy.phy_semaphore_mask; 804 + 805 + return ixgbe_mii_bus_read_generic_c45(hw, addr, devad, regnum, gssr); 806 + } 807 + 808 + /** 809 + * ixgbe_mii_bus_write_c22 - Write a clause 22 register 837 810 * @bus: pointer to mii_bus structure which points to our driver private 838 811 * @addr: address 839 812 * @regnum: register number 840 813 * @val: value to write 841 814 **/ 842 - static s32 ixgbe_mii_bus_write(struct mii_bus *bus, int addr, int regnum, 843 - u16 val) 815 + static s32 ixgbe_mii_bus_write_c22(struct mii_bus *bus, int addr, int regnum, 816 + u16 val) 844 817 { 845 818 struct ixgbe_adapter *adapter = bus->priv; 846 819 struct ixgbe_hw *hw = &adapter->hw; 847 820 u32 gssr = hw->phy.phy_semaphore_mask; 848 821 849 - return ixgbe_mii_bus_write_generic(hw, addr, regnum, val, gssr); 822 + return ixgbe_mii_bus_write_generic_c22(hw, addr, regnum, val, gssr); 850 823 } 851 824 852 825 /** 853 - * ixgbe_x550em_a_mii_bus_read - Read a clause 22/45 register on x550em_a 826 + * ixgbe_mii_bus_write_c45 - Write a clause 45 register 827 + * @bus: pointer to mii_bus structure which points to our driver private 828 + * @addr: address 829 + * @devad: device address to read 830 + * @regnum: register number 831 + * @val: value to write 832 + **/ 833 + static s32 ixgbe_mii_bus_write_c45(struct mii_bus *bus, int addr, int devad, 834 + int regnum, u16 val) 835 + { 836 + struct ixgbe_adapter *adapter = bus->priv; 837 + struct ixgbe_hw *hw = &adapter->hw; 838 + u32 gssr = hw->phy.phy_semaphore_mask; 839 + 840 + return ixgbe_mii_bus_write_generic_c45(hw, addr, devad, regnum, val, 841 + gssr); 842 + } 843 + 844 + /** 845 + * ixgbe_x550em_a_mii_bus_read_c22 - Read a clause 22 register on x550em_a 854 846 * @bus: pointer to mii_bus structure which points to our driver private 855 847 * @addr: address 856 848 * @regnum: register number 857 849 **/ 858 - static s32 ixgbe_x550em_a_mii_bus_read(struct mii_bus *bus, int addr, 859 - int regnum) 850 + static s32 ixgbe_x550em_a_mii_bus_read_c22(struct mii_bus *bus, int addr, 851 + int regnum) 860 852 { 861 853 struct ixgbe_adapter *adapter = bus->priv; 862 854 struct ixgbe_hw *hw = &adapter->hw; 863 855 u32 gssr = hw->phy.phy_semaphore_mask; 864 856 865 857 gssr |= IXGBE_GSSR_TOKEN_SM | IXGBE_GSSR_PHY0_SM; 866 - return ixgbe_mii_bus_read_generic(hw, addr, regnum, gssr); 858 + return ixgbe_mii_bus_read_generic_c22(hw, addr, regnum, gssr); 867 859 } 868 860 869 861 /** 870 - * ixgbe_x550em_a_mii_bus_write - Write a clause 22/45 register on x550em_a 862 + * ixgbe_x550em_a_mii_bus_read_c45 - Read a clause 45 register on x550em_a 871 863 * @bus: pointer to mii_bus structure which points to our driver private 872 864 * @addr: address 865 + * @devad: device address to read 873 866 * @regnum: register number 874 - * @val: value to write 875 867 **/ 876 - static s32 ixgbe_x550em_a_mii_bus_write(struct mii_bus *bus, int addr, 877 - int regnum, u16 val) 868 + static s32 ixgbe_x550em_a_mii_bus_read_c45(struct mii_bus *bus, int addr, 869 + int devad, int regnum) 878 870 { 879 871 struct ixgbe_adapter *adapter = bus->priv; 880 872 struct ixgbe_hw *hw = &adapter->hw; 881 873 u32 gssr = hw->phy.phy_semaphore_mask; 882 874 883 875 gssr |= IXGBE_GSSR_TOKEN_SM | IXGBE_GSSR_PHY0_SM; 884 - return ixgbe_mii_bus_write_generic(hw, addr, regnum, val, gssr); 876 + return ixgbe_mii_bus_read_generic_c45(hw, addr, devad, regnum, gssr); 877 + } 878 + 879 + /** 880 + * ixgbe_x550em_a_mii_bus_write_c22 - Write a clause 22 register on x550em_a 881 + * @bus: pointer to mii_bus structure which points to our driver private 882 + * @addr: address 883 + * @regnum: register number 884 + * @val: value to write 885 + **/ 886 + static s32 ixgbe_x550em_a_mii_bus_write_c22(struct mii_bus *bus, int addr, 887 + int regnum, u16 val) 888 + { 889 + struct ixgbe_adapter *adapter = bus->priv; 890 + struct ixgbe_hw *hw = &adapter->hw; 891 + u32 gssr = hw->phy.phy_semaphore_mask; 892 + 893 + gssr |= IXGBE_GSSR_TOKEN_SM | IXGBE_GSSR_PHY0_SM; 894 + return ixgbe_mii_bus_write_generic_c22(hw, addr, regnum, val, gssr); 895 + } 896 + 897 + /** 898 + * ixgbe_x550em_a_mii_bus_write_c45 - Write a clause 45 register on x550em_a 899 + * @bus: pointer to mii_bus structure which points to our driver private 900 + * @addr: address 901 + * @devad: device address to read 902 + * @regnum: register number 903 + * @val: value to write 904 + **/ 905 + static s32 ixgbe_x550em_a_mii_bus_write_c45(struct mii_bus *bus, int addr, 906 + int devad, int regnum, u16 val) 907 + { 908 + struct ixgbe_adapter *adapter = bus->priv; 909 + struct ixgbe_hw *hw = &adapter->hw; 910 + u32 gssr = hw->phy.phy_semaphore_mask; 911 + 912 + gssr |= IXGBE_GSSR_TOKEN_SM | IXGBE_GSSR_PHY0_SM; 913 + return ixgbe_mii_bus_write_generic_c45(hw, addr, devad, regnum, val, 914 + gssr); 885 915 } 886 916 887 917 /** ··· 1027 909 **/ 1028 910 s32 ixgbe_mii_bus_init(struct ixgbe_hw *hw) 1029 911 { 1030 - s32 (*write)(struct mii_bus *bus, int addr, int regnum, u16 val); 1031 - s32 (*read)(struct mii_bus *bus, int addr, int regnum); 912 + s32 (*write_c22)(struct mii_bus *bus, int addr, int regnum, u16 val); 913 + s32 (*read_c22)(struct mii_bus *bus, int addr, int regnum); 914 + s32 (*write_c45)(struct mii_bus *bus, int addr, int devad, int regnum, 915 + u16 val); 916 + s32 (*read_c45)(struct mii_bus *bus, int addr, int devad, int regnum); 1032 917 struct ixgbe_adapter *adapter = hw->back; 1033 918 struct pci_dev *pdev = adapter->pdev; 1034 919 struct device *dev = &adapter->netdev->dev; ··· 1050 929 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 1051 930 if (!ixgbe_x550em_a_has_mii(hw)) 1052 931 return 0; 1053 - read = &ixgbe_x550em_a_mii_bus_read; 1054 - write = &ixgbe_x550em_a_mii_bus_write; 932 + read_c22 = ixgbe_x550em_a_mii_bus_read_c22; 933 + write_c22 = ixgbe_x550em_a_mii_bus_write_c22; 934 + read_c45 = ixgbe_x550em_a_mii_bus_read_c45; 935 + write_c45 = ixgbe_x550em_a_mii_bus_write_c45; 1055 936 break; 1056 937 default: 1057 - read = &ixgbe_mii_bus_read; 1058 - write = &ixgbe_mii_bus_write; 938 + read_c22 = ixgbe_mii_bus_read_c22; 939 + write_c22 = ixgbe_mii_bus_write_c22; 940 + read_c45 = ixgbe_mii_bus_read_c45; 941 + write_c45 = ixgbe_mii_bus_write_c45; 1059 942 break; 1060 943 } 1061 944 ··· 1067 942 if (!bus) 1068 943 return -ENOMEM; 1069 944 1070 - bus->read = read; 1071 - bus->write = write; 945 + bus->read = read_c22; 946 + bus->write = write_c22; 947 + bus->read_c45 = read_c45; 948 + bus->write_c45 = write_c45; 1072 949 1073 950 /* Use the position of the device in the PCI hierarchy as the id */ 1074 951 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-mdio-%s", ixgbe_driver_name,
+91 -62
drivers/net/ethernet/ni/nixge.c
··· 1081 1081 .get_link = ethtool_op_get_link, 1082 1082 }; 1083 1083 1084 - static int nixge_mdio_read(struct mii_bus *bus, int phy_id, int reg) 1084 + static int nixge_mdio_read_c22(struct mii_bus *bus, int phy_id, int reg) 1085 1085 { 1086 1086 struct nixge_priv *priv = bus->priv; 1087 1087 u32 status, tmp; 1088 1088 int err; 1089 1089 u16 device; 1090 1090 1091 - if (reg & MII_ADDR_C45) { 1092 - device = (reg >> 16) & 0x1f; 1091 + device = reg & 0x1f; 1093 1092 1094 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_ADDR, reg & 0xffff); 1095 - 1096 - tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_OP_ADDRESS) 1097 - | NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1098 - 1099 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1100 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1101 - 1102 - err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1103 - !status, 10, 1000); 1104 - if (err) { 1105 - dev_err(priv->dev, "timeout setting address"); 1106 - return err; 1107 - } 1108 - 1109 - tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_C45_READ) | 1110 - NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1111 - } else { 1112 - device = reg & 0x1f; 1113 - 1114 - tmp = NIXGE_MDIO_CLAUSE22 | NIXGE_MDIO_OP(NIXGE_MDIO_C22_READ) | 1115 - NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1116 - } 1093 + tmp = NIXGE_MDIO_CLAUSE22 | NIXGE_MDIO_OP(NIXGE_MDIO_C22_READ) | 1094 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1117 1095 1118 1096 nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1119 1097 nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); ··· 1108 1130 return status; 1109 1131 } 1110 1132 1111 - static int nixge_mdio_write(struct mii_bus *bus, int phy_id, int reg, u16 val) 1133 + static int nixge_mdio_read_c45(struct mii_bus *bus, int phy_id, int device, 1134 + int reg) 1135 + { 1136 + struct nixge_priv *priv = bus->priv; 1137 + u32 status, tmp; 1138 + int err; 1139 + 1140 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_ADDR, reg & 0xffff); 1141 + 1142 + tmp = NIXGE_MDIO_CLAUSE45 | 1143 + NIXGE_MDIO_OP(NIXGE_MDIO_OP_ADDRESS) | 1144 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1145 + 1146 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1147 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1148 + 1149 + err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1150 + !status, 10, 1000); 1151 + if (err) { 1152 + dev_err(priv->dev, "timeout setting address"); 1153 + return err; 1154 + } 1155 + 1156 + tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_C45_READ) | 1157 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1158 + 1159 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1160 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1161 + 1162 + err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1163 + !status, 10, 1000); 1164 + if (err) { 1165 + dev_err(priv->dev, "timeout setting read command"); 1166 + return err; 1167 + } 1168 + 1169 + status = nixge_ctrl_read_reg(priv, NIXGE_REG_MDIO_DATA); 1170 + 1171 + return status; 1172 + } 1173 + 1174 + static int nixge_mdio_write_c22(struct mii_bus *bus, int phy_id, int reg, 1175 + u16 val) 1112 1176 { 1113 1177 struct nixge_priv *priv = bus->priv; 1114 1178 u32 status, tmp; 1115 1179 u16 device; 1116 1180 int err; 1117 1181 1118 - if (reg & MII_ADDR_C45) { 1119 - device = (reg >> 16) & 0x1f; 1182 + device = reg & 0x1f; 1120 1183 1121 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_ADDR, reg & 0xffff); 1184 + tmp = NIXGE_MDIO_CLAUSE22 | NIXGE_MDIO_OP(NIXGE_MDIO_C22_WRITE) | 1185 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1122 1186 1123 - tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_OP_ADDRESS) 1124 - | NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1187 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_DATA, val); 1188 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1189 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1125 1190 1126 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1127 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1191 + err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1192 + !status, 10, 1000); 1193 + if (err) 1194 + dev_err(priv->dev, "timeout setting write command"); 1128 1195 1129 - err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1130 - !status, 10, 1000); 1131 - if (err) { 1132 - dev_err(priv->dev, "timeout setting address"); 1133 - return err; 1134 - } 1196 + return err; 1197 + } 1135 1198 1136 - tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_C45_WRITE) 1137 - | NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1199 + static int nixge_mdio_write_c45(struct mii_bus *bus, int phy_id, 1200 + int device, int reg, u16 val) 1201 + { 1202 + struct nixge_priv *priv = bus->priv; 1203 + u32 status, tmp; 1204 + int err; 1138 1205 1139 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_DATA, val); 1140 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1141 - err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1142 - !status, 10, 1000); 1143 - if (err) 1144 - dev_err(priv->dev, "timeout setting write command"); 1145 - } else { 1146 - device = reg & 0x1f; 1206 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_ADDR, reg & 0xffff); 1147 1207 1148 - tmp = NIXGE_MDIO_CLAUSE22 | 1149 - NIXGE_MDIO_OP(NIXGE_MDIO_C22_WRITE) | 1150 - NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1208 + tmp = NIXGE_MDIO_CLAUSE45 | 1209 + NIXGE_MDIO_OP(NIXGE_MDIO_OP_ADDRESS) | 1210 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1151 1211 1152 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_DATA, val); 1153 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1154 - nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1212 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1213 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_CTRL, 1); 1155 1214 1156 - err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1157 - !status, 10, 1000); 1158 - if (err) 1159 - dev_err(priv->dev, "timeout setting write command"); 1215 + err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1216 + !status, 10, 1000); 1217 + if (err) { 1218 + dev_err(priv->dev, "timeout setting address"); 1219 + return err; 1160 1220 } 1221 + 1222 + tmp = NIXGE_MDIO_CLAUSE45 | NIXGE_MDIO_OP(NIXGE_MDIO_C45_WRITE) | 1223 + NIXGE_MDIO_ADDR(phy_id) | NIXGE_MDIO_MMD(device); 1224 + 1225 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_DATA, val); 1226 + nixge_ctrl_write_reg(priv, NIXGE_REG_MDIO_OP, tmp); 1227 + 1228 + err = nixge_ctrl_poll_timeout(priv, NIXGE_REG_MDIO_CTRL, status, 1229 + !status, 10, 1000); 1230 + if (err) 1231 + dev_err(priv->dev, "timeout setting write command"); 1161 1232 1162 1233 return err; 1163 1234 } ··· 1222 1195 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-mii", dev_name(priv->dev)); 1223 1196 bus->priv = priv; 1224 1197 bus->name = "nixge_mii_bus"; 1225 - bus->read = nixge_mdio_read; 1226 - bus->write = nixge_mdio_write; 1198 + bus->read = nixge_mdio_read_c22; 1199 + bus->write = nixge_mdio_write_c22; 1200 + bus->read_c45 = nixge_mdio_read_c45; 1201 + bus->write_c45 = nixge_mdio_write_c45; 1227 1202 bus->parent = priv->dev; 1228 1203 1229 1204 priv->mii_bus = bus;
+6 -22
drivers/net/ethernet/renesas/rswitch.c
··· 1024 1024 return ret; 1025 1025 } 1026 1026 1027 - static int rswitch_etha_mii_read(struct mii_bus *bus, int addr, int regnum) 1027 + static int rswitch_etha_mii_read_c45(struct mii_bus *bus, int addr, int devad, 1028 + int regad) 1028 1029 { 1029 1030 struct rswitch_etha *etha = bus->priv; 1030 - int mode, devad, regad; 1031 - 1032 - mode = regnum & MII_ADDR_C45; 1033 - devad = (regnum >> MII_DEVADDR_C45_SHIFT) & 0x1f; 1034 - regad = regnum & MII_REGADDR_C45_MASK; 1035 - 1036 - /* Not support Clause 22 access method */ 1037 - if (!mode) 1038 - return -EOPNOTSUPP; 1039 1031 1040 1032 return rswitch_etha_set_access(etha, true, addr, devad, regad, 0); 1041 1033 } 1042 1034 1043 - static int rswitch_etha_mii_write(struct mii_bus *bus, int addr, int regnum, u16 val) 1035 + static int rswitch_etha_mii_write_c45(struct mii_bus *bus, int addr, int devad, 1036 + int regad, u16 val) 1044 1037 { 1045 1038 struct rswitch_etha *etha = bus->priv; 1046 - int mode, devad, regad; 1047 - 1048 - mode = regnum & MII_ADDR_C45; 1049 - devad = (regnum >> MII_DEVADDR_C45_SHIFT) & 0x1f; 1050 - regad = regnum & MII_REGADDR_C45_MASK; 1051 - 1052 - /* Not support Clause 22 access method */ 1053 - if (!mode) 1054 - return -EOPNOTSUPP; 1055 1039 1056 1040 return rswitch_etha_set_access(etha, false, addr, devad, regad, val); 1057 1041 } ··· 1126 1142 mii_bus->name = "rswitch_mii"; 1127 1143 sprintf(mii_bus->id, "etha%d", rdev->etha->index); 1128 1144 mii_bus->priv = rdev->etha; 1129 - mii_bus->read = rswitch_etha_mii_read; 1130 - mii_bus->write = rswitch_etha_mii_write; 1145 + mii_bus->read_c45 = rswitch_etha_mii_read_c45; 1146 + mii_bus->write_c45 = rswitch_etha_mii_write_c45; 1131 1147 mii_bus->parent = &rdev->priv->pdev->dev; 1132 1148 1133 1149 mdio_np = rswitch_get_mdio_node(rdev);
+81 -24
drivers/net/ethernet/samsung/sxgbe/sxgbe_mdio.c
··· 50 50 } 51 51 52 52 static void sxgbe_mdio_c45(struct sxgbe_priv_data *sp, u32 cmd, int phyaddr, 53 - int phyreg, u16 phydata) 53 + int devad, int phyreg, u16 phydata) 54 54 { 55 55 u32 reg; 56 56 57 57 /* set mdio address register */ 58 - reg = ((phyreg >> 16) & 0x1f) << 21; 58 + reg = (devad & 0x1f) << 21; 59 59 reg |= (phyaddr << 16) | (phyreg & 0xffff); 60 60 writel(reg, sp->ioaddr + sp->hw->mii.addr); 61 61 ··· 76 76 sxgbe_mdio_ctrl_data(sp, cmd, phydata); 77 77 } 78 78 79 - static int sxgbe_mdio_access(struct sxgbe_priv_data *sp, u32 cmd, int phyaddr, 80 - int phyreg, u16 phydata) 79 + static int sxgbe_mdio_access_c22(struct sxgbe_priv_data *sp, u32 cmd, 80 + int phyaddr, int phyreg, u16 phydata) 81 81 { 82 82 const struct mii_regs *mii = &sp->hw->mii; 83 83 int rc; ··· 86 86 if (rc < 0) 87 87 return rc; 88 88 89 - if (phyreg & MII_ADDR_C45) { 90 - sxgbe_mdio_c45(sp, cmd, phyaddr, phyreg, phydata); 91 - } else { 92 - /* Ports 0-3 only support C22. */ 93 - if (phyaddr >= 4) 94 - return -ENODEV; 89 + /* Ports 0-3 only support C22. */ 90 + if (phyaddr >= 4) 91 + return -ENODEV; 95 92 96 - sxgbe_mdio_c22(sp, cmd, phyaddr, phyreg, phydata); 97 - } 93 + sxgbe_mdio_c22(sp, cmd, phyaddr, phyreg, phydata); 94 + 95 + return sxgbe_mdio_busy_wait(sp->ioaddr, mii->data); 96 + } 97 + 98 + static int sxgbe_mdio_access_c45(struct sxgbe_priv_data *sp, u32 cmd, 99 + int phyaddr, int devad, int phyreg, 100 + u16 phydata) 101 + { 102 + const struct mii_regs *mii = &sp->hw->mii; 103 + int rc; 104 + 105 + rc = sxgbe_mdio_busy_wait(sp->ioaddr, mii->data); 106 + if (rc < 0) 107 + return rc; 108 + 109 + sxgbe_mdio_c45(sp, cmd, phyaddr, devad, phyreg, phydata); 98 110 99 111 return sxgbe_mdio_busy_wait(sp->ioaddr, mii->data); 100 112 } 101 113 102 114 /** 103 - * sxgbe_mdio_read 115 + * sxgbe_mdio_read_c22 104 116 * @bus: points to the mii_bus structure 105 117 * @phyaddr: address of phy port 106 118 * @phyreg: address of register with in phy register 107 - * Description: this function used for C45 and C22 MDIO Read 119 + * Description: this function used for C22 MDIO Read 108 120 */ 109 - static int sxgbe_mdio_read(struct mii_bus *bus, int phyaddr, int phyreg) 121 + static int sxgbe_mdio_read_c22(struct mii_bus *bus, int phyaddr, int phyreg) 110 122 { 111 123 struct net_device *ndev = bus->priv; 112 124 struct sxgbe_priv_data *priv = netdev_priv(ndev); 113 125 int rc; 114 126 115 - rc = sxgbe_mdio_access(priv, SXGBE_SMA_READ_CMD, phyaddr, phyreg, 0); 127 + rc = sxgbe_mdio_access_c22(priv, SXGBE_SMA_READ_CMD, phyaddr, 128 + phyreg, 0); 116 129 if (rc < 0) 117 130 return rc; 118 131 ··· 133 120 } 134 121 135 122 /** 136 - * sxgbe_mdio_write 123 + * sxgbe_mdio_read_c45 124 + * @bus: points to the mii_bus structure 125 + * @phyaddr: address of phy port 126 + * @devad: device (MMD) address 127 + * @phyreg: address of register with in phy register 128 + * Description: this function used for C45 MDIO Read 129 + */ 130 + static int sxgbe_mdio_read_c45(struct mii_bus *bus, int phyaddr, int devad, 131 + int phyreg) 132 + { 133 + struct net_device *ndev = bus->priv; 134 + struct sxgbe_priv_data *priv = netdev_priv(ndev); 135 + int rc; 136 + 137 + rc = sxgbe_mdio_access_c45(priv, SXGBE_SMA_READ_CMD, phyaddr, 138 + devad, phyreg, 0); 139 + if (rc < 0) 140 + return rc; 141 + 142 + return readl(priv->ioaddr + priv->hw->mii.data) & 0xffff; 143 + } 144 + 145 + /** 146 + * sxgbe_mdio_write_c22 137 147 * @bus: points to the mii_bus structure 138 148 * @phyaddr: address of phy port 139 149 * @phyreg: address of phy registers 140 150 * @phydata: data to be written into phy register 141 - * Description: this function is used for C45 and C22 MDIO write 151 + * Description: this function is used for C22 MDIO write 142 152 */ 143 - static int sxgbe_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg, 144 - u16 phydata) 153 + static int sxgbe_mdio_write_c22(struct mii_bus *bus, int phyaddr, int phyreg, 154 + u16 phydata) 145 155 { 146 156 struct net_device *ndev = bus->priv; 147 157 struct sxgbe_priv_data *priv = netdev_priv(ndev); 148 158 149 - return sxgbe_mdio_access(priv, SXGBE_SMA_WRITE_CMD, phyaddr, phyreg, 150 - phydata); 159 + return sxgbe_mdio_access_c22(priv, SXGBE_SMA_WRITE_CMD, phyaddr, phyreg, 160 + phydata); 161 + } 162 + 163 + /** 164 + * sxgbe_mdio_write_c45 165 + * @bus: points to the mii_bus structure 166 + * @phyaddr: address of phy port 167 + * @phyreg: address of phy registers 168 + * @devad: device (MMD) address 169 + * @phydata: data to be written into phy register 170 + * Description: this function is used for C45 MDIO write 171 + */ 172 + static int sxgbe_mdio_write_c45(struct mii_bus *bus, int phyaddr, int devad, 173 + int phyreg, u16 phydata) 174 + { 175 + struct net_device *ndev = bus->priv; 176 + struct sxgbe_priv_data *priv = netdev_priv(ndev); 177 + 178 + return sxgbe_mdio_access_c45(priv, SXGBE_SMA_WRITE_CMD, phyaddr, 179 + devad, phyreg, phydata); 151 180 } 152 181 153 182 int sxgbe_mdio_register(struct net_device *ndev) ··· 216 161 217 162 /* assign mii bus fields */ 218 163 mdio_bus->name = "sxgbe"; 219 - mdio_bus->read = &sxgbe_mdio_read; 220 - mdio_bus->write = &sxgbe_mdio_write; 164 + mdio_bus->read = sxgbe_mdio_read_c22; 165 + mdio_bus->write = sxgbe_mdio_write_c22; 166 + mdio_bus->read_c45 = sxgbe_mdio_read_c45; 167 + mdio_bus->write_c45 = sxgbe_mdio_write_c45; 221 168 snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%s-%x", 222 169 mdio_bus->name, priv->plat->bus_id); 223 170 mdio_bus->priv = ndev;