4 #include <gpxe/if_ether.h>
5 #include <gpxe/netdevice.h>
6 #include <gpxe/ethernet.h>
7 #include <gpxe/iobuf.h>
11 * Quick and dirty compatibility layer
13 * This should allow old-API PCI drivers to at least function until
14 * they are updated. It will not help non-PCI drivers.
16 * No drivers should rely on this code. It will be removed asap.
22 static int legacy_registered = 0;
24 static int legacy_transmit ( struct net_device *netdev, struct io_buffer *iobuf ) {
25 struct nic *nic = netdev->priv;
26 struct ethhdr *ethhdr;
28 DBG ( "Transmitting %d bytes\n", iob_len ( iobuf ) );
29 iob_pad ( iobuf, ETH_ZLEN );
31 iob_pull ( iobuf, sizeof ( *ethhdr ) );
32 nic->nic_op->transmit ( nic, ( const char * ) ethhdr->h_dest,
33 ntohs ( ethhdr->h_protocol ),
34 iob_len ( iobuf ), iobuf->data );
35 netdev_tx_complete ( netdev, iobuf );
39 static void legacy_poll ( struct net_device *netdev, unsigned int rx_quota ) {
40 struct nic *nic = netdev->priv;
41 struct io_buffer *iobuf;
46 iobuf = alloc_iob ( ETH_FRAME_LEN );
50 nic->packet = iobuf->data;
51 if ( nic->nic_op->poll ( nic, 1 ) ) {
52 DBG ( "Received %d bytes\n", nic->packetlen );
53 iob_put ( iobuf, nic->packetlen );
54 netdev_rx ( netdev, iobuf );
60 static int legacy_open ( struct net_device *netdev ) {
61 struct nic *nic = netdev->priv;
63 nic->nic_op->irq ( nic, ENABLE );
67 static void legacy_close ( struct net_device *netdev ) {
68 struct nic *nic = netdev->priv;
70 nic->nic_op->irq ( nic, DISABLE );
73 int legacy_probe ( void *hwdev,
74 void ( * set_drvdata ) ( void *hwdev, void *priv ),
76 int ( * probe ) ( struct nic *nic, void *hwdev ),
77 void ( * disable ) ( struct nic *nic, void *hwdev ) ) {
78 struct net_device *netdev;
81 if ( legacy_registered )
84 netdev = alloc_etherdev ( 0 );
88 memset ( &nic, 0, sizeof ( nic ) );
89 set_drvdata ( hwdev, netdev );
92 netdev->open = legacy_open;
93 netdev->close = legacy_close;
94 netdev->transmit = legacy_transmit;
95 netdev->poll = legacy_poll;
96 nic.node_addr = netdev->ll_addr;
98 if ( ! probe ( &nic, hwdev ) ) {
99 netdev_put ( netdev );
103 if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
104 disable ( &nic, hwdev );
105 netdev_put ( netdev );
109 /* Do not remove this message */
110 printf ( "WARNING: Using legacy NIC wrapper on %s\n",
111 ethernet_protocol.ntoa ( nic.node_addr ) );
113 legacy_registered = 1;
117 void legacy_remove ( void *hwdev,
118 void * ( * get_drvdata ) ( void *hwdev ),
119 void ( * disable ) ( struct nic *nic, void *hwdev ) ) {
120 struct net_device *netdev = get_drvdata ( hwdev );
121 struct nic *nic = netdev->priv;
123 unregister_netdev ( netdev );
124 disable ( nic, hwdev );
125 netdev_put ( netdev );
126 legacy_registered = 0;
129 int dummy_connect ( struct nic *nic __unused ) {
133 void dummy_irq ( struct nic *nic __unused, irq_action_t irq_action __unused ) {