The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/aac/aac_pci.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2000 Michael Smith
    3  * Copyright (c) 2001 Scott Long
    4  * Copyright (c) 2000 BSDi
    5  * Copyright (c) 2001 Adaptec, Inc.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  */
   29 
   30 #include <sys/cdefs.h>
   31 __FBSDID("$FreeBSD: releng/8.4/sys/dev/aac/aac_pci.c 233033 2012-03-16 13:46:54Z emaste $");
   32 
   33 /*
   34  * PCI bus interface and resource allocation.
   35  */
   36 
   37 #include "opt_aac.h"
   38 
   39 #include <sys/param.h>
   40 #include <sys/systm.h>
   41 #include <sys/kernel.h>
   42 #include <sys/module.h>
   43 
   44 #include <sys/bio.h>
   45 #include <sys/bus.h>
   46 #include <sys/conf.h>
   47 #include <sys/disk.h>
   48 
   49 #include <machine/bus.h>
   50 #include <machine/resource.h>
   51 #include <sys/rman.h>
   52 
   53 #include <dev/pci/pcireg.h>
   54 #include <dev/pci/pcivar.h>
   55 
   56 #include <dev/aac/aacreg.h>
   57 #include <sys/aac_ioctl.h>
   58 #include <dev/aac/aacvar.h>
   59 
   60 static int      aac_pci_probe(device_t dev);
   61 static int      aac_pci_attach(device_t dev);
   62 
   63 static device_method_t aac_methods[] = {
   64         /* Device interface */
   65         DEVMETHOD(device_probe,         aac_pci_probe),
   66         DEVMETHOD(device_attach,        aac_pci_attach),
   67         DEVMETHOD(device_detach,        aac_detach),
   68         DEVMETHOD(device_suspend,       aac_suspend),
   69         DEVMETHOD(device_resume,        aac_resume),
   70 
   71         DEVMETHOD_END
   72 };
   73 
   74 static driver_t aac_pci_driver = {
   75         "aac",
   76         aac_methods,
   77         sizeof(struct aac_softc)
   78 };
   79 
   80 static devclass_t       aac_devclass;
   81 
   82 DRIVER_MODULE(aac, pci, aac_pci_driver, aac_devclass, 0, 0);
   83 MODULE_DEPEND(aac, pci, 1, 1, 1);
   84 
   85 
   86 struct aac_ident
   87 {
   88         u_int16_t               vendor;
   89         u_int16_t               device;
   90         u_int16_t               subvendor;
   91         u_int16_t               subdevice;
   92         int                     hwif;
   93         int                     quirks;
   94         char                    *desc;
   95 } aac_identifiers[] = {
   96         {0x1028, 0x0001, 0x1028, 0x0001, AAC_HWIF_I960RX, 0,
   97         "Dell PERC 2/Si"},
   98         {0x1028, 0x0002, 0x1028, 0x0002, AAC_HWIF_I960RX, 0,
   99         "Dell PERC 3/Di"},
  100         {0x1028, 0x0003, 0x1028, 0x0003, AAC_HWIF_I960RX, 0,
  101         "Dell PERC 3/Si"},
  102         {0x1028, 0x0004, 0x1028, 0x00d0, AAC_HWIF_I960RX, 0,
  103         "Dell PERC 3/Si"},
  104         {0x1028, 0x0002, 0x1028, 0x00d1, AAC_HWIF_I960RX, 0,
  105         "Dell PERC 3/Di"},
  106         {0x1028, 0x0002, 0x1028, 0x00d9, AAC_HWIF_I960RX, 0,
  107         "Dell PERC 3/Di"},
  108         {0x1028, 0x000a, 0x1028, 0x0106, AAC_HWIF_I960RX, 0,
  109         "Dell PERC 3/Di"},
  110         {0x1028, 0x000a, 0x1028, 0x011b, AAC_HWIF_I960RX, 0,
  111         "Dell PERC 3/Di"},
  112         {0x1028, 0x000a, 0x1028, 0x0121, AAC_HWIF_I960RX, 0,
  113         "Dell PERC 3/Di"},
  114         {0x1011, 0x0046, 0x9005, 0x0364, AAC_HWIF_STRONGARM, 0,
  115         "Adaptec AAC-364"},
  116         {0x1011, 0x0046, 0x9005, 0x0365, AAC_HWIF_STRONGARM,
  117          AAC_FLAGS_BROKEN_MEMMAP, "Adaptec SCSI RAID 5400S"},
  118         {0x1011, 0x0046, 0x9005, 0x1364, AAC_HWIF_STRONGARM, AAC_FLAGS_PERC2QC,
  119          "Dell PERC 2/QC"},
  120         {0x1011, 0x0046, 0x103c, 0x10c2, AAC_HWIF_STRONGARM, 0,
  121          "HP NetRaid-4M"},
  122         {0x9005, 0x0285, 0x9005, 0x0285, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  123          AAC_FLAGS_256FIBS, "Adaptec SCSI RAID 2200S"},
  124         {0x9005, 0x0285, 0x1028, 0x0287, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  125          AAC_FLAGS_256FIBS, "Dell PERC 320/DC"},
  126         {0x9005, 0x0285, 0x9005, 0x0286, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  127          AAC_FLAGS_256FIBS, "Adaptec SCSI RAID 2120S"},
  128         {0x9005, 0x0285, 0x9005, 0x0290, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB,
  129          "Adaptec SATA RAID 2410SA"},
  130         {0x9005, 0x0285, 0x1028, 0x0291, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB,
  131          "Dell CERC SATA RAID 2"},
  132         {0x9005, 0x0285, 0x9005, 0x0292, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB,
  133          "Adaptec SATA RAID 2810SA"},
  134         {0x9005, 0x0285, 0x9005, 0x0293, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB,
  135          "Adaptec SATA RAID 21610SA"},
  136         {0x9005, 0x0285, 0x103c, 0x3227, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB,
  137          "HP ML110 G2 (Adaptec 2610SA)"},
  138         {0x9005, 0x0286, 0x9005, 0x028c, AAC_HWIF_RKT, 0,
  139          "Adaptec SCSI RAID 2230S"},
  140         {0x9005, 0x0286, 0x9005, 0x028d, AAC_HWIF_RKT, 0,
  141          "Adaptec SCSI RAID 2130S"},
  142 
  143         {0x9005, 0x0285, 0x9005, 0x0287, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  144          AAC_FLAGS_256FIBS, "Adaptec SCSI RAID 2200S"},
  145         {0x9005, 0x0285, 0x17aa, 0x0286, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  146          AAC_FLAGS_256FIBS, "Legend S220"},
  147         {0x9005, 0x0285, 0x17aa, 0x0287, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB |
  148          AAC_FLAGS_256FIBS, "Legend S230"},
  149         {0x9005, 0x0285, 0x9005, 0x0288, AAC_HWIF_I960RX, 0,
  150          "Adaptec SCSI RAID 3230S"},
  151         {0x9005, 0x0285, 0x9005, 0x0289, AAC_HWIF_I960RX, 0,
  152          "Adaptec SCSI RAID 3240S"},
  153         {0x9005, 0x0285, 0x9005, 0x028a, AAC_HWIF_I960RX, 0,
  154          "Adaptec SCSI RAID 2020ZCR"},
  155         {0x9005, 0x0285, 0x9005, 0x028b, AAC_HWIF_I960RX, 0,
  156          "Adaptec SCSI RAID 2025ZCR"},
  157         {0x9005, 0x0286, 0x9005, 0x029b, AAC_HWIF_RKT, 0,
  158          "Adaptec SATA RAID 2820SA"},
  159         {0x9005, 0x0286, 0x9005, 0x029c, AAC_HWIF_RKT, 0,
  160          "Adaptec SATA RAID 2620SA"},
  161         {0x9005, 0x0286, 0x9005, 0x029d, AAC_HWIF_RKT, 0,
  162          "Adaptec SATA RAID 2420SA"},
  163         {0x9005, 0x0286, 0x9005, 0x029e, AAC_HWIF_RKT, 0,
  164          "ICP ICP9024RO SCSI RAID"},
  165         {0x9005, 0x0286, 0x9005, 0x029f, AAC_HWIF_RKT, 0,
  166          "ICP ICP9014RO SCSI RAID"},
  167         {0x9005, 0x0285, 0x9005, 0x0294, AAC_HWIF_I960RX, 0,
  168          "Adaptec SATA RAID 2026ZCR"},
  169         {0x9005, 0x0285, 0x9005, 0x0296, AAC_HWIF_I960RX, 0,
  170          "Adaptec SCSI RAID 2240S"},
  171         {0x9005, 0x0285, 0x9005, 0x0297, AAC_HWIF_I960RX, 0,
  172          "Adaptec SAS RAID 4005SAS"},
  173         {0x9005, 0x0285, 0x1014, 0x02f2, AAC_HWIF_I960RX, 0,
  174          "IBM ServeRAID 8i"},
  175         {0x9005, 0x0285, 0x1014, 0x0312, AAC_HWIF_I960RX, 0,
  176          "IBM ServeRAID 8i"},
  177         {0x9005, 0x0285, 0x9005, 0x0298, AAC_HWIF_I960RX, 0,
  178          "Adaptec RAID 4000"},
  179         {0x9005, 0x0285, 0x9005, 0x0299, AAC_HWIF_I960RX, 0,
  180          "Adaptec SAS RAID 4800SAS"},
  181         {0x9005, 0x0285, 0x9005, 0x029a, AAC_HWIF_I960RX, 0,
  182          "Adaptec SAS RAID 4805SAS"},
  183         {0x9005, 0x0285, 0x9005, 0x028e, AAC_HWIF_I960RX, 0,
  184          "Adaptec SATA RAID 2020SA ZCR"},
  185         {0x9005, 0x0285, 0x9005, 0x028f, AAC_HWIF_I960RX, 0,
  186          "Adaptec SATA RAID 2025SA ZCR"},
  187         {0x9005, 0x0285, 0x9005, 0x02a4, AAC_HWIF_I960RX, 0,
  188          "ICP ICP9085LI SAS RAID"},
  189         {0x9005, 0x0285, 0x9005, 0x02a5, AAC_HWIF_I960RX, 0,
  190          "ICP ICP5085BR SAS RAID"},
  191         {0x9005, 0x0286, 0x9005, 0x02a0, AAC_HWIF_RKT, 0,
  192          "ICP ICP9047MA SATA RAID"},
  193         {0x9005, 0x0286, 0x9005, 0x02a1, AAC_HWIF_RKT, 0,
  194          "ICP ICP9087MA SATA RAID"},
  195         {0x9005, 0x0286, 0x9005, 0x02a6, AAC_HWIF_RKT, 0,
  196          "ICP9067MA SATA RAID"},
  197         {0x9005, 0x0285, 0x9005, 0x02b5, AAC_HWIF_I960RX, 0,
  198          "Adaptec RAID 5445"},
  199         {0x9005, 0x0285, 0x9005, 0x02b6, AAC_HWIF_I960RX, 0,
  200          "Adaptec RAID 5805"},
  201         {0x9005, 0x0285, 0x9005, 0x02b7, AAC_HWIF_I960RX, 0,
  202          "Adaptec RAID 5085"},
  203         {0x9005, 0x0285, 0x9005, 0x02b8, AAC_HWIF_I960RX, 0,
  204          "ICP RAID ICP5445SL"},
  205         {0x9005, 0x0285, 0x9005, 0x02b9, AAC_HWIF_I960RX, 0,
  206          "ICP RAID ICP5085SL"},
  207         {0x9005, 0x0285, 0x9005, 0x02ba, AAC_HWIF_I960RX, 0,
  208          "ICP RAID ICP5805SL"},
  209         {0x9005, 0x0285, 0x9005, 0x02bb, AAC_HWIF_I960RX, 0,
  210          "Adaptec RAID 3405"},
  211         {0x9005, 0x0285, 0x9005, 0x02bc, AAC_HWIF_I960RX, 0,
  212          "Adaptec RAID 3805"},
  213         {0x9005, 0x0285, 0x9005, 0x02bd, AAC_HWIF_I960RX, 0,
  214          "Adaptec RAID 31205"},
  215         {0x9005, 0x0285, 0x9005, 0x02be, AAC_HWIF_I960RX, 0,
  216          "Adaptec RAID 31605"},
  217         {0x9005, 0x0285, 0x9005, 0x02bf, AAC_HWIF_I960RX, 0,
  218          "ICP RAID ICP5045BL"},
  219         {0x9005, 0x0285, 0x9005, 0x02c0, AAC_HWIF_I960RX, 0,
  220          "ICP RAID ICP5085BL"},
  221         {0x9005, 0x0285, 0x9005, 0x02c1, AAC_HWIF_I960RX, 0,
  222          "ICP RAID ICP5125BR"},
  223         {0x9005, 0x0285, 0x9005, 0x02c2, AAC_HWIF_I960RX, 0,
  224          "ICP RAID ICP5165BR"},
  225         {0x9005, 0x0285, 0x9005, 0x02c3, AAC_HWIF_I960RX, 0,
  226          "Adaptec RAID 51205"},
  227         {0x9005, 0x0285, 0x9005, 0x02c4, AAC_HWIF_I960RX, 0,
  228          "Adaptec RAID 51605"},
  229         {0x9005, 0x0285, 0x9005, 0x02c5, AAC_HWIF_I960RX, 0,
  230          "ICP RAID ICP5125SL"},
  231         {0x9005, 0x0285, 0x9005, 0x02c6, AAC_HWIF_I960RX, 0,
  232          "ICP RAID ICP5165SL"},
  233         {0x9005, 0x0285, 0x9005, 0x02c7, AAC_HWIF_I960RX, 0,
  234          "Adaptec RAID 3085"},
  235         {0x9005, 0x0285, 0x9005, 0x02c8, AAC_HWIF_I960RX, 0,
  236          "ICP RAID ICP5805BL"},
  237         {0x9005, 0x0285, 0x9005, 0x02ce, AAC_HWIF_I960RX, 0,
  238          "Adaptec RAID 51245"},
  239         {0x9005, 0x0285, 0x9005, 0x02cf, AAC_HWIF_I960RX, 0,
  240          "Adaptec RAID 51645"},
  241         {0x9005, 0x0285, 0x9005, 0x02d0, AAC_HWIF_I960RX, 0,
  242          "Adaptec RAID 52445"},
  243         {0x9005, 0x0285, 0x9005, 0x02d1, AAC_HWIF_I960RX, 0,
  244          "Adaptec RAID 5405"},
  245         {0x9005, 0x0285, 0x9005, 0x02d4, AAC_HWIF_I960RX, 0,
  246          "Adaptec RAID 2045"},
  247         {0x9005, 0x0285, 0x9005, 0x02d5, AAC_HWIF_I960RX, 0,
  248          "Adaptec RAID 2405"},
  249         {0x9005, 0x0285, 0x9005, 0x02d6, AAC_HWIF_I960RX, 0,
  250          "Adaptec RAID 2445"},
  251         {0x9005, 0x0285, 0x9005, 0x02d7, AAC_HWIF_I960RX, 0,
  252          "Adaptec RAID 2805"},
  253         {0x9005, 0x0286, 0x1014, 0x9580, AAC_HWIF_RKT, 0,
  254          "IBM ServeRAID-8k"},
  255         {0x9005, 0x0285, 0x1014, 0x034d, AAC_HWIF_I960RX, 0,
  256          "IBM ServeRAID 8s"},
  257         {0x9005, 0x0285, 0x108e, 0x7aac, AAC_HWIF_I960RX, 0,
  258          "Sun STK RAID REM"},
  259         {0x9005, 0x0285, 0x108e, 0x7aae, AAC_HWIF_I960RX, 0,
  260          "Sun STK RAID EM"},
  261         {0x9005, 0x0285, 0x108e, 0x286, AAC_HWIF_I960RX, 0,
  262          "SG-XPCIESAS-R-IN"},
  263         {0x9005, 0x0285, 0x108e, 0x287, AAC_HWIF_I960RX, 0,
  264          "SG-XPCIESAS-R-EX"},
  265         {0x9005, 0x0285, 0x15d9, 0x2b5, AAC_HWIF_I960RX, 0,
  266          "AOC-USAS-S4i"},
  267         {0x9005, 0x0285, 0x15d9, 0x2b6, AAC_HWIF_I960RX, 0,
  268          "AOC-USAS-S8i"},
  269         {0x9005, 0x0285, 0x15d9, 0x2c9, AAC_HWIF_I960RX, 0,
  270          "AOC-USAS-S4iR"},
  271         {0x9005, 0x0285, 0x15d9, 0x2ca, AAC_HWIF_I960RX, 0,
  272          "AOC-USAS-S8iR"},
  273         {0x9005, 0x0285, 0x15d9, 0x2d2, AAC_HWIF_I960RX, 0,
  274          "AOC-USAS-S8i-LP"},
  275         {0x9005, 0x0285, 0x15d9, 0x2d3, AAC_HWIF_I960RX, 0,
  276          "AOC-USAS-S8iR-LP"},
  277         {0, 0, 0, 0, 0, 0, 0}
  278 };
  279 struct aac_ident
  280 aac_family_identifiers[] = {
  281         {0x9005, 0x0285, 0, 0, AAC_HWIF_I960RX, 0,
  282          "Adaptec RAID Controller"},
  283         {0x9005, 0x0286, 0, 0, AAC_HWIF_RKT, 0,
  284          "Adaptec RAID Controller"},
  285         {0, 0, 0, 0, 0, 0, 0}
  286 };
  287 
  288 static struct aac_ident *
  289 aac_find_ident(device_t dev)
  290 {
  291         struct aac_ident *m;
  292         u_int16_t vendid, devid, sub_vendid, sub_devid;
  293 
  294         vendid = pci_get_vendor(dev);
  295         devid = pci_get_device(dev);
  296         sub_vendid = pci_get_subvendor(dev);
  297         sub_devid = pci_get_subdevice(dev);
  298 
  299         for (m = aac_identifiers; m->vendor != 0; m++) {
  300                 if ((m->vendor == vendid) && (m->device == devid) &&
  301                     (m->subvendor == sub_vendid) &&
  302                     (m->subdevice == sub_devid))
  303                         return (m);
  304         }
  305 
  306         for (m = aac_family_identifiers; m->vendor != 0; m++) {
  307                 if ((m->vendor == vendid) && (m->device == devid))
  308                         return (m);
  309         }
  310 
  311         return (NULL);
  312 }
  313 
  314 /*
  315  * Determine whether this is one of our supported adapters.
  316  */
  317 static int
  318 aac_pci_probe(device_t dev)
  319 {
  320         struct aac_ident *id;
  321 
  322         fwprintf(NULL, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
  323 
  324         if ((id = aac_find_ident(dev)) != NULL) {
  325                 device_set_desc(dev, id->desc);
  326                 return(BUS_PROBE_DEFAULT);
  327         }
  328         return(ENXIO);
  329 }
  330 
  331 /*
  332  * Allocate resources for our device, set up the bus interface.
  333  */
  334 static int
  335 aac_pci_attach(device_t dev)
  336 {
  337         struct aac_softc *sc;
  338         struct aac_ident *id;
  339         int error;
  340         u_int32_t command;
  341 
  342         fwprintf(NULL, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
  343 
  344         /*
  345          * Initialise softc.
  346          */
  347         sc = device_get_softc(dev);
  348         bzero(sc, sizeof(*sc));
  349         sc->aac_dev = dev;
  350 
  351         /* assume failure is 'not configured' */
  352         error = ENXIO;
  353 
  354         /*
  355          * Verify that the adapter is correctly set up in PCI space.
  356          */
  357         command = pci_read_config(sc->aac_dev, PCIR_COMMAND, 2);
  358         command |= PCIM_CMD_BUSMASTEREN;
  359         pci_write_config(dev, PCIR_COMMAND, command, 2);
  360         command = pci_read_config(sc->aac_dev, PCIR_COMMAND, 2);
  361         if (!(command & PCIM_CMD_BUSMASTEREN)) {
  362                 device_printf(sc->aac_dev, "can't enable bus-master feature\n");
  363                 goto out;
  364         }
  365         if ((command & PCIM_CMD_MEMEN) == 0) {
  366                 device_printf(sc->aac_dev, "memory window not available\n");
  367                 goto out;
  368         }
  369 
  370         /*
  371          * Allocate the PCI register window.
  372          */
  373         sc->aac_regs_rid0 = PCIR_BAR(0);
  374         if ((sc->aac_regs_res0 = bus_alloc_resource_any(sc->aac_dev,
  375             SYS_RES_MEMORY, &sc->aac_regs_rid0, RF_ACTIVE)) == NULL) {
  376                 device_printf(sc->aac_dev,
  377                     "couldn't allocate register window 0\n");
  378                 goto out;
  379         }
  380         sc->aac_btag0 = rman_get_bustag(sc->aac_regs_res0);
  381         sc->aac_bhandle0 = rman_get_bushandle(sc->aac_regs_res0);
  382 
  383         if (sc->aac_hwif == AAC_HWIF_NARK) {
  384                 sc->aac_regs_rid1 = PCIR_BAR(1);
  385                 if ((sc->aac_regs_res1 = bus_alloc_resource_any(sc->aac_dev,
  386                     SYS_RES_MEMORY, &sc->aac_regs_rid1, RF_ACTIVE)) == NULL) {
  387                         device_printf(sc->aac_dev,
  388                             "couldn't allocate register window 1\n");
  389                         goto out;
  390                 }
  391                 sc->aac_btag1 = rman_get_bustag(sc->aac_regs_res1);
  392                 sc->aac_bhandle1 = rman_get_bushandle(sc->aac_regs_res1);
  393         } else {
  394                 sc->aac_regs_res1 = sc->aac_regs_res0;
  395                 sc->aac_regs_rid1 = sc->aac_regs_rid0;
  396                 sc->aac_btag1 = sc->aac_btag0;
  397                 sc->aac_bhandle1 = sc->aac_bhandle0;
  398         }
  399 
  400         /*
  401          * Allocate the parent bus DMA tag appropriate for our PCI interface.
  402          *
  403          * Note that some of these controllers are 64-bit capable.
  404          */
  405         if (bus_dma_tag_create(bus_get_dma_tag(sc->aac_dev), /* parent */
  406                                PAGE_SIZE, 0,            /* algnmnt, boundary */
  407                                BUS_SPACE_MAXADDR,       /* lowaddr */
  408                                BUS_SPACE_MAXADDR,       /* highaddr */
  409                                NULL, NULL,              /* filter, filterarg */
  410                                BUS_SPACE_MAXSIZE_32BIT, /* maxsize */
  411                                BUS_SPACE_UNRESTRICTED,  /* nsegments */
  412                                BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */
  413                                0,                       /* flags */
  414                                NULL, NULL,              /* No locking needed */
  415                                &sc->aac_parent_dmat)) {
  416                 device_printf(sc->aac_dev, "can't allocate parent DMA tag\n");
  417                 goto out;
  418         }
  419 
  420         /*
  421          * Detect the hardware interface version, set up the bus interface
  422          * indirection.
  423          */
  424         id = aac_find_ident(dev);
  425         sc->aac_hwif = id->hwif;
  426         switch(sc->aac_hwif) {
  427         case AAC_HWIF_I960RX:
  428         case AAC_HWIF_NARK:
  429                 fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for i960Rx/NARK");
  430                 sc->aac_if = aac_rx_interface;
  431                 break;
  432         case AAC_HWIF_STRONGARM:
  433                 fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for StrongARM");
  434                 sc->aac_if = aac_sa_interface;
  435                 break;
  436         case AAC_HWIF_RKT:
  437                 fwprintf(sc, HBA_FLAGS_DBG_INIT_B, "set hardware up for Rocket/MIPS");
  438                 sc->aac_if = aac_rkt_interface;
  439                 break;
  440         default:
  441                 sc->aac_hwif = AAC_HWIF_UNKNOWN;
  442                 device_printf(sc->aac_dev, "unknown hardware type\n");
  443                 error = ENXIO;
  444                 goto out;
  445         }
  446 
  447         /* Set up quirks */
  448         sc->flags = id->quirks;
  449 
  450         /*
  451          * Do bus-independent initialisation.
  452          */
  453         error = aac_attach(sc);
  454 
  455 out:
  456         if (error)
  457                 aac_free(sc);
  458         return(error);
  459 }
  460 
  461 /*
  462  * Do nothing driver that will attach to the SCSI channels of a Dell PERC
  463  * controller.  This is needed to keep the power management subsystem from
  464  * trying to power down these devices.
  465  */
  466 static int aacch_probe(device_t dev);
  467 static int aacch_attach(device_t dev);
  468 static int aacch_detach(device_t dev);
  469 
  470 static device_method_t aacch_methods[] = {
  471         /* Device interface */
  472         DEVMETHOD(device_probe,         aacch_probe),
  473         DEVMETHOD(device_attach,        aacch_attach),
  474         DEVMETHOD(device_detach,        aacch_detach),
  475         { 0, 0 }
  476 };
  477 
  478 struct aacch_softc {
  479         device_t        dev;
  480 };
  481 
  482 static driver_t aacch_driver = {
  483         "aacch",
  484         aacch_methods,
  485         sizeof(struct aacch_softc)
  486 };
  487 
  488 static devclass_t       aacch_devclass;
  489 DRIVER_MODULE(aacch, pci, aacch_driver, aacch_devclass, 0, 0);
  490 
  491 static int
  492 aacch_probe(device_t dev)
  493 {
  494 
  495         if ((pci_get_vendor(dev) != 0x9005) ||
  496             (pci_get_device(dev) != 0x00c5))
  497                 return (ENXIO);
  498 
  499         device_set_desc(dev, "AAC RAID Channel");
  500         return (-10);
  501 }
  502 
  503 static int
  504 aacch_attach(device_t dev)
  505 {
  506         struct aacch_softc *sc;
  507 
  508         sc = device_get_softc(dev);
  509 
  510         sc->dev = dev;
  511 
  512         return (0);
  513 }
  514 
  515 static int
  516 aacch_detach(device_t dev)
  517 {
  518 
  519         return (0);
  520 }

Cache object: 78f436371f39c66bde01aab1e6795902


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.