Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "lan78xx: add ndo_get_stats64"

This reverts commit a59f8c5b048dc938fb958c91c282c865cd845705.

There are several bugs in this new code, for example:

1) Uses sleeping locks in get_stats64, which is not allowed,
as the operation can be invoked in an atomic context.

2) Uses PM fields without CONFIG_PM or similar guards.

3) Does not synchronize HW stats when the device runtime
suspends.

Therefore this is being reverted until a correct version
is implemented.

Signed-off-by: David S. Miller <davem@davemloft.net>

-49
-49
drivers/net/usb/lan78xx.c
··· 3261 3261 tasklet_schedule(&dev->bh); 3262 3262 } 3263 3263 3264 - struct rtnl_link_stats64 *lan78xx_get_stats64(struct net_device *netdev, 3265 - struct rtnl_link_stats64 *storage) 3266 - { 3267 - struct lan78xx_net *dev = netdev_priv(netdev); 3268 - struct lan78xx_statstage64 stats; 3269 - 3270 - /* curr_stat is updated by timer. 3271 - * periodic reading from HW will prevent from entering USB auto suspend. 3272 - * if autosuspend is disabled, read from HW. 3273 - */ 3274 - if (!dev->udev->dev.power.runtime_auto) 3275 - lan78xx_update_stats(dev); 3276 - 3277 - mutex_lock(&dev->stats.access_lock); 3278 - memcpy(&stats, &dev->stats.curr_stat, sizeof(stats)); 3279 - mutex_unlock(&dev->stats.access_lock); 3280 - 3281 - /* calc by driver */ 3282 - storage->rx_packets = (__u64)netdev->stats.rx_packets; 3283 - storage->tx_packets = (__u64)netdev->stats.tx_packets; 3284 - storage->rx_bytes = (__u64)netdev->stats.rx_bytes; 3285 - storage->tx_bytes = (__u64)netdev->stats.tx_bytes; 3286 - 3287 - /* use counter */ 3288 - storage->rx_length_errors = stats.rx_undersize_frame_errors + 3289 - stats.rx_oversize_frame_errors; 3290 - storage->rx_crc_errors = stats.rx_fcs_errors; 3291 - storage->rx_frame_errors = stats.rx_alignment_errors; 3292 - storage->rx_fifo_errors = stats.rx_dropped_frames; 3293 - storage->rx_over_errors = stats.rx_oversize_frame_errors; 3294 - storage->rx_errors = stats.rx_fcs_errors + 3295 - stats.rx_alignment_errors + 3296 - stats.rx_fragment_errors + 3297 - stats.rx_jabber_errors + 3298 - stats.rx_undersize_frame_errors + 3299 - stats.rx_oversize_frame_errors + 3300 - stats.rx_dropped_frames; 3301 - 3302 - storage->tx_carrier_errors = stats.tx_carrier_errors; 3303 - storage->tx_errors = stats.tx_fcs_errors + 3304 - stats.tx_excess_deferral_errors + 3305 - stats.tx_carrier_errors; 3306 - 3307 - storage->multicast = stats.rx_multicast_frames; 3308 - 3309 - return storage; 3310 - } 3311 - 3312 3264 static const struct net_device_ops lan78xx_netdev_ops = { 3313 3265 .ndo_open = lan78xx_open, 3314 3266 .ndo_stop = lan78xx_stop, ··· 3274 3322 .ndo_set_features = lan78xx_set_features, 3275 3323 .ndo_vlan_rx_add_vid = lan78xx_vlan_rx_add_vid, 3276 3324 .ndo_vlan_rx_kill_vid = lan78xx_vlan_rx_kill_vid, 3277 - .ndo_get_stats64 = lan78xx_get_stats64, 3278 3325 }; 3279 3326 3280 3327 static void lan78xx_stat_monitor(unsigned long param)