Able to at least compile again now.
authorMichael Brown <mcb30@etherboot.org>
Tue, 12 Apr 2005 19:11:42 +0000 (19:11 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 12 Apr 2005 19:11:42 +0000 (19:11 +0000)
src/arch/i386/drivers/net/undi.c

index 6b83089..0bc0d23 100644 (file)
@@ -61,7 +61,6 @@ static undi_t undi = {
        .started          = 0, 
        .initialized      = 0, 
        .opened           = 0,
-       .pci              = { 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, NULL },
        .irq              = IRQ_NONE 
 };
 
@@ -302,7 +301,7 @@ static int hunt_rom ( void ) {
        /* If we are not a PCI device, we cannot search for a ROM that
         * matches us (?)
         */
-       if ( ! undi.pci.vendor )
+       if ( ! undi.pci->vendor )
                return 0;
 
        printf ( "Hunting for ROMs..." );
@@ -327,11 +326,11 @@ static int hunt_rom ( void ) {
                        }
                        printf ( "PCI:%hx:%hx...", pcir_header->vendor_id,
                                 pcir_header->device_id );
-                       if ( ( pcir_header->vendor_id != undi.pci.vendor ) ||
-                            ( pcir_header->device_id != undi.pci.dev_id ) ) {
+                       if ( ( pcir_header->vendor_id != undi.pci->vendor ) ||
+                            ( pcir_header->device_id != undi.pci->dev_id ) ) {
                                printf ( "not me (%hx:%hx)\n...",
-                                        undi.pci.vendor,
-                                        undi.pci.dev_id );
+                                        undi.pci->vendor,
+                                        undi.pci->dev_id );
                                continue;
                        }
                        if ( undi.rom->pnp_off == 0 ) {
@@ -661,13 +660,13 @@ static void nontrivial_irq_debug ( irq_t irq ) {
 static int undi_loader ( void ) {
        pxe_t *pxe = NULL;
 
-       if ( ! undi.pci.vendor ) {
+       if ( ! undi.pci->vendor ) {
                printf ( "ERROR: attempted to call loader of an ISA ROM?\n" );
                return 0;
        }
 
        /* AX contains PCI bus:devfn (PCI specification) */
-       undi.pxs->loader.ax = ( undi.pci.bus << 8 ) | undi.pci.devfn;
+       undi.pxs->loader.ax = ( undi.pci->busdevfn );
        /* BX and DX set to 0xffff for non-ISAPnP devices
         * (BIOS boot specification)
         */
@@ -735,7 +734,7 @@ static int eb_pxenv_start_undi ( void ) {
        int success = 0;
 
        /* AX contains PCI bus:devfn (PCI specification) */
-       undi.pxs->start_undi.ax = ( undi.pci.bus << 8 ) | undi.pci.devfn;
+       undi.pxs->start_undi.ax = undi.pci->busdevfn;
 
        /* BX and DX set to 0xffff for non-ISAPnP devices
         * (BIOS boot specification)
@@ -1331,7 +1330,7 @@ static void undi_transmit(
 /**************************************************************************
 DISABLE - Turn off ethernet interface
 ***************************************************************************/
-static void undi_disable ( struct dev *dev __unused ) {
+static void undi_disable ( struct nic *nic __unused ) {
        undi_full_shutdown();
        free_base_mem_data();
 }
@@ -1364,22 +1363,44 @@ static int hunt_pixies_and_undi_roms ( void ) {
        return 0;
 }
 
+/* UNDI driver states that it is suitable for any PCI NIC (i.e. any
+ * PCI device of class PCI_CLASS_NETWORK_ETHERNET).  If there are any
+ * obscure UNDI NICs that have the incorrect PCI class, add them to
+ * this list.
+ */
+static struct pci_id undi_nics[] = {
+       PCI_ROM ( 0x0000, 0x0000, "undi", "UNDI driver support" ),
+};
+
+static struct pci_driver undi_driver =
+       PCI_DRIVER ( "UNDI", undi_nics, PCI_CLASS_NETWORK_ETHERNET );
+
+static struct nic_operations undi_operations = {
+       .connect = dummy_connect,
+       .poll = undi_poll,
+       .transmit = undi_transmit,
+       .irq = dummy_irq,
+       .disable = undi_disable,
+};
+
 /* The actual Etherboot probe routine.
  */
 
-static int undi_probe(struct dev *dev, struct pci_device *pci)
-{
-       struct nic *nic = (struct nic *)dev;
+static int undi_probe ( struct dev *dev ) {
+       struct nic *nic = nic_device ( dev );
+       struct pci_device *pci = pci_device ( dev );
 
        /* Zero out global undi structure */
        memset ( &undi, 0, sizeof(undi) );
 
+       /* Scan PCI bus for a suitable device */
+       if ( ! find_pci_device ( pci, &undi_driver ) )
+               return 0;
+
        /* Store PCI parameters; we will need them to initialize the
         * UNDI driver later.  If not a PCI device, leave as 0.
         */
-       if ( pci ) {
-               memcpy ( &undi.pci, pci, sizeof(undi.pci) );
-       }
+       undi.pci = pci;
 
        /* Find the BIOS' $PnP structure */
        if ( ! hunt_pnp_bios() ) {
@@ -1425,44 +1446,14 @@ static int undi_probe(struct dev *dev, struct pci_device *pci)
                printf ( "NDIS type %s interface at %d Mbps\n",
                         undi.pxs->undi_get_iface_info.IfaceType,
                         undi.pxs->undi_get_iface_info.LinkSpeed / 1000000 );
-               dev->disable  = undi_disable;
-               nic->poll     = undi_poll;
-               nic->transmit = undi_transmit;
+
+               nic->nic_op = &undi_operations;
                return 1;
        }
-       undi_disable ( dev ); /* To free base memory structures */
+       undi_disable ( nic ); /* To free base memory structures */
        return 0;
 }
 
-static int undi_isa_probe ( struct dev *dev,
-                           unsigned short *probe_addrs __unused ) {
-       return undi_probe ( dev, NULL );
-}
-
-
-/* UNDI driver states that it is suitable for any PCI NIC (i.e. any
- * PCI device of class PCI_CLASS_NETWORK_ETHERNET).  If there are any
- * obscure UNDI NICs that have the incorrect PCI class, add them to
- * this list.
- */
-static struct pci_id undi_nics[] = {
-       PCI_ROM(0x0000, 0x0000, "undi", "UNDI driver support"),
-};
-
-static struct pci_driver undi_driver __pci_driver = {
-       .type     = NIC_DRIVER,
-       .name     = "UNDI",
-       .probe    = undi_probe,
-       .ids      = undi_nics,
-       .id_count = sizeof(undi_nics)/sizeof(undi_nics[0]),
-       .class    = PCI_CLASS_NETWORK_ETHERNET,
-};
-
-static struct isa_driver undi_isa_driver __isa_driver = {
-       .type     = NIC_DRIVER,
-       .name     = "UNDI",
-       .probe    = undi_isa_probe,
-       .ioaddrs  = 0,
-};
+BOOT_DRIVER ( "UNDI", undi_probe );
 
 #endif /* PCBIOS */