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

Cache object: ae3b30b6bbdefb17449b66260420a18c


[ 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.