• Florian Fainelli's avatar
    Revert "net: ethernet: bcmgenet: use phydev from struct net_device" · 0299b6ac
    Florian Fainelli authored
    This reverts commit 62469c76 ("net: ethernet: bcmgenet: use phydev
    from struct net_device") because it causes GENETv1/2/3 adapters to
    expose the following behavior after an ifconfig down/up sequence:
    
    PING fainelli-linux (10.112.156.244): 56 data bytes
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.352 ms
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.472 ms (DUP!)
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.496 ms (DUP!)
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.517 ms (DUP!)
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.536 ms (DUP!)
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=1.557 ms (DUP!)
    64 bytes from 10.112.156.244: seq=1 ttl=61 time=752.448 ms (DUP!)
    
    This was previously fixed by commit 5dbebbb4 ("net: bcmgenet:
    Software reset EPHY after power on") but the commit we are reverting was
    essentially making this previous commit void, here is why.
    
    Without commit 62469c76 we would have the following scenario after
    an ifconfig down then up sequence:
    
    - bcmgenet_open() calls bcmgenet_power_up() to make sure the PHY is
      initialized *before* we get to initialize the UniMAC, this is
      critical to ensure the PHY is in a correct state, priv->phydev is
      valid, this code executes fine
    
    - second time from bcmgenet_mii_probe(), through the normal
      phy_init_hw() call (which arguably could be optimized out)
    
    Everything is fine in that case. With commit 62469c76, we would have
    the following scenario to happen after an ifconfig down then up
    sequence:
    
    - bcmgenet_close() calls phy_disonnect() which makes dev->phydev become
      NULL
    
    - when bcmgenet_open() executes again and calls bcmgenet_mii_reset() from
      bcmgenet_power_up() to initialize the internal PHY, the NULL check
      becomes true, so we do not reset the PHY, yet we keep going on and
      initialize the UniMAC, causing MAC activity to occur
    
    - we call bcmgenet_mii_reset() from bcmgenet_mii_probe(), but this is
      too late, the PHY is botched, and causes the above bogus pings/packets
      transmission/reception to occur
    Reported-by: default avatarJaedon Shin <jaedon.shin@gmail.com>
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarPhilippe Reynes <tremyfr@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0299b6ac
bcmmii.c 16.6 KB