diff --git a/src/core/nic.c b/src/core/nic.c index 64e87f61..0382ced2 100644 --- a/src/core/nic.c +++ b/src/core/nic.c @@ -388,6 +388,7 @@ struct type_driver nic_driver = { .load = nic_load, }; +#if 0 /* Careful. We need an aligned buffer to avoid problems on machines * that care about alignment. To trivally align the ethernet data * (the ip hdr and arp requests) we offset the packet by 2 bytes. @@ -400,17 +401,9 @@ struct nic nic = { .node_addr = arptable[ARP_CLIENT].node, .packet = packet + ETH_DATA_ALIGN, }; +#endif - -int dummy_connect ( struct nic *nic __unused ) { - return 1; -} - -void dummy_irq ( struct nic *nic __unused, irq_action_t irq_action __unused ) { - return; -} - /************************************************************************** DEFAULT_NETMASK - Return default netmask for IP address **************************************************************************/ diff --git a/src/drivers/net/3c509.c b/src/drivers/net/3c509.c index b27ee1f6..29701713 100644 --- a/src/drivers/net/3c509.c +++ b/src/drivers/net/3c509.c @@ -9,6 +9,7 @@ #include "timer.h" #include "string.h" #include "console.h" +#include "dev.h" #include "3c509.h" /* diff --git a/src/drivers/net/3c595.c b/src/drivers/net/3c595.c index 8db1285e..464f080f 100644 --- a/src/drivers/net/3c595.c +++ b/src/drivers/net/3c595.c @@ -32,7 +32,6 @@ #include "timer.h" static struct nic_operations t595_operations; -static struct pci_driver t595_driver; static unsigned short eth_nic_base; static unsigned short vx_connector, vx_connectors; diff --git a/src/drivers/net/3c90x.c b/src/drivers/net/3c90x.c index 0fb79a49..b7ac4cfb 100644 --- a/src/drivers/net/3c90x.c +++ b/src/drivers/net/3c90x.c @@ -43,7 +43,6 @@ #include "timer.h" static struct nic_operations a3c90x_operations; -static struct pci_driver a3c90x_driver; #define XCVR_MAGIC (0x5A00) /** any single transmission fails after 16 collisions or other errors diff --git a/src/drivers/net/davicom.c b/src/drivers/net/davicom.c index 0931d13f..3a470c83 100644 --- a/src/drivers/net/davicom.c +++ b/src/drivers/net/davicom.c @@ -123,7 +123,6 @@ struct rxdesc { /*********************************************************************/ static struct nic_operations davicom_operations; -static struct pci_driver davicom_driver; /* PCI Bus parameters */ static unsigned short vendor, dev_id; diff --git a/src/drivers/net/dmfe.c b/src/drivers/net/dmfe.c index 4c822724..50d96ece 100644 --- a/src/drivers/net/dmfe.c +++ b/src/drivers/net/dmfe.c @@ -189,7 +189,6 @@ enum dmfe_CR6_bits { /* Global variable declaration ----------------------------- */ static struct nic_operations dmfe_operations; -static struct pci_driver dmfe_driver; static unsigned char dmfe_media_mode = DMFE_AUTO; static u32 dmfe_cr6_user_set; diff --git a/src/drivers/net/e1000.c b/src/drivers/net/e1000.c index b9f9d8f9..d89deb7a 100644 --- a/src/drivers/net/e1000.c +++ b/src/drivers/net/e1000.c @@ -89,7 +89,6 @@ typedef enum { /* NIC specific static variables go here */ static struct nic_operations e1000_operations; -static struct pci_driver e1000_driver; static struct e1000_hw hw; diff --git a/src/drivers/net/eepro100.c b/src/drivers/net/eepro100.c index c1ff2e76..46346c71 100644 --- a/src/drivers/net/eepro100.c +++ b/src/drivers/net/eepro100.c @@ -252,7 +252,6 @@ struct RxFD { /* Receive frame descriptor. */ }; static struct nic_operations eepro100_operations; -static struct pci_driver eepro100_driver; #define RXFD_COUNT 4 struct { diff --git a/src/drivers/net/epic100.c b/src/drivers/net/epic100.c index 32f2dff4..ac9b2597 100644 --- a/src/drivers/net/epic100.c +++ b/src/drivers/net/epic100.c @@ -61,7 +61,6 @@ static int mii_read(int phy_id, int location); static void epic100_irq(struct nic *nic, irq_action_t action); static struct nic_operations epic100_operations; -static struct pci_driver epic100_driver; static int ioaddr; diff --git a/src/drivers/net/legacy.c b/src/drivers/net/legacy.c new file mode 100644 index 00000000..1b36c0de --- /dev/null +++ b/src/drivers/net/legacy.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include +#include +#include +#include + +/* + * Quick and dirty compatibility layer + * + * This should allow old-API PCI drivers to at least function until + * they are updated. It will not help non-PCI drivers. + * + * No drivers should rely on this code. It will be removed asap. + * + */ + +struct nic nic; + +static int legacy_transmit ( struct net_device *netdev, struct pk_buff *pkb ) { + struct nic *nic = netdev->priv; + struct ethhdr *ethhdr = pkb->data; + + pkb_pull ( pkb, sizeof ( *ethhdr ) ); + nic->nic_op->transmit ( nic, ( const char * ) ethhdr->h_dest, + ntohs ( ethhdr->h_protocol ), + pkb_len ( pkb ), pkb->data ); + free_pkb ( pkb ); + return 0; +} + +static void legacy_poll ( struct net_device *netdev ) { + struct nic *nic = netdev->priv; + struct pk_buff *pkb; + + pkb = alloc_pkb ( ETH_FRAME_LEN ); + if ( ! pkb ) + return; + + nic->packet = pkb->data; + if ( nic->nic_op->poll ( nic, 1 ) ) { + pkb_put ( pkb, nic->packetlen ); + netdev_rx ( netdev, pkb ); + } else { + free_pkb ( pkb ); + } +} + +int legacy_probe ( struct pci_device *pci, + const struct pci_device_id *id __unused, + int ( * probe ) ( struct nic *nic, + struct pci_device *pci ), + void ( * disable ) ( struct nic *nic ) ) { + struct net_device *netdev; + int rc; + + netdev = alloc_etherdev ( 0 ); + if ( ! netdev ) + return -ENOMEM; + netdev->priv = &nic; + memset ( &nic, 0, sizeof ( nic ) ); + pci_set_drvdata ( pci, netdev ); + + netdev->transmit = legacy_transmit; + netdev->poll = legacy_poll; + nic.node_addr = netdev->ll_addr; + + if ( ! probe ( &nic, pci ) ) { + free_netdev ( netdev ); + return -ENODEV; + } + + if ( ( rc = register_netdev ( netdev ) ) != 0 ) { + disable ( &nic ); + free_netdev ( netdev ); + return rc; + } + + return 0; +} + +void legacy_remove ( struct pci_device *pci, + void ( * disable ) ( struct nic *nic ) ) { + struct net_device *netdev = pci_get_drvdata ( pci ); + struct nic *nic = netdev->priv; + + unregister_netdev ( netdev ); + disable ( nic ); + free_netdev ( netdev ); +} + +void pci_fill_nic ( struct nic *nic, struct pci_device *pci ) { + nic->ioaddr = pci->ioaddr; + nic->irqno = pci->irq; +} + +int dummy_connect ( struct nic *nic __unused ) { + return 1; +} + +void dummy_irq ( struct nic *nic __unused, irq_action_t irq_action __unused ) { + return; +} diff --git a/src/drivers/net/natsemi.c b/src/drivers/net/natsemi.c index c34d611f..b40fb131 100644 --- a/src/drivers/net/natsemi.c +++ b/src/drivers/net/natsemi.c @@ -175,7 +175,6 @@ enum desc_status_bits { /* Globals */ static struct nic_operations natsemi_operations; -static struct pci_driver natsemi_driver; static int natsemi_debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ diff --git a/src/drivers/net/pcnet32.c b/src/drivers/net/pcnet32.c index 51efe39e..c0345bcd 100644 --- a/src/drivers/net/pcnet32.c +++ b/src/drivers/net/pcnet32.c @@ -56,7 +56,6 @@ static u32 ioaddr; /* Globally used for the card's io address */ static struct nic_operations pcnet32_operations; -static struct pci_driver pcnet32_driver; #ifdef EDEBUG #define dprintf(x) printf x diff --git a/src/drivers/net/sis900.c b/src/drivers/net/sis900.c index c6b53d81..8040ddd5 100644 --- a/src/drivers/net/sis900.c +++ b/src/drivers/net/sis900.c @@ -47,6 +47,7 @@ #include "nic.h" #include #include "timer.h" +#include "dev.h" #include "sis900.h" diff --git a/src/drivers/net/sundance.c b/src/drivers/net/sundance.c index d3cb7506..01b27d36 100644 --- a/src/drivers/net/sundance.c +++ b/src/drivers/net/sundance.c @@ -572,7 +572,6 @@ static struct nic_operations sundance_operations = { .irq = sundance_irq, }; -static struct pci_driver sundance_driver; /************************************************************************** PROBE - Look for an adapter, this routine's visible to the outside diff --git a/src/drivers/net/tlan.c b/src/drivers/net/tlan.c index bebc07a9..cc97423e 100644 --- a/src/drivers/net/tlan.c +++ b/src/drivers/net/tlan.c @@ -65,8 +65,6 @@ #define dprintf(x) #endif -static struct pci_driver tlan_driver; - static void TLan_ResetLists(struct nic *nic __unused); static void TLan_ResetAdapter(struct nic *nic __unused); static void TLan_FinishReset(struct nic *nic __unused); diff --git a/src/drivers/net/via-rhine.c b/src/drivers/net/via-rhine.c index ca3212ad..b72c13bb 100644 --- a/src/drivers/net/via-rhine.c +++ b/src/drivers/net/via-rhine.c @@ -957,7 +957,6 @@ void rhine_irq ( struct nic *nic, irq_action_t action ) { } static struct nic_operations rhine_operations; -static struct pci_driver rhine_driver; static int rhine_probe ( struct nic *nic, struct pci_device *pci ) { diff --git a/src/include/nic.h b/src/include/nic.h index 7b12c5be..d1e2b77b 100644 --- a/src/include/nic.h +++ b/src/include/nic.h @@ -8,8 +8,8 @@ #ifndef NIC_H #define NIC_H -#include "dev.h" -#include "byteswap.h" +#include +#include #include "dhcp.h" typedef enum { @@ -49,27 +49,8 @@ struct nic_operations { void ( *irq ) ( struct nic *, irq_action_t ); }; -extern struct type_driver nic_driver; - -/* - * Function prototypes - * - */ -extern int dummy_connect ( struct nic *nic ); -extern void dummy_irq ( struct nic *nic, irq_action_t irq_action ); -extern void nic_disable ( struct nic *nic ); - -/* - * Functions that implicitly operate on the current boot device - * - */ - extern struct nic nic; -static inline int eth_connect ( void ) { - return nic.nic_op->connect ( &nic ); -} - static inline int eth_poll ( int retrieve ) { return nic.nic_op->poll ( &nic, retrieve ); } @@ -79,11 +60,40 @@ static inline void eth_transmit ( const char *dest, unsigned int type, nic.nic_op->transmit ( &nic, dest, type, size, packet ); } -static inline void eth_irq ( irq_action_t action ) { - nic.nic_op->irq ( &nic, action ); -} +/* + * Function prototypes + * + */ +extern int dummy_connect ( struct nic *nic ); +extern void dummy_irq ( struct nic *nic, irq_action_t irq_action ); +extern int legacy_probe ( struct pci_device *pci, + const struct pci_device_id *id, + int ( * probe ) ( struct nic *nic, + struct pci_device *pci ), + void ( * disable ) ( struct nic *nic ) ); +extern void legacy_remove ( struct pci_device *pci, + void ( * disable ) ( struct nic *nic ) ); +extern void pci_fill_nic ( struct nic *nic, struct pci_device *pci ); -/* Should be using disable() rather than eth_disable() */ -extern void eth_disable ( void ) __attribute__ (( deprecated )); +#define PCI_DRIVER(_name,_ids,_class) \ + static int _name ## _legacy_probe ( struct pci_device *pci, \ + const struct pci_device_id *id ); \ + static void _name ## _legacy_remove ( struct pci_device *pci ); \ + struct pci_driver _name __pci_driver = { \ + .ids = _ids, \ + .id_count = sizeof ( _ids ) / sizeof ( _ids[0] ), \ + .probe = _name ## _legacy_probe, \ + .remove = _name ## _legacy_remove, \ + }; + +#undef DRIVER +#define DRIVER(_unused1,_unused2,_unused3,_name,_probe,_disable) \ + static int _name ## _legacy_probe ( struct pci_device *pci, \ + const struct pci_device_id *id ) {\ + return legacy_probe ( pci, id, _probe, _disable ); \ + } \ + static void _name ## _legacy_remove ( struct pci_device *pci ) {\ + return legacy_remove ( pci, _disable ); \ + } #endif /* NIC_H */