diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-07-07 16:43:39 +0100 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-07-07 16:43:39 +0100 |
commit | 4c418d2100228b1c478908c08f51811a474e0e1e (patch) | |
tree | e55c3fc14b82a642f1a3cf08c2356b0aad907536 /src/drivers/net/legacy.c | |
parent | 2823688a923b84d1a5683dc153c2ed1c9ecff275 (diff) | |
download | ipxe-4c418d2100228b1c478908c08f51811a474e0e1e.tar.gz |
Use net_device_operations structure and netdev_nullify() to allow for
safe dropping of the netdev ref by the driver while other refs still
exist.
Add netdev_irq() method. Net device open()/close() methods should no
longer enable or disable IRQs.
Remove rx_quota; it wasn't used anywhere and added too much complexity
to implementing correct interrupt-masking behaviour in pxe_undi.c.
Diffstat (limited to 'src/drivers/net/legacy.c')
-rw-r--r-- | src/drivers/net/legacy.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/drivers/net/legacy.c b/src/drivers/net/legacy.c index 2d4633d4..6ae2fbec 100644 --- a/src/drivers/net/legacy.c +++ b/src/drivers/net/legacy.c @@ -36,13 +36,10 @@ static int legacy_transmit ( struct net_device *netdev, struct io_buffer *iobuf return 0; } -static void legacy_poll ( struct net_device *netdev, unsigned int rx_quota ) { +static void legacy_poll ( struct net_device *netdev ) { struct nic *nic = netdev->priv; struct io_buffer *iobuf; - if ( ! rx_quota ) - return; - iobuf = alloc_iob ( ETH_FRAME_LEN ); if ( ! iobuf ) return; @@ -57,19 +54,29 @@ static void legacy_poll ( struct net_device *netdev, unsigned int rx_quota ) { } } -static int legacy_open ( struct net_device *netdev ) { - struct nic *nic = netdev->priv; - - nic->nic_op->irq ( nic, ENABLE ); +static int legacy_open ( struct net_device *netdev __unused ) { + /* Nothing to do */ return 0; } -static void legacy_close ( struct net_device *netdev ) { +static void legacy_close ( struct net_device *netdev __unused ) { + /* Nothing to do */ +} + +static void legacy_irq ( struct net_device *netdev __unused, int enable ) { struct nic *nic = netdev->priv; - nic->nic_op->irq ( nic, DISABLE ); + nic->nic_op->irq ( nic, ( enable ? ENABLE : DISABLE ) ); } +static struct net_device_operations legacy_operations = { + .open = legacy_open, + .close = legacy_close, + .transmit = legacy_transmit, + .poll = legacy_poll, + .irq = legacy_irq, +}; + int legacy_probe ( void *hwdev, void ( * set_drvdata ) ( void *hwdev, void *priv ), struct device *dev, @@ -84,27 +91,21 @@ int legacy_probe ( void *hwdev, netdev = alloc_etherdev ( 0 ); if ( ! netdev ) return -ENOMEM; + netdev_init ( netdev, &legacy_operations ); netdev->priv = &nic; memset ( &nic, 0, sizeof ( nic ) ); set_drvdata ( hwdev, netdev ); netdev->dev = dev; - netdev->open = legacy_open; - netdev->close = legacy_close; - netdev->transmit = legacy_transmit; - netdev->poll = legacy_poll; nic.node_addr = netdev->ll_addr; if ( ! probe ( &nic, hwdev ) ) { - netdev_put ( netdev ); - return -ENODEV; + rc = -ENODEV; + goto err_probe; } - if ( ( rc = register_netdev ( netdev ) ) != 0 ) { - disable ( &nic, hwdev ); - netdev_put ( netdev ); - return rc; - } + if ( ( rc = register_netdev ( netdev ) ) != 0 ) + goto err_register; /* Do not remove this message */ printf ( "WARNING: Using legacy NIC wrapper on %s\n", @@ -112,6 +113,13 @@ int legacy_probe ( void *hwdev, legacy_registered = 1; return 0; + + err_register: + disable ( &nic, hwdev ); + err_probe: + netdev_nullify ( netdev ); + netdev_put ( netdev ); + return rc; } void legacy_remove ( void *hwdev, @@ -122,6 +130,7 @@ void legacy_remove ( void *hwdev, unregister_netdev ( netdev ); disable ( nic, hwdev ); + netdev_nullify ( netdev ); netdev_put ( netdev ); legacy_registered = 0; } |