linux/drivers/scsi/aacraid/linit.c
<<
>>
Prefs
   1/*
   2 *      Adaptec AAC series RAID controller driver
   3 *      (c) Copyright 2001 Red Hat Inc.
   4 *
   5 * based on the old aacraid driver that is..
   6 * Adaptec aacraid device driver for Linux.
   7 *
   8 * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; either version 2, or (at your option)
  13 * any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; see the file COPYING.  If not, write to
  22 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23 *
  24 * Module Name:
  25 *   linit.c
  26 *
  27 * Abstract: Linux Driver entry module for Adaptec RAID Array Controller
  28 */
  29
  30
  31#include <linux/compat.h>
  32#include <linux/blkdev.h>
  33#include <linux/completion.h>
  34#include <linux/init.h>
  35#include <linux/interrupt.h>
  36#include <linux/kernel.h>
  37#include <linux/module.h>
  38#include <linux/moduleparam.h>
  39#include <linux/pci.h>
  40#include <linux/slab.h>
  41#include <linux/smp_lock.h>
  42#include <linux/spinlock.h>
  43#include <linux/syscalls.h>
  44#include <linux/delay.h>
  45#include <linux/kthread.h>
  46
  47#include <scsi/scsi.h>
  48#include <scsi/scsi_cmnd.h>
  49#include <scsi/scsi_device.h>
  50#include <scsi/scsi_host.h>
  51#include <scsi/scsi_tcq.h>
  52#include <scsi/scsicam.h>
  53#include <scsi/scsi_eh.h>
  54
  55#include "aacraid.h"
  56
  57#define AAC_DRIVER_VERSION              "1.1-5"
  58#ifndef AAC_DRIVER_BRANCH
  59#define AAC_DRIVER_BRANCH               ""
  60#endif
  61#define AAC_DRIVER_BUILD_DATE           __DATE__ " " __TIME__
  62#define AAC_DRIVERNAME                  "aacraid"
  63
  64#ifdef AAC_DRIVER_BUILD
  65#define _str(x) #x
  66#define str(x) _str(x)
  67#define AAC_DRIVER_FULL_VERSION AAC_DRIVER_VERSION "[" str(AAC_DRIVER_BUILD) "]" AAC_DRIVER_BRANCH
  68#else
  69#define AAC_DRIVER_FULL_VERSION AAC_DRIVER_VERSION AAC_DRIVER_BRANCH " " AAC_DRIVER_BUILD_DATE
  70#endif
  71
  72MODULE_AUTHOR("Red Hat Inc and Adaptec");
  73MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, "
  74                   "Adaptec Advanced Raid Products, "
  75                   "HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver");
  76MODULE_LICENSE("GPL");
  77MODULE_VERSION(AAC_DRIVER_FULL_VERSION);
  78
  79static LIST_HEAD(aac_devices);
  80static int aac_cfg_major = -1;
  81char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
  82
  83/*
  84 * Because of the way Linux names scsi devices, the order in this table has
  85 * become important.  Check for on-board Raid first, add-in cards second.
  86 *
  87 * Note: The last field is used to index into aac_drivers below.
  88 */
  89#ifdef DECLARE_PCI_DEVICE_TABLE
  90static DECLARE_PCI_DEVICE_TABLE(aac_pci_tbl) = {
  91#elif defined(__devinitconst)
  92static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
  93#else
  94static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
  95#endif
  96        { 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si (Iguana/PERC2Si) */
  97        { 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di (Opal/PERC3Di) */
  98        { 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si (SlimFast/PERC3Si */
  99        { 0x1028, 0x0004, 0x1028, 0x00d0, 0, 0, 3 }, /* PERC 3/Di (Iguana FlipChip/PERC3DiF */
 100        { 0x1028, 0x0002, 0x1028, 0x00d1, 0, 0, 4 }, /* PERC 3/Di (Viper/PERC3DiV) */
 101        { 0x1028, 0x0002, 0x1028, 0x00d9, 0, 0, 5 }, /* PERC 3/Di (Lexus/PERC3DiL) */
 102        { 0x1028, 0x000a, 0x1028, 0x0106, 0, 0, 6 }, /* PERC 3/Di (Jaguar/PERC3DiJ) */
 103        { 0x1028, 0x000a, 0x1028, 0x011b, 0, 0, 7 }, /* PERC 3/Di (Dagger/PERC3DiD) */
 104        { 0x1028, 0x000a, 0x1028, 0x0121, 0, 0, 8 }, /* PERC 3/Di (Boxster/PERC3DiB) */
 105        { 0x9005, 0x0283, 0x9005, 0x0283, 0, 0, 9 }, /* catapult */
 106        { 0x9005, 0x0284, 0x9005, 0x0284, 0, 0, 10 }, /* tomcat */
 107        { 0x9005, 0x0285, 0x9005, 0x0286, 0, 0, 11 }, /* Adaptec 2120S (Crusader) */
 108        { 0x9005, 0x0285, 0x9005, 0x0285, 0, 0, 12 }, /* Adaptec 2200S (Vulcan) */
 109        { 0x9005, 0x0285, 0x9005, 0x0287, 0, 0, 13 }, /* Adaptec 2200S (Vulcan-2m) */
 110        { 0x9005, 0x0285, 0x17aa, 0x0286, 0, 0, 14 }, /* Legend S220 (Legend Crusader) */
 111        { 0x9005, 0x0285, 0x17aa, 0x0287, 0, 0, 15 }, /* Legend S230 (Legend Vulcan) */
 112
 113        { 0x9005, 0x0285, 0x9005, 0x0288, 0, 0, 16 }, /* Adaptec 3230S (Harrier) */
 114        { 0x9005, 0x0285, 0x9005, 0x0289, 0, 0, 17 }, /* Adaptec 3240S (Tornado) */
 115        { 0x9005, 0x0285, 0x9005, 0x028a, 0, 0, 18 }, /* ASR-2020ZCR SCSI PCI-X ZCR (Skyhawk) */
 116        { 0x9005, 0x0285, 0x9005, 0x028b, 0, 0, 19 }, /* ASR-2025ZCR SCSI SO-DIMM PCI-X ZCR (Terminator) */
 117        { 0x9005, 0x0286, 0x9005, 0x028c, 0, 0, 20 }, /* ASR-2230S + ASR-2230SLP PCI-X (Lancer) */
 118        { 0x9005, 0x0286, 0x9005, 0x028d, 0, 0, 21 }, /* ASR-2130S (Lancer) */
 119        { 0x9005, 0x0286, 0x9005, 0x029b, 0, 0, 22 }, /* AAR-2820SA (Intruder) */
 120        { 0x9005, 0x0286, 0x9005, 0x029c, 0, 0, 23 }, /* AAR-2620SA (Intruder) */
 121        { 0x9005, 0x0286, 0x9005, 0x029d, 0, 0, 24 }, /* AAR-2420SA (Intruder) */
 122        { 0x9005, 0x0286, 0x9005, 0x029e, 0, 0, 25 }, /* ICP9024RO (Lancer) */
 123        { 0x9005, 0x0286, 0x9005, 0x029f, 0, 0, 26 }, /* ICP9014RO (Lancer) */
 124        { 0x9005, 0x0286, 0x9005, 0x02a0, 0, 0, 27 }, /* ICP9047MA (Lancer) */
 125        { 0x9005, 0x0286, 0x9005, 0x02a1, 0, 0, 28 }, /* ICP9087MA (Lancer) */
 126        { 0x9005, 0x0286, 0x9005, 0x02a3, 0, 0, 29 }, /* ICP5445AU (Hurricane44) */
 127        { 0x9005, 0x0285, 0x9005, 0x02a4, 0, 0, 30 }, /* ICP9085LI (Marauder-X) */
 128        { 0x9005, 0x0285, 0x9005, 0x02a5, 0, 0, 31 }, /* ICP5085BR (Marauder-E) */
 129        { 0x9005, 0x0286, 0x9005, 0x02a6, 0, 0, 32 }, /* ICP9067MA (Intruder-6) */
 130        { 0x9005, 0x0287, 0x9005, 0x0800, 0, 0, 33 }, /* Themisto Jupiter Platform */
 131        { 0x9005, 0x0200, 0x9005, 0x0200, 0, 0, 33 }, /* Themisto Jupiter Platform */
 132        { 0x9005, 0x0286, 0x9005, 0x0800, 0, 0, 34 }, /* Callisto Jupiter Platform */
 133        { 0x9005, 0x0285, 0x9005, 0x028e, 0, 0, 35 }, /* ASR-2020SA SATA PCI-X ZCR (Skyhawk) */
 134        { 0x9005, 0x0285, 0x9005, 0x028f, 0, 0, 36 }, /* ASR-2025SA SATA SO-DIMM PCI-X ZCR (Terminator) */
 135        { 0x9005, 0x0285, 0x9005, 0x0290, 0, 0, 37 }, /* AAR-2410SA PCI SATA 4ch (Jaguar II) */
 136        { 0x9005, 0x0285, 0x1028, 0x0291, 0, 0, 38 }, /* CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) */
 137        { 0x9005, 0x0285, 0x9005, 0x0292, 0, 0, 39 }, /* AAR-2810SA PCI SATA 8ch (Corsair-8) */
 138        { 0x9005, 0x0285, 0x9005, 0x0293, 0, 0, 40 }, /* AAR-21610SA PCI SATA 16ch (Corsair-16) */
 139        { 0x9005, 0x0285, 0x9005, 0x0294, 0, 0, 41 }, /* ESD SO-DIMM PCI-X SATA ZCR (Prowler) */
 140        { 0x9005, 0x0285, 0x103C, 0x3227, 0, 0, 42 }, /* AAR-2610SA PCI SATA 6ch */
 141        { 0x9005, 0x0285, 0x9005, 0x0296, 0, 0, 43 }, /* ASR-2240S (SabreExpress) */
 142        { 0x9005, 0x0285, 0x9005, 0x0297, 0, 0, 44 }, /* ASR-4005 */
 143        { 0x9005, 0x0285, 0x1014, 0x02F2, 0, 0, 45 }, /* IBM 8i (AvonPark) */
 144        { 0x9005, 0x0285, 0x1014, 0x0312, 0, 0, 45 }, /* IBM 8i (AvonPark Lite) */
 145        { 0x9005, 0x0286, 0x1014, 0x9580, 0, 0, 46 }, /* IBM 8k/8k-l8 (Aurora) */
 146        { 0x9005, 0x0286, 0x1014, 0x9540, 0, 0, 47 }, /* IBM 8k/8k-l4 (Aurora Lite) */
 147        { 0x9005, 0x0285, 0x9005, 0x0298, 0, 0, 48 }, /* ASR-4000 (BlackBird) */
 148        { 0x9005, 0x0285, 0x9005, 0x0299, 0, 0, 49 }, /* ASR-4800SAS (Marauder-X) */
 149        { 0x9005, 0x0285, 0x9005, 0x029a, 0, 0, 50 }, /* ASR-4805SAS (Marauder-E) */
 150        { 0x9005, 0x0286, 0x9005, 0x02a2, 0, 0, 51 }, /* ASR-3800 (Hurricane44) */
 151
 152        { 0x9005, 0x0285, 0x1028, 0x0287, 0, 0, 52 }, /* Perc 320/DC*/
 153        { 0x1011, 0x0046, 0x9005, 0x0365, 0, 0, 53 }, /* Adaptec 5400S (Mustang)*/
 154        { 0x1011, 0x0046, 0x9005, 0x0364, 0, 0, 54 }, /* Adaptec 5400S (Mustang)*/
 155        { 0x1011, 0x0046, 0x9005, 0x1364, 0, 0, 55 }, /* Dell PERC2/QC */
 156        { 0x1011, 0x0046, 0x103c, 0x10c2, 0, 0, 56 }, /* HP NetRAID-4M */
 157
 158        { 0x9005, 0x0285, 0x1028, PCI_ANY_ID, 0, 0, 57 }, /* Dell Catchall */
 159        { 0x9005, 0x0285, 0x17aa, PCI_ANY_ID, 0, 0, 58 }, /* Legend Catchall */
 160        { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */
 161        { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */
 162        { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */
 163        { 0,}
 164};
 165MODULE_DEVICE_TABLE(pci, aac_pci_tbl);
 166
 167/*
 168 * dmb - For now we add the number of channels to this structure.
 169 * In the future we should add a fib that reports the number of channels
 170 * for the card.  At that time we can remove the channels from here
 171 */
 172static struct aac_driver_ident aac_drivers[] = {
 173        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 2/Si (Iguana/PERC2Si) */
 174        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Opal/PERC3Di) */
 175        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Si (SlimFast/PERC3Si */
 176        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Iguana FlipChip/PERC3DiF */
 177        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Viper/PERC3DiV) */
 178        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Lexus/PERC3DiL) */
 179        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Jaguar/PERC3DiJ) */
 180        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Dagger/PERC3DiD) */
 181        { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Boxster/PERC3DiB) */
 182        { aac_rx_init, "aacraid",  "ADAPTEC ", "catapult        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* catapult */
 183        { aac_rx_init, "aacraid",  "ADAPTEC ", "tomcat          ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* tomcat */
 184        { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG },                     /* Adaptec 2120S (Crusader) */
 185        { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG },                     /* Adaptec 2200S (Vulcan) */
 186        { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan-2m) */
 187        { aac_rx_init, "aacraid",  "Legend  ", "Legend S220     ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S220 (Legend Crusader) */
 188        { aac_rx_init, "aacraid",  "Legend  ", "Legend S230     ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S230 (Legend Vulcan) */
 189
 190        { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3230S   ", 2 }, /* Adaptec 3230S (Harrier) */
 191        { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 3240S   ", 2 }, /* Adaptec 3240S (Tornado) */
 192        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020ZCR     ", 2 }, /* ASR-2020ZCR SCSI PCI-X ZCR (Skyhawk) */
 193        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2025ZCR     ", 2 }, /* ASR-2025ZCR SCSI SO-DIMM PCI-X ZCR (Terminator) */
 194        { aac_rkt_init, "aacraid",  "ADAPTEC ", "ASR-2230S PCI-X ", 2 }, /* ASR-2230S + ASR-2230SLP PCI-X (Lancer) */
 195        { aac_rkt_init, "aacraid",  "ADAPTEC ", "ASR-2130S PCI-X ", 1 }, /* ASR-2130S (Lancer) */
 196        { aac_rkt_init, "aacraid",  "ADAPTEC ", "AAR-2820SA      ", 1 }, /* AAR-2820SA (Intruder) */
 197        { aac_rkt_init, "aacraid",  "ADAPTEC ", "AAR-2620SA      ", 1 }, /* AAR-2620SA (Intruder) */
 198        { aac_rkt_init, "aacraid",  "ADAPTEC ", "AAR-2420SA      ", 1 }, /* AAR-2420SA (Intruder) */
 199        { aac_rkt_init, "aacraid",  "ICP     ", "ICP9024RO       ", 2 }, /* ICP9024RO (Lancer) */
 200        { aac_rkt_init, "aacraid",  "ICP     ", "ICP9014RO       ", 1 }, /* ICP9014RO (Lancer) */
 201        { aac_rkt_init, "aacraid",  "ICP     ", "ICP9047MA       ", 1 }, /* ICP9047MA (Lancer) */
 202        { aac_rkt_init, "aacraid",  "ICP     ", "ICP9087MA       ", 1 }, /* ICP9087MA (Lancer) */
 203        { aac_rkt_init, "aacraid",  "ICP     ", "ICP5445AU       ", 1 }, /* ICP5445AU (Hurricane44) */
 204        { aac_rx_init, "aacraid",  "ICP     ", "ICP9085LI       ", 1 }, /* ICP9085LI (Marauder-X) */
 205        { aac_rx_init, "aacraid",  "ICP     ", "ICP5085BR       ", 1 }, /* ICP5085BR (Marauder-E) */
 206        { aac_rkt_init, "aacraid",  "ICP     ", "ICP9067MA       ", 1 }, /* ICP9067MA (Intruder-6) */
 207        { NULL        , "aacraid",  "ADAPTEC ", "Themisto        ", 0, AAC_QUIRK_SLAVE }, /* Jupiter Platform */
 208        { aac_rkt_init, "aacraid",  "ADAPTEC ", "Callisto        ", 2, AAC_QUIRK_MASTER }, /* Jupiter Platform */
 209        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2020SA       ", 1 }, /* ASR-2020SA SATA PCI-X ZCR (Skyhawk) */
 210        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2025SA       ", 1 }, /* ASR-2025SA SATA SO-DIMM PCI-X ZCR (Terminator) */
 211        { aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-2410SA SATA ", 1, AAC_QUIRK_17SG }, /* AAR-2410SA PCI SATA 4ch (Jaguar II) */
 212        { aac_rx_init, "aacraid",  "DELL    ", "CERC SR2        ", 1, AAC_QUIRK_17SG }, /* CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) */
 213        { aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-2810SA SATA ", 1, AAC_QUIRK_17SG }, /* AAR-2810SA PCI SATA 8ch (Corsair-8) */
 214        { aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-21610SA SATA", 1, AAC_QUIRK_17SG }, /* AAR-21610SA PCI SATA 16ch (Corsair-16) */
 215        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2026ZCR     ", 1 }, /* ESD SO-DIMM PCI-X SATA ZCR (Prowler) */
 216        { aac_rx_init, "aacraid",  "ADAPTEC ", "AAR-2610SA      ", 1 }, /* SATA 6Ch (Bearcat) */
 217        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-2240S       ", 1 }, /* ASR-2240S (SabreExpress) */
 218        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-4005        ", 1 }, /* ASR-4005 */
 219        { aac_rx_init, "ServeRAID","IBM     ", "ServeRAID 8i    ", 1 }, /* IBM 8i (AvonPark) */
 220        { aac_rkt_init, "ServeRAID","IBM     ", "ServeRAID 8k-l8 ", 1 }, /* IBM 8k/8k-l8 (Aurora) */
 221        { aac_rkt_init, "ServeRAID","IBM     ", "ServeRAID 8k-l4 ", 1 }, /* IBM 8k/8k-l4 (Aurora Lite) */
 222        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-4000        ", 1 }, /* ASR-4000 (BlackBird & AvonPark) */
 223        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-4800SAS     ", 1 }, /* ASR-4800SAS (Marauder-X) */
 224        { aac_rx_init, "aacraid",  "ADAPTEC ", "ASR-4805SAS     ", 1 }, /* ASR-4805SAS (Marauder-E) */
 225        { aac_rkt_init, "aacraid",  "ADAPTEC ", "ASR-3800        ", 1 }, /* ASR-3800 (Hurricane44) */
 226
 227        { aac_rx_init, "percraid", "DELL    ", "PERC 320/DC     ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Perc 320/DC*/
 228        { aac_sa_init, "aacraid",  "ADAPTEC ", "Adaptec 5400S   ", 4, AAC_QUIRK_34SG }, /* Adaptec 5400S (Mustang)*/
 229        { aac_sa_init, "aacraid",  "ADAPTEC ", "AAC-364         ", 4, AAC_QUIRK_34SG }, /* Adaptec 5400S (Mustang)*/
 230        { aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4, AAC_QUIRK_34SG }, /* Dell PERC2/QC */
 231        { aac_sa_init, "hpnraid",  "HP      ", "NetRAID         ", 4, AAC_QUIRK_34SG }, /* HP NetRAID-4M */
 232
 233        { aac_rx_init, "aacraid",  "DELL    ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Dell Catchall */
 234        { aac_rx_init, "aacraid",  "Legend  ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend Catchall */
 235        { aac_rx_init, "aacraid",  "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Catch All */
 236        { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Rocket Catch All */
 237        { aac_nark_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec NEMER/ARK Catch All */
 238};
 239
 240/**
 241 *      aac_queuecommand        -       queue a SCSI command
 242 *      @cmd:           SCSI command to queue
 243 *      @done:          Function to call on command completion
 244 *
 245 *      Queues a command for execution by the associated Host Adapter.
 246 *
 247 *      TODO: unify with aac_scsi_cmd().
 248 */
 249
 250static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
 251{
 252        struct Scsi_Host *host = cmd->device->host;
 253        struct aac_dev *dev = (struct aac_dev *)host->hostdata;
 254        u32 count = 0;
 255        cmd->scsi_done = done;
 256        for (; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
 257                struct fib * fib = &dev->fibs[count];
 258                struct scsi_cmnd * command;
 259                if (fib->hw_fib_va->header.XferState &&
 260                    ((command = fib->callback_data)) &&
 261                    (command == cmd) &&
 262                    (cmd->SCp.phase == AAC_OWNER_FIRMWARE))
 263                        return 0; /* Already owned by Adapter */
 264        }
 265        cmd->SCp.phase = AAC_OWNER_LOWLEVEL;
 266        return (aac_scsi_cmd(cmd) ? FAILED : 0);
 267}
 268
 269/**
 270 *      aac_info                -       Returns the host adapter name
 271 *      @shost:         Scsi host to report on
 272 *
 273 *      Returns a static string describing the device in question
 274 */
 275
 276static const char *aac_info(struct Scsi_Host *shost)
 277{
 278        struct aac_dev *dev = (struct aac_dev *)shost->hostdata;
 279        return aac_drivers[dev->cardtype].name;
 280}
 281
 282/**
 283 *      aac_get_driver_ident
 284 *      @devtype: index into lookup table
 285 *
 286 *      Returns a pointer to the entry in the driver lookup table.
 287 */
 288
 289struct aac_driver_ident* aac_get_driver_ident(int devtype)
 290{
 291        return &aac_drivers[devtype];
 292}
 293
 294/**
 295 *      aac_biosparm    -       return BIOS parameters for disk
 296 *      @sdev: The scsi device corresponding to the disk
 297 *      @bdev: the block device corresponding to the disk
 298 *      @capacity: the sector capacity of the disk
 299 *      @geom: geometry block to fill in
 300 *
 301 *      Return the Heads/Sectors/Cylinders BIOS Disk Parameters for Disk.
 302 *      The default disk geometry is 64 heads, 32 sectors, and the appropriate
 303 *      number of cylinders so as not to exceed drive capacity.  In order for
 304 *      disks equal to or larger than 1 GB to be addressable by the BIOS
 305 *      without exceeding the BIOS limitation of 1024 cylinders, Extended
 306 *      Translation should be enabled.   With Extended Translation enabled,
 307 *      drives between 1 GB inclusive and 2 GB exclusive are given a disk
 308 *      geometry of 128 heads and 32 sectors, and drives above 2 GB inclusive
 309 *      are given a disk geometry of 255 heads and 63 sectors.  However, if
 310 *      the BIOS detects that the Extended Translation setting does not match
 311 *      the geometry in the partition table, then the translation inferred
 312 *      from the partition table will be used by the BIOS, and a warning may
 313 *      be displayed.
 314 */
 315
 316static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
 317                        sector_t capacity, int *geom)
 318{
 319        struct diskparm *param = (struct diskparm *)geom;
 320        unsigned char *buf;
 321
 322        dprintk((KERN_DEBUG "aac_biosparm.\n"));
 323
 324        /*
 325         *      Assuming extended translation is enabled - #REVISIT#
 326         */
 327        if (capacity >= 2 * 1024 * 1024) { /* 1 GB in 512 byte sectors */
 328                if(capacity >= 4 * 1024 * 1024) { /* 2 GB in 512 byte sectors */
 329                        param->heads = 255;
 330                        param->sectors = 63;
 331                } else {
 332                        param->heads = 128;
 333                        param->sectors = 32;
 334                }
 335        } else {
 336                param->heads = 64;
 337                param->sectors = 32;
 338        }
 339
 340        param->cylinders = cap_to_cyls(capacity, param->heads * param->sectors);
 341
 342        /*
 343         *      Read the first 1024 bytes from the disk device, if the boot
 344         *      sector partition table is valid, search for a partition table
 345         *      entry whose end_head matches one of the standard geometry
 346         *      translations ( 64/32, 128/32, 255/63 ).
 347         */
 348        buf = scsi_bios_ptable(bdev);
 349        if (!buf)
 350                return 0;
 351        if(*(__le16 *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
 352                struct partition *first = (struct partition * )buf;
 353                struct partition *entry = first;
 354                int saved_cylinders = param->cylinders;
 355                int num;
 356                unsigned char end_head, end_sec;
 357
 358                for(num = 0; num < 4; num++) {
 359                        end_head = entry->end_head;
 360                        end_sec = entry->end_sector & 0x3f;
 361
 362                        if(end_head == 63) {
 363                                param->heads = 64;
 364                                param->sectors = 32;
 365                                break;
 366                        } else if(end_head == 127) {
 367                                param->heads = 128;
 368                                param->sectors = 32;
 369                                break;
 370                        } else if(end_head == 254) {
 371                                param->heads = 255;
 372                                param->sectors = 63;
 373                                break;
 374                        }
 375                        entry++;
 376                }
 377
 378                if (num == 4) {
 379                        end_head = first->end_head;
 380                        end_sec = first->end_sector & 0x3f;
 381                }
 382
 383                param->cylinders = cap_to_cyls(capacity, param->heads * param->sectors);
 384                if (num < 4 && end_sec == param->sectors) {
 385                        if (param->cylinders != saved_cylinders)
 386                                dprintk((KERN_DEBUG "Adopting geometry: heads=%d, sectors=%d from partition table %d.\n",
 387                                        param->heads, param->sectors, num));
 388                } else if (end_head > 0 || end_sec > 0) {
 389                        dprintk((KERN_DEBUG "Strange geometry: heads=%d, sectors=%d in partition table %d.\n",
 390                                end_head + 1, end_sec, num));
 391                        dprintk((KERN_DEBUG "Using geometry: heads=%d, sectors=%d.\n",
 392                                        param->heads, param->sectors));
 393                }
 394        }
 395        kfree(buf);
 396        return 0;
 397}
 398
 399/**
 400 *      aac_slave_configure             -       compute queue depths
 401 *      @sdev:  SCSI device we are considering
 402 *
 403 *      Selects queue depths for each target device based on the host adapter's
 404 *      total capacity and the queue depth supported by the target device.
 405 *      A queue depth of one automatically disables tagged queueing.
 406 */
 407
 408static int aac_slave_configure(struct scsi_device *sdev)
 409{
 410        struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
 411        if (aac->jbod && (sdev->type == TYPE_DISK))
 412                sdev->removable = 1;
 413        if ((sdev->type == TYPE_DISK) &&
 414                        (sdev_channel(sdev) != CONTAINER_CHANNEL) &&
 415                        (!aac->jbod || sdev->inq_periph_qual) &&
 416                        (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))) {
 417                if (expose_physicals == 0)
 418                        return -ENXIO;
 419                if (expose_physicals < 0)
 420                        sdev->no_uld_attach = 1;
 421        }
 422        if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
 423                        (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2)) &&
 424                        !sdev->no_uld_attach) {
 425                struct scsi_device * dev;
 426                struct Scsi_Host *host = sdev->host;
 427                unsigned num_lsu = 0;
 428                unsigned num_one = 0;
 429                unsigned depth;
 430                unsigned cid;
 431
 432                /*
 433                 * Firmware has an individual device recovery time typically
 434                 * of 35 seconds, give us a margin.
 435                 */
 436                if (sdev->request_queue->rq_timeout < (45 * HZ))
 437                        blk_queue_rq_timeout(sdev->request_queue, 45*HZ);
 438                for (cid = 0; cid < aac->maximum_num_containers; ++cid)
 439                        if (aac->fsa_dev[cid].valid)
 440                                ++num_lsu;
 441                __shost_for_each_device(dev, host) {
 442                        if (dev->tagged_supported && (dev->type == TYPE_DISK) &&
 443                                        (!aac->raid_scsi_mode ||
 444                                                (sdev_channel(sdev) != 2)) &&
 445                                        !dev->no_uld_attach) {
 446                                if ((sdev_channel(dev) != CONTAINER_CHANNEL)
 447                                 || !aac->fsa_dev[sdev_id(dev)].valid)
 448                                        ++num_lsu;
 449                        } else
 450                                ++num_one;
 451                }
 452                if (num_lsu == 0)
 453                        ++num_lsu;
 454                depth = (host->can_queue - num_one) / num_lsu;
 455                if (depth > 256)
 456                        depth = 256;
 457                else if (depth < 2)
 458                        depth = 2;
 459                scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth);
 460        } else
 461                scsi_adjust_queue_depth(sdev, 0, 1);
 462
 463        return 0;
 464}
 465
 466/**
 467 *      aac_change_queue_depth          -       alter queue depths
 468 *      @sdev:  SCSI device we are considering
 469 *      @depth: desired queue depth
 470 *
 471 *      Alters queue depths for target device based on the host adapter's
 472 *      total capacity and the queue depth supported by the target device.
 473 */
 474
 475static int aac_change_queue_depth(struct scsi_device *sdev, int depth)
 476{
 477        if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
 478            (sdev_channel(sdev) == CONTAINER_CHANNEL)) {
 479                struct scsi_device * dev;
 480                struct Scsi_Host *host = sdev->host;
 481                unsigned num = 0;
 482
 483                __shost_for_each_device(dev, host) {
 484                        if (dev->tagged_supported && (dev->type == TYPE_DISK) &&
 485                            (sdev_channel(dev) == CONTAINER_CHANNEL))
 486                                ++num;
 487                        ++num;
 488                }
 489                if (num >= host->can_queue)
 490                        num = host->can_queue - 1;
 491                if (depth > (host->can_queue - num))
 492                        depth = host->can_queue - num;
 493                if (depth > 256)
 494                        depth = 256;
 495                else if (depth < 2)
 496                        depth = 2;
 497                scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth);
 498        } else
 499                scsi_adjust_queue_depth(sdev, 0, 1);
 500        return sdev->queue_depth;
 501}
 502
 503static ssize_t aac_show_raid_level(struct device *dev, struct device_attribute *attr, char *buf)
 504{
 505        struct scsi_device *sdev = to_scsi_device(dev);
 506        struct aac_dev *aac = (struct aac_dev *)(sdev->host->hostdata);
 507        if (sdev_channel(sdev) != CONTAINER_CHANNEL)
 508                return snprintf(buf, PAGE_SIZE, sdev->no_uld_attach
 509                  ? "Hidden\n" :
 510                  ((aac->jbod && (sdev->type == TYPE_DISK)) ? "JBOD\n" : ""));
 511        return snprintf(buf, PAGE_SIZE, "%s\n",
 512          get_container_type(aac->fsa_dev[sdev_id(sdev)].type));
 513}
 514
 515static struct device_attribute aac_raid_level_attr = {
 516        .attr = {
 517                .name = "level",
 518                .mode = S_IRUGO,
 519        },
 520        .show = aac_show_raid_level
 521};
 522
 523static struct device_attribute *aac_dev_attrs[] = {
 524        &aac_raid_level_attr,
 525        NULL,
 526};
 527
 528static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg)
 529{
 530        struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
 531        if (!capable(CAP_SYS_RAWIO))
 532                return -EPERM;
 533        return aac_do_ioctl(dev, cmd, arg);
 534}
 535
 536static int aac_eh_abort(struct scsi_cmnd* cmd)
 537{
 538        struct scsi_device * dev = cmd->device;
 539        struct Scsi_Host * host = dev->host;
 540        struct aac_dev * aac = (struct aac_dev *)host->hostdata;
 541        int count;
 542        int ret = FAILED;
 543
 544        printk(KERN_ERR "%s: Host adapter abort request (%d,%d,%d,%d)\n",
 545                AAC_DRIVERNAME,
 546                host->host_no, sdev_channel(dev), sdev_id(dev), dev->lun);
 547        switch (cmd->cmnd[0]) {
 548        case SERVICE_ACTION_IN:
 549                if (!(aac->raw_io_interface) ||
 550                    !(aac->raw_io_64) ||
 551                    ((cmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16))
 552                        break;
 553        case INQUIRY:
 554        case READ_CAPACITY:
 555                /* Mark associated FIB to not complete, eh handler does this */
 556                for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
 557                        struct fib * fib = &aac->fibs[count];
 558                        if (fib->hw_fib_va->header.XferState &&
 559                          (fib->flags & FIB_CONTEXT_FLAG) &&
 560                          (fib->callback_data == cmd)) {
 561                                fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
 562                                cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
 563                                ret = SUCCESS;
 564                        }
 565                }
 566                break;
 567        case TEST_UNIT_READY:
 568                /* Mark associated FIB to not complete, eh handler does this */
 569                for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
 570                        struct scsi_cmnd * command;
 571                        struct fib * fib = &aac->fibs[count];
 572                        if ((fib->hw_fib_va->header.XferState & cpu_to_le32(Async | NoResponseExpected)) &&
 573                          (fib->flags & FIB_CONTEXT_FLAG) &&
 574                          ((command = fib->callback_data)) &&
 575                          (command->device == cmd->device)) {
 576                                fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
 577                                command->SCp.phase = AAC_OWNER_ERROR_HANDLER;
 578                                if (command == cmd)
 579                                        ret = SUCCESS;
 580                        }
 581                }
 582        }
 583        return ret;
 584}
 585
 586/*
 587 *      aac_eh_reset    - Reset command handling
 588 *      @scsi_cmd:      SCSI command block causing the reset
 589 *
 590 */
 591static int aac_eh_reset(struct scsi_cmnd* cmd)
 592{
 593        struct scsi_device * dev = cmd->device;
 594        struct Scsi_Host * host = dev->host;
 595        struct scsi_cmnd * command;
 596        int count;
 597        struct aac_dev * aac = (struct aac_dev *)host->hostdata;
 598        unsigned long flags;
 599
 600        /* Mark the associated FIB to not complete, eh handler does this */
 601        for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
 602                struct fib * fib = &aac->fibs[count];
 603                if (fib->hw_fib_va->header.XferState &&
 604                  (fib->flags & FIB_CONTEXT_FLAG) &&
 605                  (fib->callback_data == cmd)) {
 606                        fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
 607                        cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
 608                }
 609        }
 610        printk(KERN_ERR "%s: Host adapter reset request. SCSI hang ?\n",
 611                                        AAC_DRIVERNAME);
 612
 613        if ((count = aac_check_health(aac)))
 614                return count;
 615        /*
 616         * Wait for all commands to complete to this specific
 617         * target (block maximum 60 seconds).
 618         */
 619        for (count = 60; count; --count) {
 620                int active = aac->in_reset;
 621
 622                if (active == 0)
 623                __shost_for_each_device(dev, host) {
 624                        spin_lock_irqsave(&dev->list_lock, flags);
 625                        list_for_each_entry(command, &dev->cmd_list, list) {
 626                                if ((command != cmd) &&
 627                                    (command->SCp.phase == AAC_OWNER_FIRMWARE)) {
 628                                        active++;
 629                                        break;
 630                                }
 631                        }
 632                        spin_unlock_irqrestore(&dev->list_lock, flags);
 633                        if (active)
 634                                break;
 635
 636                }
 637                /*
 638                 * We can exit If all the commands are complete
 639                 */
 640                if (active == 0)
 641                        return SUCCESS;
 642                ssleep(1);
 643        }
 644        printk(KERN_ERR "%s: SCSI bus appears hung\n", AAC_DRIVERNAME);
 645        /*
 646         * This adapter needs a blind reset, only do so for Adapters that
 647         * support a register, instead of a commanded, reset.
 648         */
 649        if ((aac->supplement_adapter_info.SupportedOptions2 &
 650           AAC_OPTION_MU_RESET) &&
 651          aac_check_reset &&
 652          ((aac_check_reset != 1) ||
 653           !(aac->supplement_adapter_info.SupportedOptions2 &
 654            AAC_OPTION_IGNORE_RESET)))
 655                aac_reset_adapter(aac, 2); /* Bypass wait for command quiesce */
 656        return SUCCESS; /* Cause an immediate retry of the command with a ten second delay after successful tur */
 657}
 658
 659/**
 660 *      aac_cfg_open            -       open a configuration file
 661 *      @inode: inode being opened
 662 *      @file: file handle attached
 663 *
 664 *      Called when the configuration device is opened. Does the needed
 665 *      set up on the handle and then returns
 666 *
 667 *      Bugs: This needs extending to check a given adapter is present
 668 *      so we can support hot plugging, and to ref count adapters.
 669 */
 670
 671static int aac_cfg_open(struct inode *inode, struct file *file)
 672{
 673        struct aac_dev *aac;
 674        unsigned minor_number = iminor(inode);
 675        int err = -ENODEV;
 676
 677        lock_kernel();  /* BKL pushdown: nothing else protects this list */
 678        list_for_each_entry(aac, &aac_devices, entry) {
 679                if (aac->id == minor_number) {
 680                        file->private_data = aac;
 681                        err = 0;
 682                        break;
 683                }
 684        }
 685        unlock_kernel();
 686
 687        return err;
 688}
 689
 690/**
 691 *      aac_cfg_ioctl           -       AAC configuration request
 692 *      @inode: inode of device
 693 *      @file: file handle
 694 *      @cmd: ioctl command code
 695 *      @arg: argument
 696 *
 697 *      Handles a configuration ioctl. Currently this involves wrapping it
 698 *      up and feeding it into the nasty windowsalike glue layer.
 699 *
 700 *      Bugs: Needs locking against parallel ioctls lower down
 701 *      Bugs: Needs to handle hot plugging
 702 */
 703
 704static int aac_cfg_ioctl(struct inode *inode, struct file *file,
 705                unsigned int cmd, unsigned long arg)
 706{
 707        if (!capable(CAP_SYS_RAWIO))
 708                return -EPERM;
 709        return aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
 710}
 711
 712#ifdef CONFIG_COMPAT
 713static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long arg)
 714{
 715        long ret;
 716        lock_kernel();
 717        switch (cmd) {
 718        case FSACTL_MINIPORT_REV_CHECK:
 719        case FSACTL_SENDFIB:
 720        case FSACTL_OPEN_GET_ADAPTER_FIB:
 721        case FSACTL_CLOSE_GET_ADAPTER_FIB:
 722        case FSACTL_SEND_RAW_SRB:
 723        case FSACTL_GET_PCI_INFO:
 724        case FSACTL_QUERY_DISK:
 725        case FSACTL_DELETE_DISK:
 726        case FSACTL_FORCE_DELETE_DISK:
 727        case FSACTL_GET_CONTAINERS:
 728        case FSACTL_SEND_LARGE_FIB:
 729                ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
 730                break;
 731
 732        case FSACTL_GET_NEXT_ADAPTER_FIB: {
 733                struct fib_ioctl __user *f;
 734
 735                f = compat_alloc_user_space(sizeof(*f));
 736                ret = 0;
 737                if (clear_user(f, sizeof(*f)))
 738                        ret = -EFAULT;
 739                if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32)))
 740                        ret = -EFAULT;
 741                if (!ret)
 742                        ret = aac_do_ioctl(dev, cmd, f);
 743                break;
 744        }
 745
 746        default:
 747                ret = -ENOIOCTLCMD;
 748                break;
 749        }
 750        unlock_kernel();
 751        return ret;
 752}
 753
 754static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
 755{
 756        struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
 757        return aac_compat_do_ioctl(dev, cmd, (unsigned long)arg);
 758}
 759
 760static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 761{
 762        if (!capable(CAP_SYS_RAWIO))
 763                return -EPERM;
 764        return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, arg);
 765}
 766#endif
 767
 768static ssize_t aac_show_model(struct device *device,
 769                              struct device_attribute *attr, char *buf)
 770{
 771        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 772        int len;
 773
 774        if (dev->supplement_adapter_info.AdapterTypeText[0]) {
 775                char * cp = dev->supplement_adapter_info.AdapterTypeText;
 776                while (*cp && *cp != ' ')
 777                        ++cp;
 778                while (*cp == ' ')
 779                        ++cp;
 780                len = snprintf(buf, PAGE_SIZE, "%s\n", cp);
 781        } else
 782                len = snprintf(buf, PAGE_SIZE, "%s\n",
 783                  aac_drivers[dev->cardtype].model);
 784        return len;
 785}
 786
 787static ssize_t aac_show_vendor(struct device *device,
 788                               struct device_attribute *attr, char *buf)
 789{
 790        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 791        int len;
 792
 793        if (dev->supplement_adapter_info.AdapterTypeText[0]) {
 794                char * cp = dev->supplement_adapter_info.AdapterTypeText;
 795                while (*cp && *cp != ' ')
 796                        ++cp;
 797                len = snprintf(buf, PAGE_SIZE, "%.*s\n",
 798                  (int)(cp - (char *)dev->supplement_adapter_info.AdapterTypeText),
 799                  dev->supplement_adapter_info.AdapterTypeText);
 800        } else
 801                len = snprintf(buf, PAGE_SIZE, "%s\n",
 802                  aac_drivers[dev->cardtype].vname);
 803        return len;
 804}
 805
 806static ssize_t aac_show_flags(struct device *cdev,
 807                              struct device_attribute *attr, char *buf)
 808{
 809        int len = 0;
 810        struct aac_dev *dev = (struct aac_dev*)class_to_shost(cdev)->hostdata;
 811
 812        if (nblank(dprintk(x)))
 813                len = snprintf(buf, PAGE_SIZE, "dprintk\n");
 814#ifdef AAC_DETAILED_STATUS_INFO
 815        len += snprintf(buf + len, PAGE_SIZE - len,
 816                        "AAC_DETAILED_STATUS_INFO\n");
 817#endif
 818        if (dev->raw_io_interface && dev->raw_io_64)
 819                len += snprintf(buf + len, PAGE_SIZE - len,
 820                                "SAI_READ_CAPACITY_16\n");
 821        if (dev->jbod)
 822                len += snprintf(buf + len, PAGE_SIZE - len, "SUPPORTED_JBOD\n");
 823        if (dev->supplement_adapter_info.SupportedOptions2 &
 824                AAC_OPTION_POWER_MANAGEMENT)
 825                len += snprintf(buf + len, PAGE_SIZE - len,
 826                                "SUPPORTED_POWER_MANAGEMENT\n");
 827        if (dev->msi)
 828                len += snprintf(buf + len, PAGE_SIZE - len, "PCI_HAS_MSI\n");
 829        return len;
 830}
 831
 832static ssize_t aac_show_kernel_version(struct device *device,
 833                                       struct device_attribute *attr,
 834                                       char *buf)
 835{
 836        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 837        int len, tmp;
 838
 839        tmp = le32_to_cpu(dev->adapter_info.kernelrev);
 840        len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
 841          tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
 842          le32_to_cpu(dev->adapter_info.kernelbuild));
 843        return len;
 844}
 845
 846static ssize_t aac_show_monitor_version(struct device *device,
 847                                        struct device_attribute *attr,
 848                                        char *buf)
 849{
 850        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 851        int len, tmp;
 852
 853        tmp = le32_to_cpu(dev->adapter_info.monitorrev);
 854        len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
 855          tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
 856          le32_to_cpu(dev->adapter_info.monitorbuild));
 857        return len;
 858}
 859
 860static ssize_t aac_show_bios_version(struct device *device,
 861                                     struct device_attribute *attr,
 862                                     char *buf)
 863{
 864        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 865        int len, tmp;
 866
 867        tmp = le32_to_cpu(dev->adapter_info.biosrev);
 868        len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
 869          tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
 870          le32_to_cpu(dev->adapter_info.biosbuild));
 871        return len;
 872}
 873
 874static ssize_t aac_show_serial_number(struct device *device,
 875                               struct device_attribute *attr, char *buf)
 876{
 877        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 878        int len = 0;
 879
 880        if (le32_to_cpu(dev->adapter_info.serial[0]) != 0xBAD0)
 881                len = snprintf(buf, PAGE_SIZE, "%06X\n",
 882                  le32_to_cpu(dev->adapter_info.serial[0]));
 883        if (len &&
 884          !memcmp(&dev->supplement_adapter_info.MfgPcbaSerialNo[
 885            sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo)-len],
 886          buf, len-1))
 887                len = snprintf(buf, PAGE_SIZE, "%.*s\n",
 888                  (int)sizeof(dev->supplement_adapter_info.MfgPcbaSerialNo),
 889                  dev->supplement_adapter_info.MfgPcbaSerialNo);
 890        return len;
 891}
 892
 893static ssize_t aac_show_max_channel(struct device *device,
 894                                    struct device_attribute *attr, char *buf)
 895{
 896        return snprintf(buf, PAGE_SIZE, "%d\n",
 897          class_to_shost(device)->max_channel);
 898}
 899
 900static ssize_t aac_show_max_id(struct device *device,
 901                               struct device_attribute *attr, char *buf)
 902{
 903        return snprintf(buf, PAGE_SIZE, "%d\n",
 904          class_to_shost(device)->max_id);
 905}
 906
 907static ssize_t aac_store_reset_adapter(struct device *device,
 908                                       struct device_attribute *attr,
 909                                       const char *buf, size_t count)
 910{
 911        int retval = -EACCES;
 912
 913        if (!capable(CAP_SYS_ADMIN))
 914                return retval;
 915        retval = aac_reset_adapter((struct aac_dev*)class_to_shost(device)->hostdata, buf[0] == '!');
 916        if (retval >= 0)
 917                retval = count;
 918        return retval;
 919}
 920
 921static ssize_t aac_show_reset_adapter(struct device *device,
 922                                      struct device_attribute *attr,
 923                                      char *buf)
 924{
 925        struct aac_dev *dev = (struct aac_dev*)class_to_shost(device)->hostdata;
 926        int len, tmp;
 927
 928        tmp = aac_adapter_check_health(dev);
 929        if ((tmp == 0) && dev->in_reset)
 930                tmp = -EBUSY;
 931        len = snprintf(buf, PAGE_SIZE, "0x%x\n", tmp);
 932        return len;
 933}
 934
 935static struct device_attribute aac_model = {
 936        .attr = {
 937                .name = "model",
 938                .mode = S_IRUGO,
 939        },
 940        .show = aac_show_model,
 941};
 942static struct device_attribute aac_vendor = {
 943        .attr = {
 944                .name = "vendor",
 945                .mode = S_IRUGO,
 946        },
 947        .show = aac_show_vendor,
 948};
 949static struct device_attribute aac_flags = {
 950        .attr = {
 951                .name = "flags",
 952                .mode = S_IRUGO,
 953        },
 954        .show = aac_show_flags,
 955};
 956static struct device_attribute aac_kernel_version = {
 957        .attr = {
 958                .name = "hba_kernel_version",
 959                .mode = S_IRUGO,
 960        },
 961        .show = aac_show_kernel_version,
 962};
 963static struct device_attribute aac_monitor_version = {
 964        .attr = {
 965                .name = "hba_monitor_version",
 966                .mode = S_IRUGO,
 967        },
 968        .show = aac_show_monitor_version,
 969};
 970static struct device_attribute aac_bios_version = {
 971        .attr = {
 972                .name = "hba_bios_version",
 973                .mode = S_IRUGO,
 974        },
 975        .show = aac_show_bios_version,
 976};
 977static struct device_attribute aac_serial_number = {
 978        .attr = {
 979                .name = "serial_number",
 980                .mode = S_IRUGO,
 981        },
 982        .show = aac_show_serial_number,
 983};
 984static struct device_attribute aac_max_channel = {
 985        .attr = {
 986                .name = "max_channel",
 987                .mode = S_IRUGO,
 988        },
 989        .show = aac_show_max_channel,
 990};
 991static struct device_attribute aac_max_id = {
 992        .attr = {
 993                .name = "max_id",
 994                .mode = S_IRUGO,
 995        },
 996        .show = aac_show_max_id,
 997};
 998static struct device_attribute aac_reset = {
 999        .attr = {
1000                .name = "reset_host",
1001                .mode = S_IWUSR|S_IRUGO,
1002        },
1003        .store = aac_store_reset_adapter,
1004        .show = aac_show_reset_adapter,
1005};
1006
1007static struct device_attribute *aac_attrs[] = {
1008        &aac_model,
1009        &aac_vendor,
1010        &aac_flags,
1011        &aac_kernel_version,
1012        &aac_monitor_version,
1013        &aac_bios_version,
1014        &aac_serial_number,
1015        &aac_max_channel,
1016        &aac_max_id,
1017        &aac_reset,
1018        NULL
1019};
1020
1021ssize_t aac_get_serial_number(struct device *device, char *buf)
1022{
1023        return aac_show_serial_number(device, &aac_serial_number, buf);
1024}
1025
1026static const struct file_operations aac_cfg_fops = {
1027        .owner          = THIS_MODULE,
1028        .ioctl          = aac_cfg_ioctl,
1029#ifdef CONFIG_COMPAT
1030        .compat_ioctl   = aac_compat_cfg_ioctl,
1031#endif
1032        .open           = aac_cfg_open,
1033};
1034
1035static struct scsi_host_template aac_driver_template = {
1036        .module                         = THIS_MODULE,
1037        .name                           = "AAC",
1038        .proc_name                      = AAC_DRIVERNAME,
1039        .info                           = aac_info,
1040        .ioctl                          = aac_ioctl,
1041#ifdef CONFIG_COMPAT
1042        .compat_ioctl                   = aac_compat_ioctl,
1043#endif
1044        .queuecommand                   = aac_queuecommand,
1045        .bios_param                     = aac_biosparm,
1046        .shost_attrs                    = aac_attrs,
1047        .slave_configure                = aac_slave_configure,
1048        .change_queue_depth             = aac_change_queue_depth,
1049        .sdev_attrs                     = aac_dev_attrs,
1050        .eh_abort_handler               = aac_eh_abort,
1051        .eh_host_reset_handler          = aac_eh_reset,
1052        .can_queue                      = AAC_NUM_IO_FIB,
1053        .this_id                        = MAXIMUM_NUM_CONTAINERS,
1054        .sg_tablesize                   = 16,
1055        .max_sectors                    = 128,
1056#if (AAC_NUM_IO_FIB > 256)
1057        .cmd_per_lun                    = 256,
1058#else
1059        .cmd_per_lun                    = AAC_NUM_IO_FIB,
1060#endif
1061        .use_clustering                 = ENABLE_CLUSTERING,
1062        .emulated                       = 1,
1063};
1064
1065static void __aac_shutdown(struct aac_dev * aac)
1066{
1067        if (aac->aif_thread)
1068                kthread_stop(aac->thread);
1069        aac_send_shutdown(aac);
1070        aac_adapter_disable_int(aac);
1071        free_irq(aac->pdev->irq, aac);
1072        if (aac->msi)
1073                pci_disable_msi(aac->pdev);
1074}
1075
1076static int __devinit aac_probe_one(struct pci_dev *pdev,
1077                const struct pci_device_id *id)
1078{
1079        unsigned index = id->driver_data;
1080        struct Scsi_Host *shost;
1081        struct aac_dev *aac;
1082        struct list_head *insert = &aac_devices;
1083        int error = -ENODEV;
1084        int unique_id = 0;
1085
1086        list_for_each_entry(aac, &aac_devices, entry) {
1087                if (aac->id > unique_id)
1088                        break;
1089                insert = &aac->entry;
1090                unique_id++;
1091        }
1092
1093        error = pci_enable_device(pdev);
1094        if (error)
1095                goto out;
1096        error = -ENODEV;
1097
1098        if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) ||
1099                        pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
1100                goto out_disable_pdev;
1101        /*
1102         * If the quirk31 bit is set, the adapter needs adapter
1103         * to driver communication memory to be allocated below 2gig
1104         */
1105        if (aac_drivers[index].quirks & AAC_QUIRK_31BIT)
1106                if (pci_set_dma_mask(pdev, DMA_BIT_MASK(31)) ||
1107                                pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(31)))
1108                        goto out_disable_pdev;
1109
1110        pci_set_master(pdev);
1111
1112        shost = scsi_host_alloc(&aac_driver_template, sizeof(struct aac_dev));
1113        if (!shost)
1114                goto out_disable_pdev;
1115
1116        shost->irq = pdev->irq;
1117        shost->base = pci_resource_start(pdev, 0);
1118        shost->unique_id = unique_id;
1119        shost->max_cmd_len = 16;
1120
1121        aac = (struct aac_dev *)shost->hostdata;
1122        aac->scsi_host_ptr = shost;
1123        aac->pdev = pdev;
1124        aac->name = aac_driver_template.name;
1125        aac->id = shost->unique_id;
1126        aac->cardtype = index;
1127        INIT_LIST_HEAD(&aac->entry);
1128
1129        aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL);
1130        if (!aac->fibs)
1131                goto out_free_host;
1132        spin_lock_init(&aac->fib_lock);
1133
1134        /*
1135         *      Map in the registers from the adapter.
1136         */
1137        aac->base_size = AAC_MIN_FOOTPRINT_SIZE;
1138        if ((*aac_drivers[index].init)(aac))
1139                goto out_unmap;
1140
1141        /*
1142         *      Start any kernel threads needed
1143         */
1144        aac->thread = kthread_run(aac_command_thread, aac, AAC_DRIVERNAME);
1145        if (IS_ERR(aac->thread)) {
1146                printk(KERN_ERR "aacraid: Unable to create command thread.\n");
1147                error = PTR_ERR(aac->thread);
1148                goto out_deinit;
1149        }
1150
1151        /*
1152         * If we had set a smaller DMA mask earlier, set it to 4gig
1153         * now since the adapter can dma data to at least a 4gig
1154         * address space.
1155         */
1156        if (aac_drivers[index].quirks & AAC_QUIRK_31BIT)
1157                if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))
1158                        goto out_deinit;
1159
1160        aac->maximum_num_channels = aac_drivers[index].channels;
1161        error = aac_get_adapter_info(aac);
1162        if (error < 0)
1163                goto out_deinit;
1164
1165        /*
1166         * Lets override negotiations and drop the maximum SG limit to 34
1167         */
1168        if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) &&
1169                        (shost->sg_tablesize > 34)) {
1170                shost->sg_tablesize = 34;
1171                shost->max_sectors = (shost->sg_tablesize * 8) + 112;
1172        }
1173
1174        if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) &&
1175                        (shost->sg_tablesize > 17)) {
1176                shost->sg_tablesize = 17;
1177                shost->max_sectors = (shost->sg_tablesize * 8) + 112;
1178        }
1179
1180        error = pci_set_dma_max_seg_size(pdev,
1181                (aac->adapter_info.options & AAC_OPT_NEW_COMM) ?
1182                        (shost->max_sectors << 9) : 65536);
1183        if (error)
1184                goto out_deinit;
1185
1186        /*
1187         * Firmware printf works only with older firmware.
1188         */
1189        if (aac_drivers[index].quirks & AAC_QUIRK_34SG)
1190                aac->printf_enabled = 1;
1191        else
1192                aac->printf_enabled = 0;
1193
1194        /*
1195         * max channel will be the physical channels plus 1 virtual channel
1196         * all containers are on the virtual channel 0 (CONTAINER_CHANNEL)
1197         * physical channels are address by their actual physical number+1
1198         */
1199        if (aac->nondasd_support || expose_physicals || aac->jbod)
1200                shost->max_channel = aac->maximum_num_channels;
1201        else
1202                shost->max_channel = 0;
1203
1204        aac_get_config_status(aac, 0);
1205        aac_get_containers(aac);
1206        list_add(&aac->entry, insert);
1207
1208        shost->max_id = aac->maximum_num_containers;
1209        if (shost->max_id < aac->maximum_num_physicals)
1210                shost->max_id = aac->maximum_num_physicals;
1211        if (shost->max_id < MAXIMUM_NUM_CONTAINERS)
1212                shost->max_id = MAXIMUM_NUM_CONTAINERS;
1213        else
1214                shost->this_id = shost->max_id;
1215
1216        /*
1217         * dmb - we may need to move the setting of these parms somewhere else once
1218         * we get a fib that can report the actual numbers
1219         */
1220        shost->max_lun = AAC_MAX_LUN;
1221
1222        pci_set_drvdata(pdev, shost);
1223
1224        error = scsi_add_host(shost, &pdev->dev);
1225        if (error)
1226                goto out_deinit;
1227        scsi_scan_host(shost);
1228
1229        return 0;
1230
1231 out_deinit:
1232        __aac_shutdown(aac);
1233 out_unmap:
1234        aac_fib_map_free(aac);
1235        if (aac->comm_addr)
1236                pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
1237                  aac->comm_phys);
1238        kfree(aac->queues);
1239        aac_adapter_ioremap(aac, 0);
1240        kfree(aac->fibs);
1241        kfree(aac->fsa_dev);
1242 out_free_host:
1243        scsi_host_put(shost);
1244 out_disable_pdev:
1245        pci_disable_device(pdev);
1246 out:
1247        return error;
1248}
1249
1250static void aac_shutdown(struct pci_dev *dev)
1251{
1252        struct Scsi_Host *shost = pci_get_drvdata(dev);
1253        scsi_block_requests(shost);
1254        __aac_shutdown((struct aac_dev *)shost->hostdata);
1255}
1256
1257static void __devexit aac_remove_one(struct pci_dev *pdev)
1258{
1259        struct Scsi_Host *shost = pci_get_drvdata(pdev);
1260        struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
1261
1262        scsi_remove_host(shost);
1263
1264        __aac_shutdown(aac);
1265        aac_fib_map_free(aac);
1266        pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
1267                        aac->comm_phys);
1268        kfree(aac->queues);
1269
1270        aac_adapter_ioremap(aac, 0);
1271
1272        kfree(aac->fibs);
1273        kfree(aac->fsa_dev);
1274
1275        list_del(&aac->entry);
1276        scsi_host_put(shost);
1277        pci_disable_device(pdev);
1278        if (list_empty(&aac_devices)) {
1279                unregister_chrdev(aac_cfg_major, "aac");
1280                aac_cfg_major = -1;
1281        }
1282}
1283
1284static struct pci_driver aac_pci_driver = {
1285        .name           = AAC_DRIVERNAME,
1286        .id_table       = aac_pci_tbl,
1287        .probe          = aac_probe_one,
1288        .remove         = __devexit_p(aac_remove_one),
1289        .shutdown       = aac_shutdown,
1290};
1291
1292static int __init aac_init(void)
1293{
1294        int error;
1295
1296        printk(KERN_INFO "Adaptec %s driver %s\n",
1297          AAC_DRIVERNAME, aac_driver_version);
1298
1299        error = pci_register_driver(&aac_pci_driver);
1300        if (error < 0)
1301                return error;
1302
1303        aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops);
1304        if (aac_cfg_major < 0) {
1305                printk(KERN_WARNING
1306                        "aacraid: unable to register \"aac\" device.\n");
1307        }
1308
1309        return 0;
1310}
1311
1312static void __exit aac_exit(void)
1313{
1314        if (aac_cfg_major > -1)
1315                unregister_chrdev(aac_cfg_major, "aac");
1316        pci_unregister_driver(&aac_pci_driver);
1317}
1318
1319module_init(aac_init);
1320module_exit(aac_exit);
1321