Print this page
*** NO COMMENTS ***

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/aac/aac.h
          +++ new/usr/src/uts/common/io/aac/aac.h
   1    1  /*
   2      - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
        2 + * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
        3 + * Use is subject to license terms.
   3    4   */
   4    5  
   5    6  /*
   6      - * Copyright 2005-06 Adaptec, Inc.
   7      - * Copyright (c) 2005-06 Adaptec Inc., Achim Leubner
        7 + * Copyright (c) 2010-12 PMC-Sierra, Inc.
        8 + * Copyright (c) 2005-10 Adaptec Inc., Achim Leubner
   8    9   * Copyright (c) 2000 Michael Smith
   9   10   * Copyright (c) 2001 Scott Long
  10   11   * Copyright (c) 2000 BSDi
  11   12   * All rights reserved.
  12   13   *
  13   14   * Redistribution and use in source and binary forms, with or without
  14   15   * modification, are permitted provided that the following conditions
  15   16   * are met:
  16   17   * 1. Redistributions of source code must retain the above copyright
  17   18   *    notice, this list of conditions and the following disclaimer.
↓ open down ↓ 5 lines elided ↑ open up ↑
  23   24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24   25   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25   26   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  26   27   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27   28   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28   29   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29   30   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30   31   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31   32   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32   33   * SUCH DAMAGE.
  33      - *
  34      - *    $FreeBSD: src/sys/dev/aac/aacvar.h,v 1.47 2005/10/08 15:55:09 scottl Exp $
  35   34   */
  36   35  
  37   36  #ifndef _AAC_H_
  38   37  #define _AAC_H_
  39   38  
       39 +#pragma ident   "@(#)aac.h      1.16    08/01/29 SMI"
       40 +
  40   41  #ifdef  __cplusplus
  41   42  extern "C" {
  42   43  #endif
  43   44  
       45 +#ifdef AAC_DEBUG_ALL
       46 +#define AAC_DEBUG
       47 +#define DEBUG                   /* activate assertions */
       48 +#endif
       49 +
  44   50  #define AAC_ROUNDUP(x, y)               (((x) + (y) - 1) / (y) * (y))
  45   51  
  46   52  #define AAC_TYPE_DEVO                   1
  47   53  #define AAC_TYPE_ALPHA                  2
  48   54  #define AAC_TYPE_BETA                   3
  49   55  #define AAC_TYPE_RELEASE                4
  50   56  
  51   57  #ifndef AAC_DRIVER_BUILD
  52   58  #define AAC_DRIVER_BUILD                1
  53   59  #endif
  54   60  
  55   61  #define AAC_DRIVER_MAJOR_VERSION        2
  56      -#define AAC_DRIVER_MINOR_VERSION        2
  57      -#define AAC_DRIVER_BUGFIX_LEVEL         11
       62 +#define AAC_DRIVER_MINOR_VERSION        7
       63 +#define AAC_DRIVER_BUGFIX_LEVEL         1
  58   64  #define AAC_DRIVER_TYPE                 AAC_TYPE_RELEASE
  59   65  
  60   66  #define STR(s)                          # s
  61   67  #define AAC_VERSION(a, b, c)            STR(a.b.c)
  62   68  #define AAC_DRIVER_VERSION              AAC_VERSION(AAC_DRIVER_MAJOR_VERSION, \
  63   69                                          AAC_DRIVER_MINOR_VERSION, \
  64   70                                          AAC_DRIVER_BUGFIX_LEVEL)
  65   71  
  66   72  #define AACOK                           0
       73 +#define AACOK2                          1
  67   74  #define AACERR                          -1
  68   75  
  69   76  #define AAC_MAX_ADAPTERS                64
  70   77  
  71   78  /* Definitions for mode sense */
  72   79  #ifndef SD_MODE_SENSE_PAGE3_CODE
  73   80  #define SD_MODE_SENSE_PAGE3_CODE        0x03
  74   81  #endif
  75   82  
  76   83  #ifndef SD_MODE_SENSE_PAGE4_CODE
↓ open down ↓ 10 lines elided ↑ open up ↑
  87   94   */
  88   95  #define AAC_AIFQ_LENGTH                 64
  89   96  
  90   97  #ifdef __x86
  91   98  #define AAC_IMMEDIATE_TIMEOUT           30      /* seconds */
  92   99  #else
  93  100  #define AAC_IMMEDIATE_TIMEOUT           60      /* seconds */
  94  101  #endif
  95  102  #define AAC_FWUP_TIMEOUT                180     /* wait up to 3 minutes */
  96  103  #define AAC_IOCTL_TIMEOUT               900     /* wait up to 15 minutes */
  97      -#define AAC_SYNC_TIMEOUT                900     /* wait up to 15 minutes */
      104 +#define AAC_AIF_TIMEOUT         180 /* up to 3 minutes */
  98  105  
  99  106  /* Adapter hardware interface types */
 100  107  #define AAC_HWIF_UNKNOWN                0
 101  108  #define AAC_HWIF_I960RX                 1
 102  109  #define AAC_HWIF_RKT                    2
      110 +#define AAC_HWIF_NARK                   3
      111 +#define AAC_HWIF_SRC                    4
      112 +#define AAC_HWIF_SRCV                   5
 103  113  
 104  114  #define AAC_TYPE_UNKNOWN                0
 105  115  #define AAC_TYPE_SCSI                   1
 106  116  #define AAC_TYPE_SATA                   2
 107  117  #define AAC_TYPE_SAS                    3
 108  118  
 109  119  #define AAC_LS32(d)                     ((uint32_t)((d) & 0xffffffffull))
 110  120  #define AAC_MS32(d)                     ((uint32_t)((d) >> 32))
 111  121  #define AAC_LO32(p64)                   ((uint32_t *)(p64))
 112  122  #define AAC_HI32(p64)                   ((uint32_t *)(p64) + 1)
 113  123  
 114  124  /*
 115      - * Internal events that will be handled serially by aac_event_thread()
 116      - */
 117      -#define AAC_EVENT_AIF                   (1 << 0)
 118      -#define AAC_EVENT_TIMEOUT               (1 << 1)
 119      -#define AAC_EVENT_SYNCTICK              (1 << 2)
 120      -
 121      -/*
 122  125   * AAC_CMDQ_SYNC should be 0 and AAC_CMDQ_ASYNC be 1 for Sync FIB io
 123  126   * to be served before async FIB io, see aac_start_waiting_io().
 124  127   * So that io requests sent by interactive userland commands get
 125  128   * responded asap.
 126  129   */
 127  130  enum aac_cmdq {
 128  131          AAC_CMDQ_SYNC,  /* sync FIB queue */
 129  132          AAC_CMDQ_ASYNC, /* async FIB queue */
 130  133          AAC_CMDQ_NUM
 131  134  };
↓ open down ↓ 17 lines elided ↑ open up ↑
 149  152          uint16_t device;        /* PCI Device ID */
 150  153          uint16_t subvendor;     /* PCI Subsystem Vendor ID */
 151  154          uint16_t subsys;        /* PCI Subsystem ID */
 152  155          uint16_t hwif;          /* card chip type: i960 or Rocket */
 153  156          uint16_t quirks;        /* card odd limits */
 154  157          uint16_t type;          /* hard drive type */
 155  158          char *vid;              /* ASCII data for INQUIRY command vendor id */
 156  159          char *desc;             /* ASCII data for INQUIRY command product id */
 157  160  };
 158  161  
 159      -/* Device types */
 160      -#define AAC_DEV_LD              0       /* logical device */
 161      -#define AAC_DEV_PD              1       /* physical device */
      162 +#define AAC_DEV_LD      0       /* logical device */
      163 +#define AAC_DEV_PD      1       /* physical device */
 162  164  
 163      -/* Device flags */
 164      -#define AAC_DFLAG_VALID         (1 << 0)
 165      -#define AAC_DFLAG_CONFIGURING   (1 << 1)
 166      -
 167      -#define AAC_DEV_IS_VALID(dvp)   ((dvp)->flags & AAC_DFLAG_VALID)
 168      -#define AAC_P2VTGT(softs, bus, tgt) \
 169      -                ((softs)->tgt_max * (bus) + (tgt) + AAC_MAX_LD)
 170      -
 171      -/*
 172      - * Device config change events
 173      - */
 174      -enum aac_cfg_event {
 175      -        AAC_CFG_NULL_NOEXIST = 0,       /* No change with no device */
 176      -        AAC_CFG_NULL_EXIST,             /* No change but have device */
 177      -        AAC_CFG_ADD,                    /* Device added */
 178      -        AAC_CFG_DELETE,                 /* Device deleted */
 179      -        AAC_CFG_CHANGE                  /* Device changed */
 180      -};
 181      -
      165 +#define AAC_DEV_NONE    0
      166 +#define AAC_DEV_ONLINE  1
      167 +#define AAC_DEV_OFFLINE 2
 182  168  struct aac_device {
 183      -        int flags;
 184      -
      169 +        uint8_t valid;
 185  170          uint8_t type;
 186  171          dev_info_t *dip;
 187  172          int ncmds[AAC_CMDQ_NUM];        /* outstanding cmds of the device */
 188  173          int throttle[AAC_CMDQ_NUM];     /* hold IO cmds for the device */
 189  174  };
 190  175  
 191  176  /* Array description */
 192  177  struct aac_container {
 193  178          struct aac_device dev;
 194  179  
↓ open down ↓ 4 lines elided ↑ open up ↑
 199  184          uint8_t deleted;
 200  185          uint8_t reset;          /* container is being reseted */
 201  186  };
 202  187  
 203  188  /* Non-DASD phys. device descrption, eg. CDROM or tape */
 204  189  struct aac_nondasd {
 205  190          struct aac_device dev;
 206  191  
 207  192          uint32_t bus;
 208  193          uint32_t tid;
      194 +        uint8_t dtype;          /* SCSI device type */
 209  195  };
 210  196  
 211  197  /*
 212  198   * The firmware can support a lot of outstanding commands. Each aac_slot
 213  199   * is corresponding to one of such commands. It records the command and
 214  200   * associated DMA resource for FIB command.
 215  201   */
 216  202  struct aac_slot {
 217  203          struct aac_slot *next;  /* next slot in the free slot list */
 218  204          int index;              /* index of this slot */
 219  205          ddi_acc_handle_t fib_acc_handle;
 220  206          ddi_dma_handle_t fib_dma_handle;
 221  207          uint64_t fib_phyaddr;   /* physical address of FIB memory */
 222  208          struct aac_cmd *acp;    /* command using this slot */
 223  209          struct aac_fib *fibp;   /* virtual address of FIB memory */
 224  210  };
 225  211  
 226      -/*
 227      - * Scatter-gather list structure defined by HBA hardware
 228      - */
 229      -struct aac_sge {
 230      -        uint32_t bcount;        /* byte count */
 231      -        union {
 232      -                uint32_t ad32;  /* 32 bit address */
 233      -                struct {
 234      -                        uint32_t lo;
 235      -                        uint32_t hi;
 236      -                } ad64;         /* 64 bit address */
 237      -        } addr;
 238      -};
 239      -
 240      -/* aac_cmd flags */
 241      -#define AAC_CMD_CONSISTENT              (1 << 0)
 242      -#define AAC_CMD_DMA_PARTIAL             (1 << 1)
 243      -#define AAC_CMD_DMA_VALID               (1 << 2)
 244      -#define AAC_CMD_BUF_READ                (1 << 3)
 245      -#define AAC_CMD_BUF_WRITE               (1 << 4)
 246      -#define AAC_CMD_SYNC                    (1 << 5) /* use sync FIB */
 247      -#define AAC_CMD_NO_INTR                 (1 << 6) /* poll IO, no intr */
 248      -#define AAC_CMD_NO_CB                   (1 << 7) /* sync IO, no callback */
 249      -#define AAC_CMD_NTAG                    (1 << 8)
 250      -#define AAC_CMD_CMPLT                   (1 << 9) /* cmd exec'ed by driver/fw */
 251      -#define AAC_CMD_ABORT                   (1 << 10)
 252      -#define AAC_CMD_TIMEOUT                 (1 << 11)
 253      -#define AAC_CMD_ERR                     (1 << 12)
 254      -#define AAC_CMD_IN_SYNC_SLOT            (1 << 13)
 255      -
 256      -struct aac_softstate;
 257      -typedef void (*aac_cmd_fib_t)(struct aac_softstate *, struct aac_cmd *);
 258      -
 259      -struct aac_cmd {
 260      -        /*
 261      -         * Note: should be the first member for aac_cmd_queue to work
 262      -         * correctly.
 263      -         */
 264      -        struct aac_cmd *next;
 265      -        struct aac_cmd *prev;
 266      -
 267      -        struct scsi_pkt *pkt;
 268      -        int cmdlen;
 269      -        int flags;
 270      -        uint32_t timeout; /* time when the cmd should have completed */
 271      -        struct buf *bp;
 272      -        ddi_dma_handle_t buf_dma_handle;
 273      -
 274      -        /* For non-aligned buffer and SRB */
 275      -        caddr_t abp;
 276      -        ddi_acc_handle_t abh;
 277      -
 278      -        /* Data transfer state */
 279      -        ddi_dma_cookie_t cookie;
 280      -        uint_t left_cookien;
 281      -        uint_t cur_win;
 282      -        uint_t total_nwin;
 283      -        size_t total_xfer;
 284      -        uint64_t blkno;
 285      -        uint32_t bcount;        /* buffer size in byte */
 286      -        struct aac_sge *sgt;    /* sg table */
 287      -
 288      -        /* FIB construct function */
 289      -        aac_cmd_fib_t aac_cmd_fib;
 290      -        /* Call back function for completed command */
 291      -        void (*ac_comp)(struct aac_softstate *, struct aac_cmd *);
 292      -
 293      -        struct aac_slot *slotp; /* slot used by this command */
 294      -        struct aac_device *dvp; /* target device */
 295      -
 296      -        /* FIB for this IO command */
 297      -        int fib_size; /* size of the FIB xferred to/from the card */
 298      -        struct aac_fib *fibp;
 299      -
 300      -#ifdef DEBUG
 301      -        uint32_t fib_flags;
 302      -#endif
 303      -};
 304      -
 305  212  /* Flags for attach tracking */
 306  213  #define AAC_ATTACH_SOFTSTATE_ALLOCED    (1 << 0)
 307  214  #define AAC_ATTACH_CARD_DETECTED        (1 << 1)
 308  215  #define AAC_ATTACH_PCI_MEM_MAPPED       (1 << 2)
 309  216  #define AAC_ATTACH_KMUTEX_INITED        (1 << 3)
 310      -#define AAC_ATTACH_SCSI_TRAN_SETUP      (1 << 4)
 311      -#define AAC_ATTACH_COMM_SPACE_SETUP     (1 << 5)
 312      -#define AAC_ATTACH_CREATE_DEVCTL        (1 << 6)
 313      -#define AAC_ATTACH_CREATE_SCSI          (1 << 7)
      217 +#define AAC_ATTACH_HARD_INTR_SETUP      (1 << 4)
      218 +#define AAC_ATTACH_SOFT_INTR_SETUP      (1 << 5)
      219 +#define AAC_ATTACH_SCSI_TRAN_SETUP      (1 << 6)
      220 +#define AAC_ATTACH_COMM_SPACE_SETUP     (1 << 7)
      221 +#define AAC_ATTACH_CREATE_DEVCTL        (1 << 8)
      222 +#define AAC_ATTACH_CREATE_SCSI          (1 << 9)
 314  223  
 315  224  /* Driver running states */
 316  225  #define AAC_STATE_STOPPED       0
 317  226  #define AAC_STATE_RUN           (1 << 0)
 318  227  #define AAC_STATE_RESET         (1 << 1)
 319  228  #define AAC_STATE_QUIESCED      (1 << 2)
 320  229  #define AAC_STATE_DEAD          (1 << 3)
 321      -#define AAC_STATE_INTR          (1 << 4)
 322  230  
 323  231  /*
 324  232   * Flags for aac firmware
 325  233   * Note: Quirks are only valid for the older cards. These cards only supported
 326  234   * old comm. Thus they are not valid for any cards that support new comm.
 327  235   */
 328  236  #define AAC_FLAGS_SG_64BIT      (1 << 0) /* Use 64-bit S/G addresses */
 329  237  #define AAC_FLAGS_4GB_WINDOW    (1 << 1) /* Can access host mem 2-4GB range */
 330  238  #define AAC_FLAGS_NO4GB (1 << 2)        /* quirk: FIB addresses must reside */
 331  239                                          /*        between 0x2000 & 0x7FFFFFFF */
 332  240  #define AAC_FLAGS_256FIBS       (1 << 3) /* quirk: Can only do 256 commands */
 333  241  #define AAC_FLAGS_NEW_COMM      (1 << 4) /* New comm. interface supported */
 334  242  #define AAC_FLAGS_RAW_IO        (1 << 5) /* Raw I/O interface */
 335  243  #define AAC_FLAGS_ARRAY_64BIT   (1 << 6) /* 64-bit array size */
 336  244  #define AAC_FLAGS_LBA_64BIT     (1 << 7) /* 64-bit LBA supported */
 337  245  #define AAC_FLAGS_17SG          (1 << 8) /* quirk: 17 scatter gather maximum */
 338  246  #define AAC_FLAGS_34SG          (1 << 9) /* quirk: 34 scatter gather maximum */
 339  247  #define AAC_FLAGS_NONDASD       (1 << 10) /* non-DASD device supported */
 340      -#define AAC_FLAGS_BRKUP         (1 << 11) /* pkt breakup support */
 341      -#define AAC_FLAGS_JBOD          (1 << 12) /* JBOD mode support */
      248 +#define AAC_FLAGS_NEW_COMM_TYPE1        (1 << 11)       /* New comm. type1 supported */
      249 +#define AAC_FLAGS_NEW_COMM_TYPE2        (1 << 12)       /* New comm. type2 supported */
      250 +#define AAC_FLAGS_NEW_COMM_TYPE34       (1 << 13)       /* New comm. type3-4 */
      251 +#define AAC_FLAGS_SYNC_MODE     (1 << 14)       /* Sync. transfer mode */
 342  252  
 343  253  struct aac_softstate;
 344  254  struct aac_interface {
      255 +        void (*aif_set_intr)(struct aac_softstate *, int enable);
      256 +        void (*aif_status_clr)(struct aac_softstate *, int mask);
      257 +        int (*aif_status_get)(struct aac_softstate *);
      258 +        void (*aif_notify)(struct aac_softstate *, int val);
 345  259          int (*aif_get_fwstatus)(struct aac_softstate *);
 346  260          int (*aif_get_mailbox)(struct aac_softstate *, int);
 347  261          void (*aif_set_mailbox)(struct aac_softstate *, uint32_t,
 348  262              uint32_t, uint32_t, uint32_t, uint32_t);
      263 +        int (*aif_send_command)(struct aac_softstate *, struct aac_slot *);
 349  264  };
 350  265  
 351      -#define AAC_CTXFLAG_FILLED      0x01    /* aifq's full for this ctx */
 352      -#define AAC_CTXFLAG_RESETED     0x02
 353      -
 354  266  struct aac_fib_context {
 355  267          uint32_t unique;
 356  268          int ctx_idx;
 357  269          int ctx_filled;         /* aifq is full for this fib context */
 358      -        int ctx_flags;
 359      -        int ctx_overrun;
 360  270          struct aac_fib_context *next, *prev;
 361  271  };
 362  272  
      273 +typedef void (*aac_cmd_fib_t)(struct aac_softstate *, struct aac_cmd *);
      274 +
 363  275  #define AAC_VENDOR_LEN          8
 364  276  #define AAC_PRODUCT_LEN         16
 365  277  
 366  278  struct aac_softstate {
 367  279          int card;               /* index to aac_cards */
 368  280          uint16_t hwif;          /* card chip type: i960 or Rocket */
 369  281          uint16_t vendid;        /* vendor id */
 370  282          uint16_t subvendid;     /* sub vendor id */
 371  283          uint16_t devid;         /* device id */
 372  284          uint16_t subsysid;      /* sub system id */
 373  285          char vendor_name[AAC_VENDOR_LEN + 1];
 374  286          char product_name[AAC_PRODUCT_LEN + 1];
 375  287          uint32_t support_opt;   /* firmware features */
 376      -        uint32_t support_opt2;
 377      -        uint32_t feature_bits;
 378  288          uint32_t atu_size;      /* actual size of PCI mem space */
 379  289          uint32_t map_size;      /* mapped PCI mem space size */
 380  290          uint32_t map_size_min;  /* minimum size of PCI mem that must be */
 381  291                                  /* mapped to address the card */
 382  292          int flags;              /* firmware features enabled */
 383  293          int instance;
 384  294          dev_info_t *devinfo_p;
 385  295          scsi_hba_tran_t *hba_tran;
 386  296          int slen;
 387      -        int legacy;             /* legacy device naming */
 388      -        uint32_t dma_max;       /* for buf breakup */
      297 +        int legacy;
      298 +        int sync_mode;
      299 +        int no_sgl_conv;
 389  300  
 390  301          /* DMA attributes */
 391  302          ddi_dma_attr_t buf_dma_attr;
 392  303          ddi_dma_attr_t addr_dma_attr;
 393  304  
 394  305          /* PCI spaces */
 395      -        ddi_device_acc_attr_t acc_attr;
 396      -        ddi_device_acc_attr_t reg_attr;
 397      -        ddi_acc_handle_t pci_mem_handle;
 398      -        uint8_t *pci_mem_base_vaddr;
 399      -        uint32_t pci_mem_base_paddr;
      306 +        ddi_acc_handle_t pci_mem_handle[AAC_MAX_MEM_SPACE];
      307 +        char *pci_mem_base_vaddr[AAC_MAX_MEM_SPACE];
      308 +        uint32_t pci_mem_base_paddr[AAC_MAX_MEM_SPACE];
 400  309  
 401  310          struct aac_interface aac_if;    /* adapter hardware interface */
 402  311  
 403      -        struct aac_cmd sync_ac;         /* sync FIB */
 404      -
      312 +        struct aac_slot *sync_slot;      /* sync FIB */
      313 +        int sync_slot_busy;
      314 +        struct aac_slot *sync_mode_slot;
      315 +    
 405  316          /* Communication space */
 406  317          struct aac_comm_space *comm_space;
 407  318          ddi_acc_handle_t comm_space_acc_handle;
 408  319          ddi_dma_handle_t comm_space_dma_handle;
 409  320          uint32_t comm_space_phyaddr;
 410  321  
 411      -        /* Old Comm. interface: message queues */
      322 +        /* New Comm. type1: response buffer index */
      323 +        uint32_t aac_host_rrq_idx;
      324 +
      325 +    /* Old Comm. interface: message queues */
 412  326          struct aac_queue_table *qtablep;
 413  327          struct aac_queue_entry *qentries[AAC_QUEUE_COUNT];
 414  328  
 415  329          /* New Comm. interface */
 416  330          uint32_t aac_max_fibs;          /* max. FIB count */
 417  331          uint32_t aac_max_fib_size;      /* max. FIB size */
 418  332          uint32_t aac_sg_tablesize;      /* max. sg count from host */
 419  333          uint32_t aac_max_sectors;       /* max. I/O size from host (blocks) */
      334 +        uint32_t aac_max_aif;           /* max. AIF count */
 420  335  
 421  336          aac_cmd_fib_t aac_cmd_fib;      /* IO cmd FIB construct function */
 422  337          aac_cmd_fib_t aac_cmd_fib_scsi; /* SRB construct function */
 423  338  
      339 +        ddi_iblock_cookie_t iblock_cookie;
 424  340          ddi_softintr_t softint_id;      /* soft intr */
 425  341  
 426  342          kmutex_t io_lock;
 427  343          int state;                      /* driver state */
 428  344  
 429  345          struct aac_container containers[AAC_MAX_LD];
 430  346          int container_count;            /* max container id + 1 */
 431  347          struct aac_nondasd *nondasds;
 432  348          uint32_t bus_max;               /* max FW buses exposed */
 433  349          uint32_t tgt_max;               /* max FW target per bus */
      350 +        uint32_t aac_feature_bits;
      351 +        uint32_t aac_support_opt2;
 434  352  
 435  353          /*
 436  354           * Command queues
 437  355           * Each aac command flows through wait(or wait_sync) queue,
 438  356           * busy queue, and complete queue sequentially.
 439  357           */
 440  358          struct aac_cmd_queue q_wait[AAC_CMDQ_NUM];
 441  359          struct aac_cmd_queue q_busy;    /* outstanding cmd queue */
 442  360          kmutex_t q_comp_mutex;
 443  361          struct aac_cmd_queue q_comp;    /* completed io requests */
 444  362  
 445  363          /* I/O slots and FIBs */
 446  364          int total_slots;                /* total slots allocated */
 447  365          int total_fibs;                 /* total FIBs allocated */
 448  366          struct aac_slot *io_slot;       /* static list for allocated slots */
 449  367          struct aac_slot *free_io_slot_head;
 450  368  
      369 +        timeout_id_t timeout_id;        /* for timeout daemon */
      370 +
 451  371          kcondvar_t event;               /* for ioctl_send_fib() and sync IO */
 452      -        kcondvar_t sync_fib_cv;         /* for sync_fib_slot_bind/release */
 453  372  
 454  373          int bus_ncmds[AAC_CMDQ_NUM];    /* total outstanding async cmds */
 455  374          int bus_throttle[AAC_CMDQ_NUM]; /* hold IO cmds for the bus */
 456  375          int ndrains;                    /* number of draining threads */
 457  376          timeout_id_t drain_timeid;      /* for outstanding cmd drain */
 458  377          kcondvar_t drain_cv;            /* for quiesce drain */
 459  378  
 460      -        /* Internal timer */
 461      -        kmutex_t time_mutex;
 462      -        timeout_id_t timeout_id;        /* for timeout daemon */
 463      -        uint32_t timebase;              /* internal timer in seconds */
 464      -        uint32_t time_sync;             /* next time to sync with firmware */
 465      -        uint32_t time_out;              /* next time to check timeout */
 466      -        uint32_t time_throttle;         /* next time to restore throttle */
 467      -
 468      -        /* Internal events handling */
 469      -        kmutex_t ev_lock;
 470      -        int events;
 471      -        kthread_t *event_thread;        /* for AIF & timeout */
 472      -        kcondvar_t event_wait_cv;
 473      -        kcondvar_t event_disp_cv;
 474      -
 475  379          /* AIF */
 476  380          kmutex_t aifq_mutex;            /* for AIF queue aifq */
 477      -        kcondvar_t aifq_cv;
      381 +        kcondvar_t aifv;
 478  382          union aac_fib_align aifq[AAC_AIFQ_LENGTH];
 479  383          int aifq_idx;                   /* slot for next new AIF */
 480  384          int aifq_wrap;                  /* AIF queue has ever been wrapped */
 481      -        struct aac_fib_context aifctx;  /* sys aif ctx */
 482      -        struct aac_fib_context *fibctx_p;
      385 +        struct aac_fib_context *fibctx;
 483  386          int devcfg_wait_on;             /* AIF event waited for rescan */
 484  387  
 485  388          int fm_capabilities;
      389 +        ddi_taskq_t *taskq;
 486  390  
 487      -        /* MSI specific fields */
 488      -        ddi_intr_handle_t *htable;      /* For array of interrupts */
 489      -        int intr_type;                  /* What type of interrupt */
 490      -        int intr_cnt;                   /* # of intrs count returned */
 491      -        int intr_size;
 492      -        uint_t intr_pri;                /* Interrupt priority   */
 493      -        int intr_cap;                   /* Interrupt capabilities */
 494      -
 495      -#ifdef DEBUG
      391 +#ifdef AAC_DEBUG
 496  392          /* UART trace printf variables */
 497  393          uint32_t debug_flags;           /* debug print flags bitmap */
 498      -        uint32_t debug_fib_flags;       /* debug FIB print flags bitmap */
 499  394          uint32_t debug_fw_flags;        /* FW debug flags */
 500  395          uint32_t debug_buf_offset;      /* offset from DPMEM start */
 501  396          uint32_t debug_buf_size;        /* FW debug buffer size in bytes */
 502  397          uint32_t debug_header_size;     /* size of debug header */
 503  398  #endif
 504  399  };
 505  400  
 506  401  /*
 507  402   * The following data are kept stable because they are only written at driver
 508  403   * initialization, and we do not allow them changed otherwise even at driver
 509  404   * re-initialization.
 510  405   */
 511  406  _NOTE(SCHEME_PROTECTS_DATA("stable data", aac_softstate::{flags slen \
 512  407      buf_dma_attr pci_mem_handle pci_mem_base_vaddr \
 513  408      comm_space_acc_handle comm_space_dma_handle aac_max_fib_size \
 514      -    aac_sg_tablesize aac_cmd_fib aac_cmd_fib_scsi debug_flags bus_max tgt_max}))
      409 +    aac_sg_tablesize aac_cmd_fib aac_cmd_fib_scsi debug_flags bus_max tgt_max \
      410 +        aac_feature_bits}))
 515  411  
 516      -#ifdef DEBUG
      412 +/*
      413 + * Scatter-gather list structure defined by HBA hardware
      414 + */
      415 +struct aac_sge {
      416 +        uint32_t bcount;        /* byte count */
      417 +        union {
      418 +                uint32_t ad32;  /* 32 bit address */
      419 +                struct {
      420 +                        uint32_t lo;
      421 +                        uint32_t hi;
      422 +                } ad64;         /* 64 bit address */
      423 +        } addr;
      424 +};
 517  425  
      426 +/* aac_cmd flags */
      427 +#define AAC_CMD_CONSISTENT              (1 << 0)
      428 +#define AAC_CMD_DMA_PARTIAL             (1 << 1)
      429 +#define AAC_CMD_DMA_VALID               (1 << 2)
      430 +#define AAC_CMD_BUF_READ                (1 << 3)
      431 +#define AAC_CMD_BUF_WRITE               (1 << 4)
      432 +#define AAC_CMD_SYNC                    (1 << 5) /* use sync FIB */
      433 +#define AAC_CMD_NO_INTR                 (1 << 6) /* poll IO, no intr */
      434 +#define AAC_CMD_NO_CB                   (1 << 7) /* sync IO, no callback */
      435 +#define AAC_CMD_NTAG                    (1 << 8)
      436 +#define AAC_CMD_CMPLT                   (1 << 9) /* cmd exec'ed by driver/fw */
      437 +#define AAC_CMD_ABORT                   (1 << 10)
      438 +#define AAC_CMD_TIMEOUT                 (1 << 11)
      439 +#define AAC_CMD_ERR                     (1 << 12)
      440 +#define AAC_CMD_AIF                     (1 << 13)
      441 +#define AAC_CMD_AIF_NOMORE              (1 << 14)
      442 +#define AAC_CMD_FASTRESP                (1 << 15)
      443 +
      444 +#define AAC_MAXSEGMENTS         16
      445 +
      446 +struct aac_cmd {
      447 +        /*
      448 +         * Note: should be the first member for aac_cmd_queue to work
      449 +         * correctly.
      450 +         */
      451 +        struct aac_cmd *next;
      452 +        struct aac_cmd *prev;
      453 +
      454 +        struct scsi_pkt *pkt;
      455 +        int cmdlen;
      456 +        int flags;
      457 +        uint32_t timeout; /* time when the cmd should have completed */
      458 +        struct buf *bp;
      459 +
      460 +        uint_t segment_cnt;
      461 +        uint_t left_cookien;
      462 +        struct {
      463 +                ddi_dma_handle_t buf_dma_handle;
      464 +                /* For non-aligned buffer and SRB */
      465 +                caddr_t abp;
      466 +                ddi_acc_handle_t abh;
      467 +                uint32_t abp_size;
      468 +                size_t abp_real_size;
      469 +
      470 +                /* Data transfer state */
      471 +                ddi_dma_cookie_t cookie;
      472 +                uint_t left_cookien;
      473 +                struct aac_sge *sgt;
      474 +        } segments[AAC_MAXSEGMENTS];
      475 +        uint_t cur_segment;
      476 +        uint_t cur_win;
      477 +        uint_t total_nwin;
      478 +        size_t total_xfer;
      479 +        uint64_t blkno;
      480 +        uint32_t bcount;        /* buffer size in byte */
      481 +        struct aac_sge *sgt;    /* sg table */
      482 +
      483 +        /* FIB construct function */
      484 +        aac_cmd_fib_t aac_cmd_fib;
      485 +        /* Call back function for completed command */
      486 +        void (*ac_comp)(struct aac_softstate *, struct aac_cmd *);
      487 +
      488 +        struct aac_slot *slotp; /* slot used by this command */
      489 +        struct aac_device *dvp; /* target device */
      490 +
      491 +        /* FIB for this IO command */
      492 +        int fib_size; /* size of the FIB xferred to/from the card */
      493 +        struct aac_fib *fibp;
      494 +};
      495 +
      496 +#ifdef AAC_DEBUG
 518  497  #define AACDB_FLAGS_MASK                0x0000ffff
 519  498  #define AACDB_FLAGS_KERNEL_PRINT        0x00000001
 520  499  #define AACDB_FLAGS_FW_PRINT            0x00000002
 521  500  #define AACDB_FLAGS_NO_HEADERS          0x00000004
 522  501  
 523  502  #define AACDB_FLAGS_MISC                0x00000010
 524  503  #define AACDB_FLAGS_FUNC1               0x00000020
 525  504  #define AACDB_FLAGS_FUNC2               0x00000040
 526  505  #define AACDB_FLAGS_SCMD                0x00000080
 527  506  #define AACDB_FLAGS_AIF                 0x00000100
 528  507  #define AACDB_FLAGS_FIB                 0x00000200
 529  508  #define AACDB_FLAGS_IOCTL               0x00000400
 530  509  
 531      -/*
 532      - * Flags for FIB print
 533      - */
 534      -/* FIB sources */
 535      -#define AACDB_FLAGS_FIB_SCMD            0x00000001
 536      -#define AACDB_FLAGS_FIB_IOCTL           0x00000002
 537      -#define AACDB_FLAGS_FIB_SRB             0x00000004
 538      -#define AACDB_FLAGS_FIB_SYNC            0x00000008
 539      -/* FIB components */
 540      -#define AACDB_FLAGS_FIB_HEADER          0x00000010
 541      -/* FIB states */
 542      -#define AACDB_FLAGS_FIB_TIMEOUT         0x00000100
 543      -
 544  510  extern uint32_t aac_debug_flags;
 545  511  extern int aac_dbflag_on(struct aac_softstate *, int);
 546  512  extern void aac_printf(struct aac_softstate *, uint_t, const char *, ...);
 547      -extern void aac_print_fib(struct aac_softstate *, struct aac_slot *);
 548  513  
 549  514  #define AACDB_PRINT(s, lev, ...) { \
 550  515          if (aac_dbflag_on((s), AACDB_FLAGS_MISC)) \
 551  516                  aac_printf((s), (lev), __VA_ARGS__); }
 552  517  
 553  518  #define AACDB_PRINT_IOCTL(s, ...) { \
 554  519          if (aac_dbflag_on((s), AACDB_FLAGS_IOCTL)) \
 555  520                  aac_printf((s), CE_NOTE, __VA_ARGS__); }
 556  521  
 557  522  #define AACDB_PRINT_TRAN(s, ...) { \
 558  523          if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) \
 559  524                  aac_printf((s), CE_NOTE, __VA_ARGS__); }
 560  525  
 561  526  #define DBCALLED(s, n) { \
 562  527          if (aac_dbflag_on((s), AACDB_FLAGS_FUNC ## n)) \
 563  528                  aac_printf((s), CE_NOTE, "--- %s() called ---", __func__); }
      529 +#else
      530 +#define AACDB_PRINT(s, lev, ...)
      531 +#define AACDB_PRINT_IOCTL(s, ...)
      532 +#define AACDB_PRINT_TRAN(s, ...)
      533 +#define DBCALLED(s, n)
      534 +#endif /* AAC_DEBUG */
 564  535  
      536 +#ifdef AAC_DEBUG_ALL
      537 +extern void aac_print_fib(struct aac_softstate *, struct aac_fib *);
      538 +
 565  539  #define AACDB_PRINT_SCMD(s, x) { \
 566  540          if (aac_dbflag_on((s), AACDB_FLAGS_SCMD)) aac_print_scmd((s), (x)); }
 567  541  
 568  542  #define AACDB_PRINT_AIF(s, x) { \
 569  543          if (aac_dbflag_on((s), AACDB_FLAGS_AIF)) aac_print_aif((s), (x)); }
 570  544  
 571  545  #define AACDB_PRINT_FIB(s, x) { \
 572  546          if (aac_dbflag_on((s), AACDB_FLAGS_FIB)) aac_print_fib((s), (x)); }
 573      -
 574      -#else /* DEBUG */
 575      -
 576      -#define AACDB_PRINT(s, lev, ...)
 577      -#define AACDB_PRINT_IOCTL(s, ...)
 578      -#define AACDB_PRINT_TRAN(s, ...)
      547 +#else
 579  548  #define AACDB_PRINT_FIB(s, x)
 580  549  #define AACDB_PRINT_SCMD(s, x)
 581  550  #define AACDB_PRINT_AIF(s, x)
 582      -#define DBCALLED(s, n)
      551 +#endif /* AAC_DEBUG_ALL */
 583  552  
 584      -#endif /* DEBUG */
 585      -
 586  553  #ifdef  __cplusplus
 587  554  }
 588  555  #endif
 589  556  
 590  557  #endif /* _AAC_H_ */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX