svn commit: r319199 - head/sys/dev/ena

Zbigniew Bodek zbb at FreeBSD.org
Tue May 30 11:56:55 UTC 2017


Author: zbb
Date: Tue May 30 11:56:54 2017
New Revision: 319199
URL: https://svnweb.freebsd.org/changeset/base/319199

Log:
  Add error handling to the ENA driver if init of the reset task fails
  
  Also, to simplify cleaning routine, reset task is initialized before
  allocating statistics and other resources.
  
  Submitted by:   Michal Krawczyk <mk at semihalf.com>
  Obtained from:  Semihalf
  Sponsored by:   Amazon.com Inc.
  Differential revision: https://reviews.freebsd.org/D10925

Modified:
  head/sys/dev/ena/ena.c

Modified: head/sys/dev/ena/ena.c
==============================================================================
--- head/sys/dev/ena/ena.c	Tue May 30 11:55:02 2017	(r319198)
+++ head/sys/dev/ena/ena.c	Tue May 30 11:56:54 2017	(r319199)
@@ -3604,6 +3604,18 @@ ena_attach(device_t pdev)
 		goto err_ifp_free;
 	}
 
+	/* Initialize reset task queue */
+	TASK_INIT(&adapter->reset_task, 0, ena_reset_task, adapter);
+	adapter->reset_tq = taskqueue_create("ena_reset_enqueue",
+	    M_WAITOK | M_ZERO, taskqueue_thread_enqueue, &adapter->reset_tq);
+	if (adapter->reset_tq == NULL) {
+		device_printf(adapter->pdev,
+		    "Unable to create reset task queue\n");
+		goto err_reset_tq;
+	}
+	taskqueue_start_threads(&adapter->reset_tq, 1, PI_NET,
+	    "%s rstq", device_get_nameunit(adapter->pdev));
+
 	/* Initialize statistics */
 	ena_alloc_counters((counter_u64_t *)&adapter->dev_stats,
 	    sizeof(struct ena_stats_dev));
@@ -3613,16 +3625,12 @@ ena_attach(device_t pdev)
 	/* Tell the stack that the interface is not active */
 	if_setdrvflagbits(adapter->ifp, IFF_DRV_OACTIVE, IFF_DRV_RUNNING);
 
-	/* Initialize reset task queue */
-	TASK_INIT(&adapter->reset_task, 0, ena_reset_task, adapter);
-	adapter->reset_tq = taskqueue_create("ena_reset_enqueue",
-	    M_WAITOK | M_ZERO, taskqueue_thread_enqueue, &adapter->reset_tq);
-	taskqueue_start_threads(&adapter->reset_tq, 1, PI_NET,
-	    "%s rstq", device_get_nameunit(adapter->pdev));
-
 	adapter->running = true;
 	return (0);
 
+err_reset_tq:
+	ena_free_mgmnt_irq(adapter);
+	ena_disable_msix(adapter);
 err_ifp_free:
 	if_detach(adapter->ifp);
 	if_free(adapter->ifp);


More information about the svn-src-all mailing list