[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>
This commit is contained in:
Lennert Buytenhek 2005-11-23 12:49:05 +01:00 коммит произвёл Jeff Garzik
Родитель 35b8fcab1b
Коммит 0c49919a47
1 изменённых файлов: 17 добавлений и 18 удалений

Просмотреть файл

@ -300,15 +300,6 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
nds = __nds; nds = __nds;
set_port_admin_status = __set_port_admin_status; 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++) { for (i = 0; i < RX_BUF_COUNT; i++) {
void *buf; void *buf;
@ -317,7 +308,7 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
err = -ENOMEM; err = -ENOMEM;
while (--i >= 0) while (--i >= 0)
free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr)); 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_addr = virt_to_phys(buf);
rx_desc[i].buf_length = PAGE_SIZE; rx_desc[i].buf_length = PAGE_SIZE;
@ -355,7 +346,6 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
ixp2000_uengine_load(0, &ixp2400_rx); ixp2000_uengine_load(0, &ixp2400_rx);
ixp2000_uengine_start_contexts(0, 0xff); ixp2000_uengine_start_contexts(0, 0xff);
/* 256 entries, ring status set means 'empty', base address 0x0800. */ /* 256 entries, ring status set means 'empty', base address 0x0800. */
ixp2000_reg_write(RING_TX_PENDING_BASE, 0x44000800); ixp2000_reg_write(RING_TX_PENDING_BASE, 0x44000800);
ixp2000_reg_write(RING_TX_PENDING_HEAD, 0x00000000); ixp2000_reg_write(RING_TX_PENDING_HEAD, 0x00000000);
@ -369,16 +359,25 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
ixp2000_uengine_load(1, &ixp2400_tx); ixp2000_uengine_load(1, &ixp2400_tx);
ixp2000_uengine_start_contexts(1, 0xff); 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; 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: err_free_rx:
for (i = 0; i < RX_BUF_COUNT; i++) for (i = 0; i < RX_BUF_COUNT; i++)
free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr)); 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: err_out:
return err; return err;
} }
@ -389,6 +388,9 @@ void ixpdev_deinit(void)
/* @@@ Flush out pending packets. */ /* @@@ 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(1, 0xff);
ixp2000_uengine_stop_contexts(0, 0xff); ixp2000_uengine_stop_contexts(0, 0xff);
ixp2000_uengine_reset(0x3); ixp2000_uengine_reset(0x3);
@ -398,7 +400,4 @@ void ixpdev_deinit(void)
for (i = 0; i < RX_BUF_COUNT; i++) for (i = 0; i < RX_BUF_COUNT; i++)
free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr)); free_page((unsigned long)phys_to_virt(rx_desc[i].buf_addr));
for (i = 0; i < nds_count; i++)
unregister_netdev(nds[i]);
} }