I am making a driver for a VERY old PCI device.

I decided to try using the new 'bus_resource' facilities,  and came up
with the oddest error.

First, here is my 'probe' routine:

> static int
> digic_probe(device_t dev)
> {
>       static struct digic_type *t;
>       int vendor = pci_get_vendor(dev);
>       int did = pci_get_device(dev);
>       DPRINTF(("myprobe: vendor 0x%x, device 0x%x\n",
>               vendor, did ));
>       for( t = digic_devs; t->vid; ++t ){
>               if( (t->vid == vendor) && (t->did == did) ){
>                       DPRINTF(("found '%s'\n", t->name );
>                       device_set_desc(dev,t->name));
>                       return(0);
>               }
>       }
>       return( ENXIO );
> }

And here is the output it puts out (from dmesg):

> Copyright (c) 1992-2000 The FreeBSD Project.
> ....
> myprobe: vendor 0x1106, device 0x597
> pcib2: <VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
> pci1: <PCI bus> on pcib2
> myprobe: vendor 0x1002, device 0x4742

Yes it is seeing things...
> pci1: <ATI Mach64-GB graphics accelerator> at 0.0 irq 11
> isab0: <VIA 82C596B PCI-ISA bridge> at device 7.0 on pci0
> isa0: <ISA bus> on isab0
....

> found 'Digi International PCI Classic 8 Serial Adapter'
> my0: <Digi International PCI Classic 8 Serial Adapter> \
   port 0xdc00-0xdcff,0xd800-0xd87f mem 0xea400000-0xea4000ff,0xea402000-0xea40207f \
    irq 12 at device 10.0 on pci0
> digic_attach: unit 0, irq 12, slot 10, progif 0x0, iobase 0xd801, membase 
>0xea402000, irqline 0x10c
> my0: couldn't map memory
> device_probe_and_attach: my0 attach returned 6

So it found the card, discovered the vintage hardware id, and printed it out.
The we call the attach routine:

> static int
> digic_attach( device_t dev )
> {
>       struct digic_softc *digic;
>       int unit;
>       int irq, slot, progif, iobase, membase, irqline;
>       int error = 0;
>       void *ih = 0;
> 
>       /* get the sc structure */
>       digic = device_get_softc(dev);
>       bzero(digic,sizeof(digic[0]));
>       unit = device_get_unit(dev);
>       irq = pci_get_irq(dev);
>       slot = pci_get_slot(dev);
>       progif = pci_get_progif(dev);
> 
> #define WB_PCI_LOMEM  0x10
> #define WB_PCI_LOIO   0x14
> #define WB_PCI_INTLINE        0x3c
>       iobase = pci_read_config(dev, WB_PCI_LOIO, 4);
>       membase = pci_read_config(dev, WB_PCI_LOMEM, 4);
>       irqline = pci_read_config(dev, WB_PCI_INTLINE, 4);
> 
>       DPRINTF(("digic_attach: unit %d, irq %d, slot %d, progif 0x%x, iobase 0x%x, 
>membase 0x%x, irqline 0x%x\n",
>               unit, irq, slot, progif, iobase, membase, irqline ));
> 
>       
>       switch( pci_get_device(dev) ){
>               case PCI_CLASSIC_4: digic->digic_ports = 4; break;
>               case PCI_CLASSIC_8: digic->digic_ports = 8; break;
>               default:
>                       device_printf(dev,"digic_attach: bad device id! %d", 
>pci_get_device(dev));
>                       goto fail;
>       }
> 
>       /* now get the memory resources */
>       digic->digic_mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
>                                           &digic->digic_mem_rid,
>                                           0, ~0, 256, RF_ACTIVE|RF_SHAREABLE);
>       if (!digic->digic_mem_res) {
>               device_printf(dev, "couldn't map memory\n");
>               goto fail;
>       }

Now, I am SURE that I must be doing something stupid here - but I snipped this code
right out of the code for another driver,  and this one works.

The only puzzle is:
> my0: <Digi International PCI Classic 8 Serial Adapter> \
   port 0xdc00-0xdcff,0xd800-0xd87f mem 0xea400000-0xea4000ff,0xea402000-0xea40207f \
    irq 12 at device 10.0 on pci0

Note that the diagnostic output indicates some VERY strange ranges.
Could this be the problem?

Patrick Powell


Patrick Powell                 Astart Technologies,
[EMAIL PROTECTED]            9475 Chesapeake Drive, Suite D,
Network and System             San Diego, CA 92123
  Consulting                   858-874-6543 FAX 858-279-8424 
LPRng - Print Spooler (http://www.astart.com)


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to