--- tms380tr.c.orig Tue Nov 2 20:07:08 1999 +++ tms380tr.c Tue Nov 9 16:33:40 1999 @@ -226,10 +226,25 @@ else if(base_addr != 0) /* Don't probe at all. */ return (-ENXIO); + /* + * Let's check for pci adapters first + */ + +/* for (i=0; i < TMS380TR_MAX_ADAPTERS; i++) Not enough for pci, could be other tr cards in the box */ + for (i=0; i < 8; i++) { + if (tms380tr_probe1(dev,0) == 0) { /* Success */ + return 0 ; + } + } + + /* + * No pci cards found, let's check for isa + */ + for(i = 0; tms380tr_portlist[i]; i++) { int ioaddr = tms380tr_portlist[i]; - if(check_region(ioaddr, TMS380TR_IO_EXTENT)) + if(check_region(ioaddr, TMS380TR_IO_EXTENT)) /* Region already used */ continue; if(tms380tr_probe1(dev, ioaddr)) { @@ -248,7 +263,6 @@ unsigned short device) { int cur; - for (cur = 1; cardinfo[cur].name != NULL; cur++) { if (cardinfo[cur].type == 2) /* PCI */ { @@ -266,65 +280,39 @@ static int __init tms380tr_pci_chk_card(struct net_device *dev, struct cardinfo_table **outcard) { - static int pci_index = 0; - unsigned char pci_bus, pci_device_fn; + struct pci_dev *pci_device = NULL ; struct cardinfo_table *card; int i; if(!pci_present()) return (-1); /* No PCI present. */ + + while ( (pci_device=pci_find_class(PCI_CLASS_NETWORK_TOKEN_RING<<8, pci_device))) { - for(; pci_index < 0xff; pci_index++) - { unsigned int pci_irq_line; - struct pci_dev *pdev; - unsigned short pci_command, new_command, vendor, device; unsigned int pci_ioaddr; - if(pcibios_find_class(PCI_CLASS_NETWORK_TOKEN_RING << 8, - pci_index, &pci_bus, &pci_device_fn) - != PCIBIOS_SUCCESSFUL) - { - break; - } - - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_VENDOR_ID, &vendor); - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_DEVICE_ID, &device); - - pdev = pci_find_slot(pci_bus, pci_device_fn); - pci_irq_line = pdev->irq; - pci_ioaddr = pdev->resource[0].start; - - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - /* Remove I/O space marker in bit 0. */ - pci_ioaddr &= ~3; + pci_irq_line = pci_device->irq ; + pci_ioaddr = pci_device->resource[0].start ; +/* pci_ioaddr &= ~3; */ + + /* Don't return from here, just continue on the card discovery loop - MLP */ + if (!(card = tms380tr_pci_getcardinfo(pci_device->vendor, pci_device->device))) + continue ; - if (!(card = tms380tr_pci_getcardinfo(vendor, device))) - return -ENODEV; - if(check_region(pci_ioaddr, TMS380TR_IO_EXTENT)) continue; + request_region(pci_ioaddr, TMS380TR_IO_EXTENT, card->name); - if(request_irq(pdev->irq, tms380tr_interrupt, SA_SHIRQ, - card->name, dev)) + if(request_irq(pci_device->irq, tms380tr_interrupt, SA_SHIRQ, + card->name, dev)) { + release_region(pci_ioaddr, TMS380TR_IO_EXTENT) ; return (-ENODEV); /* continue; ?? */ - - new_command = (pci_command|PCI_COMMAND_MASTER|PCI_COMMAND_IO); - - if(pci_command != new_command) - { - printk("The PCI BIOS has not enabled this" - "device! Updating PCI command %4.4x->%4.4x.\n", - pci_command, new_command); - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, new_command); } + /* At this point we have found a valid tms380tr PCI TR card. */ - /* At this point we have found a valid PCI TR card. */ + pci_ioaddr &= ~3 ; dev->base_addr = pci_ioaddr; dev->irq = pci_irq_line; dev->dma = 0; @@ -342,10 +330,10 @@ if (outcard) *outcard = card; - return (0); + return 0 ; } - return (-1); + return (-1); } /* @@ -448,6 +436,10 @@ return (0); } +/* + * Passing an ioaddr of 0 tells us to do a pci card search + */ + static int __init tms380tr_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed = 0; @@ -463,14 +455,13 @@ if(dev == NULL) return (-ENOMEM); #endif - - err = tms380tr_pci_chk_card(dev, &card); - if(err < 0) - { + if (ioaddr == 0) { + err = tms380tr_pci_chk_card(dev, &card); + } else { err = tms380tr_isa_chk_card(dev, ioaddr, &card); - if(err < 0) - return (-ENODEV); } + if(err < 0) + return (-ENODEV); /* Setup this devices private information structure */ tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA); @@ -484,10 +475,10 @@ dev->init = tms380tr_init_card; dev->open = tms380tr_open; dev->stop = tms380tr_close; + dev->do_ioctl = NULL ; dev->hard_start_xmit = tms380tr_send_packet; dev->get_stats = tms380tr_get_stats; dev->set_multicast_list = &tms380tr_set_multicast_list; - return (0); } @@ -568,6 +559,7 @@ printk(KERN_INFO "%s: Adapter RAM size: %dK\n", dev->name, tms380tr_read_ptr(dev)); + tms380tr_enable_interrupts(dev); tms380tr_open_adapter(dev); @@ -664,15 +656,12 @@ if((Tmp & ~CYCLE_TIME) != (PosReg & ~CYCLE_TIME)) printk(KERN_INFO "%s: POSREG error\n", dev->name); } - err = tms380tr_reset_adapter(dev); if(err < 0) return (-1); - err = tms380tr_bringup_diags(dev); if(err < 0) return (-1); - err = tms380tr_init_adapter(dev); if(err < 0) return (-1); @@ -1461,7 +1450,6 @@ static int tms380tr_close(struct net_device *dev) { struct net_local *tp = (struct net_local *)dev->priv; - dev->tbusy = 1; dev->start = 0; @@ -2259,8 +2247,7 @@ ADAPTER_INT_PTRS, 16); tms380tr_read_ram(dev, (unsigned char *)&adapterram, (unsigned short)SWAPB(tp->intptrs.AdapterRAMPtr), 2); - - return SWAPB(adapterram); + return SWAPB(adapterram); } /* @@ -2722,7 +2709,8 @@ } else return (0); - } + } + } return (0);