| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0+ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * drivers/net/phy/lxt.c |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 6 | 7 | * Author: Andy Fleming |
|---|
| 7 | 8 | * |
|---|
| 8 | 9 | * Copyright (c) 2004 Freescale Semiconductor, Inc. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 11 | | - * under the terms of the GNU General Public License as published by the |
|---|
| 12 | | - * Free Software Foundation; either version 2 of the License, or (at your |
|---|
| 13 | | - * option) any later version. |
|---|
| 14 | | - * |
|---|
| 15 | 10 | */ |
|---|
| 16 | 11 | #include <linux/kernel.h> |
|---|
| 17 | 12 | #include <linux/string.h> |
|---|
| .. | .. |
|---|
| 177 | 172 | */ |
|---|
| 178 | 173 | } while (lpa == adv && retry--); |
|---|
| 179 | 174 | |
|---|
| 180 | | - phydev->lp_advertising = mii_lpa_to_ethtool_lpa_t(lpa); |
|---|
| 175 | + mii_lpa_to_linkmode_lpa_t(phydev->lp_advertising, lpa); |
|---|
| 181 | 176 | |
|---|
| 182 | 177 | lpa &= adv; |
|---|
| 183 | 178 | |
|---|
| .. | .. |
|---|
| 195 | 190 | phydev->duplex = DUPLEX_FULL; |
|---|
| 196 | 191 | } |
|---|
| 197 | 192 | |
|---|
| 198 | | - if (phydev->duplex == DUPLEX_FULL) { |
|---|
| 199 | | - phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0; |
|---|
| 200 | | - phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0; |
|---|
| 201 | | - } |
|---|
| 193 | + phy_resolve_aneg_pause(phydev); |
|---|
| 202 | 194 | } else { |
|---|
| 203 | | - int bmcr = phy_read(phydev, MII_BMCR); |
|---|
| 204 | | - |
|---|
| 205 | | - if (bmcr < 0) |
|---|
| 206 | | - return bmcr; |
|---|
| 207 | | - |
|---|
| 208 | | - if (bmcr & BMCR_FULLDPLX) |
|---|
| 209 | | - phydev->duplex = DUPLEX_FULL; |
|---|
| 210 | | - else |
|---|
| 211 | | - phydev->duplex = DUPLEX_HALF; |
|---|
| 212 | | - |
|---|
| 213 | | - if (bmcr & BMCR_SPEED1000) |
|---|
| 214 | | - phydev->speed = SPEED_1000; |
|---|
| 215 | | - else if (bmcr & BMCR_SPEED100) |
|---|
| 216 | | - phydev->speed = SPEED_100; |
|---|
| 217 | | - else |
|---|
| 218 | | - phydev->speed = SPEED_10; |
|---|
| 195 | + err = genphy_read_status_fixed(phydev); |
|---|
| 196 | + if (err < 0) |
|---|
| 197 | + return err; |
|---|
| 219 | 198 | |
|---|
| 220 | 199 | phydev->pause = phydev->asym_pause = 0; |
|---|
| 221 | | - phydev->lp_advertising = 0; |
|---|
| 200 | + linkmode_zero(phydev->lp_advertising); |
|---|
| 222 | 201 | } |
|---|
| 223 | 202 | |
|---|
| 224 | 203 | return 0; |
|---|
| .. | .. |
|---|
| 239 | 218 | phy_write(phydev, MII_BMCR, val); |
|---|
| 240 | 219 | /* Remember that the port is in fiber mode. */ |
|---|
| 241 | 220 | phydev->priv = lxt973_probe; |
|---|
| 221 | + phydev->port = PORT_FIBRE; |
|---|
| 242 | 222 | } else { |
|---|
| 243 | 223 | phydev->priv = NULL; |
|---|
| 244 | 224 | } |
|---|
| .. | .. |
|---|
| 256 | 236 | .phy_id = 0x78100000, |
|---|
| 257 | 237 | .name = "LXT970", |
|---|
| 258 | 238 | .phy_id_mask = 0xfffffff0, |
|---|
| 259 | | - .features = PHY_BASIC_FEATURES, |
|---|
| 260 | | - .flags = PHY_HAS_INTERRUPT, |
|---|
| 239 | + /* PHY_BASIC_FEATURES */ |
|---|
| 261 | 240 | .config_init = lxt970_config_init, |
|---|
| 262 | 241 | .ack_interrupt = lxt970_ack_interrupt, |
|---|
| 263 | 242 | .config_intr = lxt970_config_intr, |
|---|
| .. | .. |
|---|
| 265 | 244 | .phy_id = 0x001378e0, |
|---|
| 266 | 245 | .name = "LXT971", |
|---|
| 267 | 246 | .phy_id_mask = 0xfffffff0, |
|---|
| 268 | | - .features = PHY_BASIC_FEATURES, |
|---|
| 269 | | - .flags = PHY_HAS_INTERRUPT, |
|---|
| 247 | + /* PHY_BASIC_FEATURES */ |
|---|
| 270 | 248 | .ack_interrupt = lxt971_ack_interrupt, |
|---|
| 271 | 249 | .config_intr = lxt971_config_intr, |
|---|
| 250 | + .suspend = genphy_suspend, |
|---|
| 251 | + .resume = genphy_resume, |
|---|
| 272 | 252 | }, { |
|---|
| 273 | 253 | .phy_id = 0x00137a10, |
|---|
| 274 | 254 | .name = "LXT973-A2", |
|---|
| 275 | 255 | .phy_id_mask = 0xffffffff, |
|---|
| 276 | | - .features = PHY_BASIC_FEATURES, |
|---|
| 256 | + /* PHY_BASIC_FEATURES */ |
|---|
| 277 | 257 | .flags = 0, |
|---|
| 278 | 258 | .probe = lxt973_probe, |
|---|
| 279 | 259 | .config_aneg = lxt973_config_aneg, |
|---|
| 280 | 260 | .read_status = lxt973a2_read_status, |
|---|
| 261 | + .suspend = genphy_suspend, |
|---|
| 262 | + .resume = genphy_resume, |
|---|
| 281 | 263 | }, { |
|---|
| 282 | 264 | .phy_id = 0x00137a10, |
|---|
| 283 | 265 | .name = "LXT973", |
|---|
| 284 | 266 | .phy_id_mask = 0xfffffff0, |
|---|
| 285 | | - .features = PHY_BASIC_FEATURES, |
|---|
| 267 | + /* PHY_BASIC_FEATURES */ |
|---|
| 286 | 268 | .flags = 0, |
|---|
| 287 | 269 | .probe = lxt973_probe, |
|---|
| 288 | 270 | .config_aneg = lxt973_config_aneg, |
|---|
| 271 | + .suspend = genphy_suspend, |
|---|
| 272 | + .resume = genphy_resume, |
|---|
| 289 | 273 | } }; |
|---|
| 290 | 274 | |
|---|
| 291 | 275 | module_phy_driver(lxt97x_driver); |
|---|