1 Use phy lib for the phy. This is needed to get the switch connected to
2 the phy and driven by b53 working.
4 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
6 --- a/drivers/net/ethernet/broadcom/bgmac.c
7 +++ b/drivers/net/ethernet/broadcom/bgmac.c
8 @@ -1252,27 +1252,14 @@ static int bgmac_set_mac_address(struct
9 static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
11 struct bgmac *bgmac = netdev_priv(net_dev);
12 - struct mii_ioctl_data *data = if_mii(ifr);
16 - data->phy_id = bgmac->phyaddr;
19 - if (!netif_running(net_dev))
21 - data->val_out = bgmac_phy_read(bgmac, data->phy_id,
22 - data->reg_num & 0x1f);
25 - if (!netif_running(net_dev))
27 - bgmac_phy_write(bgmac, data->phy_id, data->reg_num & 0x1f,
33 + if (!netif_running(net_dev))
39 + return phy_mii_ioctl(bgmac->phydev, ifr, cmd);
42 static const struct net_device_ops bgmac_netdev_ops = {
43 @@ -1294,61 +1281,16 @@ static int bgmac_get_settings(struct net
45 struct bgmac *bgmac = netdev_priv(net_dev);
47 - cmd->supported = SUPPORTED_10baseT_Half |
48 - SUPPORTED_10baseT_Full |
49 - SUPPORTED_100baseT_Half |
50 - SUPPORTED_100baseT_Full |
51 - SUPPORTED_1000baseT_Half |
52 - SUPPORTED_1000baseT_Full |
55 - if (bgmac->autoneg) {
56 - WARN_ON(cmd->advertising);
57 - if (bgmac->full_duplex) {
58 - if (bgmac->speed & BGMAC_SPEED_10)
59 - cmd->advertising |= ADVERTISED_10baseT_Full;
60 - if (bgmac->speed & BGMAC_SPEED_100)
61 - cmd->advertising |= ADVERTISED_100baseT_Full;
62 - if (bgmac->speed & BGMAC_SPEED_1000)
63 - cmd->advertising |= ADVERTISED_1000baseT_Full;
65 - if (bgmac->speed & BGMAC_SPEED_10)
66 - cmd->advertising |= ADVERTISED_10baseT_Half;
67 - if (bgmac->speed & BGMAC_SPEED_100)
68 - cmd->advertising |= ADVERTISED_100baseT_Half;
69 - if (bgmac->speed & BGMAC_SPEED_1000)
70 - cmd->advertising |= ADVERTISED_1000baseT_Half;
73 - switch (bgmac->speed) {
74 - case BGMAC_SPEED_10:
75 - ethtool_cmd_speed_set(cmd, SPEED_10);
77 - case BGMAC_SPEED_100:
78 - ethtool_cmd_speed_set(cmd, SPEED_100);
80 - case BGMAC_SPEED_1000:
81 - ethtool_cmd_speed_set(cmd, SPEED_1000);
86 - cmd->duplex = bgmac->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
88 - cmd->autoneg = bgmac->autoneg;
91 + return phy_ethtool_gset(bgmac->phydev, cmd);
95 static int bgmac_set_settings(struct net_device *net_dev,
96 struct ethtool_cmd *cmd)
98 struct bgmac *bgmac = netdev_priv(net_dev);
101 + return phy_ethtool_sset(bgmac->phydev, cmd);
105 static void bgmac_get_drvinfo(struct net_device *net_dev,
106 struct ethtool_drvinfo *info)
107 @@ -1359,6 +1301,7 @@ static void bgmac_get_drvinfo(struct net
109 static const struct ethtool_ops bgmac_ethtool_ops = {
110 .get_settings = bgmac_get_settings,
111 + .set_settings = bgmac_set_settings,
112 .get_drvinfo = bgmac_get_drvinfo,
115 @@ -1377,10 +1320,36 @@ static int bgmac_mii_write(struct mii_bu
116 return bgmac_phy_write(bus->priv, mii_id, regnum, value);
119 +static void bgmac_adjust_link(struct net_device *dev)
121 + struct bgmac *bgmac = netdev_priv(dev);
122 + struct phy_device *phydev = bgmac->phydev;
123 + bool status_changed = 0;
127 + if (bgmac->old_link != phydev->link) {
128 + status_changed = 1;
129 + bgmac->old_link = phydev->link;
132 + /* reflect duplex change */
133 + if (phydev->link && (bgmac->old_duplex != phydev->duplex)) {
134 + status_changed = 1;
135 + bgmac->old_duplex = phydev->duplex;
138 + if (status_changed)
139 + phy_print_status(phydev);
142 static int bgmac_mii_register(struct bgmac *bgmac)
144 struct mii_bus *mii_bus;
146 + struct phy_device *phydev = NULL;
147 + char phy_id[MII_BUS_ID_SIZE + 3];
148 + struct net_device *net_dev = bgmac->net_dev;
150 mii_bus = mdiobus_alloc();
152 @@ -1411,7 +1380,28 @@ static int bgmac_mii_register(struct bgm
154 bgmac->mii_bus = mii_bus;
157 + /* connect to PHY */
158 + snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT,
159 + mii_bus->id, bgmac->phyaddr);
161 + phydev = phy_connect(net_dev, phy_id, &bgmac_adjust_link,
162 + PHY_INTERFACE_MODE_MII);
164 + if (IS_ERR(phydev)) {
165 + netdev_err(net_dev, "could not attach PHY: %s\n", phy_id);
166 + bgmac->phyaddr = BGMAC_PHY_NOREGS;
167 + return PTR_ERR(phydev);
170 + bgmac->phydev = phydev;
171 + bgmac->old_link = 0;
172 + bgmac->old_duplex = -1;
173 + bgmac->phyaddr = phydev->addr;
175 + netdev_info(net_dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s)\n",
176 + phydev->drv->name, dev_name(&phydev->dev));
182 --- a/drivers/net/ethernet/broadcom/bgmac.h
183 +++ b/drivers/net/ethernet/broadcom/bgmac.h
184 @@ -401,7 +401,10 @@ struct bgmac {
185 struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */
186 struct net_device *net_dev;
187 struct napi_struct napi;
188 + struct phy_device *phydev;
189 struct mii_bus *mii_bus;
194 struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];