[PATCH] ixp2000: register netdevices last

Do not register our netdevices with the kernel until we've actually
finished setting up the hardware and microcode.

Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
diff --git a/drivers/net/ixp2000/ixpdev.c b/drivers/net/ixp2000/ixpdev.c
index 216aad1..d9fd57d 100644
--- a/drivers/net/ixp2000/ixpdev.c
+++ b/drivers/net/ixp2000/ixpdev.c
@@ -300,15 +300,6 @@
 	nds = __nds;
 	set_port_admin_status = __set_port_admin_status;
 
-	for (i = 0; i < nds_count; i++) {
-		err = register_netdev(nds[i]);
-		if (err) {
-			while (--i >= 0)
-				unregister_netdev(nds[i]);
-			goto err_out;
-		}
-	}
-
 	for (i = 0; i < RX_BUF_COUNT; i++) {
 		void *buf;
 
@@ -317,7 +308,7 @@
 			err = -ENOMEM;
 			while (--i >= 0)
 				free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
-			goto err_unregister;
+			goto err_out;
 		}
 		rx_desc[i].buf_addr = virt_to_phys(buf);
 		rx_desc[i].buf_length = PAGE_SIZE;
@@ -355,7 +346,6 @@
 	ixp2000_uengine_load(0, &ixp2400_rx);
 	ixp2000_uengine_start_contexts(0, 0xff);
 
-
 	/* 256 entries, ring status set means 'empty', base address 0x0800.  */
 	ixp2000_reg_write(RING_TX_PENDING_BASE, 0x44000800);
 	ixp2000_reg_write(RING_TX_PENDING_HEAD, 0x00000000);
@@ -369,16 +359,25 @@
 	ixp2000_uengine_load(1, &ixp2400_tx);
 	ixp2000_uengine_start_contexts(1, 0xff);
 
+	for (i = 0; i < nds_count; i++) {
+		err = register_netdev(nds[i]);
+		if (err) {
+			while (--i >= 0)
+				unregister_netdev(nds[i]);
+			goto err_free_tx;
+		}
+	}
+
 	return 0;
 
+err_free_tx:
+	for (i = 0; i < TX_BUF_COUNT; i++)
+		free_page((unsigned long)phys_to_virt(tx_desc[i].buf_addr));
+
 err_free_rx:
 	for (i = 0; i < RX_BUF_COUNT; i++)
 		free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
 
-err_unregister:
-	for (i = 0; i < nds_count; i++)
-		unregister_netdev(nds[i]);
-
 err_out:
 	return err;
 } 
@@ -389,6 +388,9 @@
 
 	/* @@@ Flush out pending packets.  */
 
+	for (i = 0; i < nds_count; i++)
+		unregister_netdev(nds[i]);
+
 	ixp2000_uengine_stop_contexts(1, 0xff);
 	ixp2000_uengine_stop_contexts(0, 0xff);
 	ixp2000_uengine_reset(0x3);
@@ -398,7 +400,4 @@
 
 	for (i = 0; i < RX_BUF_COUNT; i++)
 		free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
-
-	for (i = 0; i < nds_count; i++)
-		unregister_netdev(nds[i]);
 }