hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/ethernet/qlogic/qede/qede_main.c
....@@ -313,6 +313,8 @@
313313
314314 edev->ops->get_vport_stats(edev->cdev, &stats);
315315
316
+ spin_lock(&edev->stats_lock);
317
+
316318 p_common->no_buff_discards = stats.common.no_buff_discards;
317319 p_common->packet_too_big_discard = stats.common.packet_too_big_discard;
318320 p_common->ttl0_discard = stats.common.ttl0_discard;
....@@ -410,6 +412,8 @@
410412 p_ah->tx_1519_to_max_byte_packets =
411413 stats.ah.tx_1519_to_max_byte_packets;
412414 }
415
+
416
+ spin_unlock(&edev->stats_lock);
413417 }
414418
415419 static void qede_get_stats64(struct net_device *dev,
....@@ -418,8 +422,9 @@
418422 struct qede_dev *edev = netdev_priv(dev);
419423 struct qede_stats_common *p_common;
420424
421
- qede_fill_by_demand_stats(edev);
422425 p_common = &edev->stats.common;
426
+
427
+ spin_lock(&edev->stats_lock);
423428
424429 stats->rx_packets = p_common->rx_ucast_pkts + p_common->rx_mcast_pkts +
425430 p_common->rx_bcast_pkts;
....@@ -440,6 +445,8 @@
440445 stats->collisions = edev->stats.bb.tx_total_collisions;
441446 stats->rx_crc_errors = p_common->rx_crc_errors;
442447 stats->rx_frame_errors = p_common->rx_align_errors;
448
+
449
+ spin_unlock(&edev->stats_lock);
443450 }
444451
445452 #ifdef CONFIG_QED_SRIOV
....@@ -1001,6 +1008,23 @@
10011008 rtnl_unlock();
10021009 }
10031010
1011
+static void qede_periodic_task(struct work_struct *work)
1012
+{
1013
+ struct qede_dev *edev = container_of(work, struct qede_dev,
1014
+ periodic_task.work);
1015
+
1016
+ qede_fill_by_demand_stats(edev);
1017
+ schedule_delayed_work(&edev->periodic_task, edev->stats_coal_ticks);
1018
+}
1019
+
1020
+static void qede_init_periodic_task(struct qede_dev *edev)
1021
+{
1022
+ INIT_DELAYED_WORK(&edev->periodic_task, qede_periodic_task);
1023
+ spin_lock_init(&edev->stats_lock);
1024
+ edev->stats_coal_usecs = USEC_PER_SEC;
1025
+ edev->stats_coal_ticks = usecs_to_jiffies(USEC_PER_SEC);
1026
+}
1027
+
10041028 static void qede_sp_task(struct work_struct *work)
10051029 {
10061030 struct qede_dev *edev = container_of(work, struct qede_dev,
....@@ -1020,6 +1044,7 @@
10201044 */
10211045
10221046 if (test_and_clear_bit(QEDE_SP_RECOVERY, &edev->sp_flags)) {
1047
+ cancel_delayed_work_sync(&edev->periodic_task);
10231048 #ifdef CONFIG_QED_SRIOV
10241049 /* SRIOV must be disabled outside the lock to avoid a deadlock.
10251050 * The recovery of the active VFs is currently not supported.
....@@ -1216,6 +1241,7 @@
12161241 */
12171242 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
12181243 mutex_init(&edev->qede_lock);
1244
+ qede_init_periodic_task(edev);
12191245
12201246 rc = register_netdev(edev->ndev);
12211247 if (rc) {
....@@ -1240,6 +1266,11 @@
12401266 edev->rx_copybreak = QEDE_RX_HDR_SIZE;
12411267
12421268 qede_log_probe(edev);
1269
+
1270
+ /* retain user config (for example - after recovery) */
1271
+ if (edev->stats_coal_usecs)
1272
+ schedule_delayed_work(&edev->periodic_task, 0);
1273
+
12431274 return 0;
12441275
12451276 err4:
....@@ -1308,6 +1339,7 @@
13081339 unregister_netdev(ndev);
13091340
13101341 cancel_delayed_work_sync(&edev->sp_task);
1342
+ cancel_delayed_work_sync(&edev->periodic_task);
13111343
13121344 edev->ops->common->set_power_state(cdev, PCI_D0);
13131345