Skip to content

Commit

Permalink
[PATCH] ixp2000: register netdevices last
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Lennert Buytenhek authored and Jeff Garzik committed Dec 1, 2005
1 parent 35b8fca commit 0c49919
Showing 1 changed file with 17 additions and 18 deletions.
35 changes: 17 additions & 18 deletions drivers/net/ixp2000/ixpdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,15 +300,6 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
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;

Expand All @@ -317,7 +308,7 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
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;
Expand Down Expand Up @@ -355,7 +346,6 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
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);
Expand All @@ -369,16 +359,25 @@ int ixpdev_init(int __nds_count, struct net_device **__nds,
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;
}
Expand All @@ -389,6 +388,9 @@ void ixpdev_deinit(void)

/* @@@ 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);
Expand All @@ -398,7 +400,4 @@ void ixpdev_deinit(void)

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]);
}

0 comments on commit 0c49919

Please sign in to comment.