Skip to content

Commit

Permalink
drivers/net/ftgmac100: fix DHCP potential failure with systemd
Browse files Browse the repository at this point in the history
DHCP failures were observed with systemd 247.6. The issue could be
reproduced by rebooting Aspeed 2600 and then running ifconfig ethX
down/up.

It is caused by below procedures in the driver:

1. ftgmac100_open() enables net interface and call phy_start()
2. When PHY is link up, it calls netif_carrier_on() and then
adjust_link callback
3. ftgmac100_adjust_link() will schedule the reset task
4. ftgmac100_reset_task() will then reset the MAC in another schedule

After step 2, systemd will be notified to send DHCP discover packet,
while the packet might be corrupted by MAC reset operation in step 4.

Call ftgmac100_reset() directly instead of scheduling task to fix the
issue.

Signed-off-by: Heyi Guo <guoheyi@linux.alibaba.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Heyi Guo authored and David S. Miller committed Feb 23, 2022
1 parent 3c773db commit 1baf2e5
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions drivers/net/ethernet/faraday/ftgmac100.c
Original file line number Diff line number Diff line change
Expand Up @@ -1402,8 +1402,17 @@ static void ftgmac100_adjust_link(struct net_device *netdev)
/* Disable all interrupts */
iowrite32(0, priv->base + FTGMAC100_OFFSET_IER);

/* Reset the adapter asynchronously */
schedule_work(&priv->reset_task);
/* Release phy lock to allow ftgmac100_reset to aquire it, keeping lock
* order consistent to prevent dead lock.
*/
if (netdev->phydev)
mutex_unlock(&netdev->phydev->lock);

ftgmac100_reset(priv);

if (netdev->phydev)
mutex_lock(&netdev->phydev->lock);

}

static int ftgmac100_mii_probe(struct net_device *netdev)
Expand Down

0 comments on commit 1baf2e5

Please sign in to comment.