summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/legacy.c
diff options
context:
space:
mode:
authorMichael Brown2007-07-07 17:43:39 +0200
committerMichael Brown2007-07-07 17:43:39 +0200
commit4c418d2100228b1c478908c08f51811a474e0e1e (patch)
treee55c3fc14b82a642f1a3cf08c2356b0aad907536 /src/drivers/net/legacy.c
parentRevert "Replace natsemi driver with Indolent's updated one that uses the gPXE... (diff)
downloadipxe-4c418d2100228b1c478908c08f51811a474e0e1e.tar.gz
ipxe-4c418d2100228b1c478908c08f51811a474e0e1e.tar.xz
ipxe-4c418d2100228b1c478908c08f51811a474e0e1e.zip
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.c51
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;
}