Print this page
Code reconciliation with other base.
Update tx waitq's code.
Create 2 threads, divide the workflow and deliver
to the hardware from the threads.
Optimise mutex's and code paths.
Split out offline target code.
Enable Fast Path for capable devices.
Merge fixes for Illumos issue 4819, fix mpt_sas command timeout handling.
Tweeks debug flags.
Lint and cstyle fixes.
Fix problem with running against 64bit msgaddr attributes for DMA.
Default is now to run like this.
Fixes for Illumos issue 4682.
Fix hang bug to do with tx_wq.
Re-arrange mptsas_poll() to disable interrupts before issuing the
command.
Improve the tx_waitq code path.
Major rework of mutexes.
During normal operation do not grab m_mutex during interrupt.
Use reply post queues instead.
Distribute command done processing around the threads.
Improved auto-request sense memory usage.
Re-arrange mptsas_intr() to reduce number of spurious interrupts.
Should not need m_in_callback flag. It prevents concurrent
command completion processing.
Added code to support using MSI-X interrupts across multiple
reply queues. Not tested with anything other than 3008 yet.
Use MSI-X interrupts, just one for now.
Pre-allocate array for request sense buffers, similar to command frames.
No more messing about with scsi_alloc_consistent_buf().
Add rolling buffer for *all* debug messages.
Improve mdb module and seperate out into mpt_sas3.
Initial modifications using the code changes present between
the LSI source code for FreeBSD drivers. Specifically the changes
between from mpslsi-source-17.00.00.00 -> mpslsi-source-03.00.00.00.
This mainly involves using a different scatter/gather element in
frame setup.
Changes to enable driver to compile.
Header paths, object lists, etc.

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/sys/scsi/adapters/mpt_sas3/mptsas3_var.h
          +++ new/usr/src/uts/common/sys/scsi/adapters/mpt_sas3/mptsas3_var.h
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
       24 + * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
  25   25   * Copyright (c) 2013, Joyent, Inc. All rights reserved.
       26 + * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
  26   27   */
  27   28  
  28   29  /*
  29   30   * Copyright (c) 2000 to 2010, LSI Corporation.
  30   31   * All rights reserved.
  31   32   *
  32   33   * Redistribution and use in source and binary forms of all code within
  33   34   * this file that is exclusively owned by LSI, with or without
  34   35   * modification, is permitted provided that, in addition to the CDDL 1.0
  35   36   * License requirements, the following conditions are met:
↓ open down ↓ 9 lines elided ↑ open up ↑
  45   46   * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  46   47   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  47   48   * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  48   49   * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  49   50   * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  50   51   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  51   52   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  52   53   * DAMAGE.
  53   54   */
  54   55  
  55      -#ifndef _SYS_SCSI_ADAPTERS_MPTVAR_H
  56      -#define _SYS_SCSI_ADAPTERS_MPTVAR_H
       56 +#ifndef _SYS_SCSI_ADAPTERS_MPTSAS3_VAR_H
       57 +#define _SYS_SCSI_ADAPTERS_MPTSAS3_VAR_H
  57   58  
  58   59  #include <sys/byteorder.h>
       60 +#include <sys/queue.h>
  59   61  #include <sys/isa_defs.h>
  60   62  #include <sys/sunmdi.h>
  61   63  #include <sys/mdi_impldefs.h>
  62      -#include <sys/scsi/adapters/mpt_sas/mptsas_hash.h>
  63      -#include <sys/scsi/adapters/mpt_sas/mptsas_ioctl.h>
  64      -#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_tool.h>
  65      -#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_cnfg.h>
       64 +#include <sys/scsi/adapters/mpt_sas3/mptsas3_hash.h>
       65 +#include <sys/scsi/adapters/mpt_sas3/mptsas3_ioctl.h>
       66 +#include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_tool.h>
       67 +#include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_cnfg.h>
  66   68  
  67   69  #ifdef  __cplusplus
  68   70  extern "C" {
  69   71  #endif
  70   72  
  71   73  /*
  72   74   * Compile options
  73   75   */
  74   76  #ifdef DEBUG
  75   77  #define MPTSAS_DEBUG            /* turn on debugging code */
↓ open down ↓ 58 lines elided ↑ open up ↑
 134  136  #define MPTSAS_MAX_DMA_SEGS     1
 135  137  #define MPTSAS_MAX_CMD_SEGS     1
 136  138  #else
 137  139  #define MPTSAS_MAX_DMA_SEGS     256
 138  140  #define MPTSAS_MAX_CMD_SEGS     257
 139  141  #endif
 140  142  #define MPTSAS_MAX_FRAME_SGES(mpt) \
 141  143          (((mpt->m_req_frame_size - (sizeof (MPI2_SCSI_IO_REQUEST))) / 8) + 1)
 142  144  
 143  145  /*
 144      - * Caculating how many 64-bit DMA simple elements can be stored in the first
      146 + * Calculating how many 64-bit DMA simple elements can be stored in the first
 145  147   * frame. Note that msg_scsi_io_request contains 2 double-words (8 bytes) for
 146  148   * element storage.  And 64-bit dma element is 3 double-words (12 bytes) in
 147      - * size.
      149 + * size. IEEE 64-bit dma element used for SAS3 controllers is 4 double-words
      150 + * (16 bytes).
 148  151   */
 149  152  #define MPTSAS_MAX_FRAME_SGES64(mpt) \
 150  153          ((mpt->m_req_frame_size - \
 151      -        (sizeof (MPI2_SCSI_IO_REQUEST)) + sizeof (MPI2_SGE_IO_UNION)) / 12)
      154 +        sizeof (MPI2_SCSI_IO_REQUEST) + sizeof (MPI2_SGE_IO_UNION)) / \
      155 +        (mpt->m_MPI25 ? sizeof (MPI2_IEEE_SGE_SIMPLE64) : \
      156 +        sizeof (MPI2_SGE_SIMPLE64)))
 152  157  
 153  158  /*
 154  159   * Scatter-gather list structure defined by HBA hardware
 155  160   */
 156  161  typedef struct NcrTableIndirect {       /* Table Indirect entries */
 157  162          uint32_t count;         /* 24 bit count */
 158  163          union {
 159  164                  uint32_t address32;     /* 32 bit address */
 160  165                  struct {
 161  166                          uint32_t Low;
↓ open down ↓ 31 lines elided ↑ open up ↑
 193  198   * format unit address.
 194  199   */
 195  200  #define MPTSAS_RAID_WWID(wwid) \
 196  201          ((wwid & 0x0FFFFFFFFFFFFFFF) | 0x3000000000000000)
 197  202  
 198  203  typedef struct mptsas_target_addr {
 199  204          uint64_t mta_wwn;
 200  205          mptsas_phymask_t mta_phymask;
 201  206  } mptsas_target_addr_t;
 202  207  
      208 +TAILQ_HEAD(mptsas_active_cmdq, mptsas_cmd);
      209 +typedef struct mptsas_active_cmdq mptsas_active_cmdq_t;
      210 +
 203  211  typedef struct mptsas_target {
      212 +                kmutex_t                m_t_mutex;
 204  213                  mptsas_target_addr_t    m_addr;
 205  214                  refhash_link_t          m_link;
 206      -                uint8_t                 m_dr_flag;
 207  215                  uint16_t                m_devhdl;
 208  216                  uint32_t                m_deviceinfo;
 209      -                uint8_t                 m_phynum;
 210  217                  uint32_t                m_dups;
 211      -                int32_t                 m_timeout;
 212      -                int32_t                 m_timebase;
      218 +                uint8_t                 m_phynum;
      219 +                mptsas_active_cmdq_t    m_active_cmdq;
 213  220                  int32_t                 m_t_throttle;
 214  221                  int32_t                 m_t_ncmds;
 215  222                  int32_t                 m_reset_delay;
 216  223                  int32_t                 m_t_nwait;
 217      -
 218      -                uint16_t                m_qfull_retry_interval;
 219      -                uint8_t                 m_qfull_retries;
      224 +                uint16_t                m_io_flags;
 220  225                  uint16_t                m_enclosure;
 221  226                  uint16_t                m_slot_num;
 222      -                uint32_t                m_tgt_unconfigured;
      227 +                uint16_t                m_qfull_retry_interval;
      228 +                uint8_t                 m_qfull_retries;
      229 +                uint8_t                 m_tgt_unconfigured;
 223  230                  uint8_t                 m_led_status;
 224      -
      231 +                uint8_t                 m_dr_flag;
 225  232  } mptsas_target_t;
 226  233  
      234 +/*
      235 + * If you change this structure, be sure that mptsas_smp_target_copy()
      236 + * does the right thing.
      237 + */
 227  238  typedef struct mptsas_smp {
 228  239          mptsas_target_addr_t    m_addr;
 229  240          refhash_link_t          m_link;
 230  241          uint16_t                m_devhdl;
 231  242          uint32_t                m_deviceinfo;
 232  243          uint16_t                m_pdevhdl;
 233  244          uint32_t                m_pdevinfo;
 234  245  } mptsas_smp_t;
 235  246  
 236  247  typedef struct mptsas_cache_frames {
 237  248          ddi_dma_handle_t m_dma_hdl;
 238  249          ddi_acc_handle_t m_acc_hdl;
 239  250          caddr_t m_frames_addr;
 240      -        uint32_t m_phys_addr;
      251 +        uint64_t m_phys_addr;
 241  252  } mptsas_cache_frames_t;
 242  253  
 243  254  typedef struct  mptsas_cmd {
 244  255          uint_t                  cmd_flags;      /* flags from scsi_init_pkt */
 245  256          ddi_dma_handle_t        cmd_dmahandle;  /* dma handle */
 246  257          ddi_dma_cookie_t        cmd_cookie;
 247  258          uint_t                  cmd_cookiec;
 248  259          uint_t                  cmd_winindex;
 249  260          uint_t                  cmd_nwin;
 250  261          uint_t                  cmd_cur_cookie;
 251  262          off_t                   cmd_dma_offset;
 252  263          size_t                  cmd_dma_len;
 253  264          uint32_t                cmd_totaldmacount;
 254      -
 255      -        ddi_dma_handle_t        cmd_arqhandle;  /* dma arq handle */
 256      -        ddi_dma_cookie_t        cmd_arqcookie;
 257      -        struct buf              *cmd_arq_buf;
 258      -        ddi_dma_handle_t        cmd_ext_arqhandle; /* dma extern arq handle */
 259      -        ddi_dma_cookie_t        cmd_ext_arqcookie;
 260      -        struct buf              *cmd_ext_arq_buf;
      265 +        caddr_t                 cmd_arq_buf;
 261  266  
 262  267          int                     cmd_pkt_flags;
 263  268  
 264      -        /* timer for command in active slot */
 265      -        int                     cmd_active_timeout;
      269 +        /* pending expiration time for command in active slot */
      270 +        hrtime_t                cmd_active_expiration;
      271 +        TAILQ_ENTRY(mptsas_cmd) cmd_active_link;
 266  272  
 267  273          struct scsi_pkt         *cmd_pkt;
 268  274          struct scsi_arq_status  cmd_scb;
 269  275          uchar_t                 cmd_cdblen;     /* length of cdb */
 270  276          uchar_t                 cmd_rqslen;     /* len of requested rqsense */
 271  277          uchar_t                 cmd_privlen;
      278 +        uint16_t                cmd_extrqslen;  /* len of extended rqsense */
      279 +        uint16_t                cmd_extrqschunks; /* len in map chunks */
      280 +        uint16_t                cmd_extrqsidx;  /* Index into map */
 272  281          uint_t                  cmd_scblen;
 273  282          uint32_t                cmd_dmacount;
 274  283          uint64_t                cmd_dma_addr;
 275  284          uchar_t                 cmd_age;
 276  285          ushort_t                cmd_qfull_retries;
 277  286          uchar_t                 cmd_queued;     /* true if queued */
 278  287          struct mptsas_cmd       *cmd_linkp;
 279  288          mptti_t                 *cmd_sg; /* Scatter/Gather structure */
 280  289          uchar_t                 cmd_cdb[SCSI_CDB_SIZE];
 281  290          uint64_t                cmd_pkt_private[PKT_PRIV_LEN];
 282  291          uint32_t                cmd_slot;
 283  292          uint32_t                ioc_cmd_slot;
      293 +        uint8_t                 cmd_rpqidx;
 284  294  
 285  295          mptsas_cache_frames_t   *cmd_extra_frames;
 286  296  
 287  297          uint32_t                cmd_rfm;
 288  298          mptsas_target_t         *cmd_tgt_addr;
 289  299  } mptsas_cmd_t;
 290  300  
 291  301  /*
 292  302   * These are the defined cmd_flags for this structure.
 293  303   */
↓ open down ↓ 15 lines elided ↑ open up ↑
 309  319  #define CFLAG_CDBEXTERN         0x004000 /* cdb kmem_alloc'd */
 310  320  #define CFLAG_SCBEXTERN         0x008000 /* scb kmem_alloc'd */
 311  321  #define CFLAG_FREE              0x010000 /* packet is on free list */
 312  322  #define CFLAG_PRIVEXTERN        0x020000 /* target private kmem_alloc'd */
 313  323  #define CFLAG_DMA_PARTIAL       0x040000 /* partial xfer OK */
 314  324  #define CFLAG_QFULL_STATUS      0x080000 /* pkt got qfull status */
 315  325  #define CFLAG_TIMEOUT           0x100000 /* passthru/config command timeout */
 316  326  #define CFLAG_PMM_RECEIVED      0x200000 /* use cmd_pmm* for saving pointers */
 317  327  #define CFLAG_RETRY             0x400000 /* cmd has been retried */
 318  328  #define CFLAG_CMDIOC            0x800000 /* cmd is just for for ioc, no io */
 319      -#define CFLAG_EXTARQBUFVALID    0x1000000 /* extern arq buf handle is valid */
 320  329  #define CFLAG_PASSTHRU          0x2000000 /* cmd is a passthrough command */
 321  330  #define CFLAG_XARQ              0x4000000 /* cmd requests for extra sense */
 322  331  #define CFLAG_CMDACK            0x8000000 /* cmd for event ack */
 323  332  #define CFLAG_TXQ               0x10000000 /* cmd queued in the tx_waitq */
 324  333  #define CFLAG_FW_CMD            0x20000000 /* cmd is a fw up/down command */
 325  334  #define CFLAG_CONFIG            0x40000000 /* cmd is for config header/page */
 326  335  #define CFLAG_FW_DIAG           0x80000000 /* cmd is for FW diag buffers */
 327  336  
      337 +#ifdef MPTSAS_DEBUG
      338 +/* Could be used with cmn_err %b */
      339 +#define CFLAGS_DEBUG_BITS "\\020\\0CmdDisc\\1Watch\\2Finished\\3ChkSeg" \
      340 +        "\\4Cmpltd\\5Prepd\\6InTran\\7RestPtrs\\8ARQIP\\9TM\\10CArq" \
      341 +        "\\11DMAVal\\12DMASnd\\13CIopb\\14CDBExt\\15SCBExt\\16Free" \
      342 +        "\\17PrivExt\\18DMAPrtl\\19QFull\\20Tout\\21PMMRcv\\22Retry" \
      343 +        "\\23CIoc\\25PThru\\26XArq\\27CAck\\28TXq\\29FWCmd\\30Config\\31FWDiag"
      344 +#endif
      345 +
 328  346  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_SIZE                     8
 329  347  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_MASK                     0xC0
 330  348  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_PERIPHERAL                       0x00
 331  349  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_FLAT_SPACE                       0x40
 332  350  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT             0x80
 333  351  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_EXTENDED_UNIT            0xC0
 334  352  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_2B          0x00
 335  353  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_4B          0x01
 336  354  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_6B          0x10
 337  355  #define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_8B          0x20
↓ open down ↓ 17 lines elided ↑ open up ↑
 355  373  } mptsas_dma_alloc_state_t;
 356  374  
 357  375  /*
 358  376   * passthrough request structure
 359  377   */
 360  378  typedef struct mptsas_pt_request {
 361  379          uint8_t *request;
 362  380          uint32_t request_size;
 363  381          uint32_t data_size;
 364  382          uint32_t dataout_size;
 365      -        uint32_t direction;
      383 +        uint8_t direction;
      384 +        uint8_t simple;
      385 +        uint16_t sgl_offset;
 366  386          ddi_dma_cookie_t data_cookie;
 367  387          ddi_dma_cookie_t dataout_cookie;
 368  388  } mptsas_pt_request_t;
 369  389  
 370  390  /*
 371  391   * config page request structure
 372  392   */
 373  393  typedef struct mptsas_config_request {
 374  394          uint32_t        page_address;
 375  395          uint8_t         action;
↓ open down ↓ 165 lines elided ↑ open up ↑
 541  561  #define DEV_INFO_FAIL_PAGE0             0x1
 542  562  #define DEV_INFO_WRONG_DEVICE_TYPE      0x2
 543  563  #define DEV_INFO_PHYS_DISK              0x3
 544  564  #define DEV_INFO_FAIL_ALLOC             0x4
 545  565  
 546  566  /*
 547  567   * mpt hotplug event defines
 548  568   */
 549  569  #define MPTSAS_DR_EVENT_RECONFIG_TARGET 0x01
 550  570  #define MPTSAS_DR_EVENT_OFFLINE_TARGET  0x02
 551      -#define MPTSAS_TOPO_FLAG_REMOVE_HANDLE  0x04
      571 +#define MPTSAS_DR_EVENT_REMOVE_HANDLE   0x04
 552  572  
 553  573  /*
 554  574   * SMP target hotplug events
 555  575   */
 556  576  #define MPTSAS_DR_EVENT_RECONFIG_SMP    0x10
 557  577  #define MPTSAS_DR_EVENT_OFFLINE_SMP     0x20
 558  578  #define MPTSAS_DR_EVENT_MASK            0x3F
 559  579  
 560  580  /*
 561  581   * mpt hotplug status definition for m_dr_flag
↓ open down ↓ 73 lines elided ↑ open up ↑
 635  655          uint8_t                 port_num;
 636  656          uint8_t                 port_flags;
 637  657          uint16_t                ctrl_devhdl;
 638  658          uint32_t                phy_device_type;
 639  659          uint16_t                attached_devhdl;
 640  660          mptsas_phymask_t        phy_mask;
 641  661          smhba_info_t            smhba_info;
 642  662  } mptsas_phy_info_t;
 643  663  
 644  664  
 645      -typedef struct mptsas_doneq_thread_arg {
      665 +typedef struct mptsas_thread_arg {
 646  666          void            *mpt;
 647      -        uint64_t        t;
 648      -} mptsas_doneq_thread_arg_t;
      667 +        uint32_t        t;
      668 +} mptsas_thread_arg_t;
      669 +
      670 +typedef struct mptsas_done_list {
      671 +        mptsas_cmd_t            *dl_q;
      672 +        mptsas_cmd_t            **dl_tail;
      673 +        uint32_t                dl_len;
      674 +} mptsas_done_list_t;
 649  675  
 650  676  #define MPTSAS_DONEQ_THREAD_ACTIVE      0x1
 651  677  typedef struct mptsas_doneq_thread_list {
 652      -        mptsas_cmd_t            *doneq;
 653      -        mptsas_cmd_t            **donetail;
      678 +        mptsas_done_list_t      dlist;
 654  679          kthread_t               *threadp;
 655  680          kcondvar_t              cv;
 656  681          ushort_t                reserv1;
 657  682          uint32_t                reserv2;
 658  683          kmutex_t                mutex;
 659  684          uint32_t                flag;
 660      -        uint32_t                len;
 661      -        mptsas_doneq_thread_arg_t       arg;
      685 +        mptsas_thread_arg_t     arg;
 662  686  } mptsas_doneq_thread_list_t;
 663  687  
      688 +typedef struct mptsas_reply_pqueue {
      689 +        kmutex_t                rpq_mutex;
      690 +        uint8_t                 rpq_num;
      691 +        caddr_t                 rpq_queue; /* Pointer to this queue base */
      692 +        uint32_t                rpq_index; /* Index of next replyq entry */
      693 +        uint32_t                rpq_ncmds; /* Number of outstanding commands */
      694 +        mptsas_done_list_t      rpq_dlist;
      695 +        uint32_t                rpq_intr_count;
      696 +        uint32_t                rpq_intr_unclaimed;
      697 +        uint32_t                rpq_intr_mutexbusy;
      698 +} mptsas_reply_pqueue_t;
      699 +
      700 +
      701 +typedef struct mptsas_tx_waitqueue {
      702 +        kmutex_t        txwq_mutex;
      703 +        kcondvar_t      txwq_cv;
      704 +        kcondvar_t      txwq_drain_cv;
      705 +        kthread_t       *txwq_threadp;
      706 +        mptsas_cmd_t    *txwq_cmdq;     /* TX cmd queue for active request */
      707 +        mptsas_cmd_t    **txwq_qtail;   /* tx_wait queue tail ptr */
      708 +        uint32_t        txwq_len;       /* TX queue length */
      709 +        mptsas_thread_arg_t     arg;
      710 +        uint8_t         txwq_active;    /* Thread active flag */
      711 +        uint8_t         txwq_draining;  /* TX queue draining flag */
      712 +        uint8_t         txwq_wdrain;
      713 +} mptsas_tx_waitqueue_t;
      714 +
      715 +#define NUM_TX_WAITQ    2
      716 +
 664  717  typedef struct mptsas {
 665  718          int             m_instance;
 666  719  
 667  720          struct mptsas *m_next;
 668  721  
 669  722          scsi_hba_tran_t         *m_tran;
 670  723          smp_hba_tran_t          *m_smptran;
 671  724          kmutex_t                m_mutex;
 672  725          kmutex_t                m_passthru_mutex;
 673  726          kcondvar_t              m_cv;
↓ open down ↓ 6 lines elided ↑ open up ↑
 680  733          /*
 681  734           * soft state flags
 682  735           */
 683  736          uint_t          m_softstate;
 684  737  
 685  738          refhash_t       *m_targets;
 686  739          refhash_t       *m_smp_targets;
 687  740  
 688  741          m_raidconfig_t  m_raidconfig[MPTSAS_MAX_RAIDCONFIGS];
 689  742          uint8_t         m_num_raid_configs;
      743 +        uint8_t         m_pref_tx_waitq;
 690  744  
 691  745          struct mptsas_slots *m_active;  /* outstanding cmds */
 692  746  
 693  747          mptsas_cmd_t    *m_waitq;       /* cmd queue for active request */
 694  748          mptsas_cmd_t    **m_waitqtail;  /* wait queue tail ptr */
 695      -
 696      -        kmutex_t        m_tx_waitq_mutex;
 697      -        mptsas_cmd_t    *m_tx_waitq;    /* TX cmd queue for active request */
 698      -        mptsas_cmd_t    **m_tx_waitqtail;       /* tx_wait queue tail ptr */
 699      -        int             m_tx_draining;  /* TX queue draining flag */
 700      -
 701      -        mptsas_cmd_t    *m_doneq;       /* queue of completed commands */
 702      -        mptsas_cmd_t    **m_donetail;   /* queue tail ptr */
      749 +        mptsas_tx_waitqueue_t   m_tx_waitq[NUM_TX_WAITQ];
      750 +        uint16_t                m_txwq_thread_threshold;
      751 +        uint16_t                m_txwq_thread_n;
      752 +        uint8_t                 m_txwq_enabled;
      753 +        uint8_t                 m_txwq_allow_q_jumping;
      754 +        mptsas_done_list_t      m_dlist; /* List of completed commands */
 703  755  
 704  756          /*
 705  757           * variables for helper threads (fan-out interrupts)
 706  758           */
 707  759          mptsas_doneq_thread_list_t      *m_doneq_thread_id;
 708      -        uint32_t                m_doneq_thread_n;
      760 +        uint16_t                m_doneq_thread_n;
      761 +        uint16_t                m_doneq_next_thread;
 709  762          uint32_t                m_doneq_thread_threshold;
 710  763          uint32_t                m_doneq_length_threshold;
 711      -        uint32_t                m_doneq_len;
 712      -        kcondvar_t              m_doneq_thread_cv;
 713      -        kmutex_t                m_doneq_mutex;
      764 +        kcondvar_t              m_qthread_cv;
      765 +        kmutex_t                m_qthread_mutex;
 714  766  
 715      -        int             m_ncmds;        /* number of outstanding commands */
      767 +        uint32_t                m_ncmds; /* number of outstanding commands */
      768 +        uint32_t                m_ncstarted; /* ncmds started per interval */
      769 +        uint32_t                m_lncstarted; /* record of last value */
 716  770          m_event_struct_t *m_ioc_event_cmdq;     /* cmd queue for ioc event */
 717  771          m_event_struct_t **m_ioc_event_cmdtail; /* ioc cmd queue tail */
 718  772  
 719  773          ddi_acc_handle_t m_datap;       /* operating regs data access handle */
 720  774  
 721  775          struct _MPI2_SYSTEM_INTERFACE_REGS      *m_reg;
 722  776  
 723  777          ushort_t        m_devid;        /* device id of chip. */
 724  778          uchar_t         m_revid;        /* revision of chip. */
 725  779          uint16_t        m_svid;         /* subsystem Vendor ID of chip */
 726  780          uint16_t        m_ssid;         /* subsystem Device ID of chip */
 727  781  
 728  782          uchar_t         m_sync_offset;  /* default offset for this chip. */
 729  783  
 730  784          timeout_id_t    m_quiesce_timeid;
 731  785  
 732  786          ddi_dma_handle_t m_dma_req_frame_hdl;
 733  787          ddi_acc_handle_t m_acc_req_frame_hdl;
      788 +        ddi_dma_handle_t m_dma_req_sense_hdl;
      789 +        ddi_acc_handle_t m_acc_req_sense_hdl;
 734  790          ddi_dma_handle_t m_dma_reply_frame_hdl;
 735  791          ddi_acc_handle_t m_acc_reply_frame_hdl;
 736  792          ddi_dma_handle_t m_dma_free_queue_hdl;
 737  793          ddi_acc_handle_t m_acc_free_queue_hdl;
 738  794          ddi_dma_handle_t m_dma_post_queue_hdl;
 739  795          ddi_acc_handle_t m_acc_post_queue_hdl;
      796 +        uint8_t         m_dma_flags;
 740  797  
 741  798          /*
 742  799           * list of reset notification requests
 743  800           */
 744  801          struct scsi_reset_notify_entry  *m_reset_notify_listf;
 745  802  
 746  803          /*
 747  804           * qfull handling
 748  805           */
 749  806          timeout_id_t    m_restart_cmd_timeid;
↓ open down ↓ 9 lines elided ↑ open up ↑
 759  816          uchar_t         m_suspended;    /* true if driver is suspended */
 760  817  
 761  818          struct kmem_cache *m_kmem_cache;
 762  819          struct kmem_cache *m_cache_frames;
 763  820  
 764  821          /*
 765  822           * hba options.
 766  823           */
 767  824          uint_t          m_options;
 768  825  
 769      -        int             m_in_callback;
 770      -
 771  826          int             m_power_level;  /* current power level */
 772  827  
 773  828          int             m_busy;         /* power management busy state */
 774  829  
 775  830          off_t           m_pmcsr_offset; /* PMCSR offset */
 776  831  
 777  832          ddi_acc_handle_t m_config_handle;
 778  833  
 779  834          ddi_dma_attr_t          m_io_dma_attr;  /* Used for data I/O */
 780  835          ddi_dma_attr_t          m_msg_dma_attr; /* Used for message frames */
 781  836          ddi_device_acc_attr_t   m_dev_acc_attr;
 782  837          ddi_device_acc_attr_t   m_reg_acc_attr;
 783  838  
 784  839          /*
 785  840           * request/reply variables
 786  841           */
 787  842          caddr_t         m_req_frame;
 788  843          uint64_t        m_req_frame_dma_addr;
      844 +        caddr_t         m_req_sense;
      845 +        caddr_t         m_extreq_sense;
      846 +        uint64_t        m_req_sense_dma_addr;
 789  847          caddr_t         m_reply_frame;
 790  848          uint64_t        m_reply_frame_dma_addr;
 791  849          caddr_t         m_free_queue;
 792  850          uint64_t        m_free_queue_dma_addr;
 793  851          caddr_t         m_post_queue;
 794  852          uint64_t        m_post_queue_dma_addr;
      853 +        struct map      *m_erqsense_map;
      854 +        mptsas_reply_pqueue_t   *m_rep_post_queues;
 795  855  
 796  856          m_replyh_arg_t *m_replyh_args;
 797  857  
 798  858          uint16_t        m_max_requests;
 799  859          uint16_t        m_req_frame_size;
      860 +        uint16_t        m_req_sense_size;
 800  861  
 801  862          /*
 802      -         * Max frames per request reprted in IOC Facts
      863 +         * Max frames per request reported in IOC Facts
 803  864           */
 804  865          uint8_t         m_max_chain_depth;
 805  866          /*
 806  867           * Max frames per request which is used in reality. It's adjusted
 807  868           * according DMA SG length attribute, and shall not exceed the
 808  869           * m_max_chain_depth.
 809  870           */
 810  871          uint8_t         m_max_request_frames;
      872 +        uint8_t         m_max_msix_vectors;
      873 +        uint8_t         m_reply_frame_size;
      874 +        uint8_t         m_post_reply_qcount;
 811  875  
 812  876          uint16_t        m_free_queue_depth;
 813  877          uint16_t        m_post_queue_depth;
 814  878          uint16_t        m_max_replies;
 815  879          uint32_t        m_free_index;
 816      -        uint32_t        m_post_index;
 817      -        uint8_t         m_reply_frame_size;
 818  880          uint32_t        m_ioc_capabilities;
 819  881  
 820  882          /*
      883 +         * Housekeeping.
      884 +         */
      885 +        uint64_t        m_interrupt_count;
      886 +        uint32_t        m_unclaimed_pm_interrupt_count;
      887 +        uint32_t        m_unclaimed_polled_interrupt_count;
      888 +        uint32_t        m_unclaimed_no_interrupt_count;
      889 +        uint32_t        m_unclaimed_nocmd_interrupt_count;
      890 +
      891 +        /*
 821  892           * indicates if the firmware was upload by the driver
 822  893           * at boot time
 823  894           */
 824  895          ushort_t        m_fwupload;
 825  896  
 826  897          uint16_t        m_productid;
 827  898  
 828  899          /*
 829  900           * per instance data structures for dma memory resources for
 830  901           * MPI handshake protocol. only one handshake cmd can run at a time.
↓ open down ↓ 53 lines elided ↑ open up ↑
 884  955          uint32_t                m_event_number;
 885  956          uint32_t                m_event_mask[4];
 886  957          mptsas_event_entry_t    m_events[MPTSAS_EVENT_QUEUE_SIZE];
 887  958  
 888  959          /*
 889  960           * FW diag Buffer List
 890  961           */
 891  962          mptsas_fw_diagnostic_buffer_t
 892  963                  m_fw_diag_buffer_list[MPI2_DIAG_BUF_TYPE_COUNT];
 893  964  
      965 +        /* GEN3 support */
      966 +        uint8_t                 m_MPI25;
      967 +
 894  968          /*
 895  969           * Event Replay flag (MUR support)
 896  970           */
 897  971          uint8_t                 m_event_replay;
 898  972  
 899  973          /*
 900  974           * IR Capable flag
 901  975           */
 902  976          uint8_t                 m_ir_capable;
 903  977  
↓ open down ↓ 24 lines elided ↑ open up ↑
 928 1002          ((physicalport == physport) || (dynamicport && (phymask & \
 929 1003          (1 << physport))))
 930 1004  
 931 1005  _NOTE(MUTEX_PROTECTS_DATA(mptsas::m_mutex, mptsas))
 932 1006  _NOTE(SCHEME_PROTECTS_DATA("safe sharing", mptsas::m_next))
 933 1007  _NOTE(SCHEME_PROTECTS_DATA("stable data", mptsas::m_dip mptsas::m_tran))
 934 1008  _NOTE(SCHEME_PROTECTS_DATA("stable data", mptsas::m_kmem_cache))
 935 1009  _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_io_dma_attr.dma_attr_sgllen))
 936 1010  _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_devid))
 937 1011  _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_productid))
 938      -_NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_port_type))
 939 1012  _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_mpxio_enable))
 940      -_NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_ntargets))
 941 1013  _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_instance))
 942 1014  
 943 1015  /*
 944 1016   * These should eventually migrate into the mpt header files
 945 1017   * that may become the /kernel/misc/mpt module...
 946 1018   */
 947 1019  #define mptsas_init_std_hdr(hdl, mp, DevHandle, Lun, ChainOffset, Function) \
 948 1020          mptsas_put_msg_DevHandle(hdl, mp, DevHandle); \
 949 1021          mptsas_put_msg_ChainOffset(hdl, mp, ChainOffset); \
 950 1022          mptsas_put_msg_Function(hdl, mp, Function); \
↓ open down ↓ 27 lines elided ↑ open up ↑
 978 1050                  MPI2_WRSEQ_4TH_KEY_VALUE); \
 979 1051          ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
 980 1052                  MPI2_WRSEQ_5TH_KEY_VALUE); \
 981 1053          ddi_put32(hdl->m_datap, &hdl->m_reg->WriteSequence, \
 982 1054                  MPI2_WRSEQ_6TH_KEY_VALUE);
 983 1055  
 984 1056  /*
 985 1057   * m_options flags
 986 1058   */
 987 1059  #define MPTSAS_OPT_PM           0x01    /* Power Management */
     1060 +#define MPTSAS_OPT_MSI          0x02    /* PCI MSI Interrupts */
     1061 +#define MPTSAS_OPT_MSI_X        0x04    /* PCI MSI-X Interrupts */
 988 1062  
 989 1063  /*
 990 1064   * m_softstate flags
 991 1065   */
 992 1066  #define MPTSAS_SS_DRAINING              0x02
 993 1067  #define MPTSAS_SS_QUIESCED              0x04
 994 1068  #define MPTSAS_SS_MSG_UNIT_RESET        0x08
 995 1069  #define MPTSAS_DID_MSG_UNIT_RESET       0x10
 996 1070  
 997 1071  /*
     1072 + * m_dma_flags (allocated).
     1073 + */
     1074 +#define MPTSAS_REQ_FRAME        0x01
     1075 +#define MPTSAS_REQ_SENSE        0x02
     1076 +#define MPTSAS_REPLY_FRAME      0x04
     1077 +#define MPTSAS_FREE_QUEUE       0x08
     1078 +#define MPTSAS_POST_QUEUE       0x10
     1079 +
     1080 +/*
 998 1081   * regspec defines.
 999 1082   */
1000 1083  #define CONFIG_SPACE    0       /* regset[0] - configuration space */
1001 1084  #define IO_SPACE        1       /* regset[1] - used for i/o mapped device */
1002 1085  #define MEM_SPACE       2       /* regset[2] - used for memory mapped device */
1003 1086  #define BASE_REG2       3       /* regset[3] - used for 875 scripts ram */
1004 1087  
1005 1088  /*
1006 1089   * Handy constants
1007 1090   */
1008 1091  #define FALSE           0
1009 1092  #define TRUE            1
     1093 +#define BLOCKED         2
1010 1094  #define UNDEFINED       -1
1011 1095  #define FAILED          -2
1012 1096  
1013 1097  /*
1014 1098   * power management.
1015 1099   */
1016 1100  #define MPTSAS_POWER_ON(mpt) { \
1017 1101          pci_config_put16(mpt->m_config_handle, mpt->m_pmcsr_offset, \
1018 1102              PCI_PMCSR_D0); \
1019 1103          delay(drv_usectohz(10000)); \
↓ open down ↓ 78 lines elided ↑ open up ↑
1098 1182  #define MPTSAS_SET_SIGP(P) \
1099 1183                  ClrSetBits(mpt->m_devaddr + NREG_ISTAT, 0, NB_ISTAT_SIGP)
1100 1184  
1101 1185  #define MPTSAS_RESET_SIGP(P) (void) ddi_get8(mpt->m_datap, \
1102 1186                          (uint8_t *)(mpt->m_devaddr + NREG_CTEST2))
1103 1187  
1104 1188  #define MPTSAS_GET_INTCODE(P) (ddi_get32(mpt->m_datap, \
1105 1189                          (uint32_t *)(mpt->m_devaddr + NREG_DSPS)))
1106 1190  
1107 1191  
1108      -#define MPTSAS_START_CMD(mpt, req_desc_lo, req_desc_hi) \
1109      -        ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostLow,\
1110      -            req_desc_lo);\
1111      -        ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostHigh,\
1112      -            req_desc_hi);
     1192 +#define MPTSAS_START_CMD(mpt, req_desc) \
     1193 +        ddi_put64(mpt->m_datap, \
     1194 +            (uint64_t *)(void *)&mpt->m_reg->RequestDescriptorPostLow, \
     1195 +            req_desc);                                                 \
     1196 +        atomic_inc_32(&mpt->m_ncstarted)
     1197 +
1113 1198  
1114 1199  #define INTPENDING(mpt) \
1115 1200          (MPTSAS_GET_ISTAT(mpt) & MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT)
1116 1201  
1117 1202  /*
1118 1203   * Mask all interrupts to disable
1119 1204   */
1120 1205  #define MPTSAS_DISABLE_INTR(mpt)        \
1121 1206          ddi_put32((mpt)->m_datap, &(mpt)->m_reg->HostInterruptMask, \
1122 1207              (MPI2_HIM_RIM | MPI2_HIM_DIM | MPI2_HIM_RESET_IRQ_MASK))
1123 1208  
1124 1209  /*
1125 1210   * Mask Doorbell and Reset interrupts to enable reply desc int.
1126 1211   */
1127 1212  #define MPTSAS_ENABLE_INTR(mpt) \
1128 1213          ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptMask, \
1129 1214          (MPI2_HIM_DIM | MPI2_HIM_RESET_IRQ_MASK))
1130 1215  
1131      -#define MPTSAS_GET_NEXT_REPLY(mpt, index)  \
1132      -        &((uint64_t *)(void *)mpt->m_post_queue)[index]
     1216 +#define MPTSAS_GET_NEXT_REPLY(rpqp, index)  \
     1217 +        &((uint64_t *)(void *)rpqp->rpq_queue)[index]
1133 1218  
1134 1219  #define MPTSAS_GET_NEXT_FRAME(mpt, SMID) \
1135 1220          (mpt->m_req_frame + (mpt->m_req_frame_size * SMID))
1136 1221  
1137 1222  #define ClrSetBits32(hdl, reg, clr, set) \
1138 1223          ddi_put32(hdl, (reg), \
1139 1224              ((ddi_get32(mpt->m_datap, (reg)) & ~(clr)) | (set)))
1140 1225  
1141 1226  #define ClrSetBits(reg, clr, set) \
1142 1227          ddi_put8(mpt->m_datap, (uint8_t *)(reg), \
↓ open down ↓ 15 lines elided ↑ open up ↑
1158 1243                          mpt->m_tx_waitqtail = &mpt->m_tx_waitq; \
1159 1244                  cmdp->cmd_linkp = NULL; \
1160 1245                  cmdp->cmd_queued = FALSE; \
1161 1246          }
1162 1247  
1163 1248  /*
1164 1249   * defaults for the global properties
1165 1250   */
1166 1251  #define DEFAULT_SCSI_OPTIONS    SCSI_OPTIONS_DR
1167 1252  #define DEFAULT_TAG_AGE_LIMIT   2
1168      -#define DEFAULT_WD_TICK         10
     1253 +#define DEFAULT_WD_TICK         1
1169 1254  
1170 1255  /*
1171 1256   * invalid hostid.
1172 1257   */
1173 1258  #define MPTSAS_INVALID_HOSTID  -1
1174 1259  
1175 1260  /*
1176 1261   * Get/Set hostid from SCSI port configuration page
1177 1262   */
1178 1263  #define MPTSAS_GET_HOST_ID(configuration) (configuration & 0xFF)
↓ open down ↓ 66 lines elided ↑ open up ↑
1245 1330  
1246 1331  /*
1247 1332   * Shared functions
1248 1333   */
1249 1334  int mptsas_save_cmd(struct mptsas *mpt, struct mptsas_cmd *cmd);
1250 1335  void mptsas_remove_cmd(mptsas_t *mpt, mptsas_cmd_t *cmd);
1251 1336  void mptsas_waitq_add(mptsas_t *mpt, mptsas_cmd_t *cmd);
1252 1337  void mptsas_log(struct mptsas *mpt, int level, char *fmt, ...);
1253 1338  int mptsas_poll(mptsas_t *mpt, mptsas_cmd_t *poll_cmd, int polltime);
1254 1339  int mptsas_do_dma(mptsas_t *mpt, uint32_t size, int var, int (*callback)());
1255      -int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action,
1256      -        uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber,
1257      -        uint8_t pageversion, uint8_t pagelength, uint32_t
1258      -        SGEflagslength, uint32_t SGEaddress32);
1259      -int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
1260      -        uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
1261      -        uint8_t pageversion, uint16_t extpagelength,
1262      -        uint32_t SGEflagslength, uint32_t SGEaddress32);
1263 1340  int mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size,
1264 1341          uint8_t type, int mode);
1265 1342  int mptsas_check_flash(mptsas_t *mpt, caddr_t origfile, uint32_t size,
1266 1343          uint8_t type, int mode);
1267 1344  int mptsas_download_firmware();
1268 1345  int mptsas_can_download_firmware();
1269 1346  int mptsas_dma_alloc(mptsas_t *mpt, mptsas_dma_alloc_state_t *dma_statep);
1270 1347  void mptsas_dma_free(mptsas_dma_alloc_state_t *dma_statep);
1271 1348  mptsas_phymask_t mptsas_physport_to_phymask(mptsas_t *mpt, uint8_t physport);
1272 1349  void mptsas_fma_check(mptsas_t *mpt, mptsas_cmd_t *cmd);
↓ open down ↓ 11 lines elided ↑ open up ↑
1284 1361  int mptsas_ioc_wait_for_response(mptsas_t *mpt);
1285 1362  int mptsas_ioc_wait_for_doorbell(mptsas_t *mpt);
1286 1363  int mptsas_ioc_reset(mptsas_t *mpt, int);
1287 1364  int mptsas_send_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
1288 1365      ddi_acc_handle_t accessp);
1289 1366  int mptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
1290 1367      ddi_acc_handle_t accessp);
1291 1368  int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action,
1292 1369      uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber,
1293 1370      uint8_t pageversion, uint8_t pagelength, uint32_t SGEflagslength,
1294      -    uint32_t SGEaddress32);
     1371 +    uint64_t SGEaddress);
1295 1372  int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
1296 1373      uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
1297 1374      uint8_t pageversion, uint16_t extpagelength,
1298      -    uint32_t SGEflagslength, uint32_t SGEaddress32);
     1375 +    uint32_t SGEflagslength, uint64_t SGEaddress);
1299 1376  
1300 1377  int mptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd,
1301 1378      struct scsi_pkt **pkt);
1302 1379  void mptsas_return_to_pool(mptsas_t *mpt, mptsas_cmd_t *cmd);
1303 1380  void mptsas_destroy_ioc_event_cmd(mptsas_t *mpt);
1304 1381  void mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd);
1305 1382  int mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type,
1306 1383      uint8_t page_number, uint32_t page_address, int (*callback) (mptsas_t *,
1307 1384      caddr_t, ddi_acc_handle_t, uint16_t, uint32_t, va_list), ...);
1308 1385  
1309 1386  int mptsas_ioc_task_management(mptsas_t *mpt, int task_type,
1310 1387      uint16_t dev_handle, int lun, uint8_t *reply, uint32_t reply_size,
1311 1388      int mode);
1312 1389  int mptsas_send_event_ack(mptsas_t *mpt, uint32_t event, uint32_t eventcntx);
1313 1390  void mptsas_send_pending_event_ack(mptsas_t *mpt);
1314      -void mptsas_set_throttle(struct mptsas *mpt, mptsas_target_t *ptgt, int what);
1315 1391  int mptsas_restart_ioc(mptsas_t *mpt);
1316 1392  void mptsas_update_driver_data(struct mptsas *mpt);
1317 1393  uint64_t mptsas_get_sata_guid(mptsas_t *mpt, mptsas_target_t *ptgt, int lun);
1318 1394  
1319 1395  /*
1320 1396   * init functions
1321 1397   */
1322 1398  int mptsas_ioc_get_facts(mptsas_t *mpt);
1323 1399  int mptsas_ioc_get_port_facts(mptsas_t *mpt, int port);
1324 1400  int mptsas_ioc_enable_port(mptsas_t *mpt);
1325 1401  int mptsas_ioc_enable_event_notification(mptsas_t *mpt);
1326 1402  int mptsas_ioc_init(mptsas_t *mpt);
1327 1403  
1328 1404  /*
1329 1405   * configuration pages operation
1330 1406   */
1331 1407  int mptsas_get_sas_device_page0(mptsas_t *mpt, uint32_t page_address,
1332 1408      uint16_t *dev_handle, uint64_t *sas_wwn, uint32_t *dev_info,
1333 1409      uint8_t *physport, uint8_t *phynum, uint16_t *pdevhandle,
1334      -    uint16_t *slot_num, uint16_t *enclosure);
     1410 +    uint16_t *slot_num, uint16_t *enclosure, uint16_t *io_flags);
1335 1411  int mptsas_get_sas_io_unit_page(mptsas_t *mpt);
1336 1412  int mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt);
1337 1413  int mptsas_get_sas_expander_page0(mptsas_t *mpt, uint32_t page_address,
1338 1414      mptsas_smp_t *info);
1339 1415  int mptsas_set_ioc_params(mptsas_t *mpt);
1340 1416  int mptsas_get_manufacture_page5(mptsas_t *mpt);
1341 1417  int mptsas_get_sas_port_page0(mptsas_t *mpt, uint32_t page_address,
1342 1418      uint64_t *sas_wwn, uint8_t *portwidth);
1343 1419  int mptsas_get_bios_page3(mptsas_t *mpt,  uint32_t *bios_version);
1344 1420  int
↓ open down ↓ 18 lines elided ↑ open up ↑
1363 1439  int mptsas_delete_volume(mptsas_t *mpt, uint16_t volid);
1364 1440  void mptsas_raid_action_system_shutdown(mptsas_t *mpt);
1365 1441  
1366 1442  #define MPTSAS_IOCSTATUS(status) (status & MPI2_IOCSTATUS_MASK)
1367 1443  /*
1368 1444   * debugging.
1369 1445   */
1370 1446  #if defined(MPTSAS_DEBUG)
1371 1447  
1372 1448  void mptsas_printf(char *fmt, ...);
     1449 +void mptsas_debug_log(char *fmt, ...);
1373 1450  
1374 1451  #define MPTSAS_DBGPR(m, args)   \
1375 1452          if (mptsas_debug_flags & (m)) \
1376      -                mptsas_printf args
     1453 +                mptsas_printf args;   \
     1454 +        if (~mptsas_dbglog_imask & (m)) \
     1455 +                mptsas_debug_log args
1377 1456  #else   /* ! defined(MPTSAS_DEBUG) */
1378 1457  #define MPTSAS_DBGPR(m, args)
1379 1458  #endif  /* defined(MPTSAS_DEBUG) */
1380 1459  
1381 1460  #define NDBG0(args)     MPTSAS_DBGPR(0x01, args)        /* init */
1382 1461  #define NDBG1(args)     MPTSAS_DBGPR(0x02, args)        /* normal running */
1383 1462  #define NDBG2(args)     MPTSAS_DBGPR(0x04, args)        /* property handling */
1384 1463  #define NDBG3(args)     MPTSAS_DBGPR(0x08, args)        /* pkt handling */
1385 1464  
1386 1465  #define NDBG4(args)     MPTSAS_DBGPR(0x10, args)        /* kmem alloc/free */
1387 1466  #define NDBG5(args)     MPTSAS_DBGPR(0x20, args)        /* polled cmds */
1388      -#define NDBG6(args)     MPTSAS_DBGPR(0x40, args)        /* interrupts */
     1467 +#define NDBG6(args)     MPTSAS_DBGPR(0x40, args)        /* interrupt setup */
1389 1468  #define NDBG7(args)     MPTSAS_DBGPR(0x80, args)        /* queue handling */
1390 1469  
1391 1470  #define NDBG8(args)     MPTSAS_DBGPR(0x0100, args)      /* arq */
1392 1471  #define NDBG9(args)     MPTSAS_DBGPR(0x0200, args)      /* Tagged Q'ing */
1393 1472  #define NDBG10(args)    MPTSAS_DBGPR(0x0400, args)      /* halting chip */
1394 1473  #define NDBG11(args)    MPTSAS_DBGPR(0x0800, args)      /* power management */
1395 1474  
1396 1475  #define NDBG12(args)    MPTSAS_DBGPR(0x1000, args)      /* enumeration */
1397 1476  #define NDBG13(args)    MPTSAS_DBGPR(0x2000, args)      /* configuration page */
1398 1477  #define NDBG14(args)    MPTSAS_DBGPR(0x4000, args)      /* LED control */
1399      -#define NDBG15(args)    MPTSAS_DBGPR(0x8000, args)
     1478 +#define NDBG15(args)    MPTSAS_DBGPR(0x8000, args)      /* Passthrough */
1400 1479  
1401      -#define NDBG16(args)    MPTSAS_DBGPR(0x010000, args)
     1480 +#define NDBG16(args)    MPTSAS_DBGPR(0x010000, args)    /* SAS Broadcasts */
1402 1481  #define NDBG17(args)    MPTSAS_DBGPR(0x020000, args)    /* scatter/gather */
1403      -#define NDBG18(args)    MPTSAS_DBGPR(0x040000, args)
     1482 +#define NDBG18(args)    MPTSAS_DBGPR(0x040000, args)    /* Interrupts */
1404 1483  #define NDBG19(args)    MPTSAS_DBGPR(0x080000, args)    /* handshaking */
1405 1484  
1406 1485  #define NDBG20(args)    MPTSAS_DBGPR(0x100000, args)    /* events */
1407 1486  #define NDBG21(args)    MPTSAS_DBGPR(0x200000, args)    /* dma */
1408 1487  #define NDBG22(args)    MPTSAS_DBGPR(0x400000, args)    /* reset */
1409 1488  #define NDBG23(args)    MPTSAS_DBGPR(0x800000, args)    /* abort */
1410 1489  
1411 1490  #define NDBG24(args)    MPTSAS_DBGPR(0x1000000, args)   /* capabilities */
1412 1491  #define NDBG25(args)    MPTSAS_DBGPR(0x2000000, args)   /* flushing */
1413 1492  #define NDBG26(args)    MPTSAS_DBGPR(0x4000000, args)
↓ open down ↓ 16 lines elided ↑ open up ↑
1430 1509  #define RQ_MAKECOM_G0(pkt, flag, cmd, addr, cnt) \
1431 1510          RQ_MAKECOM_COMMON((pkt), (flag), (cmd)), \
1432 1511          FORMG0ADDR(((union scsi_cdb *)(pkt)->pkt_cdbp), (addr)), \
1433 1512          FORMG0COUNT(((union scsi_cdb *)(pkt)->pkt_cdbp), (cnt))
1434 1513  
1435 1514  
1436 1515  #ifdef  __cplusplus
1437 1516  }
1438 1517  #endif
1439 1518  
1440      -#endif  /* _SYS_SCSI_ADAPTERS_MPTVAR_H */
     1519 +#endif  /* _SYS_SCSI_ADAPTERS_MPTSAS3_VAR_H */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX