mirror of
https://github.com/ipxe/ipxe
synced 2025-12-29 11:03:15 +03:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user