3 #include <gpxe/if_ether.h>
4 #include <gpxe/netdevice.h>
5 #include <gpxe/ethernet.h>
6 #include <gpxe/pkbuff.h>
10 * Quick and dirty compatibility layer
12 * This should allow old-API PCI drivers to at least function until
13 * they are updated. It will not help non-PCI drivers.
15 * No drivers should rely on this code. It will be removed asap.
21 static int legacy_registered = 0;
23 static int legacy_transmit ( struct net_device *netdev, struct pk_buff *pkb ) {
24 struct nic *nic = netdev->priv;
25 struct ethhdr *ethhdr = pkb->data;
28 pad_len = ( ETH_ZLEN - pkb_len ( pkb ) );
30 memset ( pkb_put ( pkb, pad_len ), 0, pad_len );
31 pkb_pull ( pkb, sizeof ( *ethhdr ) );
32 nic->nic_op->transmit ( nic, ( const char * ) ethhdr->h_dest,
33 ntohs ( ethhdr->h_protocol ),
34 pkb_len ( pkb ), pkb->data );
39 static void legacy_poll ( struct net_device *netdev ) {
40 struct nic *nic = netdev->priv;
43 pkb = alloc_pkb ( ETH_FRAME_LEN );
47 nic->packet = pkb->data;
48 if ( nic->nic_op->poll ( nic, 1 ) ) {
49 pkb_put ( pkb, nic->packetlen );
50 netdev_rx ( netdev, pkb );
56 int legacy_probe ( struct pci_device *pci,
57 const struct pci_device_id *id __unused,
58 int ( * probe ) ( struct nic *nic,
59 struct pci_device *pci ),
60 void ( * disable ) ( struct nic *nic ) ) {
61 struct net_device *netdev;
64 if ( legacy_registered )
67 netdev = alloc_etherdev ( 0 );
71 memset ( &nic, 0, sizeof ( nic ) );
72 pci_set_drvdata ( pci, netdev );
74 netdev->transmit = legacy_transmit;
75 netdev->poll = legacy_poll;
76 nic.node_addr = netdev->ll_addr;
78 if ( ! probe ( &nic, pci ) ) {
79 free_netdev ( netdev );
83 if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
85 free_netdev ( netdev );
89 /* Do not remove this message */
90 printf ( "WARNING: Using legacy NIC wrapper\n" );
92 legacy_registered = 1;
96 void legacy_remove ( struct pci_device *pci,
97 void ( * disable ) ( struct nic *nic ) ) {
98 struct net_device *netdev = pci_get_drvdata ( pci );
99 struct nic *nic = netdev->priv;
101 unregister_netdev ( netdev );
103 free_netdev ( netdev );
104 legacy_registered = 0;
107 void pci_fill_nic ( struct nic *nic, struct pci_device *pci ) {
108 nic->ioaddr = pci->ioaddr;
109 nic->irqno = pci->irq;
112 int dummy_connect ( struct nic *nic __unused ) {
116 void dummy_irq ( struct nic *nic __unused, irq_action_t irq_action __unused ) {
120 REQUIRE_OBJECT ( pci );