return 0;
 }
 
-/* Got back a STOPPED LDC message on port. If the queue is stopped,
- * wake it up so that we'll send out another START message at the
- * next TX.
+/* If the queue is stopped, wake it up so that we'll
+ * send out another START message at the next TX.
  */
 static void maybe_tx_wakeup(struct vnet_port *port)
 {
 
 static int vnet_event_napi(struct vnet_port *port, int budget)
 {
+       struct net_device *dev = VNET_PORT_TO_NET_DEVICE(port);
        struct vio_driver_state *vio = &port->vio;
        int tx_wakeup, err;
        int npkts = 0;
                if (event == LDC_EVENT_RESET) {
                        vnet_port_reset(port);
                        vio_port_up(vio);
+
+                       /* If the device is running but its tx queue was
+                        * stopped (due to flow control), restart it.
+                        * This is necessary since vnet_port_reset()
+                        * clears the tx drings and thus we may never get
+                        * back a VIO_TYPE_DATA ACK packet - which is
+                        * the normal mechanism to restart the tx queue.
+                        */
+                       if (netif_running(dev))
+                               maybe_tx_wakeup(port);
                }
                port->rx_event = 0;
                return 0;