Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Jul 1997 16:35:22 -0700 (PDT)
From:      Simon Shapiro <Shimon@i-Connect.Net>
To:        Stefan Esser <se@freebsd.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: pcireg.h lost children... ?
Message-ID:  <XFMail.970717212105.Shimon@i-Connect.Net>
In-Reply-To: <19970716214222.61218@mi.uni-koeln.de>

next in thread | previous in thread | raw e-mail | index | archive | help

Hi Stefan Esser;  On 16-Jul-97 you wrote: 

...  Excellent explanation deleted ...

It did, for a while, break compatability...

> I did not expect drivers to actually care for the class code
> or command register values of a device, since higher level 
> code should take care of things ...
> 
> What are you using those values for ?

In pci/dpt_pci.c:

dpt_pci_probe()
...

  if ((dpt_id = (type & 0xffff0000) >> 16) == DPT_DEVICE_ID) {
    /* This one appears to belong to us, but what is it? */
    class = pci_conf_read(tag, PCI_CLASS_REG);
    if (((class & PCI_CLASS_MASK) == PCI_CLASS_MASS_STORAGE) &&
        ((class & PCI_SUBCLASS_MASK) == PCI_SUBCLASS_MASS_STORAGE_SCSI) ) {
      /* It is a SCSI storage device.  How do talk to it? */
      command = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
      if ( ((command & PCI_COMMAND_MEM_ENABLE) == 0)
           && ((command & PCI_COMMAND_IO_ENABLE) == 0) ) {
        printf("DPT:  Cannot map the controller as memory, nor as I/O :-(\n");
        return(NULL);
      }
    } else {
      printf("DPT:  Device is not Mass Storage, nor SCSI controller :-(\n");
      return(NULL);
    }

    command = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
    if ( (command & PCI_COMMAND_MASTER_ENABLE) == 0 ) {
      printf("DPT:  BUSMASTER disabled :-(\n");
      return (NULL);
    }

And in dpt_pci_attach()
...
  io_base = 0;
  vaddr   = 0;
  paddr   = 0;
  data = pci_conf_read(config_id, PCI_BASEADR0);

  command = pci_conf_read(config_id, PCI_COMMAND_STATUS_REG);
  if ( ((command & PCI_COMMAND_MEM_ENABLE) == 0)
       || (pci_map_mem(config_id, PCI_BASEADR0, &vaddr, &paddr) == 0) ) {
    /* Either not memory mappable or mapping failed.  Try I/O mapping */
    if ((command & PCI_COMMAND_IO_ENABLE) == 0
        || (pci_map_port(config_id, PCI_BASEADR0, &io_base) == 0) ) {
      free(dpt, M_DEVBUF);
      printf ("dpt%d: Failed to map memory or I/O registers :-(\n", unit);
      return;
    }
  }

Makes sense?

Simon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.970717212105.Shimon>