|
@@ -2912,20 +2912,12 @@ static void fec_poll_controller(struct net_device *dev)
|
|
|
#endif
|
|
|
|
|
|
#define FEATURES_NEED_QUIESCE NETIF_F_RXCSUM
|
|
|
-
|
|
|
-static int fec_set_features(struct net_device *netdev,
|
|
|
+static inline void fec_enet_set_netdev_features(struct net_device *netdev,
|
|
|
netdev_features_t features)
|
|
|
{
|
|
|
struct fec_enet_private *fep = netdev_priv(netdev);
|
|
|
netdev_features_t changed = features ^ netdev->features;
|
|
|
|
|
|
- /* Quiesce the device if necessary */
|
|
|
- if (netif_running(netdev) && changed & FEATURES_NEED_QUIESCE) {
|
|
|
- napi_disable(&fep->napi);
|
|
|
- netif_tx_lock_bh(netdev);
|
|
|
- fec_stop(netdev);
|
|
|
- }
|
|
|
-
|
|
|
netdev->features = features;
|
|
|
|
|
|
/* Receive checksum has been changed */
|
|
@@ -2935,13 +2927,25 @@ static int fec_set_features(struct net_device *netdev,
|
|
|
else
|
|
|
fep->csum_flags &= ~FLAG_RX_CSUM_ENABLED;
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+static int fec_set_features(struct net_device *netdev,
|
|
|
+ netdev_features_t features)
|
|
|
+{
|
|
|
+ struct fec_enet_private *fep = netdev_priv(netdev);
|
|
|
+ netdev_features_t changed = features ^ netdev->features;
|
|
|
|
|
|
- /* Resume the device after updates */
|
|
|
if (netif_running(netdev) && changed & FEATURES_NEED_QUIESCE) {
|
|
|
+ napi_disable(&fep->napi);
|
|
|
+ netif_tx_lock_bh(netdev);
|
|
|
+ fec_stop(netdev);
|
|
|
+ fec_enet_set_netdev_features(netdev, features);
|
|
|
fec_restart(netdev);
|
|
|
netif_tx_wake_all_queues(netdev);
|
|
|
netif_tx_unlock_bh(netdev);
|
|
|
napi_enable(&fep->napi);
|
|
|
+ } else {
|
|
|
+ fec_enet_set_netdev_features(netdev, features);
|
|
|
}
|
|
|
|
|
|
return 0;
|