ionic: recreate hwstamp queues on ifup
authorShannon Nelson <snelson@pensando.io>
Fri, 27 Aug 2021 18:55:12 +0000 (11:55 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 28 Aug 2021 10:23:09 +0000 (11:23 +0100)
The queues can be freed in ionic_close().  They need to be recreated
after ionic_open().  It doesn't need to replay the whole config.  It
only needs to create the timestamping queues again.

Signed-off-by: Allen Hubbe <allenbh@pensando.io>
Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c
drivers/net/ethernet/pensando/ionic/ionic_lif.h
drivers/net/ethernet/pensando/ionic/ionic_phc.c

index 96e7e289b7d3ed3bf07fe981444ed4506911055e..23c9e196a7847ff35d118fad6541c18bbaa5bfe9 100644 (file)
@@ -2246,7 +2246,13 @@ static int ionic_open(struct net_device *netdev)
                        goto err_txrx_deinit;
        }
 
+       /* If hardware timestamping is enabled, but the queues were freed by
+        * ionic_stop, those need to be reallocated and initialized, too.
+        */
+       ionic_lif_hwstamp_recreate_queues(lif);
+
        mutex_unlock(&lif->queue_lock);
+
        return 0;
 
 err_txrx_deinit:
index cad193d358e8e0315ea6ac961e22e9000765617d..4915184f3efbe9c0d9db4760b63509fd706f3612 100644 (file)
@@ -306,6 +306,7 @@ int ionic_lif_size(struct ionic *ionic);
 
 #if IS_ENABLED(CONFIG_PTP_1588_CLOCK)
 void ionic_lif_hwstamp_replay(struct ionic_lif *lif);
+void ionic_lif_hwstamp_recreate_queues(struct ionic_lif *lif);
 int ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr);
 int ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr);
 ktime_t ionic_lif_phc_ktime(struct ionic_lif *lif, u64 counter);
@@ -315,6 +316,7 @@ void ionic_lif_alloc_phc(struct ionic_lif *lif);
 void ionic_lif_free_phc(struct ionic_lif *lif);
 #else
 static inline void ionic_lif_hwstamp_replay(struct ionic_lif *lif) {}
+static inline void ionic_lif_hwstamp_recreate_queues(struct ionic_lif *lif) {}
 
 static inline int ionic_lif_hwstamp_set(struct ionic_lif *lif, struct ifreq *ifr)
 {
index c39790a6c436cc5dc3638fdb8beb223a11de193b..eed2db69d7083f35c73aa187fc4cd79310c20eeb 100644 (file)
@@ -222,6 +222,30 @@ void ionic_lif_hwstamp_replay(struct ionic_lif *lif)
                netdev_info(lif->netdev, "hwstamp replay failed: %d\n", err);
 }
 
+void ionic_lif_hwstamp_recreate_queues(struct ionic_lif *lif)
+{
+       int err;
+
+       if (!lif->phc || !lif->phc->ptp)
+               return;
+
+       mutex_lock(&lif->phc->config_lock);
+
+       if (lif->phc->ts_config_tx_mode) {
+               err = ionic_lif_create_hwstamp_txq(lif);
+               if (err)
+                       netdev_info(lif->netdev, "hwstamp recreate txq failed: %d\n", err);
+       }
+
+       if (lif->phc->ts_config_rx_filt) {
+               err = ionic_lif_create_hwstamp_rxq(lif);
+               if (err)
+                       netdev_info(lif->netdev, "hwstamp recreate rxq failed: %d\n", err);
+       }
+
+       mutex_unlock(&lif->phc->config_lock);
+}
+
 int ionic_lif_hwstamp_get(struct ionic_lif *lif, struct ifreq *ifr)
 {
        struct hwtstamp_config config;