[Resending with mailing list address corrected. Sorry about that.] I believe I'm seeing the same issue as in this thread:
http://www.spinics.net/lists/netdev/msg373670.html macb Ethernet driver and after upgrading from 4.4.0 to 4.60, the Ethernet interface would not initialize unless I force autonegation (e.g., with mii-diag -r). It looks to me the code may always have been broken, but since this check for PHY_POLL was introduced to phy_state_machine(): /* Only re-schedule a PHY state machine change if we are polling the * PHY, if PHY_IGNORE_INTERRUPT is set, then we will be moving * between states from phy_mac_interrupt() */ if (phydev->irq == PHY_POLL) queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, PHY_STATE_TIME * HZ); The bug no longer gets papered over with. The sequence of events I'm seeing: [ 0.810000] macb f8008000.ethernet: invalid hw address, using random [ 0.820000] libphy: MACB_mii_bus: probed [ 0.900000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 0 [ 0.900000] kszphy_ack_interrupt: rc 0 [ 0.900000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 500 [ 0.910000] Micrel KSZ8081 or KSZ8091 f8008000.etherne:01: attached PHY driver [Micrel KSZ8081 or KSZ8091] (mii_bus:phy_addr=f8008000.etherne:01, irq=117) [ 0.930000] macb f8008000.ethernet eth0: Cadence GEM rev 0x00020203 at 0xf8008000 irq 27 (ca:83:b2:75:81:e2) [ 0.940000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 0 [ 0.940000] kszphy_ack_interrupt: rc 0 [ 0.950000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 500 [ 0.950000] libphy: phy_state_machine: state 2 : [ 3.060000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 0 [ 3.060000] kszphy_ack_interrupt: rc 1 [ 3.070000] kszphy_config_intr: mask 200 MII_KSZPHY_INTCS 500 [ 3.070000] libphy: phy_state_machine: state 2 : [ 7.960000] macb: macb_open: calling phy_start() [ 7.970000] libphy: phy_start: old state 2 [ 7.970000] libphy: phy_start: new state 4 So if I understand this right, at 3.06 seconds, a LINKUP interrupt gets reported, but since the phy is in state PHY_READY, the interrupt gets ignored. At 7.96 seconds, phy_start() gets called, but even though this enters state PHY_UP, it does not trigger phy_state_machine() and therefore doesn't trigger autonegotiation. I'm not quite sure how this is intended to be handled properly. I believe Alexandre Belloni's patch would do the trick: http://www.spinics.net/lists/netdev/msg373324.html Or has this been fixed in some other way already? --david -- Love Linux kernel hacking? Know Python? We are hiring! Contact us at j...@egauge.net