Annotation of qemu/roms/ipxe/src/drivers/net/legacy.c, revision 1.1.1.1

1.1       root        1: #include <stdint.h>
                      2: #include <stdio.h>
                      3: #include <errno.h>
                      4: #include <ipxe/if_ether.h>
                      5: #include <ipxe/netdevice.h>
                      6: #include <ipxe/ethernet.h>
                      7: #include <ipxe/iobuf.h>
                      8: #include <nic.h>
                      9: 
                     10: /*
                     11:  * Quick and dirty compatibility layer
                     12:  *
                     13:  * This should allow old-API PCI drivers to at least function until
                     14:  * they are updated.  It will not help non-PCI drivers.
                     15:  *
                     16:  * No drivers should rely on this code.  It will be removed asap.
                     17:  *
                     18:  */
                     19: 
                     20: FILE_LICENCE ( GPL2_OR_LATER );
                     21: 
                     22: struct nic nic;
                     23: 
                     24: static int legacy_registered = 0;
                     25: 
                     26: static int legacy_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
                     27:        struct nic *nic = netdev->priv;
                     28:        struct ethhdr *ethhdr;
                     29: 
                     30:        DBG ( "Transmitting %zd bytes\n", iob_len ( iobuf ) );
                     31:        iob_pad ( iobuf, ETH_ZLEN );
                     32:        ethhdr = iobuf->data;
                     33:        iob_pull ( iobuf, sizeof ( *ethhdr ) );
                     34:        nic->nic_op->transmit ( nic, ( const char * ) ethhdr->h_dest,
                     35:                                ntohs ( ethhdr->h_protocol ),
                     36:                                iob_len ( iobuf ), iobuf->data );
                     37:        netdev_tx_complete ( netdev, iobuf );
                     38:        return 0;
                     39: }
                     40: 
                     41: static void legacy_poll ( struct net_device *netdev ) {
                     42:        struct nic *nic = netdev->priv;
                     43:        struct io_buffer *iobuf;
                     44: 
                     45:        iobuf = alloc_iob ( ETH_FRAME_LEN );
                     46:        if ( ! iobuf )
                     47:                return;
                     48: 
                     49:        nic->packet = iobuf->data;
                     50:        if ( nic->nic_op->poll ( nic, 1 ) ) {
                     51:                DBG ( "Received %d bytes\n", nic->packetlen );
                     52:                iob_put ( iobuf, nic->packetlen );
                     53:                netdev_rx ( netdev, iobuf );
                     54:        } else {
                     55:                free_iob ( iobuf );
                     56:        }
                     57: }
                     58: 
                     59: static int legacy_open ( struct net_device *netdev __unused ) {
                     60:        /* Nothing to do */
                     61:        return 0;
                     62: }
                     63: 
                     64: static void legacy_close ( struct net_device *netdev __unused ) {
                     65:        /* Nothing to do */
                     66: }
                     67: 
                     68: static void legacy_irq ( struct net_device *netdev __unused, int enable ) {
                     69:        struct nic *nic = netdev->priv;
                     70: 
                     71:        nic->nic_op->irq ( nic, ( enable ? ENABLE : DISABLE ) );
                     72: }
                     73: 
                     74: static struct net_device_operations legacy_operations = {
                     75:        .open           = legacy_open,
                     76:        .close          = legacy_close,
                     77:        .transmit       = legacy_transmit,
                     78:        .poll           = legacy_poll,
                     79:        .irq            = legacy_irq,
                     80: };
                     81: 
                     82: int legacy_probe ( void *hwdev,
                     83:                   void ( * set_drvdata ) ( void *hwdev, void *priv ),
                     84:                   struct device *dev,
                     85:                   int ( * probe ) ( struct nic *nic, void *hwdev ),
                     86:                   void ( * disable ) ( struct nic *nic, void *hwdev ) ) {
                     87:        struct net_device *netdev;
                     88:        int rc;
                     89: 
                     90:        if ( legacy_registered )
                     91:                return -EBUSY;
                     92:        
                     93:        netdev = alloc_etherdev ( 0 );
                     94:        if ( ! netdev )
                     95:                return -ENOMEM;
                     96:        netdev_init ( netdev, &legacy_operations );
                     97:        netdev->priv = &nic;
                     98:        memset ( &nic, 0, sizeof ( nic ) );
                     99:        set_drvdata ( hwdev, netdev );
                    100:        netdev->dev = dev;
                    101: 
                    102:        nic.node_addr = netdev->hw_addr;
                    103:        nic.irqno = dev->desc.irq;
                    104: 
                    105:        if ( ! probe ( &nic, hwdev ) ) {
                    106:                rc = -ENODEV;
                    107:                goto err_probe;
                    108:        }
                    109: 
                    110:        /* Overwrite the IRQ number.  Some legacy devices set
                    111:         * nic->irqno to 0 in the probe routine to indicate that they
                    112:         * don't support interrupts; doing this allows the timer
                    113:         * interrupt to be used instead.
                    114:         */
                    115:        dev->desc.irq = nic.irqno;
                    116: 
                    117:        if ( ( rc = register_netdev ( netdev ) ) != 0 )
                    118:                goto err_register;
                    119: 
                    120:        /* Mark as link up; legacy devices don't handle link state */
                    121:        netdev_link_up ( netdev );
                    122: 
                    123:        /* Do not remove this message */
                    124:        printf ( "WARNING: Using legacy NIC wrapper on %s\n",
                    125:                 netdev->ll_protocol->ntoa ( nic.node_addr ) );
                    126: 
                    127:        legacy_registered = 1;
                    128:        return 0;
                    129: 
                    130:  err_register:
                    131:        disable ( &nic, hwdev );
                    132:  err_probe:
                    133:        netdev_nullify ( netdev );
                    134:        netdev_put ( netdev );
                    135:        return rc;
                    136: }
                    137: 
                    138: void legacy_remove ( void *hwdev,
                    139:                     void * ( * get_drvdata ) ( void *hwdev ),
                    140:                     void ( * disable ) ( struct nic *nic, void *hwdev ) ) {
                    141:        struct net_device *netdev = get_drvdata ( hwdev );
                    142:        struct nic *nic = netdev->priv;
                    143: 
                    144:        unregister_netdev ( netdev );
                    145:        disable ( nic, hwdev );
                    146:        netdev_nullify ( netdev );
                    147:        netdev_put ( netdev );
                    148:        legacy_registered = 0;
                    149: }
                    150: 
                    151: int dummy_connect ( struct nic *nic __unused ) {
                    152:        return 1;
                    153: }
                    154: 
                    155: void dummy_irq ( struct nic *nic __unused, irq_action_t irq_action __unused ) {
                    156:        return;
                    157: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.