Print this page
    
MFV: illumos-gate@fd6d41c5025e9fb45a115fc82d86e9983d1e9fd6
9815 Want basic AHCI enclosure services
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Rob Johnston <rob.johnston@joyent.com>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Robert Mustacchi <rm@joyent.com>
Conflicts:
        usr/src/cmd/Makefile
NEX-5834 panic in sata module while running trim
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-4418 SATA inquiry property generation doesn't work as advertised
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
1787 SATL fails to handle returned SMART sense data
Reviewed by: Richard Elling <richard.elling@richardelling.com>
Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Robert Mustacchi <rm@joyent.com>
re #12164 Marvell 88SE9128: Appliance hard hangs on boot probing duplicated ahci device
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/io/sata/impl/sata.c
          +++ new/usr/src/uts/common/io/sata/impl/sata.c
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License (the "License").
   6    6   * You may not use this file except in compliance with the License.
   7    7   *
   8    8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9    9   * or http://www.opensolaris.org/os/licensing.
  10   10   * See the License for the specific language governing permissions
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  
    | 
      ↓ 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) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - */
  25      -/*
  26      - * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
       24 + * Copyright 2016 Nexenta Systems, Inc.
  27   25   * Copyright 2016 Argo Technologies SA
       26 + * Copyright (c) 2018, Joyent, Inc.
  28   27   */
  29   28  
  30   29  /*
  31   30   * SATA Framework
  32   31   * Generic SATA Host Adapter Implementation
  33   32   */
  34   33  
  35   34  #include <sys/conf.h>
  36   35  #include <sys/file.h>
  37   36  #include <sys/ddi.h>
  38   37  #include <sys/sunddi.h>
  39   38  #include <sys/modctl.h>
  40   39  #include <sys/cmn_err.h>
  41   40  #include <sys/errno.h>
  42   41  #include <sys/thread.h>
  43   42  #include <sys/kstat.h>
  44   43  #include <sys/note.h>
  45   44  #include <sys/sysevent.h>
  46   45  #include <sys/sysevent/eventdefs.h>
  47   46  #include <sys/sysevent/dr.h>
  48   47  #include <sys/taskq.h>
  49   48  #include <sys/disp.h>
  50   49  #include <sys/sdt.h>
  51   50  
  52   51  #include <sys/sata/impl/sata.h>
  53   52  #include <sys/sata/sata_hba.h>
  54   53  #include <sys/sata/sata_defs.h>
  55   54  #include <sys/sata/sata_cfgadm.h>
  56   55  #include <sys/sata/sata_blacklist.h>
  57   56  #include <sys/sata/sata_satl.h>
  58   57  
  59   58  #include <sys/scsi/impl/spc3_types.h>
  60   59  
  61   60  /*
  62   61   * FMA header files
  63   62   */
  64   63  #include <sys/ddifm.h>
  65   64  #include <sys/fm/protocol.h>
  66   65  #include <sys/fm/util.h>
  67   66  #include <sys/fm/io/ddi.h>
  68   67  
  69   68  /* Debug flags - defined in sata.h */
  70   69  int     sata_debug_flags = 0;
  71   70  int     sata_msg = 0;
  72   71  
  73   72  /*
  74   73   * Flags enabling selected SATA HBA framework functionality
  75   74   */
  76   75  #define SATA_ENABLE_QUEUING             1
  77   76  #define SATA_ENABLE_NCQ                 2
  78   77  #define SATA_ENABLE_PROCESS_EVENTS      4
  79   78  #define SATA_ENABLE_PMULT_FBS           8 /* FIS-Based Switching */
  80   79  int sata_func_enable =
  81   80          SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
  82   81  
  83   82  /*
  84   83   * Global variable setting default maximum queue depth (NCQ or TCQ)
  85   84   * Note:minimum queue depth is 1
  86   85   */
  87   86  int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
  88   87  
  89   88  /*
  90   89   * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
  91   90   * initialization, using value from sata_max_queue_depth
  92   91   * It is adjusted to minimum supported by the controller and by the device,
  93   92   * if queueing is enabled.
  94   93   */
  95   94  static  int sata_current_max_qdepth;
  96   95  
  97   96  /*
  98   97   * Global variable determining the default behavior after device hotpluggin.
  99   98   * If non-zero, the hotplugged device is onlined (if possible) without explicit
 100   99   * IOCTL request (AP_CONFIGURE).
 101  100   * If zero, hotplugged device is identified, but not onlined.
 102  101   * Enabling (AP_CONNECT) device port with an attached device does not result
 103  102   * in device onlining regardless of the flag setting
 104  103   */
 105  104  int sata_auto_online = 0;
 106  105  
 107  106  #ifdef SATA_DEBUG
 108  107  
 109  108  #define SATA_LOG_D(args)        sata_log args
 110  109  uint64_t mbuf_count = 0;
 111  110  uint64_t mbuffail_count = 0;
 112  111  
 113  112  sata_atapi_cmd_t sata_atapi_trace[64];
 114  113  uint32_t sata_atapi_trace_index = 0;
 115  114  int sata_atapi_trace_save = 1;
 116  115  static  void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
 117  116  #define SATAATAPITRACE(spx, count)      if (sata_atapi_trace_save) \
 118  117      sata_save_atapi_trace(spx, count);
 119  118  
 120  119  #else
 121  120  #define SATA_LOG_D(args)        sata_trace_log args
 122  121  #define SATAATAPITRACE(spx, count)
 123  122  #endif
 124  123  
 125  124  #if 0
 126  125  static void
 127  126  sata_test_atapi_packet_command(sata_hba_inst_t *, int);
 128  127  #endif
 129  128  
 130  129  #ifdef SATA_INJECT_FAULTS
 131  130  
 132  131  #define         SATA_INJECT_PKT_FAULT   1
 133  132  uint32_t        sata_inject_fault = 0;
 134  133  
 135  134  uint32_t        sata_inject_fault_count = 0;
 136  135  uint32_t        sata_inject_fault_pause_count = 0;
 137  136  uint32_t        sata_fault_type = 0;
 138  137  uint32_t        sata_fault_cmd = 0;
 139  138  dev_info_t      *sata_fault_ctrl = NULL;
 140  139  sata_device_t   sata_fault_device;
 141  140  
 142  141  static  void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
 143  142  
 144  143  #endif
 145  144  
 146  145  #define LEGACY_HWID_LEN 64      /* Model (40) + Serial (20) + pad */
 147  146  
 148  147  static char sata_rev_tag[] = {"1.46"};
 149  148  
 150  149  /*
 151  150   * SATA cb_ops functions
 152  151   */
 153  152  static  int sata_hba_open(dev_t *, int, int, cred_t *);
 154  153  static  int sata_hba_close(dev_t, int, int, cred_t *);
 155  154  static  int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
 156  155  
 157  156  /*
 158  157   * SCSA required entry points
 159  158   */
 160  159  static  int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
 161  160      scsi_hba_tran_t *, struct scsi_device *);
 162  161  static  int sata_scsi_tgt_probe(struct scsi_device *,
 163  162      int (*callback)(void));
 164  163  static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
 165  164      scsi_hba_tran_t *, struct scsi_device *);
 166  165  static  int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
 167  166  static  int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
 168  167  static  int sata_scsi_reset(struct scsi_address *, int);
 169  168  static  int sata_scsi_getcap(struct scsi_address *, char *, int);
 170  169  static  int sata_scsi_setcap(struct scsi_address *, char *, int, int);
 171  170  static  struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
 172  171      struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
 173  172      caddr_t);
 174  173  static  void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
 175  174  static  void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
 176  175  static  void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
 177  176  
 178  177  /*
 179  178   * SATA HBA interface functions are defined in sata_hba.h header file
 180  179   */
 181  180  
 182  181  /* Event processing functions */
 183  182  static  void sata_event_daemon(void *);
 184  183  static  void sata_event_thread_control(int);
 185  184  static  void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
 186  185  static  void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
 187  186  static  void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
 188  187  static  void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
 189  188  static  void sata_process_port_failed_event(sata_hba_inst_t *,
 190  189      sata_address_t *);
 191  190  static  void sata_process_port_link_events(sata_hba_inst_t *,
 192  191      sata_address_t *);
 193  192  static  void sata_process_pmport_link_events(sata_hba_inst_t *,
 194  193      sata_address_t *);
 195  194  static  void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
 196  195  static  void sata_process_pmdevice_detached(sata_hba_inst_t *,
 197  196      sata_address_t *);
 198  197  static  void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
 199  198  static  void sata_process_pmdevice_attached(sata_hba_inst_t *,
 200  199      sata_address_t *);
 201  200  static  void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
 202  201  static  void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
 203  202  static  void sata_process_target_node_cleanup(sata_hba_inst_t *,
 204  203      sata_address_t *);
 205  204  static  void sata_process_device_autoonline(sata_hba_inst_t *,
 206  205      sata_address_t *saddr);
 207  206  
 208  207  /*
 209  208   * Local translation functions
 210  209   */
 211  210  static  int sata_txlt_inquiry(sata_pkt_txlate_t *);
 212  211  static  int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
 213  212  static  int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
 214  213  static  int sata_txlt_read_capacity(sata_pkt_txlate_t *);
 215  214  static  int sata_txlt_read_capacity16(sata_pkt_txlate_t *);
 216  215  static  int sata_txlt_unmap(sata_pkt_txlate_t *);
 217  216  static  int sata_txlt_request_sense(sata_pkt_txlate_t *);
 218  217  static  int sata_txlt_read(sata_pkt_txlate_t *);
 219  218  static  int sata_txlt_write(sata_pkt_txlate_t *);
 220  219  static  int sata_txlt_log_sense(sata_pkt_txlate_t *);
 221  220  static  int sata_txlt_log_select(sata_pkt_txlate_t *);
 222  221  static  int sata_txlt_mode_sense(sata_pkt_txlate_t *);
 223  222  static  int sata_txlt_mode_select(sata_pkt_txlate_t *);
 224  223  static  int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
 225  224  static  int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
 226  225  static  int sata_txlt_write_buffer(sata_pkt_txlate_t *);
 227  226  static  int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
 228  227  
 229  228  static  int sata_hba_start(sata_pkt_txlate_t *, int *);
 230  229  static  int sata_txlt_invalid_command(sata_pkt_txlate_t *);
 231  230  static  int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
 232  231  static  int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
 233  232  static  int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
 234  233  static  int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
 235  234  static  void sata_txlt_rw_completion(sata_pkt_t *);
 236  235  static  void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
 237  236  static  void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
 238  237  static  void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
 239  238  static  void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *);
 240  239  static  int sata_emul_rw_completion(sata_pkt_txlate_t *);
 241  240  static  void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
 242  241      uint8_t);
 243  242  static  struct scsi_extended_sense *sata_immediate_error_response(
 244  243      sata_pkt_txlate_t *, int);
 245  244  static  struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
 246  245  
 247  246  static  int sata_txlt_atapi(sata_pkt_txlate_t *);
 248  247  static  void sata_txlt_atapi_completion(sata_pkt_t *);
 249  248  
 250  249  /*
 251  250   * Local functions for ioctl
 252  251   */
 253  252  static  int32_t sata_get_port_num(sata_hba_inst_t *,  struct devctl_iocdata *);
 254  253  static  void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
 255  254      devctl_ap_state_t *);
 256  255  static  dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
 257  256  static  dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
 258  257  static  dev_info_t *sata_devt_to_devinfo(dev_t);
 259  258  static  int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
 260  259  static  int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
 261  260  static  int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
 262  261  static  int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
 263  262  static  int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
 264  263  static  int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
 265  264  static  int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
 266  265  static  int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
 267  266  static  int sata_ioctl_reset_all(sata_hba_inst_t *);
 268  267  static  int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
 269  268  static  int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
 270  269      sata_ioctl_data_t *, int mode);
 271  270  static  int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
 272  271      sata_ioctl_data_t *, int mode);
 273  272  static  int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
 274  273      sata_ioctl_data_t *, int mode);
 275  274  static  int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
 276  275      sata_ioctl_data_t *, int mode);
 277  276  static  int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
 278  277      sata_device_t *, sata_ioctl_data_t *, int mode);
 279  278  
 280  279  /*
 281  280   * Local functions
 282  281   */
 283  282  static  void sata_remove_hba_instance(dev_info_t *);
 284  283  static  int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
 285  284  static  void sata_probe_ports(sata_hba_inst_t *);
 286  285  static  void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
 287  286  static  int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
 288  287  static  int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
 289  288  static  int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
 290  289  static  int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
 291  290  static  void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
 292  291  static  int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
 293  292  static  int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
 294  293      sata_drive_info_t *);
 295  294  static  dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
 296  295      sata_address_t *);
 297  296  static  void sata_remove_target_node(sata_hba_inst_t *,
 298  297      sata_address_t *);
 299  298  static  int sata_validate_scsi_address(sata_hba_inst_t *,
 300  299      struct scsi_address *, sata_device_t *);
 301  300  static  int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
 302  301  static  sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
 303  302  static  void sata_pkt_free(sata_pkt_txlate_t *);
 304  303  static  int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
 305  304      caddr_t, ddi_dma_attr_t *);
 306  305  static  void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
 307  306  static  int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
 308  307  static  sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
 309  308      sata_device_t *);
 310  309  static  int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
 311  310  static  void sata_reidentify_device(sata_pkt_txlate_t *);
 312  311  static  struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
 313  312  static  void sata_free_local_buffer(sata_pkt_txlate_t *);
 314  313  static  uint64_t sata_check_capacity(sata_drive_info_t *);
 315  314  void    sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
 316  315      ddi_dma_attr_t *);
 317  316  static  int sata_fetch_device_identify_data(sata_hba_inst_t *,
 318  317      sata_drive_info_t *);
 319  318  static  void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
 320  319  static  void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
 321  320  static  void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
 322  321  static  int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
 323  322  static  int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
 324  323  static  int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
 325  324  static  int sata_set_drive_features(sata_hba_inst_t *,
 326  325      sata_drive_info_t *, int flag);
 327  326  static  void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
 328  327  static  int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
 329  328  static  void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
 330  329      uint8_t *);
 331  330  static  int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
 332  331      struct scsi_inquiry *);
 333  332  static  int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
 334  333  static  int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
 335  334  static  int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
 336  335  static  int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
 337  336  static  int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
 338  337  static  int sata_mode_select_page_8(sata_pkt_txlate_t *,
 339  338      struct mode_cache_scsi3 *, int, int *, int *, int *);
 340  339  static  int sata_mode_select_page_1a(sata_pkt_txlate_t *,
 341  340      struct mode_info_power_cond *, int, int *, int *, int *);
 342  341  static  int sata_mode_select_page_1c(sata_pkt_txlate_t *,
 343  342      struct mode_info_excpt_page *, int, int *, int *, int *);
 344  343  static  int sata_mode_select_page_30(sata_pkt_txlate_t *,
 345  344      struct mode_acoustic_management *, int, int *, int *, int *);
 346  345  
 347  346  static  int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
 348  347  static  int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
 349  348      sata_hba_inst_t *);
 350  349  static  int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
 351  350      sata_hba_inst_t *);
 352  351  static  int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
 353  352      sata_hba_inst_t *);
 354  353  static  int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
 355  354      sata_pkt_txlate_t *);
 356  355  
 357  356  static  void sata_set_arq_data(sata_pkt_t *);
 358  357  static  void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
 359  358  static  void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
 360  359  static  uint8_t sata_get_standby_timer(uint8_t *timer);
 361  360  
 362  361  static  void sata_save_drive_settings(sata_drive_info_t *);
 363  362  static  void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
 364  363  static  void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
 365  364  static  void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
 366  365  static  void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
 367  366  static  int sata_fetch_smart_return_status(sata_hba_inst_t *,
 368  367      sata_drive_info_t *);
 369  368  static  int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
 370  369      struct smart_data *);
 371  370  static  int sata_smart_selftest_log(sata_hba_inst_t *,
 372  371      sata_drive_info_t *,
 373  372      struct smart_selftest_log *);
 374  373  static  int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
 375  374      sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
 376  375  static  int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
 377  376      uint8_t *, uint8_t, uint8_t);
 378  377  static  int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
 379  378      struct read_log_ext_directory *);
 380  379  static  void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
 381  380  static  void sata_xlate_errors(sata_pkt_txlate_t *);
 382  381  static  void sata_decode_device_error(sata_pkt_txlate_t *,
 383  382      struct scsi_extended_sense *);
 384  383  static  void sata_set_device_removed(dev_info_t *);
 385  384  static  boolean_t sata_check_device_removed(dev_info_t *);
 386  385  static  void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
 387  386  static  int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
 388  387      sata_drive_info_t *);
 389  388  static  int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
 390  389      sata_drive_info_t *);
 391  390  static  void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
 392  391  static  void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
 393  392  static  void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
 394  393  static  int sata_check_modser(char *, int);
 395  394  
 396  395  /*
 397  396   * FMA
 398  397   */
 399  398  static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
 400  399  
 401  400  
 402  401  /*
 403  402   * SATA Framework will ignore SATA HBA driver cb_ops structure and
 404  403   * register following one with SCSA framework.
 405  404   * Open & close are provided, so scsi framework will not use its own
 406  405   */
 407  406  static struct cb_ops sata_cb_ops = {
 408  407          sata_hba_open,                  /* open */
 409  408          sata_hba_close,                 /* close */
 410  409          nodev,                          /* strategy */
 411  410          nodev,                          /* print */
 412  411          nodev,                          /* dump */
 413  412          nodev,                          /* read */
 414  413          nodev,                          /* write */
 415  414          sata_hba_ioctl,                 /* ioctl */
 416  415          nodev,                          /* devmap */
 417  416          nodev,                          /* mmap */
 418  417          nodev,                          /* segmap */
 419  418          nochpoll,                       /* chpoll */
 420  419          ddi_prop_op,                    /* cb_prop_op */
 421  420          0,                              /* streamtab */
 422  421          D_NEW | D_MP,                   /* cb_flag */
 423  422          CB_REV,                         /* rev */
 424  423          nodev,                          /* aread */
 425  424          nodev                           /* awrite */
 426  425  };
 427  426  
 428  427  
 429  428  extern struct mod_ops mod_miscops;
 430  429  extern uchar_t  scsi_cdb_size[];
 431  430  
 432  431  static struct modlmisc modlmisc = {
 433  432          &mod_miscops,                   /* Type of module */
 434  433          "SATA Module"                   /* module name */
 435  434  };
 436  435  
 437  436  
 438  437  static struct modlinkage modlinkage = {
 439  438          MODREV_1,
 440  439          (void *)&modlmisc,
 441  440          NULL
 442  441  };
 443  442  
 444  443  /*
 445  444   * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
 446  445   * i.e. when scsi_pkt has not timeout specified.
 447  446   */
 448  447  static int sata_default_pkt_time = 60;  /* 60 seconds */
 449  448  
 450  449  /*
 451  450   * Intermediate buffer device access attributes - they are required,
 452  451   * but not necessarily used.
 453  452   */
 454  453  static ddi_device_acc_attr_t sata_acc_attr = {
 455  454          DDI_DEVICE_ATTR_V0,
 456  455          DDI_STRUCTURE_LE_ACC,
 457  456          DDI_STRICTORDER_ACC
 458  457  };
 459  458  
 460  459  
 461  460  /*
 462  461   * Mutexes protecting structures in multithreaded operations.
 463  462   * Because events are relatively rare, a single global mutex protecting
 464  463   * data structures should be sufficient. To increase performance, add
 465  464   * separate mutex per each sata port and use global mutex only to protect
 466  465   * common data structures.
 467  466   */
 468  467  static  kmutex_t sata_mutex;            /* protects sata_hba_list */
 469  468  static  kmutex_t sata_log_mutex;        /* protects log */
 470  469  
 471  470  static  char sata_log_buf[256];
 472  471  
 473  472  /*
 474  473   * sata trace debug
 475  474   */
 476  475  static  sata_trace_rbuf_t *sata_debug_rbuf;
 477  476  static  sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
 478  477  static  void sata_trace_dmsg_free(void);
 479  478  static  void sata_trace_rbuf_alloc(void);
 480  479  static  void sata_trace_rbuf_free(void);
 481  480  
 482  481  int     dmsg_ring_size = DMSG_RING_SIZE;
 483  482  
 484  483  /* Default write cache setting for SATA hard disks */
 485  484  int     sata_write_cache = 1;           /* enabled */
 486  485  
 487  486  /* Default write cache setting for SATA ATAPI CD/DVD */
 488  487  int     sata_atapicdvd_write_cache = 1; /* enabled */
 489  488  
 490  489  /* Default write cache setting for SATA ATAPI tape */
 491  490  int     sata_atapitape_write_cache = 1; /* enabled */
 492  491  
 493  492  /* Default write cache setting for SATA ATAPI disk */
 494  493  int     sata_atapidisk_write_cache = 1; /* enabled */
 495  494  
 496  495  /*
 497  496   * Linked list of HBA instances
 498  497   */
 499  498  static  sata_hba_inst_t *sata_hba_list = NULL;
 500  499  static  sata_hba_inst_t *sata_hba_list_tail = NULL;
 501  500  /*
 502  501   * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
 503  502   * structure and in sata soft state.
 504  503   */
 505  504  
 506  505  /*
 507  506   * Event daemon related variables
 508  507   */
 509  508  static  kmutex_t sata_event_mutex;
 510  509  static  kcondvar_t sata_event_cv;
 511  510  static  kthread_t *sata_event_thread = NULL;
 512  511  static  int sata_event_thread_terminate = 0;
 513  512  static  int sata_event_pending = 0;
 514  513  static  int sata_event_thread_active = 0;
 515  514  extern  pri_t minclsyspri;
 516  515  
 517  516  /*
 518  517   * NCQ error recovery command
 519  518   */
 520  519  static const sata_cmd_t sata_rle_cmd = {
 521  520          SATA_CMD_REV,
 522  521          NULL,
 523  522          {
 524  523                  SATA_DIR_READ
 525  524          },
 526  525          ATA_ADDR_LBA48,
 527  526          0,
 528  527          0,
 529  528          0,
 530  529          0,
 531  530          0,
 532  531          1,
 533  532          READ_LOG_EXT_NCQ_ERROR_RECOVERY,
 534  533          0,
 535  534          0,
 536  535          0,
 537  536          SATAC_READ_LOG_EXT,
 538  537          0,
 539  538          0,
 540  539          0,
 541  540  };
 542  541  
 543  542  /*
 544  543   * ATAPI error recovery CDB
 545  544   */
 546  545  static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
 547  546          SCMD_REQUEST_SENSE,
 548  547          0,                      /* Only fixed RQ format is supported */
 549  548          0,
 550  549          0,
 551  550          SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
 552  551          0
 553  552  };
 554  553  
 555  554  
 556  555  /* Warlock directives */
 557  556  
 558  557  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
 559  558  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
 560  559  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
 561  560  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
 562  561  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
 563  562  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
 564  563  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
 565  564  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
 566  565  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
 567  566  _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
 568  567  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
 569  568  _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
 570  569  _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
 571  570  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
 572  571      sata_hba_inst::satahba_scsi_tran))
 573  572  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
 574  573  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
 575  574  _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
 576  575  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
 577  576  _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
 578  577      sata_hba_inst::satahba_event_flags))
 579  578  _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
 580  579      sata_cport_info::cport_devp))
 581  580  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
 582  581  _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
 583  582  _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
 584  583      sata_cport_info::cport_dev_type))
 585  584  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
 586  585  _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
 587  586      sata_cport_info::cport_state))
 588  587  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
 589  588  _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
 590  589      sata_pmport_info::pmport_state))
 591  590  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
 592  591  _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
 593  592      sata_pmport_info::pmport_dev_type))
 594  593  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
 595  594  _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
 596  595      sata_pmport_info::pmport_sata_drive))
 597  596  _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
 598  597      sata_pmport_info::pmport_tgtnode_clean))
 599  598  _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
 600  599      sata_pmport_info::pmport_event_flags))
 601  600  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
 602  601  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
 603  602  _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
 604  603  #ifdef SATA_DEBUG
 605  604  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
 606  605  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
 607  606  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
 608  607  _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
 609  608  #endif
 610  609  
 611  610  /* End of warlock directives */
 612  611  
 613  612  /* ************** loadable module configuration functions ************** */
 614  613  
 615  614  int
 616  615  _init()
 617  616  {
 618  617          int rval;
 619  618  
 620  619          mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
 621  620          mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
 622  621          mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
 623  622          cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
 624  623          sata_trace_rbuf_alloc();
 625  624          if ((rval = mod_install(&modlinkage)) != 0) {
 626  625  #ifdef SATA_DEBUG
 627  626                  cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
 628  627  #endif
 629  628                  sata_trace_rbuf_free();
 630  629                  mutex_destroy(&sata_log_mutex);
 631  630                  cv_destroy(&sata_event_cv);
 632  631                  mutex_destroy(&sata_event_mutex);
 633  632                  mutex_destroy(&sata_mutex);
 634  633          }
 635  634          return (rval);
 636  635  }
 637  636  
 638  637  int
 639  638  _fini()
 640  639  {
 641  640          int rval;
 642  641  
 643  642          if ((rval = mod_remove(&modlinkage)) != 0)
 644  643                  return (rval);
 645  644  
 646  645          sata_trace_rbuf_free();
 647  646          mutex_destroy(&sata_log_mutex);
 648  647          cv_destroy(&sata_event_cv);
 649  648          mutex_destroy(&sata_event_mutex);
 650  649          mutex_destroy(&sata_mutex);
 651  650          return (rval);
 652  651  }
 653  652  
 654  653  int
 655  654  _info(struct modinfo *modinfop)
 656  655  {
 657  656          return (mod_info(&modlinkage, modinfop));
 658  657  }
 659  658  
 660  659  
 661  660  
 662  661  /* ********************* SATA HBA entry points ********************* */
 663  662  
 664  663  
 665  664  /*
 666  665   * Called by SATA HBA from _init().
 667  666   * Registers HBA driver instance/sata framework pair with scsi framework, by
 668  667   * calling scsi_hba_init().
 669  668   *
 670  669   * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
 671  670   * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
 672  671   * cb_ops pointer in SATA HBA driver dev_ops structure.
 673  672   * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
 674  673   *
 675  674   * Return status of the scsi_hba_init() is returned to a calling SATA HBA
 676  675   * driver.
 677  676   */
 678  677  int
 679  678  sata_hba_init(struct modlinkage *modlp)
 680  679  {
 681  680          int rval;
 682  681          struct dev_ops *hba_ops;
 683  682  
 684  683          SATADBG1(SATA_DBG_HBA_IF, NULL,
 685  684              "sata_hba_init: name %s \n",
 686  685              ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
 687  686          /*
 688  687           * Fill-up cb_ops and dev_ops when necessary
 689  688           */
 690  689          hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
 691  690          /*
 692  691           * Provide pointer to SATA dev_ops
 693  692           */
 694  693          hba_ops->devo_cb_ops = &sata_cb_ops;
 695  694  
 696  695          /*
 697  696           * Register SATA HBA with SCSI framework
 698  697           */
 699  698          if ((rval = scsi_hba_init(modlp)) != 0) {
 700  699                  SATADBG1(SATA_DBG_HBA_IF, NULL,
 701  700                      "sata_hba_init: scsi hba init failed\n", NULL);
 702  701                  return (rval);
 703  702          }
 704  703  
 705  704          return (0);
 706  705  }
 707  706  
 708  707  
 709  708  /* HBA attach stages */
 710  709  #define HBA_ATTACH_STAGE_SATA_HBA_INST  1
 711  710  #define HBA_ATTACH_STAGE_SCSI_ATTACHED  2
 712  711  #define HBA_ATTACH_STAGE_SETUP          4
 713  712  #define HBA_ATTACH_STAGE_LINKED         8
 714  713  
 715  714  
 716  715  /*
 717  716   *
 718  717   * Called from SATA HBA driver's attach routine to attach an instance of
 719  718   * the HBA.
 720  719   *
 721  720   * For DDI_ATTACH command:
 722  721   * sata_hba_inst structure is allocated here and initialized with pointers to
 723  722   * SATA framework implementation of required scsi tran functions.
 724  723   * The scsi_tran's tran_hba_private field is used by SATA Framework to point
 725  724   * to the soft structure (sata_hba_inst) allocated by SATA framework for
 726  725   * SATA HBA instance related data.
 727  726   * The scsi_tran's tran_hba_private field is used by SATA framework to
 728  727   * store a pointer to per-HBA-instance of sata_hba_inst structure.
 729  728   * The sata_hba_inst structure is cross-linked to scsi tran structure.
 730  729   * Among other info, a pointer to sata_hba_tran structure is stored in
 731  730   * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
 732  731   * linked together into the list, pointed to by sata_hba_list.
 733  732   * On the first HBA instance attach the sata event thread is initialized.
 734  733   * Attachment points are created for all SATA ports of the HBA being attached.
 735  734   * All HBA instance's SATA ports are probed and type of plugged devices is
 736  735   * determined. For each device of a supported type, a target node is created.
 737  736   *
 738  737   * DDI_SUCCESS is returned when attachment process is successful,
 739  738   * DDI_FAILURE is returned otherwise.
 740  739   *
 741  740   * For DDI_RESUME command:
 742  741   * Not implemented at this time (postponed until phase 2 of the development).
 743  742   */
 744  743  int
 745  744  sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
 746  745      ddi_attach_cmd_t cmd)
 747  746  {
 748  747          sata_hba_inst_t *sata_hba_inst;
 749  748          scsi_hba_tran_t *scsi_tran = NULL;
 750  749          int hba_attach_state = 0;
 751  750          char taskq_name[MAXPATHLEN];
 752  751  
 753  752          SATADBG3(SATA_DBG_HBA_IF, NULL,
 754  753              "sata_hba_attach: node %s (%s%d)\n",
 755  754              ddi_node_name(dip), ddi_driver_name(dip),
 756  755              ddi_get_instance(dip));
 757  756  
 758  757          if (cmd == DDI_RESUME) {
 759  758                  /*
 760  759                   * Postponed until phase 2 of the development
 761  760                   */
 762  761                  return (DDI_FAILURE);
 763  762          }
 764  763  
 765  764          if (cmd != DDI_ATTACH) {
 766  765                  return (DDI_FAILURE);
 767  766          }
 768  767  
 769  768          /* cmd == DDI_ATTACH */
 770  769  
 771  770          if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
 772  771                  SATA_LOG_D((NULL, CE_WARN,
 773  772                      "sata_hba_attach: invalid sata_hba_tran"));
 774  773                  return (DDI_FAILURE);
 775  774          }
 776  775          /*
 777  776           * Allocate and initialize SCSI tran structure.
 778  777           * SATA copy of tran_bus_config is provided to create port nodes.
 779  778           */
 780  779          scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
 781  780          if (scsi_tran == NULL)
 782  781                  return (DDI_FAILURE);
 783  782          /*
 784  783           * Allocate soft structure for SATA HBA instance.
 785  784           * There is a separate softstate for each HBA instance.
 786  785           */
 787  786          sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
 788  787          ASSERT(sata_hba_inst != NULL); /* this should not fail */
 789  788          mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
 790  789          hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
 791  790  
 792  791          /*
 793  792           * scsi_trans's tran_hba_private is used by SATA Framework to point to
 794  793           * soft structure allocated by SATA framework for
 795  794           * SATA HBA instance related data.
 796  795           */
 797  796          scsi_tran->tran_hba_private     = sata_hba_inst;
 798  797          scsi_tran->tran_tgt_private     = NULL;
 799  798  
 800  799          scsi_tran->tran_tgt_init        = sata_scsi_tgt_init;
 801  800          scsi_tran->tran_tgt_probe       = sata_scsi_tgt_probe;
 802  801          scsi_tran->tran_tgt_free        = sata_scsi_tgt_free;
 803  802  
 804  803          scsi_tran->tran_start           = sata_scsi_start;
 805  804          scsi_tran->tran_reset           = sata_scsi_reset;
 806  805          scsi_tran->tran_abort           = sata_scsi_abort;
 807  806          scsi_tran->tran_getcap          = sata_scsi_getcap;
 808  807          scsi_tran->tran_setcap          = sata_scsi_setcap;
 809  808          scsi_tran->tran_init_pkt        = sata_scsi_init_pkt;
 810  809          scsi_tran->tran_destroy_pkt     = sata_scsi_destroy_pkt;
 811  810  
 812  811          scsi_tran->tran_dmafree         = sata_scsi_dmafree;
 813  812          scsi_tran->tran_sync_pkt        = sata_scsi_sync_pkt;
 814  813  
 815  814          scsi_tran->tran_reset_notify    = NULL;
 816  815          scsi_tran->tran_get_bus_addr    = NULL;
 817  816          scsi_tran->tran_quiesce         = NULL;
 818  817          scsi_tran->tran_unquiesce       = NULL;
 819  818          scsi_tran->tran_bus_reset       = NULL;
 820  819  
 821  820          if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
 822  821              scsi_tran, 0) != DDI_SUCCESS) {
 823  822  #ifdef SATA_DEBUG
 824  823                  cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
 825  824                      ddi_driver_name(dip), ddi_get_instance(dip));
 826  825  #endif
 827  826                  goto fail;
 828  827          }
 829  828          hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
 830  829  
 831  830          if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
 832  831                  if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
 833  832                      "sata", 1) != DDI_PROP_SUCCESS) {
 834  833                          SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
 835  834                              "failed to create hba sata prop"));
 836  835                          goto fail;
 837  836                  }
 838  837          }
 839  838  
 840  839          /*
 841  840           * Save pointers in hba instance soft state.
 842  841           */
 843  842          sata_hba_inst->satahba_scsi_tran = scsi_tran;
 844  843          sata_hba_inst->satahba_tran = sata_tran;
 845  844          sata_hba_inst->satahba_dip = dip;
 846  845  
 847  846          /*
 848  847           * Create a task queue to handle emulated commands completion
 849  848           * Use node name, dash, instance number as the queue name.
 850  849           */
 851  850          taskq_name[0] = '\0';
 852  851          (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
 853  852              sizeof (taskq_name));
 854  853          (void) snprintf(taskq_name + strlen(taskq_name),
 855  854              sizeof (taskq_name) - strlen(taskq_name),
 856  855              "-%d", DEVI(dip)->devi_instance);
 857  856          sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
 858  857              minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
 859  858              TASKQ_DYNAMIC);
 860  859  
 861  860          hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
 862  861  
 863  862          /*
 864  863           * Create events thread if not created yet.
 865  864           */
 866  865          sata_event_thread_control(1);
 867  866  
 868  867          /*
 869  868           * Link this hba instance into the list.
 870  869           */
 871  870          mutex_enter(&sata_mutex);
 872  871  
 873  872          if (sata_hba_list == NULL) {
 874  873                  /*
 875  874                   * The first instance of HBA is attached.
 876  875                   * Set current/active default maximum NCQ/TCQ queue depth for
 877  876                   * all SATA devices. It is done here and now, to eliminate the
 878  877                   * possibility of the dynamic, programatic modification of the
 879  878                   * queue depth via global (and public) sata_max_queue_depth
 880  879                   * variable (this would require special handling in HBA drivers)
 881  880                   */
 882  881                  sata_current_max_qdepth = sata_max_queue_depth;
 883  882                  if (sata_current_max_qdepth > 32)
 884  883                          sata_current_max_qdepth = 32;
 885  884                  else if (sata_current_max_qdepth < 1)
 886  885                          sata_current_max_qdepth = 1;
 887  886          }
 888  887  
 889  888          sata_hba_inst->satahba_next = NULL;
 890  889          sata_hba_inst->satahba_prev = sata_hba_list_tail;
 891  890          if (sata_hba_list == NULL) {
 892  891                  sata_hba_list = sata_hba_inst;
 893  892          }
 894  893          if (sata_hba_list_tail != NULL) {
 895  894                  sata_hba_list_tail->satahba_next = sata_hba_inst;
 896  895          }
 897  896          sata_hba_list_tail = sata_hba_inst;
 898  897          mutex_exit(&sata_mutex);
 899  898          hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
 900  899  
 901  900          /*
 902  901           * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
 903  902           * SATA HBA driver should not use its own open/close entry points.
 904  903           *
 905  904           * Make sure that instance number doesn't overflow
 906  905           * when forming minor numbers.
 907  906           */
 908  907          ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
 909  908          if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
 910  909              INST2DEVCTL(ddi_get_instance(dip)),
 911  910              DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
 912  911  #ifdef SATA_DEBUG
 913  912                  cmn_err(CE_WARN, "sata_hba_attach: "
 914  913                      "cannot create devctl minor node");
 915  914  #endif
 916  915                  goto fail;
 917  916          }
 918  917  
 919  918  
 920  919          /*
 921  920           * Set-up kstats here, if necessary.
 922  921           * (postponed until future phase of the development).
 923  922           */
 924  923  
 925  924          /*
 926  925           * Indicate that HBA is attached. This will enable events processing
 927  926           * for this HBA.
 928  927           */
 929  928          sata_hba_inst->satahba_attached = 1;
 930  929          /*
 931  930           * Probe controller ports. This operation will describe a current
 932  931           * controller/port/multipliers/device configuration and will create
 933  932           * attachment points.
 934  933           * We may end-up with just a controller with no devices attached.
 935  934           * For the ports with a supported device attached, device target nodes
 936  935           * are created and devices are initialized.
 937  936           */
 938  937          sata_probe_ports(sata_hba_inst);
 939  938  
 940  939          return (DDI_SUCCESS);
 941  940  
 942  941  fail:
 943  942          if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
 944  943                  (void) sata_remove_hba_instance(dip);
 945  944                  if (sata_hba_list == NULL)
 946  945                          sata_event_thread_control(0);
 947  946          }
 948  947  
 949  948          if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
 950  949                  (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
 951  950                  taskq_destroy(sata_hba_inst->satahba_taskq);
 952  951          }
 953  952  
 954  953          if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
 955  954                  (void) scsi_hba_detach(dip);
 956  955  
 957  956          if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
 958  957                  mutex_destroy(&sata_hba_inst->satahba_mutex);
 959  958                  kmem_free((void *)sata_hba_inst,
 960  959                      sizeof (struct sata_hba_inst));
 961  960                  scsi_hba_tran_free(scsi_tran);
 962  961          }
 963  962  
 964  963          sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
 965  964              ddi_driver_name(dip), ddi_get_instance(dip));
 966  965  
 967  966          return (DDI_FAILURE);
 968  967  }
 969  968  
 970  969  
 971  970  /*
 972  971   * Called by SATA HBA from to detach an instance of the driver.
 973  972   *
 974  973   * For DDI_DETACH command:
 975  974   * Free local structures allocated for SATA HBA instance during
 976  975   * sata_hba_attach processing.
 977  976   *
 978  977   * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
 979  978   *
 980  979   * For DDI_SUSPEND command:
 981  980   * Not implemented at this time (postponed until phase 2 of the development)
 982  981   * Returnd DDI_SUCCESS.
 983  982   *
 984  983   * When the last HBA instance is detached, the event daemon is terminated.
 985  984   *
 986  985   * NOTE: Port multiplier is supported.
 987  986   */
 988  987  int
 989  988  sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
 990  989  {
 991  990          dev_info_t      *tdip;
 992  991          sata_hba_inst_t *sata_hba_inst;
 993  992          scsi_hba_tran_t *scsi_hba_tran;
 994  993          sata_cport_info_t *cportinfo;
 995  994          sata_pmult_info_t *pminfo;
 996  995          sata_drive_info_t *sdinfo;
 997  996          sata_device_t   sdevice;
 998  997          int ncport, npmport;
 999  998  
1000  999          SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1001 1000              ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1002 1001  
1003 1002          switch (cmd) {
1004 1003          case DDI_DETACH:
1005 1004  
1006 1005                  if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1007 1006                          return (DDI_FAILURE);
1008 1007  
1009 1008                  sata_hba_inst = scsi_hba_tran->tran_hba_private;
1010 1009                  if (sata_hba_inst == NULL)
1011 1010                          return (DDI_FAILURE);
1012 1011  
1013 1012                  if (scsi_hba_detach(dip) == DDI_FAILURE) {
1014 1013                          sata_hba_inst->satahba_attached = 1;
1015 1014                          return (DDI_FAILURE);
1016 1015                  }
1017 1016  
1018 1017                  /*
1019 1018                   * Free all target nodes - at this point
1020 1019                   * devices should be at least offlined
1021 1020                   * otherwise scsi_hba_detach() should not be called.
1022 1021                   */
1023 1022                  for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1024 1023                      ncport++) {
1025 1024                          cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1026 1025                          if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1027 1026                                  sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1028 1027                                  if (sdinfo != NULL) {
1029 1028                                          tdip = sata_get_target_dip(dip,
1030 1029                                              ncport, 0);
1031 1030                                          if (tdip != NULL) {
1032 1031                                                  if (ndi_devi_offline(tdip,
1033 1032                                                      NDI_DEVI_REMOVE) !=
1034 1033                                                      NDI_SUCCESS) {
1035 1034                                                          SATA_LOG_D((
1036 1035                                                              sata_hba_inst,
1037 1036                                                              CE_WARN,
1038 1037                                                              "sata_hba_detach: "
1039 1038                                                              "Target node not "
1040 1039                                                              "removed !"));
1041 1040                                                          return (DDI_FAILURE);
1042 1041                                                  }
1043 1042                                          }
1044 1043                                  }
1045 1044                          } else { /* SATA_DTYPE_PMULT */
1046 1045                                  mutex_enter(&cportinfo->cport_mutex);
1047 1046                                  pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1048 1047  
1049 1048                                  if (pminfo == NULL) {
1050 1049                                          SATA_LOG_D((sata_hba_inst, CE_WARN,
1051 1050                                              "sata_hba_detach: Port multiplier "
1052 1051                                              "not ready yet!"));
1053 1052                                          mutex_exit(&cportinfo->cport_mutex);
1054 1053                                          return (DDI_FAILURE);
1055 1054                                  }
1056 1055  
1057 1056                                  /*
1058 1057                                   * Detach would fail if removal of any of the
1059 1058                                   * target nodes is failed - albeit in that
1060 1059                                   * case some of them may have been removed.
1061 1060                                   */
1062 1061                                  for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1063 1062                                      sata_hba_inst, ncport); npmport++) {
1064 1063                                          tdip = sata_get_target_dip(dip, ncport,
1065 1064                                              npmport);
1066 1065                                          if (tdip != NULL) {
1067 1066                                                  if (ndi_devi_offline(tdip,
1068 1067                                                      NDI_DEVI_REMOVE) !=
1069 1068                                                      NDI_SUCCESS) {
1070 1069                                                          SATA_LOG_D((
1071 1070                                                              sata_hba_inst,
1072 1071                                                              CE_WARN,
1073 1072                                                              "sata_hba_detach: "
1074 1073                                                              "Target node not "
1075 1074                                                              "removed !"));
1076 1075                                                          mutex_exit(&cportinfo->
1077 1076                                                              cport_mutex);
1078 1077                                                          return (DDI_FAILURE);
1079 1078                                                  }
1080 1079                                          }
1081 1080                                  }
1082 1081                                  mutex_exit(&cportinfo->cport_mutex);
1083 1082                          }
1084 1083                  }
1085 1084                  /*
1086 1085                   * Disable sata event daemon processing for this HBA
1087 1086                   */
1088 1087                  sata_hba_inst->satahba_attached = 0;
1089 1088  
1090 1089                  /*
1091 1090                   * Remove event daemon thread, if it is last HBA instance.
1092 1091                   */
1093 1092  
1094 1093                  mutex_enter(&sata_mutex);
1095 1094                  if (sata_hba_list->satahba_next == NULL) {
1096 1095                          mutex_exit(&sata_mutex);
1097 1096                          sata_event_thread_control(0);
1098 1097                          mutex_enter(&sata_mutex);
1099 1098                  }
1100 1099                  mutex_exit(&sata_mutex);
1101 1100  
1102 1101                  /* Remove this HBA instance from the HBA list */
1103 1102                  sata_remove_hba_instance(dip);
1104 1103  
1105 1104                  /*
1106 1105                   * At this point there should be no target nodes attached.
1107 1106                   * Detach and destroy device and port info structures.
1108 1107                   */
1109 1108                  for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1110 1109                      ncport++) {
1111 1110                          cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1112 1111                          if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1113 1112                                  sdinfo =
1114 1113                                      cportinfo->cport_devp.cport_sata_drive;
1115 1114                                  if (sdinfo != NULL) {
1116 1115                                          /* Release device structure */
1117 1116                                          kmem_free(sdinfo,
1118 1117                                              sizeof (sata_drive_info_t));
1119 1118                                  }
1120 1119                                  /* Release cport info */
1121 1120                                  mutex_destroy(&cportinfo->cport_mutex);
1122 1121                                  kmem_free(cportinfo,
1123 1122                                      sizeof (sata_cport_info_t));
1124 1123                          } else { /* SATA_DTYPE_PMULT */
1125 1124                                  sdevice.satadev_addr.cport = (uint8_t)ncport;
1126 1125                                  sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1127 1126                                  sata_free_pmult(sata_hba_inst, &sdevice);
1128 1127                          }
1129 1128                  }
1130 1129  
1131 1130                  scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1132 1131  
1133 1132                  (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1134 1133  
1135 1134                  taskq_destroy(sata_hba_inst->satahba_taskq);
1136 1135  
1137 1136                  mutex_destroy(&sata_hba_inst->satahba_mutex);
1138 1137                  kmem_free((void *)sata_hba_inst,
1139 1138                      sizeof (struct sata_hba_inst));
1140 1139  
1141 1140                  return (DDI_SUCCESS);
1142 1141  
1143 1142          case DDI_SUSPEND:
1144 1143                  /*
1145 1144                   * Postponed until phase 2
1146 1145                   */
1147 1146                  return (DDI_FAILURE);
1148 1147  
1149 1148          default:
1150 1149                  return (DDI_FAILURE);
1151 1150          }
1152 1151  }
1153 1152  
1154 1153  
1155 1154  /*
1156 1155   * Called by an HBA drive from _fini() routine.
1157 1156   * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1158 1157   */
1159 1158  void
1160 1159  sata_hba_fini(struct modlinkage *modlp)
1161 1160  {
1162 1161          SATADBG1(SATA_DBG_HBA_IF, NULL,
1163 1162              "sata_hba_fini: name %s\n",
1164 1163              ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1165 1164  
1166 1165          scsi_hba_fini(modlp);
1167 1166  }
1168 1167  
1169 1168  
1170 1169  /*
1171 1170   * Default open and close routine for sata_hba framework.
1172 1171   *
1173 1172   */
1174 1173  /*
1175 1174   * Open devctl node.
1176 1175   *
1177 1176   * Returns:
1178 1177   * 0 if node was open successfully, error code otherwise.
1179 1178   *
1180 1179   *
1181 1180   */
1182 1181  
1183 1182  static int
1184 1183  sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1185 1184  {
1186 1185  #ifndef __lock_lint
1187 1186          _NOTE(ARGUNUSED(credp))
1188 1187  #endif
1189 1188          int rv = 0;
1190 1189          dev_info_t *dip;
1191 1190          scsi_hba_tran_t *scsi_hba_tran;
1192 1191          sata_hba_inst_t *sata_hba_inst;
1193 1192  
1194 1193          SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1195 1194  
1196 1195          if (otyp != OTYP_CHR)
1197 1196                  return (EINVAL);
1198 1197  
1199 1198          dip = sata_devt_to_devinfo(*devp);
1200 1199          if (dip == NULL)
1201 1200                  return (ENXIO);
1202 1201  
1203 1202          if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1204 1203                  return (ENXIO);
1205 1204  
1206 1205          sata_hba_inst = scsi_hba_tran->tran_hba_private;
1207 1206          if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1208 1207                  return (ENXIO);
1209 1208  
1210 1209          mutex_enter(&sata_mutex);
1211 1210          if (flags & FEXCL) {
1212 1211                  if (sata_hba_inst->satahba_open_flag != 0) {
1213 1212                          rv = EBUSY;
1214 1213                  } else {
1215 1214                          sata_hba_inst->satahba_open_flag =
1216 1215                              SATA_DEVCTL_EXOPENED;
1217 1216                  }
1218 1217          } else {
1219 1218                  if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1220 1219                          rv = EBUSY;
1221 1220                  } else {
1222 1221                          sata_hba_inst->satahba_open_flag =
1223 1222                              SATA_DEVCTL_SOPENED;
1224 1223                  }
1225 1224          }
1226 1225          mutex_exit(&sata_mutex);
1227 1226  
1228 1227          return (rv);
1229 1228  }
1230 1229  
1231 1230  
1232 1231  /*
1233 1232   * Close devctl node.
1234 1233   * Returns:
1235 1234   * 0 if node was closed successfully, error code otherwise.
1236 1235   *
1237 1236   */
1238 1237  
1239 1238  static int
1240 1239  sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1241 1240  {
1242 1241  #ifndef __lock_lint
1243 1242          _NOTE(ARGUNUSED(credp))
1244 1243          _NOTE(ARGUNUSED(flag))
1245 1244  #endif
1246 1245          dev_info_t *dip;
1247 1246          scsi_hba_tran_t *scsi_hba_tran;
1248 1247          sata_hba_inst_t *sata_hba_inst;
1249 1248  
1250 1249          SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1251 1250  
1252 1251          if (otyp != OTYP_CHR)
1253 1252                  return (EINVAL);
1254 1253  
1255 1254          dip = sata_devt_to_devinfo(dev);
1256 1255          if (dip == NULL)
1257 1256                  return (ENXIO);
1258 1257  
1259 1258          if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1260 1259                  return (ENXIO);
1261 1260  
1262 1261          sata_hba_inst = scsi_hba_tran->tran_hba_private;
1263 1262          if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1264 1263                  return (ENXIO);
1265 1264  
1266 1265          mutex_enter(&sata_mutex);
1267 1266          sata_hba_inst->satahba_open_flag = 0;
1268 1267          mutex_exit(&sata_mutex);
1269 1268          return (0);
1270 1269  }
1271 1270  
1272 1271  
1273 1272  
1274 1273  /*
1275 1274   * Standard IOCTL commands for SATA hotplugging.
1276 1275   * Implemented DEVCTL_AP commands:
1277 1276   * DEVCTL_AP_CONNECT
1278 1277   * DEVCTL_AP_DISCONNECT
1279 1278   * DEVCTL_AP_CONFIGURE
1280 1279   * DEVCTL_UNCONFIGURE
1281 1280   * DEVCTL_AP_CONTROL
1282 1281   *
1283 1282   * Commands passed to default ndi ioctl handler:
1284 1283   * DEVCTL_DEVICE_GETSTATE
1285 1284   * DEVCTL_DEVICE_ONLINE
1286 1285   * DEVCTL_DEVICE_OFFLINE
1287 1286   * DEVCTL_DEVICE_REMOVE
1288 1287   * DEVCTL_DEVICE_INSERT
1289 1288   * DEVCTL_BUS_GETSTATE
1290 1289   *
1291 1290   * All other cmds are passed to HBA if it provide ioctl handler, or failed
1292 1291   * if not.
1293 1292   *
1294 1293   * Returns:
1295 1294   * 0 if successful,
1296 1295   * error code if operation failed.
1297 1296   *
1298 1297   * Port Multiplier support is supported now.
1299 1298   *
1300 1299   * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1301 1300   */
1302 1301  
1303 1302  static int
1304 1303  sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1305 1304      int *rvalp)
1306 1305  {
1307 1306  #ifndef __lock_lint
1308 1307          _NOTE(ARGUNUSED(credp))
1309 1308          _NOTE(ARGUNUSED(rvalp))
1310 1309  #endif
1311 1310          int rv = 0;
1312 1311          int32_t comp_port = -1;
1313 1312          dev_info_t *dip;
1314 1313          devctl_ap_state_t ap_state;
1315 1314          struct devctl_iocdata *dcp = NULL;
1316 1315          scsi_hba_tran_t *scsi_hba_tran;
1317 1316          sata_hba_inst_t *sata_hba_inst;
1318 1317          sata_device_t sata_device;
1319 1318          sata_cport_info_t *cportinfo;
1320 1319          int cport, pmport, qual;
1321 1320          int rval = SATA_SUCCESS;
1322 1321  
1323 1322          dip = sata_devt_to_devinfo(dev);
1324 1323          if (dip == NULL)
1325 1324                  return (ENXIO);
1326 1325  
1327 1326          if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1328 1327                  return (ENXIO);
1329 1328  
1330 1329          sata_hba_inst = scsi_hba_tran->tran_hba_private;
1331 1330          if (sata_hba_inst == NULL)
1332 1331                  return (ENXIO);
1333 1332  
1334 1333          if (sata_hba_inst->satahba_tran == NULL)
1335 1334                  return (ENXIO);
1336 1335  
1337 1336          switch (cmd) {
1338 1337  
1339 1338          case DEVCTL_DEVICE_GETSTATE:
1340 1339          case DEVCTL_DEVICE_ONLINE:
1341 1340          case DEVCTL_DEVICE_OFFLINE:
  
    | 
      ↓ open down ↓ | 
    1304 lines elided | 
    
      ↑ open up ↑ | 
  
1342 1341          case DEVCTL_DEVICE_REMOVE:
1343 1342          case DEVCTL_BUS_GETSTATE:
1344 1343                  /*
1345 1344                   * There may be more cases that we want to pass to default
1346 1345                   * handler rather than fail them.
1347 1346                   */
1348 1347                  return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1349 1348          }
1350 1349  
1351 1350          /* read devctl ioctl data */
1352      -        if (cmd != DEVCTL_AP_CONTROL) {
     1351 +        if (cmd != DEVCTL_AP_CONTROL && cmd >= DEVCTL_IOC &&
     1352 +            cmd <= DEVCTL_IOC_MAX) {
1353 1353                  if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1354 1354                          return (EFAULT);
1355 1355  
1356 1356                  if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1357 1357                      -1) {
1358 1358                          if (dcp)
1359 1359                                  ndi_dc_freehdl(dcp);
1360 1360                          return (EINVAL);
1361 1361                  }
1362 1362  
1363 1363                  /*
1364 1364                   * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1365 1365                   * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1366 1366                   */
1367 1367                  cport = SCSI_TO_SATA_CPORT(comp_port);
1368 1368                  pmport = SCSI_TO_SATA_PMPORT(comp_port);
1369 1369                  qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1370 1370  
1371 1371                  if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1372 1372                      qual) != 0) {
1373 1373                          ndi_dc_freehdl(dcp);
1374 1374                          return (EINVAL);
1375 1375                  }
1376 1376  
1377 1377                  cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1378 1378                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1379 1379                      cport_mutex);
1380 1380                  if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1381 1381                          /*
1382 1382                           * Cannot process ioctl request now. Come back later.
1383 1383                           */
1384 1384                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1385 1385                              cport_mutex);
1386 1386                          ndi_dc_freehdl(dcp);
1387 1387                          return (EBUSY);
1388 1388                  }
1389 1389                  /* Block event processing for this port */
1390 1390                  cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1391 1391                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1392 1392  
1393 1393                  sata_device.satadev_addr.cport = cport;
1394 1394                  sata_device.satadev_addr.pmport = pmport;
1395 1395                  sata_device.satadev_addr.qual = qual;
1396 1396                  sata_device.satadev_rev = SATA_DEVICE_REV;
1397 1397          }
1398 1398  
1399 1399          switch (cmd) {
1400 1400  
1401 1401          case DEVCTL_AP_DISCONNECT:
1402 1402  
1403 1403                  /*
1404 1404                   * Normally, cfgadm sata plugin will try to offline
1405 1405                   * (unconfigure) device before this request. Nevertheless,
1406 1406                   * if a device is still configured, we need to
1407 1407                   * attempt to offline and unconfigure device first, and we will
1408 1408                   * deactivate the port regardless of the unconfigure
1409 1409                   * operation results.
1410 1410                   *
1411 1411                   */
1412 1412                  rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1413 1413  
1414 1414                  break;
1415 1415  
1416 1416          case DEVCTL_AP_UNCONFIGURE:
1417 1417  
1418 1418                  /*
1419 1419                   * The unconfigure operation uses generic nexus operation to
1420 1420                   * offline a device. It leaves a target device node attached.
1421 1421                   * and obviously sata_drive_info attached as well, because
1422 1422                   * from the hardware point of view nothing has changed.
1423 1423                   */
1424 1424                  rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1425 1425                  break;
1426 1426  
1427 1427          case DEVCTL_AP_CONNECT:
1428 1428          {
1429 1429                  /*
1430 1430                   * The sata cfgadm pluging will invoke this operation only if
1431 1431                   * port was found in the disconnect state (failed state
1432 1432                   * is also treated as the disconnected state).
1433 1433                   * If port activation is successful and a device is found
1434 1434                   * attached to the port, the initialization sequence is
1435 1435                   * executed to probe the port and attach
1436 1436                   * a device structure to a port structure. The device is not
1437 1437                   * set in configured state (system-wise) by this operation.
1438 1438                   */
1439 1439  
1440 1440                  rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1441 1441  
1442 1442                  break;
1443 1443          }
1444 1444  
1445 1445          case DEVCTL_AP_CONFIGURE:
1446 1446          {
1447 1447                  /*
1448 1448                   * A port may be in an active or shutdown state.
1449 1449                   * If port is in a failed state, operation is aborted.
1450 1450                   * If a port is in a shutdown state, sata_tran_port_activate()
1451 1451                   * is invoked prior to any other operation.
1452 1452                   *
1453 1453                   * Onlining the device involves creating a new target node.
1454 1454                   * If there is an old target node present (belonging to
1455 1455                   * previously removed device), the operation is aborted - the
1456 1456                   * old node has to be released and removed before configure
1457 1457                   * operation is attempted.
1458 1458                   */
1459 1459  
1460 1460                  rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1461 1461  
1462 1462                  break;
1463 1463          }
1464 1464  
1465 1465          case DEVCTL_AP_GETSTATE:
1466 1466  
1467 1467                  sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1468 1468  
1469 1469                  ap_state.ap_last_change = (time_t)-1;
1470 1470                  ap_state.ap_error_code = 0;
1471 1471                  ap_state.ap_in_transition = 0;
1472 1472  
1473 1473                  /* Copy the return AP-state information to the user space */
1474 1474                  if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1475 1475                          rv = EFAULT;
1476 1476                  }
1477 1477                  break;
1478 1478  
1479 1479          case DEVCTL_AP_CONTROL:
1480 1480          {
1481 1481                  /*
1482 1482                   * Generic devctl for hardware specific functionality
1483 1483                   */
1484 1484                  sata_ioctl_data_t       ioc;
1485 1485  
1486 1486                  ASSERT(dcp == NULL);
1487 1487  
1488 1488                  /* Copy in user ioctl data first */
1489 1489  #ifdef _MULTI_DATAMODEL
1490 1490                  if (ddi_model_convert_from(mode & FMODELS) ==
1491 1491                      DDI_MODEL_ILP32) {
1492 1492  
1493 1493                          sata_ioctl_data_32_t    ioc32;
1494 1494  
1495 1495                          if (ddi_copyin((void *)arg, (void *)&ioc32,
1496 1496                              sizeof (ioc32), mode) != 0) {
1497 1497                                  rv = EFAULT;
1498 1498                                  break;
1499 1499                          }
1500 1500                          ioc.cmd         = (uint_t)ioc32.cmd;
1501 1501                          ioc.port        = (uint_t)ioc32.port;
1502 1502                          ioc.get_size    = (uint_t)ioc32.get_size;
1503 1503                          ioc.buf         = (caddr_t)(uintptr_t)ioc32.buf;
1504 1504                          ioc.bufsiz      = (uint_t)ioc32.bufsiz;
1505 1505                          ioc.misc_arg    = (uint_t)ioc32.misc_arg;
1506 1506                  } else
1507 1507  #endif /* _MULTI_DATAMODEL */
1508 1508                  if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1509 1509                      mode) != 0) {
1510 1510                          return (EFAULT);
1511 1511                  }
1512 1512  
1513 1513                  SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1514 1514                      "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1515 1515                      "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1516 1516  
1517 1517                  /*
1518 1518                   * To avoid BE/LE and 32/64 issues, a get_size always returns
1519 1519                   * a 32-bit number.
1520 1520                   */
1521 1521                  if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1522 1522                          return (EINVAL);
1523 1523                  }
1524 1524                  /* validate address */
1525 1525                  cport = SCSI_TO_SATA_CPORT(ioc.port);
1526 1526                  pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1527 1527                  qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1528 1528  
1529 1529                  SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1530 1530                      "sata_hba_ioctl: target port is %d:%d (%d)",
1531 1531                      cport, pmport, qual);
1532 1532  
1533 1533                  if (sata_validate_sata_address(sata_hba_inst, cport,
1534 1534                      pmport, qual) != 0)
1535 1535                          return (EINVAL);
1536 1536  
1537 1537                  cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1538 1538                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1539 1539                      cport_mutex);
1540 1540                  /* Is the port locked by event processing daemon ? */
1541 1541                  if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1542 1542                          /*
1543 1543                           * Cannot process ioctl request now. Come back later
1544 1544                           */
1545 1545                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1546 1546                              cport_mutex);
1547 1547                          return (EBUSY);
1548 1548                  }
1549 1549                  /* Block event processing for this port */
1550 1550                  cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1551 1551                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1552 1552  
1553 1553  
1554 1554                  sata_device.satadev_addr.cport = cport;
1555 1555                  sata_device.satadev_addr.pmport = pmport;
1556 1556                  sata_device.satadev_addr.qual = qual;
1557 1557                  sata_device.satadev_rev = SATA_DEVICE_REV;
1558 1558  
1559 1559                  switch (ioc.cmd) {
1560 1560  
1561 1561                  case SATA_CFGA_RESET_PORT:
1562 1562                          /*
1563 1563                           * There is no protection for configured device.
1564 1564                           */
1565 1565                          rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1566 1566                          break;
1567 1567  
1568 1568                  case SATA_CFGA_RESET_DEVICE:
1569 1569                          /*
1570 1570                           * There is no protection for configured device.
1571 1571                           */
1572 1572                          rv = sata_ioctl_reset_device(sata_hba_inst,
1573 1573                              &sata_device);
1574 1574                          break;
1575 1575  
1576 1576                  case SATA_CFGA_RESET_ALL:
1577 1577                          /*
1578 1578                           * There is no protection for configured devices.
1579 1579                           */
1580 1580                          rv = sata_ioctl_reset_all(sata_hba_inst);
1581 1581                          /*
1582 1582                           * We return here, because common return is for
1583 1583                           * a single port operation - we have already unlocked
1584 1584                           * all ports and no dc handle was allocated.
1585 1585                           */
1586 1586                          return (rv);
1587 1587  
1588 1588                  case SATA_CFGA_PORT_DEACTIVATE:
1589 1589                          /*
1590 1590                           * Arbitrarily unconfigure attached device, if any.
1591 1591                           * Even if the unconfigure fails, proceed with the
1592 1592                           * port deactivation.
1593 1593                           */
1594 1594                          rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1595 1595  
1596 1596                          break;
1597 1597  
1598 1598                  case SATA_CFGA_PORT_ACTIVATE:
1599 1599  
1600 1600                          rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1601 1601                          break;
1602 1602  
1603 1603                  case SATA_CFGA_PORT_SELF_TEST:
1604 1604  
1605 1605                          rv = sata_ioctl_port_self_test(sata_hba_inst,
1606 1606                              &sata_device);
1607 1607                          break;
1608 1608  
1609 1609                  case SATA_CFGA_GET_DEVICE_PATH:
1610 1610  
1611 1611                          rv = sata_ioctl_get_device_path(sata_hba_inst,
1612 1612                              &sata_device, &ioc, mode);
1613 1613                          break;
1614 1614  
1615 1615                  case SATA_CFGA_GET_AP_TYPE:
1616 1616  
1617 1617                          rv = sata_ioctl_get_ap_type(sata_hba_inst,
1618 1618                              &sata_device, &ioc, mode);
1619 1619                          break;
1620 1620  
1621 1621                  case SATA_CFGA_GET_MODEL_INFO:
1622 1622  
1623 1623                          rv = sata_ioctl_get_model_info(sata_hba_inst,
1624 1624                              &sata_device, &ioc, mode);
1625 1625                          break;
1626 1626  
1627 1627                  case SATA_CFGA_GET_REVFIRMWARE_INFO:
1628 1628  
1629 1629                          rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1630 1630                              &sata_device, &ioc, mode);
1631 1631                          break;
1632 1632  
1633 1633                  case SATA_CFGA_GET_SERIALNUMBER_INFO:
1634 1634  
1635 1635                          rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1636 1636                              &sata_device, &ioc, mode);
1637 1637                          break;
1638 1638  
1639 1639                  default:
1640 1640                          rv = EINVAL;
1641 1641                          break;
1642 1642  
1643 1643                  } /* End of DEVCTL_AP_CONTROL cmd switch */
1644 1644  
1645 1645                  break;
1646 1646          }
1647 1647  
1648 1648          default:
1649 1649          {
1650 1650                  /*
1651 1651                   * If we got here, we got an IOCTL that SATA HBA Framework
1652 1652                   * does not recognize. Pass ioctl to HBA driver, in case
1653 1653                   * it could process it.
1654 1654                   */
1655 1655                  sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1656 1656                  dev_info_t      *mydip = SATA_DIP(sata_hba_inst);
1657 1657  
1658 1658                  SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1659 1659                      "IOCTL 0x%2x not supported in SATA framework, "
1660 1660                      "passthrough to HBA", cmd);
1661 1661  
1662 1662                  if (sata_tran->sata_tran_ioctl == NULL) {
1663 1663                          rv = EINVAL;
1664 1664                          break;
1665 1665                  }
1666 1666                  rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1667 1667                  if (rval != 0) {
1668 1668                          SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1669 1669                              "IOCTL 0x%2x failed in HBA", cmd);
  
    | 
      ↓ open down ↓ | 
    307 lines elided | 
    
      ↑ open up ↑ | 
  
1670 1670                          rv = rval;
1671 1671                  }
1672 1672                  break;
1673 1673          }
1674 1674  
1675 1675          } /* End of main IOCTL switch */
1676 1676  
1677 1677          if (dcp) {
1678 1678                  ndi_dc_freehdl(dcp);
1679 1679          }
1680      -        mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1681      -        cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1682      -        mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1683 1680  
     1681 +        if (cmd >= DEVCTL_IOC && cmd <= DEVCTL_IOC_MAX) {
     1682 +                mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
     1683 +                    cport)->cport_mutex);
     1684 +                cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
     1685 +                mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
     1686 +        }
     1687 +
1684 1688          return (rv);
1685 1689  }
1686 1690  
1687 1691  
1688 1692  /*
1689 1693   * Create error retrieval sata packet
1690 1694   *
1691 1695   * A sata packet is allocated and set-up to contain specified error retrieval
1692 1696   * command and appropriate dma-able data buffer.
1693 1697   * No association with any scsi packet is made and no callback routine is
1694 1698   * specified.
1695 1699   *
1696 1700   * Returns a pointer to sata packet upon successful packet creation.
1697 1701   * Returns NULL, if packet cannot be created.
1698 1702   */
1699 1703  sata_pkt_t *
1700 1704  sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1701 1705      int pkt_type)
1702 1706  {
1703 1707          sata_hba_inst_t *sata_hba_inst;
1704 1708          sata_pkt_txlate_t *spx;
1705 1709          sata_pkt_t *spkt;
1706 1710          sata_drive_info_t *sdinfo;
1707 1711  
1708 1712          mutex_enter(&sata_mutex);
1709 1713          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1710 1714              sata_hba_inst = sata_hba_inst->satahba_next) {
1711 1715                  if (SATA_DIP(sata_hba_inst) == dip)
1712 1716                          break;
1713 1717          }
1714 1718          mutex_exit(&sata_mutex);
1715 1719          ASSERT(sata_hba_inst != NULL);
1716 1720  
1717 1721          sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1718 1722          if (sdinfo == NULL) {
1719 1723                  sata_log(sata_hba_inst, CE_WARN,
1720 1724                      "sata: error recovery request for non-attached device at "
1721 1725                      "cport %d", sata_device->satadev_addr.cport);
1722 1726                  return (NULL);
1723 1727          }
1724 1728  
1725 1729          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1726 1730          spx->txlt_sata_hba_inst = sata_hba_inst;
1727 1731          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
1728 1732          spkt = sata_pkt_alloc(spx, NULL);
1729 1733          if (spkt == NULL) {
1730 1734                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
1731 1735                  return (NULL);
1732 1736          }
1733 1737          /* address is needed now */
1734 1738          spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1735 1739  
1736 1740          switch (pkt_type) {
1737 1741          case SATA_ERR_RETR_PKT_TYPE_NCQ:
1738 1742                  if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1739 1743                          if (sata_check_for_dma_error(dip, spx)) {
1740 1744                                  ddi_fm_service_impact(dip,
1741 1745                                      DDI_SERVICE_UNAFFECTED);
1742 1746                                  break;
1743 1747                          }
1744 1748                          return (spkt);
1745 1749                  }
1746 1750                  break;
1747 1751  
1748 1752          case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1749 1753                  if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1750 1754                          if (sata_check_for_dma_error(dip, spx)) {
1751 1755                                  ddi_fm_service_impact(dip,
1752 1756                                      DDI_SERVICE_UNAFFECTED);
1753 1757                                  break;
1754 1758                          }
1755 1759                          return (spkt);
1756 1760                  }
1757 1761                  break;
1758 1762  
1759 1763          default:
1760 1764                  break;
1761 1765          }
1762 1766  
1763 1767          sata_pkt_free(spx);
1764 1768          kmem_free(spx, sizeof (sata_pkt_txlate_t));
1765 1769          return (NULL);
1766 1770  
1767 1771  }
1768 1772  
1769 1773  
1770 1774  /*
1771 1775   * Free error retrieval sata packet
1772 1776   *
1773 1777   * Free sata packet and any associated resources allocated previously by
1774 1778   * sata_get_error_retrieval_pkt().
1775 1779   *
1776 1780   * Void return.
1777 1781   */
1778 1782  void
1779 1783  sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1780 1784  {
1781 1785          sata_pkt_txlate_t *spx =
1782 1786              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1783 1787  
1784 1788          ASSERT(sata_pkt != NULL);
1785 1789  
1786 1790          sata_free_local_buffer(spx);
1787 1791          sata_pkt_free(spx);
1788 1792          kmem_free(spx, sizeof (sata_pkt_txlate_t));
1789 1793  
1790 1794  }
1791 1795  
1792 1796  /*
1793 1797   * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1794 1798   *
1795 1799   * No association with any scsi packet is made and no callback routine is
1796 1800   * specified.
1797 1801   *
1798 1802   * Returns a pointer to sata packet upon successful packet creation.
1799 1803   * Returns NULL, if packet cannot be created.
1800 1804   *
1801 1805   * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1802 1806   * only lower 32 bits are available currently.
1803 1807   */
1804 1808  sata_pkt_t *
1805 1809  sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1806 1810      uint8_t regn, uint32_t regv, uint32_t type)
1807 1811  {
1808 1812          sata_hba_inst_t *sata_hba_inst;
1809 1813          sata_pkt_txlate_t *spx;
1810 1814          sata_pkt_t *spkt;
1811 1815          sata_cmd_t *scmd;
1812 1816  
1813 1817          /* Only READ/WRITE commands are accepted. */
1814 1818          ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1815 1819              type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1816 1820  
1817 1821          mutex_enter(&sata_mutex);
1818 1822          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1819 1823              sata_hba_inst = sata_hba_inst->satahba_next) {
1820 1824                  if (SATA_DIP(sata_hba_inst) == dip)
1821 1825                          break;
1822 1826          }
1823 1827          mutex_exit(&sata_mutex);
1824 1828          ASSERT(sata_hba_inst != NULL);
1825 1829  
1826 1830          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1827 1831          spx->txlt_sata_hba_inst = sata_hba_inst;
1828 1832          spx->txlt_scsi_pkt = NULL;      /* No scsi pkt involved */
1829 1833          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1830 1834          if (spkt == NULL) {
1831 1835                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
1832 1836                  return (NULL);
1833 1837          }
1834 1838  
1835 1839          /*
1836 1840           * NOTE: We need to send this command to the port multiplier,
1837 1841           * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
1838 1842           *
1839 1843           * sata_device contains the address of actual target device, and the
1840 1844           * pmport number in the command comes from the sata_device structure.
1841 1845           */
1842 1846          spkt->satapkt_device.satadev_addr = sd->satadev_addr;
1843 1847          spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
1844 1848          spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
1845 1849  
1846 1850          /* Fill sata_pkt */
1847 1851          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
1848 1852          spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
1849 1853          spkt->satapkt_time = 10; /* Timeout 10s */
1850 1854  
1851 1855          /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
1852 1856          scmd = &spkt->satapkt_cmd;
1853 1857          scmd->satacmd_features_reg = regn & 0xff;
1854 1858          scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
1855 1859          scmd->satacmd_device_reg = sd->satadev_addr.pmport;
1856 1860          scmd->satacmd_addr_type = 0;            /* N/A */
1857 1861  
1858 1862          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1859 1863  
1860 1864          if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
1861 1865                  scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
1862 1866                  scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1863 1867                  scmd->satacmd_flags.sata_special_regs = 1;
1864 1868                  scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
1865 1869                  scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
1866 1870                  scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
1867 1871                  scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
1868 1872          } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
1869 1873                  scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
1870 1874                  scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1871 1875                  scmd->satacmd_sec_count_lsb = regv & 0xff;
1872 1876                  scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
1873 1877                  scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
1874 1878                  scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
1875 1879          }
1876 1880  
1877 1881          return (spkt);
1878 1882  }
1879 1883  
1880 1884  /*
1881 1885   * Free sata packet and any associated resources allocated previously by
1882 1886   * sata_get_rdwr_pmult_pkt().
1883 1887   *
1884 1888   * Void return.
1885 1889   */
1886 1890  void
1887 1891  sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
1888 1892  {
1889 1893          sata_pkt_txlate_t *spx =
1890 1894              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1891 1895  
1892 1896          /* Free allocated resources */
1893 1897          sata_pkt_free(spx);
1894 1898          kmem_free(spx, sizeof (sata_pkt_txlate_t));
1895 1899  }
1896 1900  
1897 1901  /*
1898 1902   * Register a port multiplier to framework.
1899 1903   * 1) Store the GSCR values in the previous allocated pmult_info strctures.
1900 1904   * 2) Search in the blacklist and update the number of the device ports of the
1901 1905   * port multiplier.
1902 1906   *
1903 1907   * Void return.
1904 1908   */
1905 1909  void
1906 1910  sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
1907 1911  {
1908 1912          sata_hba_inst_t *sata_hba_inst = NULL;
1909 1913          sata_pmult_info_t *pmultinfo;
1910 1914          sata_pmult_bl_t *blp;
1911 1915          int cport = sd->satadev_addr.cport;
1912 1916  
1913 1917          mutex_enter(&sata_mutex);
1914 1918          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1915 1919              sata_hba_inst = sata_hba_inst->satahba_next) {
1916 1920                  if (SATA_DIP(sata_hba_inst) == dip)
1917 1921                          if (sata_hba_inst->satahba_attached == 1)
1918 1922                                  break;
1919 1923          }
1920 1924          mutex_exit(&sata_mutex);
1921 1925          /* HBA not attached? */
1922 1926          if (sata_hba_inst == NULL)
1923 1927                  return;
1924 1928  
1925 1929          /* Number of pmports */
1926 1930          sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
1927 1931  
1928 1932          /* Check the blacklist */
1929 1933          for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
1930 1934                  if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
1931 1935                          continue;
1932 1936                  if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
1933 1937                          continue;
1934 1938                  if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
1935 1939                          continue;
1936 1940  
1937 1941                  cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
1938 1942                  sd->satadev_add_info = blp->bl_flags;
1939 1943                  break;
1940 1944          }
1941 1945  
1942 1946          /* Register the port multiplier GSCR */
1943 1947          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1944 1948          pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
1945 1949          if (pmultinfo != NULL) {
1946 1950                  pmultinfo->pmult_gscr = *sg;
1947 1951                  pmultinfo->pmult_num_dev_ports =
1948 1952                      sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
1949 1953                  SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
1950 1954                      "Port multiplier registered at port %d", cport);
1951 1955          }
1952 1956          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1953 1957  }
1954 1958  
1955 1959  /*
1956 1960   * sata_split_model splits the model ID into vendor and product IDs.
1957 1961   * It assumes that a vendor ID cannot be longer than 8 characters, and
1958 1962   * that vendor and product ID are separated by a whitespace.
1959 1963   */
1960 1964  void
1961 1965  sata_split_model(char *model, char **vendor, char **product)
1962 1966  {
1963 1967          int i, modlen;
1964 1968          char *vid, *pid;
1965 1969  
1966 1970          /*
1967 1971           * remove whitespace at the end of model
1968 1972           */
1969 1973          for (i = SATA_ID_MODEL_LEN; i > 0; i--)
1970 1974                  if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
1971 1975                          model[i] = '\0';
1972 1976                  else
1973 1977                          break;
1974 1978  
1975 1979          /*
1976 1980           * try to split model into into vid/pid
1977 1981           */
1978 1982          modlen = strlen(model);
1979 1983          for (i = 0, pid = model; i < modlen; i++, pid++)
1980 1984                  if ((*pid == ' ') || (*pid == '\t'))
1981 1985                          break;
1982 1986  
1983 1987          /*
1984 1988           * only use vid if it is less than 8 chars (as in SCSI)
1985 1989           */
1986 1990          if (i < modlen && i <= 8) {
1987 1991                  vid = model;
1988 1992                  /*
1989 1993                   * terminate vid, establish pid
1990 1994                   */
1991 1995                  *pid++ = '\0';
1992 1996          } else {
1993 1997                  /*
1994 1998                   * vid will stay "ATA     "
1995 1999                   */
1996 2000                  vid = NULL;
1997 2001                  /*
1998 2002                   * model is all pid
1999 2003                   */
2000 2004                  pid = model;
2001 2005          }
2002 2006  
2003 2007          *vendor = vid;
2004 2008          *product = pid;
2005 2009  }
2006 2010  
2007 2011  /*
2008 2012   * sata_name_child is for composing the name of the node
2009 2013   * the format of the name is "target,0".
2010 2014   */
2011 2015  static int
2012 2016  sata_name_child(dev_info_t *dip, char *name, int namelen)
2013 2017  {
2014 2018          int target;
2015 2019  
2016 2020          target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2017 2021              DDI_PROP_DONTPASS, "target", -1);
2018 2022          if (target == -1)
2019 2023                  return (DDI_FAILURE);
2020 2024          (void) snprintf(name, namelen, "%x,0", target);
2021 2025          return (DDI_SUCCESS);
2022 2026  }
2023 2027  
2024 2028  
2025 2029  
2026 2030  /* ****************** SCSA required entry points *********************** */
2027 2031  
2028 2032  /*
2029 2033   * Implementation of scsi tran_tgt_init.
2030 2034   * sata_scsi_tgt_init() initializes scsi_device structure
2031 2035   *
2032 2036   * If successful, DDI_SUCCESS is returned.
2033 2037   * DDI_FAILURE is returned if addressed device does not exist
2034 2038   */
2035 2039  
2036 2040  static int
2037 2041  sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2038 2042      scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2039 2043  {
2040 2044  #ifndef __lock_lint
2041 2045          _NOTE(ARGUNUSED(hba_dip))
2042 2046          _NOTE(ARGUNUSED(tgt_dip))
2043 2047  #endif
2044 2048          sata_device_t           sata_device;
2045 2049          sata_drive_info_t       *sdinfo;
2046 2050          struct sata_id          *sid;
2047 2051          sata_hba_inst_t         *sata_hba_inst;
2048 2052          char                    model[SATA_ID_MODEL_LEN + 1];
2049 2053          char                    fw[SATA_ID_FW_LEN + 1];
2050 2054          char                    *vid, *pid;
2051 2055  
2052 2056          /*
2053 2057           * Fail tran_tgt_init for .conf stub node
2054 2058           */
2055 2059          if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2056 2060                  (void) ndi_merge_node(tgt_dip, sata_name_child);
2057 2061                  ddi_set_name_addr(tgt_dip, NULL);
2058 2062                  return (DDI_FAILURE);
2059 2063          }
2060 2064  
2061 2065          sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2062 2066  
2063 2067          /* Validate scsi device address */
2064 2068          if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2065 2069              &sata_device) != 0)
2066 2070                  return (DDI_FAILURE);
2067 2071  
2068 2072          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2069 2073              sata_device.satadev_addr.cport)));
2070 2074  
2071 2075          /* sata_device now contains a valid sata address */
2072 2076          sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2073 2077          if (sdinfo == NULL) {
2074 2078                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2075 2079                      sata_device.satadev_addr.cport)));
2076 2080                  return (DDI_FAILURE);
2077 2081          }
2078 2082          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2079 2083              sata_device.satadev_addr.cport)));
2080 2084  
2081 2085          /*
2082 2086           * Check if we need to create a legacy devid (i.e cmdk style) for
2083 2087           * the target disks.
2084 2088           *
2085 2089           * HBA devinfo node will have the property "use-cmdk-devid-format"
2086 2090           * if we need to create cmdk-style devid for all the disk devices
2087 2091           * attached to this controller. This property may have been set
2088 2092           * from HBA driver's .conf file or by the HBA driver in its
2089 2093           * attach(9F) function.
2090 2094           */
2091 2095          if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2092 2096              (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2093 2097              "use-cmdk-devid-format", 0) == 1)) {
2094 2098                  /* register a legacy devid for this target node */
2095 2099                  sata_target_devid_register(tgt_dip, sdinfo);
2096 2100          }
2097 2101  
2098 2102  
2099 2103          /*
2100 2104           * 'Identify Device Data' does not always fit in standard SCSI
2101 2105           * INQUIRY data, so establish INQUIRY_* properties with full-form
2102 2106           * of information.
2103 2107           */
2104 2108          sid = &sdinfo->satadrv_id;
2105 2109  #ifdef  _LITTLE_ENDIAN
2106 2110          swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2107 2111          swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2108 2112  #else   /* _LITTLE_ENDIAN */
2109 2113          bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2110 2114          bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2111 2115  #endif  /* _LITTLE_ENDIAN */
2112 2116          model[SATA_ID_MODEL_LEN] = 0;
2113 2117          fw[SATA_ID_FW_LEN] = 0;
2114 2118  
2115 2119          sata_split_model(model, &vid, &pid);
2116 2120  
2117 2121          if (vid)
2118 2122                  (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2119 2123                      vid, strlen(vid));
2120 2124          if (pid)
2121 2125                  (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2122 2126                      pid, strlen(pid));
2123 2127          (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2124 2128              fw, strlen(fw));
2125 2129  
2126 2130          return (DDI_SUCCESS);
2127 2131  }
2128 2132  
2129 2133  /*
2130 2134   * Implementation of scsi tran_tgt_probe.
2131 2135   * Probe target, by calling default scsi routine scsi_hba_probe()
2132 2136   */
2133 2137  static int
2134 2138  sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2135 2139  {
2136 2140          sata_hba_inst_t *sata_hba_inst =
2137 2141              (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2138 2142          int rval;
2139 2143          uint32_t pm_cap;
2140 2144  
2141 2145          rval = scsi_hba_probe(sd, callback);
2142 2146          pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2143 2147              SATA_CAP_LOG_SENSE;
2144 2148  
2145 2149          if (rval == SCSIPROBE_EXISTS) {
2146 2150                  /*
2147 2151                   * Set property "pm-capable" on the target device node, so that
2148 2152                   * the target driver will not try to fetch scsi cycle counters
2149 2153                   * before enabling device power-management.
2150 2154                   */
2151 2155                  if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2152 2156                      "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2153 2157                          sata_log(sata_hba_inst, CE_WARN,
2154 2158                              "SATA device at port %d: "
2155 2159                              "will not be power-managed ",
2156 2160                              SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2157 2161                          SATA_LOG_D((sata_hba_inst, CE_WARN,
2158 2162                              "failure updating pm-capable property"));
2159 2163                  }
2160 2164          }
2161 2165          return (rval);
2162 2166  }
2163 2167  
2164 2168  /*
2165 2169   * Implementation of scsi tran_tgt_free.
2166 2170   * Release all resources allocated for scsi_device
2167 2171   */
2168 2172  static void
2169 2173  sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2170 2174      scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2171 2175  {
2172 2176  #ifndef __lock_lint
2173 2177          _NOTE(ARGUNUSED(hba_dip))
2174 2178  #endif
2175 2179          sata_device_t           sata_device;
2176 2180          sata_drive_info_t       *sdinfo;
2177 2181          sata_hba_inst_t         *sata_hba_inst;
2178 2182          ddi_devid_t             devid;
2179 2183  
2180 2184          sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2181 2185  
2182 2186          /* Validate scsi device address */
2183 2187          /*
2184 2188           * Note: tgt_free relates to the SCSA view of a device. If called, there
2185 2189           * was a device at this address, so even if the sata framework internal
2186 2190           * resources were alredy released because a device was detached,
2187 2191           * this function should be executed as long as its actions do
2188 2192           * not require the internal sata view of a device and the address
2189 2193           * refers to a valid sata address.
2190 2194           * Validating the address here means that we do not trust SCSA...
2191 2195           */
2192 2196          if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2193 2197              &sata_device) == -1)
2194 2198                  return;
2195 2199  
2196 2200          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2197 2201              sata_device.satadev_addr.cport)));
2198 2202  
2199 2203          /* sata_device now should contain a valid sata address */
2200 2204          sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2201 2205          if (sdinfo == NULL) {
2202 2206                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2203 2207                      sata_device.satadev_addr.cport)));
2204 2208                  return;
2205 2209          }
2206 2210          /*
2207 2211           * We did not allocate any resources in sata_scsi_tgt_init()
2208 2212           * other than few properties.
2209 2213           * Free them.
2210 2214           */
2211 2215          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2212 2216              sata_device.satadev_addr.cport)));
2213 2217          (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2214 2218  
2215 2219          /*
2216 2220           * If devid was previously created but not freed up from
2217 2221           * sd(7D) driver (i.e during detach(9F)) then do it here.
2218 2222           */
2219 2223          if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2220 2224              (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2221 2225              "use-cmdk-devid-format", 0) == 1) &&
2222 2226              (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2223 2227                  ddi_devid_unregister(tgt_dip);
2224 2228                  ddi_devid_free(devid);
2225 2229          }
2226 2230  }
2227 2231  
2228 2232  /*
2229 2233   * Implementation of scsi tran_init_pkt
2230 2234   * Upon successful return, scsi pkt buffer has DMA resources allocated.
2231 2235   *
2232 2236   * It seems that we should always allocate pkt, even if the address is
2233 2237   * for non-existing device - just use some default for dma_attr.
2234 2238   * The reason is that there is no way to communicate this to a caller here.
2235 2239   * Subsequent call to sata_scsi_start may fail appropriately.
2236 2240   * Simply returning NULL does not seem to discourage a target driver...
2237 2241   *
2238 2242   * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2239 2243   */
2240 2244  static struct scsi_pkt *
2241 2245  sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2242 2246      struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2243 2247      int (*callback)(caddr_t), caddr_t arg)
2244 2248  {
2245 2249          sata_hba_inst_t *sata_hba_inst =
2246 2250              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2247 2251          dev_info_t *dip = SATA_DIP(sata_hba_inst);
2248 2252          sata_device_t sata_device;
2249 2253          sata_drive_info_t *sdinfo;
2250 2254          sata_pkt_txlate_t *spx;
2251 2255          ddi_dma_attr_t cur_dma_attr;
2252 2256          int rval;
2253 2257          boolean_t new_pkt = B_TRUE;
2254 2258  
2255 2259          ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2256 2260  
2257 2261          /*
2258 2262           * We need to translate the address, even if it could be
2259 2263           * a bogus one, for a non-existing device
2260 2264           */
2261 2265          sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2262 2266          sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2263 2267          sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2264 2268          sata_device.satadev_rev = SATA_DEVICE_REV;
2265 2269  
2266 2270          if (pkt == NULL) {
2267 2271                  /*
2268 2272                   * Have to allocate a brand new scsi packet.
2269 2273                   * We need to operate with auto request sense enabled.
2270 2274                   */
2271 2275                  pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2272 2276                      MAX(statuslen, SATA_MAX_SENSE_LEN),
2273 2277                      tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2274 2278  
2275 2279                  if (pkt == NULL)
2276 2280                          return (NULL);
2277 2281  
2278 2282                  /* Fill scsi packet structure */
2279 2283                  pkt->pkt_comp           = (void (*)())NULL;
2280 2284                  pkt->pkt_time           = 0;
2281 2285                  pkt->pkt_resid          = 0;
2282 2286                  pkt->pkt_statistics     = 0;
2283 2287                  pkt->pkt_reason         = 0;
2284 2288  
2285 2289                  /*
2286 2290                   * pkt_hba_private will point to sata pkt txlate structure
2287 2291                   */
2288 2292                  spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2289 2293                  bzero(spx, sizeof (sata_pkt_txlate_t));
2290 2294  
2291 2295                  spx->txlt_scsi_pkt = pkt;
2292 2296                  spx->txlt_sata_hba_inst = sata_hba_inst;
2293 2297  
2294 2298                  /* Allocate sata_pkt */
2295 2299                  spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2296 2300                  if (spx->txlt_sata_pkt == NULL) {
2297 2301                          /* Could not allocate sata pkt */
2298 2302                          scsi_hba_pkt_free(ap, pkt);
2299 2303                          return (NULL);
2300 2304                  }
2301 2305                  /* Set sata address */
2302 2306                  spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2303 2307                      sata_device.satadev_addr;
2304 2308                  spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2305 2309                      sata_device.satadev_rev;
2306 2310  
2307 2311                  if ((bp == NULL) || (bp->b_bcount == 0))
2308 2312                          return (pkt);
2309 2313  
2310 2314                  spx->txlt_total_residue = bp->b_bcount;
2311 2315          } else {
2312 2316                  new_pkt = B_FALSE;
2313 2317                  /*
2314 2318                   * Packet was preallocated/initialized by previous call
2315 2319                   */
2316 2320                  spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2317 2321  
2318 2322                  if ((bp == NULL) || (bp->b_bcount == 0)) {
2319 2323                          return (pkt);
2320 2324                  }
2321 2325  
2322 2326                  /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2323 2327          }
2324 2328  
2325 2329          spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2326 2330  
2327 2331          /*
2328 2332           * We use an adjusted version of the dma_attr, to account
2329 2333           * for device addressing limitations.
2330 2334           * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2331 2335           * happen when a device is not yet configured.
2332 2336           */
2333 2337          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2334 2338              sata_device.satadev_addr.cport)));
2335 2339          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2336 2340              &spx->txlt_sata_pkt->satapkt_device);
2337 2341          /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2338 2342          sata_adjust_dma_attr(sdinfo,
2339 2343              SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2340 2344          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2341 2345              sata_device.satadev_addr.cport)));
2342 2346          /*
2343 2347           * Allocate necessary DMA resources for the packet's data buffer
2344 2348           * NOTE:
2345 2349           * In case of read/write commands, DMA resource allocation here is
2346 2350           * based on the premise that the transfer length specified in
2347 2351           * the read/write scsi cdb will match exactly DMA resources -
2348 2352           * returning correct packet residue is crucial.
2349 2353           */
2350 2354          if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2351 2355              &cur_dma_attr)) != DDI_SUCCESS) {
2352 2356                  /*
2353 2357                   * If a DMA allocation request fails with
2354 2358                   * DDI_DMA_NOMAPPING, indicate the error by calling
2355 2359                   * bioerror(9F) with bp and an error code of EFAULT.
2356 2360                   * If a DMA allocation request fails with
2357 2361                   * DDI_DMA_TOOBIG, indicate the error by calling
2358 2362                   * bioerror(9F) with bp and an error code of EINVAL.
2359 2363                   * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2360 2364                   * Request may be repeated later - there is no real error.
2361 2365                   */
2362 2366                  switch (rval) {
2363 2367                  case DDI_DMA_NORESOURCES:
2364 2368                          bioerror(bp, 0);
2365 2369                          break;
2366 2370                  case DDI_DMA_NOMAPPING:
2367 2371                  case DDI_DMA_BADATTR:
2368 2372                          bioerror(bp, EFAULT);
2369 2373                          break;
2370 2374                  case DDI_DMA_TOOBIG:
2371 2375                  default:
2372 2376                          bioerror(bp, EINVAL);
2373 2377                          break;
2374 2378                  }
2375 2379                  goto fail;
2376 2380          }
2377 2381  
2378 2382          if (sata_check_for_dma_error(dip, spx)) {
2379 2383                  ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2380 2384                  bioerror(bp, EFAULT);
2381 2385                  goto fail;
2382 2386          }
2383 2387  
2384 2388  success:
2385 2389          /* Set number of bytes that are not yet accounted for */
2386 2390          pkt->pkt_resid = spx->txlt_total_residue;
2387 2391          ASSERT(pkt->pkt_resid >= 0);
2388 2392  
2389 2393          return (pkt);
2390 2394  
2391 2395  fail:
2392 2396          if (new_pkt == B_TRUE) {
2393 2397                  /*
2394 2398                   * Since this is a new packet, we can clean-up
2395 2399                   * everything
2396 2400                   */
2397 2401                  sata_scsi_destroy_pkt(ap, pkt);
2398 2402          } else {
2399 2403                  /*
2400 2404                   * This is a re-used packet. It will be target driver's
2401 2405                   * responsibility to eventually destroy it (which
2402 2406                   * will free allocated resources).
2403 2407                   * Here, we just "complete" the request, leaving
2404 2408                   * allocated resources intact, so the request may
2405 2409                   * be retried.
2406 2410                   */
2407 2411                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2408 2412                  sata_pkt_free(spx);
2409 2413          }
2410 2414          return (NULL);
2411 2415  }
2412 2416  
2413 2417  /*
2414 2418   * Implementation of scsi tran_start.
2415 2419   * Translate scsi cmd into sata operation and return status.
2416 2420   * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2417 2421   * are supported.
2418 2422   * For SATA hard disks, supported scsi commands:
2419 2423   * SCMD_INQUIRY
2420 2424   * SCMD_TEST_UNIT_READY
2421 2425   * SCMD_START_STOP
2422 2426   * SCMD_READ_CAPACITY
2423 2427   * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2424 2428   * SCMD_REQUEST_SENSE
2425 2429   * SCMD_LOG_SENSE_G1
2426 2430   * SCMD_LOG_SELECT_G1
2427 2431   * SCMD_MODE_SENSE      (specific pages)
2428 2432   * SCMD_MODE_SENSE_G1   (specific pages)
2429 2433   * SCMD_MODE_SELECT     (specific pages)
2430 2434   * SCMD_MODE_SELECT_G1  (specific pages)
2431 2435   * SCMD_SYNCHRONIZE_CACHE
2432 2436   * SCMD_SYNCHRONIZE_CACHE_G1
2433 2437   * SCMD_READ
2434 2438   * SCMD_READ_G1
2435 2439   * SCMD_READ_G4
2436 2440   * SCMD_READ_G5
2437 2441   * SCMD_WRITE
2438 2442   * SCMD_WRITE_BUFFER
2439 2443   * SCMD_WRITE_G1
2440 2444   * SCMD_WRITE_G4
2441 2445   * SCMD_WRITE_G5
2442 2446   * SCMD_SEEK            (noop)
2443 2447   * SCMD_SDIAG
2444 2448   *
2445 2449   * All other commands are rejected as unsupported.
2446 2450   *
2447 2451   * Returns:
2448 2452   * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2449 2453   * for execution. TRAN_ACCEPT may be returned also if device was removed but
2450 2454   * a callback could be scheduled.
2451 2455   * TRAN_BADPKT if cmd was directed to invalid address.
2452 2456   * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2453 2457   * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2454 2458   * was removed and there was no callback specified in scsi pkt.
2455 2459   * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2456 2460   * framework was busy performing some other operation(s).
2457 2461   *
2458 2462   */
2459 2463  static int
2460 2464  sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2461 2465  {
2462 2466          sata_hba_inst_t *sata_hba_inst =
2463 2467              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2464 2468          sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2465 2469          sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2466 2470          sata_drive_info_t *sdinfo;
2467 2471          struct buf *bp;
2468 2472          uint8_t cport, pmport;
2469 2473          boolean_t dev_gone = B_FALSE;
2470 2474          int rval;
2471 2475  
2472 2476          SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2473 2477              "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2474 2478  
2475 2479          ASSERT(spx != NULL &&
2476 2480              spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
2477 2481  
2478 2482          cport = SCSI_TO_SATA_CPORT(ap->a_target);
2479 2483          pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2480 2484  
2481 2485          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2482 2486  
2483 2487          if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2484 2488                  sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2485 2489                  if (sdinfo == NULL ||
2486 2490                      SATA_CPORT_INFO(sata_hba_inst, cport)->
2487 2491                      cport_tgtnode_clean == B_FALSE ||
2488 2492                      (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2489 2493                          dev_gone = B_TRUE;
2490 2494                  }
2491 2495          } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2492 2496                  if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2493 2497                      SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2494 2498                      cport) == NULL) {
2495 2499                          dev_gone = B_TRUE;
2496 2500                  } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2497 2501                      pmport) == NULL) {
2498 2502                          dev_gone = B_TRUE;
2499 2503                  } else {
2500 2504                          mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2501 2505                              cport, pmport)));
2502 2506                          sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2503 2507                          if (sdinfo == NULL ||
2504 2508                              SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2505 2509                              pmport_tgtnode_clean == B_FALSE ||
2506 2510                              (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2507 2511                                  dev_gone = B_TRUE;
2508 2512                          }
2509 2513                          mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2510 2514                              cport, pmport)));
2511 2515                  }
2512 2516          }
2513 2517  
2514 2518          if (dev_gone == B_TRUE) {
2515 2519                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2516 2520                  pkt->pkt_reason = CMD_DEV_GONE;
2517 2521                  /*
2518 2522                   * The sd target driver is checking CMD_DEV_GONE pkt_reason
2519 2523                   * only in callback function (for normal requests) and
2520 2524                   * in the dump code path.
2521 2525                   * So, if the callback is available, we need to do
2522 2526                   * the callback rather than returning TRAN_FATAL_ERROR here.
2523 2527                   */
2524 2528                  if (pkt->pkt_comp != NULL) {
2525 2529                          /* scsi callback required */
2526 2530                          if (servicing_interrupt()) {
2527 2531                                  if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2528 2532                                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2529 2533                                      (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2530 2534                                      NULL) {
2531 2535                                          return (TRAN_BUSY);
2532 2536                                  }
2533 2537                          } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2534 2538                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2535 2539                              (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
2536 2540                                  /* Scheduling the callback failed */
2537 2541                                  return (TRAN_BUSY);
2538 2542                          }
2539 2543                          return (TRAN_ACCEPT);
2540 2544                  }
2541 2545                  /* No callback available */
2542 2546                  return (TRAN_FATAL_ERROR);
2543 2547          }
2544 2548  
2545 2549          if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2546 2550                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2547 2551                  rval = sata_txlt_atapi(spx);
2548 2552                  SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2549 2553                      "sata_scsi_start atapi: rval %d\n", rval);
2550 2554                  return (rval);
2551 2555          }
2552 2556          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2553 2557  
2554 2558          /*
2555 2559           * Checking for power state, if it was on
2556 2560           * STOPPED state, then the drive is not capable
2557 2561           * of processing media access command.  And
2558 2562           * TEST_UNIT_READY, REQUEST_SENSE has special handling
2559 2563           * in the function for different power state.
2560 2564           */
2561 2565          if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2562 2566              (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2563 2567              (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2564 2568                  return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2565 2569                      SD_SCSI_ASC_LU_NOT_READY));
2566 2570          }
2567 2571  
2568 2572          /* ATA Disk commands processing starts here */
2569 2573  
2570 2574          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2571 2575  
2572 2576          switch (pkt->pkt_cdbp[0]) {
2573 2577  
2574 2578          case SCMD_INQUIRY:
2575 2579                  /* Mapped to identify device */
2576 2580                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2577 2581                          bp_mapin(bp);
2578 2582                  rval = sata_txlt_inquiry(spx);
2579 2583                  break;
2580 2584  
2581 2585          case SCMD_TEST_UNIT_READY:
2582 2586                  /*
2583 2587                   * SAT "SATA to ATA Translation" doc specifies translation
2584 2588                   * to ATA CHECK POWER MODE.
2585 2589                   */
2586 2590                  rval = sata_txlt_test_unit_ready(spx);
2587 2591                  break;
2588 2592  
2589 2593          case SCMD_START_STOP:
2590 2594                  /* Mapping depends on the command */
2591 2595                  rval = sata_txlt_start_stop_unit(spx);
2592 2596                  break;
2593 2597  
2594 2598          case SCMD_READ_CAPACITY:
2595 2599                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2596 2600                          bp_mapin(bp);
2597 2601                  rval = sata_txlt_read_capacity(spx);
2598 2602                  break;
2599 2603  
2600 2604          case SCMD_SVC_ACTION_IN_G4:             /* READ CAPACITY (16) */
2601 2605                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2602 2606                          bp_mapin(bp);
2603 2607                  rval = sata_txlt_read_capacity16(spx);
2604 2608                  break;
2605 2609  
2606 2610          case SCMD_REQUEST_SENSE:
2607 2611                  /*
2608 2612                   * Always No Sense, since we force ARQ
2609 2613                   */
2610 2614                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2611 2615                          bp_mapin(bp);
2612 2616                  rval = sata_txlt_request_sense(spx);
2613 2617                  break;
2614 2618  
2615 2619          case SCMD_LOG_SENSE_G1:
2616 2620                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2617 2621                          bp_mapin(bp);
2618 2622                  rval = sata_txlt_log_sense(spx);
2619 2623                  break;
2620 2624  
2621 2625          case SCMD_LOG_SELECT_G1:
2622 2626                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2623 2627                          bp_mapin(bp);
2624 2628                  rval = sata_txlt_log_select(spx);
2625 2629                  break;
2626 2630  
2627 2631          case SCMD_MODE_SENSE:
2628 2632          case SCMD_MODE_SENSE_G1:
2629 2633                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2630 2634                          bp_mapin(bp);
2631 2635                  rval = sata_txlt_mode_sense(spx);
2632 2636                  break;
2633 2637  
2634 2638  
2635 2639          case SCMD_MODE_SELECT:
2636 2640          case SCMD_MODE_SELECT_G1:
2637 2641                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2638 2642                          bp_mapin(bp);
2639 2643                  rval = sata_txlt_mode_select(spx);
2640 2644                  break;
2641 2645  
2642 2646          case SCMD_SYNCHRONIZE_CACHE:
2643 2647          case SCMD_SYNCHRONIZE_CACHE_G1:
2644 2648                  rval = sata_txlt_synchronize_cache(spx);
2645 2649                  break;
2646 2650  
2647 2651          case SCMD_READ:
2648 2652          case SCMD_READ_G1:
2649 2653          case SCMD_READ_G4:
2650 2654          case SCMD_READ_G5:
2651 2655                  rval = sata_txlt_read(spx);
2652 2656                  break;
2653 2657          case SCMD_WRITE_BUFFER:
2654 2658                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2655 2659                          bp_mapin(bp);
2656 2660                  rval = sata_txlt_write_buffer(spx);
2657 2661                  break;
2658 2662  
2659 2663          case SCMD_WRITE:
2660 2664          case SCMD_WRITE_G1:
2661 2665          case SCMD_WRITE_G4:
2662 2666          case SCMD_WRITE_G5:
2663 2667                  rval = sata_txlt_write(spx);
2664 2668                  break;
2665 2669  
2666 2670          case SCMD_SEEK:
2667 2671                  rval = sata_txlt_nodata_cmd_immediate(spx);
2668 2672                  break;
2669 2673  
2670 2674          case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
2671 2675          case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
2672 2676                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2673 2677                          bp_mapin(bp);
2674 2678                  rval = sata_txlt_ata_pass_thru(spx);
2675 2679                  break;
2676 2680  
2677 2681                  /* Other cases will be filed later */
2678 2682                  /* postponed until phase 2 of the development */
2679 2683          case SPC3_CMD_UNMAP:
2680 2684                  if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2681 2685                          bp_mapin(bp);
2682 2686                  rval = sata_txlt_unmap(spx);
2683 2687                  break;
2684 2688          default:
2685 2689                  rval = sata_txlt_invalid_command(spx);
2686 2690                  break;
2687 2691          }
2688 2692  
2689 2693          SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2690 2694              "sata_scsi_start: rval %d\n", rval);
2691 2695  
2692 2696          return (rval);
2693 2697  }
2694 2698  
2695 2699  /*
2696 2700   * Implementation of scsi tran_abort.
2697 2701   * Abort specific pkt or all packets.
2698 2702   *
2699 2703   * Returns 1 if one or more packets were aborted, returns 0 otherwise
2700 2704   *
2701 2705   * May be called from an interrupt level.
2702 2706   */
2703 2707  static int
2704 2708  sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2705 2709  {
2706 2710          sata_hba_inst_t *sata_hba_inst =
2707 2711              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2708 2712          sata_device_t   sata_device;
2709 2713          sata_pkt_t      *sata_pkt;
2710 2714  
2711 2715          SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2712 2716              "sata_scsi_abort: %s at target: 0x%x\n",
2713 2717              scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2714 2718  
2715 2719          /* Validate address */
2716 2720          if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2717 2721                  /* Invalid address */
2718 2722                  return (0);
2719 2723  
2720 2724          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2721 2725              sata_device.satadev_addr.cport)));
2722 2726          if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2723 2727                  /* invalid address */
2724 2728                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2725 2729                      sata_device.satadev_addr.cport)));
2726 2730                  return (0);
2727 2731          }
2728 2732          if (scsi_pkt == NULL) {
2729 2733                  /*
2730 2734                   * Abort all packets.
2731 2735                   * Although we do not have specific packet, we still need
2732 2736                   * dummy packet structure to pass device address to HBA.
2733 2737                   * Allocate one, without sleeping. Fail if pkt cannot be
2734 2738                   * allocated.
2735 2739                   */
2736 2740                  sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2737 2741                  if (sata_pkt == NULL) {
2738 2742                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2739 2743                              sata_device.satadev_addr.cport)));
2740 2744                          SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2741 2745                              "could not allocate sata_pkt"));
2742 2746                          return (0);
2743 2747                  }
2744 2748                  sata_pkt->satapkt_rev = SATA_PKT_REV;
2745 2749                  sata_pkt->satapkt_device = sata_device;
2746 2750                  sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2747 2751          } else {
2748 2752                  if (scsi_pkt->pkt_ha_private == NULL) {
2749 2753                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2750 2754                              sata_device.satadev_addr.cport)));
2751 2755                          return (0); /* Bad scsi pkt */
2752 2756                  }
2753 2757                  /* extract pointer to sata pkt */
2754 2758                  sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2755 2759                      txlt_sata_pkt;
2756 2760          }
2757 2761  
2758 2762          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2759 2763              sata_device.satadev_addr.cport)));
2760 2764          /* Send abort request to HBA */
2761 2765          if ((*SATA_ABORT_FUNC(sata_hba_inst))
2762 2766              (SATA_DIP(sata_hba_inst), sata_pkt,
2763 2767              scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2764 2768              SATA_SUCCESS) {
2765 2769                  if (scsi_pkt == NULL)
2766 2770                          kmem_free(sata_pkt, sizeof (sata_pkt_t));
2767 2771                  /* Success */
2768 2772                  return (1);
2769 2773          }
2770 2774          /* Else, something did not go right */
2771 2775          if (scsi_pkt == NULL)
2772 2776                  kmem_free(sata_pkt, sizeof (sata_pkt_t));
2773 2777          /* Failure */
2774 2778          return (0);
2775 2779  }
2776 2780  
2777 2781  
2778 2782  /*
2779 2783   * Implementation of scsi tran_reset.
2780 2784   * RESET_ALL request is translated into port reset.
2781 2785   * RESET_TARGET requests is translated into a device reset,
2782 2786   * RESET_LUN request is accepted only for LUN 0 and translated into
2783 2787   * device reset.
2784 2788   * The target reset should cause all HBA active and queued packets to
2785 2789   * be terminated and returned with pkt reason SATA_PKT_RESET prior to
2786 2790   * the return. HBA should report reset event for the device.
2787 2791   *
2788 2792   * Returns 1 upon success, 0 upon failure.
2789 2793   */
2790 2794  static int
2791 2795  sata_scsi_reset(struct scsi_address *ap, int level)
2792 2796  {
2793 2797          sata_hba_inst_t *sata_hba_inst =
2794 2798              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2795 2799          sata_device_t   sata_device;
2796 2800          int             val;
2797 2801  
2798 2802          SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2799 2803              "sata_scsi_reset: level %d target: 0x%x\n",
2800 2804              level, ap->a_target);
2801 2805  
2802 2806          /* Validate address */
2803 2807          val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
2804 2808          if (val == -1)
2805 2809                  /* Invalid address */
2806 2810                  return (0);
2807 2811  
2808 2812          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2809 2813              sata_device.satadev_addr.cport)));
2810 2814          if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2811 2815                  /* invalid address */
2812 2816                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2813 2817                      sata_device.satadev_addr.cport)));
2814 2818                  return (0);
2815 2819          }
2816 2820          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2817 2821              sata_device.satadev_addr.cport)));
2818 2822          if (level == RESET_ALL) {
2819 2823                  /* port reset */
2820 2824                  if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
2821 2825                          sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2822 2826                  else
2823 2827                          sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
2824 2828  
2825 2829                  if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2826 2830                      (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2827 2831                          return (1);
2828 2832                  else
2829 2833                          return (0);
2830 2834  
2831 2835          } else if (val == 0 &&
2832 2836              (level == RESET_TARGET || level == RESET_LUN)) {
2833 2837                  /* reset device (device attached) */
2834 2838                  if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2835 2839                      (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2836 2840                          return (1);
2837 2841                  else
2838 2842                          return (0);
2839 2843          }
2840 2844          return (0);
2841 2845  }
2842 2846  
2843 2847  
2844 2848  /*
2845 2849   * Implementation of scsi tran_getcap (get transport/device capabilities).
2846 2850   * Supported capabilities for SATA hard disks:
2847 2851   * auto-rqsense         (always supported)
2848 2852   * tagged-qing          (supported if HBA supports it)
2849 2853   * untagged-qing        (could be supported if disk supports it, but because
2850 2854   *                       caching behavior allowing untagged queuing actually
2851 2855   *                       results in reduced performance.  sd tries to throttle
2852 2856   *                       back to only 3 outstanding commands, which may
2853 2857   *                       work for real SCSI disks, but with read ahead
2854 2858   *                       caching, having more than 1 outstanding command
2855 2859   *                       results in cache thrashing.)
2856 2860   * sector_size
2857 2861   * dma_max
2858 2862   * interconnect-type    (INTERCONNECT_SATA)
2859 2863   *
2860 2864   * Supported capabilities for ATAPI CD/DVD devices:
2861 2865   * auto-rqsense         (always supported)
2862 2866   * sector_size
2863 2867   * dma_max
2864 2868   * max-cdb-length
2865 2869   * interconnect-type    (INTERCONNECT_SATA)
2866 2870   *
2867 2871   * Supported capabilities for ATAPI TAPE devices:
2868 2872   * auto-rqsense         (always supported)
2869 2873   * dma_max
2870 2874   * max-cdb-length
2871 2875   *
2872 2876   * Supported capabilities for SATA ATAPI hard disks:
2873 2877   * auto-rqsense         (always supported)
2874 2878   * interconnect-type    (INTERCONNECT_SATA)
2875 2879   * max-cdb-length
2876 2880   *
2877 2881   * Request for other capabilities is rejected as unsupported.
2878 2882   *
2879 2883   * Returns supported capability value, or -1 if capability is unsuppported or
2880 2884   * the address is invalid - no device.
2881 2885   */
2882 2886  
2883 2887  static int
2884 2888  sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
2885 2889  {
2886 2890  
2887 2891          sata_hba_inst_t         *sata_hba_inst =
2888 2892              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2889 2893          sata_device_t           sata_device;
2890 2894          sata_drive_info_t       *sdinfo;
2891 2895          ddi_dma_attr_t          adj_dma_attr;
2892 2896          int                     rval;
2893 2897  
2894 2898          SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2895 2899              "sata_scsi_getcap: target: 0x%x, cap: %s\n",
2896 2900              ap->a_target, cap);
2897 2901  
2898 2902          /*
2899 2903           * We want to process the capabilities on per port granularity.
2900 2904           * So, we are specifically restricting ourselves to whom != 0
2901 2905           * to exclude the controller wide handling.
2902 2906           */
2903 2907          if (cap == NULL || whom == 0)
2904 2908                  return (-1);
2905 2909  
2906 2910          if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
2907 2911                  /* Invalid address */
2908 2912                  return (-1);
2909 2913          }
2910 2914          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2911 2915              sata_device.satadev_addr.cport)));
2912 2916          if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
2913 2917              NULL) {
2914 2918                  /* invalid address */
2915 2919                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2916 2920                      sata_device.satadev_addr.cport)));
2917 2921                  return (-1);
2918 2922          }
2919 2923  
2920 2924          switch (scsi_hba_lookup_capstr(cap)) {
2921 2925          case SCSI_CAP_ARQ:
2922 2926                  rval = 1;               /* ARQ supported, turned on */
2923 2927                  break;
2924 2928  
2925 2929          case SCSI_CAP_SECTOR_SIZE:
2926 2930                  if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
2927 2931                          rval = SATA_DISK_SECTOR_SIZE;   /* fixed size */
2928 2932                  else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
2929 2933                          rval = SATA_ATAPI_SECTOR_SIZE;
2930 2934                  else rval = -1;
2931 2935                  break;
2932 2936  
2933 2937          /*
2934 2938           * untagged queuing cause a performance inversion because of
2935 2939           * the way sd operates.  Because of this reason we do not
2936 2940           * use it when available.
2937 2941           */
2938 2942          case SCSI_CAP_UNTAGGED_QING:
2939 2943                  if (sdinfo->satadrv_features_enabled &
2940 2944                      SATA_DEV_F_E_UNTAGGED_QING)
2941 2945                          rval = 1;       /* Untagged queuing available */
2942 2946                  else
2943 2947                          rval = -1;      /* Untagged queuing not available */
2944 2948                  break;
2945 2949  
2946 2950          case SCSI_CAP_TAGGED_QING:
2947 2951                  if ((sdinfo->satadrv_features_enabled &
2948 2952                      SATA_DEV_F_E_TAGGED_QING) &&
2949 2953                      (sdinfo->satadrv_max_queue_depth > 1))
2950 2954                          rval = 1;       /* Tagged queuing available */
2951 2955                  else
2952 2956                          rval = -1;      /* Tagged queuing not available */
2953 2957                  break;
2954 2958  
2955 2959          case SCSI_CAP_DMA_MAX:
2956 2960                  sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
2957 2961                      &adj_dma_attr);
2958 2962                  rval = (int)adj_dma_attr.dma_attr_maxxfer;
2959 2963                  /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
2960 2964                  break;
2961 2965  
2962 2966          case SCSI_CAP_INTERCONNECT_TYPE:
2963 2967                  rval = INTERCONNECT_SATA;       /* SATA interconnect type */
2964 2968                  break;
2965 2969  
2966 2970          case SCSI_CAP_CDB_LEN:
2967 2971                  if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
2968 2972                          rval = sdinfo->satadrv_atapi_cdb_len;
2969 2973                  else
2970 2974                          rval = -1;
2971 2975                  break;
2972 2976  
2973 2977          default:
2974 2978                  rval = -1;
2975 2979                  break;
2976 2980          }
2977 2981          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2978 2982              sata_device.satadev_addr.cport)));
2979 2983          return (rval);
2980 2984  }
2981 2985  
2982 2986  /*
2983 2987   * Implementation of scsi tran_setcap
2984 2988   *
2985 2989   * Only SCSI_CAP_UNTAGGED_QING and  SCSI_CAP_TAGGED_QING are changeable.
2986 2990   *
2987 2991   */
2988 2992  static int
2989 2993  sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
2990 2994  {
2991 2995          sata_hba_inst_t *sata_hba_inst =
2992 2996              (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2993 2997          sata_device_t   sata_device;
2994 2998          sata_drive_info_t       *sdinfo;
2995 2999          int             rval;
2996 3000  
2997 3001          SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2998 3002              "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
2999 3003  
3000 3004          /*
3001 3005           * We want to process the capabilities on per port granularity.
3002 3006           * So, we are specifically restricting ourselves to whom != 0
3003 3007           * to exclude the controller wide handling.
3004 3008           */
3005 3009          if (cap == NULL || whom == 0) {
3006 3010                  return (-1);
3007 3011          }
3008 3012  
3009 3013          if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3010 3014                  /* Invalid address */
3011 3015                  return (-1);
3012 3016          }
3013 3017          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3014 3018              sata_device.satadev_addr.cport)));
3015 3019          if ((sdinfo = sata_get_device_info(sata_hba_inst,
3016 3020              &sata_device)) == NULL) {
3017 3021                  /* invalid address */
3018 3022                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3019 3023                      sata_device.satadev_addr.cport)));
3020 3024                  return (-1);
3021 3025          }
3022 3026          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3023 3027              sata_device.satadev_addr.cport)));
3024 3028  
3025 3029          switch (scsi_hba_lookup_capstr(cap)) {
3026 3030          case SCSI_CAP_ARQ:
3027 3031          case SCSI_CAP_SECTOR_SIZE:
3028 3032          case SCSI_CAP_DMA_MAX:
3029 3033          case SCSI_CAP_INTERCONNECT_TYPE:
3030 3034                  rval = 0;
3031 3035                  break;
3032 3036          case SCSI_CAP_UNTAGGED_QING:
3033 3037                  if (SATA_QDEPTH(sata_hba_inst) > 1) {
3034 3038                          rval = 1;
3035 3039                          if (value == 1) {
3036 3040                                  sdinfo->satadrv_features_enabled |=
3037 3041                                      SATA_DEV_F_E_UNTAGGED_QING;
3038 3042                          } else if (value == 0) {
3039 3043                                  sdinfo->satadrv_features_enabled &=
3040 3044                                      ~SATA_DEV_F_E_UNTAGGED_QING;
3041 3045                          } else {
3042 3046                                  rval = -1;
3043 3047                          }
3044 3048                  } else {
3045 3049                          rval = 0;
3046 3050                  }
3047 3051                  break;
3048 3052          case SCSI_CAP_TAGGED_QING:
3049 3053                  /* This can TCQ or NCQ */
3050 3054                  if (sata_func_enable & SATA_ENABLE_QUEUING &&
3051 3055                      ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3052 3056                      SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3053 3057                      (sata_func_enable & SATA_ENABLE_NCQ &&
3054 3058                      sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3055 3059                      SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3056 3060                      (sdinfo->satadrv_max_queue_depth > 1)) {
3057 3061                          rval = 1;
3058 3062                          if (value == 1) {
3059 3063                                  sdinfo->satadrv_features_enabled |=
3060 3064                                      SATA_DEV_F_E_TAGGED_QING;
3061 3065                          } else if (value == 0) {
3062 3066                                  sdinfo->satadrv_features_enabled &=
3063 3067                                      ~SATA_DEV_F_E_TAGGED_QING;
3064 3068                          } else {
3065 3069                                  rval = -1;
3066 3070                          }
3067 3071                  } else {
3068 3072                          rval = 0;
3069 3073                  }
3070 3074                  break;
3071 3075          default:
3072 3076                  rval = -1;
3073 3077                  break;
3074 3078          }
3075 3079          return (rval);
3076 3080  }
3077 3081  
3078 3082  /*
3079 3083   * Implementations of scsi tran_destroy_pkt.
3080 3084   * Free resources allocated by sata_scsi_init_pkt()
3081 3085   */
3082 3086  static void
3083 3087  sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3084 3088  {
3085 3089          sata_pkt_txlate_t *spx;
3086 3090  
3087 3091          spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3088 3092  
3089 3093          sata_common_free_dma_rsrcs(spx);
3090 3094  
3091 3095          spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3092 3096          sata_pkt_free(spx);
3093 3097  
3094 3098          scsi_hba_pkt_free(ap, pkt);
3095 3099  }
3096 3100  
3097 3101  /*
3098 3102   * Implementation of scsi tran_dmafree.
3099 3103   * Free DMA resources allocated by sata_scsi_init_pkt()
3100 3104   */
3101 3105  
3102 3106  static void
3103 3107  sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3104 3108  {
3105 3109  #ifndef __lock_lint
3106 3110          _NOTE(ARGUNUSED(ap))
3107 3111  #endif
3108 3112          sata_pkt_txlate_t *spx;
3109 3113  
3110 3114          ASSERT(pkt != NULL);
3111 3115          spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3112 3116  
3113 3117          sata_common_free_dma_rsrcs(spx);
3114 3118  }
3115 3119  
3116 3120  /*
3117 3121   * Implementation of scsi tran_sync_pkt.
3118 3122   *
3119 3123   * The assumption below is that pkt is unique - there is no need to check ap
3120 3124   *
3121 3125   * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3122 3126   * into/from the real buffer.
3123 3127   */
3124 3128  static void
3125 3129  sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3126 3130  {
3127 3131  #ifndef __lock_lint
3128 3132          _NOTE(ARGUNUSED(ap))
3129 3133  #endif
3130 3134          int rval;
3131 3135          sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3132 3136          struct buf *bp;
3133 3137          int direction;
3134 3138  
3135 3139          ASSERT(spx != NULL);
3136 3140          if (spx->txlt_buf_dma_handle != NULL) {
3137 3141                  direction = spx->txlt_sata_pkt->
3138 3142                      satapkt_cmd.satacmd_flags.sata_data_direction;
3139 3143                  if (spx->txlt_sata_pkt != NULL &&
3140 3144                      direction != SATA_DIR_NODATA_XFER) {
3141 3145                          if (spx->txlt_tmp_buf != NULL) {
3142 3146                                  /* Intermediate DMA buffer used */
3143 3147                                  bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3144 3148  
3145 3149                                  if (direction & SATA_DIR_WRITE) {
3146 3150                                          bcopy(bp->b_un.b_addr,
3147 3151                                              spx->txlt_tmp_buf, bp->b_bcount);
3148 3152                                  }
3149 3153                          }
3150 3154                          /* Sync the buffer for device or for CPU */
3151 3155                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle,   0, 0,
3152 3156                              (direction & SATA_DIR_WRITE) ?
3153 3157                              DDI_DMA_SYNC_FORDEV :  DDI_DMA_SYNC_FORCPU);
3154 3158                          ASSERT(rval == DDI_SUCCESS);
3155 3159                          if (spx->txlt_tmp_buf != NULL &&
3156 3160                              !(direction & SATA_DIR_WRITE)) {
3157 3161                                  /* Intermediate DMA buffer used for read */
3158 3162                                  bcopy(spx->txlt_tmp_buf,
3159 3163                                      bp->b_un.b_addr, bp->b_bcount);
3160 3164                          }
3161 3165  
3162 3166                  }
3163 3167          }
3164 3168  }
3165 3169  
3166 3170  
3167 3171  
3168 3172  /* *******************  SATA - SCSI Translation functions **************** */
3169 3173  /*
3170 3174   * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3171 3175   * translation.
3172 3176   */
3173 3177  
3174 3178  /*
3175 3179   * Checks if a device exists and can be access and translates common
3176 3180   * scsi_pkt data to sata_pkt data.
3177 3181   *
3178 3182   * Flag argument indicates that a non-read/write ATA command may be sent
3179 3183   * to HBA in arbitrary SYNC mode to execute this packet.
3180 3184   *
3181 3185   * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3182 3186   * sata_pkt was set-up.
3183 3187   * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3184 3188   * exist and pkt_comp callback was scheduled.
3185 3189   * Returns other TRAN_XXXXX values when error occured and command should be
3186 3190   * rejected with the returned TRAN_XXXXX value.
3187 3191   *
3188 3192   * This function should be called with port mutex held.
3189 3193   */
3190 3194  static int
3191 3195  sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3192 3196  {
3193 3197          sata_drive_info_t *sdinfo;
3194 3198          sata_device_t sata_device;
3195 3199          const struct sata_cmd_flags sata_initial_cmd_flags = {
3196 3200                  SATA_DIR_NODATA_XFER,
3197 3201                  /* all other values to 0/FALSE */
3198 3202          };
3199 3203          /*
3200 3204           * Pkt_reason has to be set if the pkt_comp callback is invoked,
3201 3205           * and that implies TRAN_ACCEPT return value. Any other returned value
3202 3206           * indicates that the scsi packet was not accepted (the reason will not
3203 3207           * be checked by the scsi target driver).
3204 3208           * To make debugging easier, we set pkt_reason to know value here.
3205 3209           * It may be changed later when different completion reason is
3206 3210           * determined.
3207 3211           */
3208 3212          spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3209 3213          *reason = CMD_TRAN_ERR;
3210 3214  
3211 3215          /* Validate address */
3212 3216          switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3213 3217              &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3214 3218  
3215 3219          case -1:
3216 3220                  /* Invalid address or invalid device type */
3217 3221                  return (TRAN_BADPKT);
3218 3222          case 2:
3219 3223                  /*
3220 3224                   * Valid address but device type is unknown - Chack if it is
3221 3225                   * in the reset state and therefore in an indeterminate state.
3222 3226                   */
3223 3227                  sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3224 3228                      &spx->txlt_sata_pkt->satapkt_device);
3225 3229                  if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3226 3230                      (SATA_EVNT_DEVICE_RESET |
3227 3231                      SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3228 3232                          if (!ddi_in_panic()) {
3229 3233                                  spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3230 3234                                  *reason = CMD_INCOMPLETE;
3231 3235                                  SATADBG1(SATA_DBG_SCSI_IF,
3232 3236                                      spx->txlt_sata_hba_inst,
3233 3237                                      "sata_scsi_start: rejecting command "
3234 3238                                      "because of device reset state\n", NULL);
3235 3239                                  return (TRAN_BUSY);
3236 3240                          }
3237 3241                  }
3238 3242                  /* FALLTHROUGH */
3239 3243          case 1:
3240 3244                  /* valid address but no valid device - it has disappeared */
3241 3245                  spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3242 3246                  *reason = CMD_DEV_GONE;
3243 3247                  /*
3244 3248                   * The sd target driver is checking CMD_DEV_GONE pkt_reason
3245 3249                   * only in callback function (for normal requests) and
3246 3250                   * in the dump code path.
3247 3251                   * So, if the callback is available, we need to do
3248 3252                   * the callback rather than returning TRAN_FATAL_ERROR here.
3249 3253                   */
3250 3254                  if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3251 3255                          /* scsi callback required */
3252 3256                          if (servicing_interrupt()) {
3253 3257                                  if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3254 3258                                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3255 3259                                      (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3256 3260                                      NULL) {
3257 3261                                          return (TRAN_BUSY);
3258 3262                                  }
3259 3263                          } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3260 3264                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3261 3265                              (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3262 3266                                  /* Scheduling the callback failed */
3263 3267                                  return (TRAN_BUSY);
3264 3268                          }
3265 3269  
3266 3270                          return (TRAN_ACCEPT);
3267 3271                  }
3268 3272                  return (TRAN_FATAL_ERROR);
3269 3273          default:
3270 3274                  /* all OK; pkt reason will be overwritten later */
3271 3275                  break;
3272 3276          }
3273 3277          /*
3274 3278           * If pkt is to be executed in polling mode and a command will not be
3275 3279           * emulated in SATA module (requires sending a non-read/write ATA
3276 3280           * command to HBA driver in arbitrary SYNC mode) and we are in the
3277 3281           * interrupt context and not in the panic dump, then reject the packet
3278 3282           * to avoid a possible interrupt stack overrun or hang caused by
3279 3283           * a potentially blocked interrupt.
3280 3284           */
3281 3285          if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3282 3286              servicing_interrupt() && !ddi_in_panic()) {
3283 3287                  SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3284 3288                      "sata_scsi_start: rejecting synchronous command because "
3285 3289                      "of interrupt context\n", NULL);
3286 3290                  return (TRAN_BUSY);
3287 3291          }
3288 3292  
3289 3293          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3290 3294              &spx->txlt_sata_pkt->satapkt_device);
3291 3295  
3292 3296          /*
3293 3297           * If device is in reset condition, reject the packet with
3294 3298           * TRAN_BUSY, unless:
3295 3299           * 1. system is panicking (dumping)
3296 3300           * In such case only one thread is running and there is no way to
3297 3301           * process reset.
3298 3302           * 2. cfgadm operation is is progress (internal APCTL lock is set)
3299 3303           * Some cfgadm operations involve drive commands, so reset condition
3300 3304           * needs to be ignored for IOCTL operations.
3301 3305           */
3302 3306          if ((sdinfo->satadrv_event_flags &
3303 3307              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3304 3308  
3305 3309                  if (!ddi_in_panic() &&
3306 3310                      ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3307 3311                      sata_device.satadev_addr.cport) &
3308 3312                      SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3309 3313                          spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3310 3314                          *reason = CMD_INCOMPLETE;
3311 3315                          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3312 3316                              "sata_scsi_start: rejecting command because "
3313 3317                              "of device reset state\n", NULL);
3314 3318                          return (TRAN_BUSY);
3315 3319                  }
3316 3320          }
3317 3321  
3318 3322          /*
3319 3323           * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3320 3324           * sata_scsi_pkt_init() because pkt init had to work also with
3321 3325           * non-existing devices.
3322 3326           * Now we know that the packet was set-up for a real device, so its
3323 3327           * type is known.
3324 3328           */
3325 3329          spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3326 3330  
3327 3331          spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3328 3332          if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3329 3333              sata_device.satadev_addr.cport)->cport_event_flags &
3330 3334              SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3331 3335                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3332 3336                      sata_ignore_dev_reset = B_TRUE;
3333 3337          }
3334 3338          /*
3335 3339           * At this point the generic translation routine determined that the
3336 3340           * scsi packet should be accepted. Packet completion reason may be
3337 3341           * changed later when a different completion reason is determined.
3338 3342           */
3339 3343          spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3340 3344          *reason = CMD_CMPLT;
3341 3345  
3342 3346          if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3343 3347                  /* Synchronous execution */
3344 3348                  spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3345 3349                      SATA_OPMODE_POLLING;
3346 3350                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3347 3351                      sata_ignore_dev_reset = ddi_in_panic();
3348 3352          } else {
3349 3353                  /* Asynchronous execution */
3350 3354                  spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3351 3355                      SATA_OPMODE_INTERRUPTS;
3352 3356          }
3353 3357          /* Convert queuing information */
3354 3358          if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3355 3359                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3356 3360                      B_TRUE;
3357 3361          else if (spx->txlt_scsi_pkt->pkt_flags &
3358 3362              (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3359 3363                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3360 3364                      B_TRUE;
3361 3365  
3362 3366          /* Always limit pkt time */
3363 3367          if (spx->txlt_scsi_pkt->pkt_time == 0)
3364 3368                  spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3365 3369          else
3366 3370                  /* Pass on scsi_pkt time */
3367 3371                  spx->txlt_sata_pkt->satapkt_time =
3368 3372                      spx->txlt_scsi_pkt->pkt_time;
3369 3373  
3370 3374          return (TRAN_ACCEPT);
3371 3375  }
3372 3376  
3373 3377  
3374 3378  /*
3375 3379   * Translate ATA Identify Device data to SCSI Inquiry data.
3376 3380   * This function may be called only for ATA devices.
3377 3381   * This function should not be called for ATAPI devices - they
3378 3382   * respond directly to SCSI Inquiry command.
3379 3383   *
3380 3384   * SATA Identify Device data has to be valid in sata_drive_info.
3381 3385   * Buffer has to accomodate the inquiry length (36 bytes).
3382 3386   *
3383 3387   * This function should be called with a port mutex held.
3384 3388   */
3385 3389  static  void
3386 3390  sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3387 3391      sata_drive_info_t *sdinfo, uint8_t *buf)
3388 3392  {
3389 3393  
3390 3394          struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3391 3395          struct sata_id *sid = &sdinfo->satadrv_id;
3392 3396  
3393 3397          /* Start with a nice clean slate */
3394 3398          bzero((void *)inq, sizeof (struct scsi_inquiry));
3395 3399  
3396 3400          /*
3397 3401           * Rely on the dev_type for setting paripheral qualifier.
3398 3402           * Assume that  DTYPE_RODIRECT applies to CD/DVD R/W devices.
3399 3403           * It could be that DTYPE_OPTICAL could also qualify in the future.
3400 3404           * ATAPI Inquiry may provide more data to the target driver.
3401 3405           */
3402 3406          inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3403 3407              DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3404 3408  
3405 3409          /* CFA type device is not a removable media device */
3406 3410          inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3407 3411              (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3408 3412          inq->inq_qual = 0;      /* Device type qualifier (obsolete in SCSI3? */
3409 3413          inq->inq_iso = 0;       /* ISO version */
3410 3414          inq->inq_ecma = 0;      /* ECMA version */
3411 3415          inq->inq_ansi = 3;      /* ANSI version - SCSI 3 */
3412 3416          inq->inq_aenc = 0;      /* Async event notification cap. */
3413 3417          inq->inq_trmiop = 0;    /* Supports TERMINATE I/O PROC msg - NO */
3414 3418          inq->inq_normaca = 0;   /* setting NACA bit supported - NO */
3415 3419          inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3416 3420          inq->inq_len = 31;      /* Additional length */
3417 3421          inq->inq_dualp = 0;     /* dual port device - NO */
3418 3422          inq->inq_reladdr = 0;   /* Supports relative addressing - NO */
3419 3423          inq->inq_sync = 0;      /* Supports synchronous data xfers - NO */
3420 3424          inq->inq_linked = 0;    /* Supports linked commands - NO */
3421 3425                                  /*
3422 3426                                   * Queuing support - controller has to
3423 3427                                   * support some sort of command queuing.
3424 3428                                   */
3425 3429          if (SATA_QDEPTH(sata_hba_inst) > 1)
3426 3430                  inq->inq_cmdque = 1; /* Supports command queueing - YES */
3427 3431          else
3428 3432                  inq->inq_cmdque = 0; /* Supports command queueing - NO */
3429 3433          inq->inq_sftre = 0;     /* Supports Soft Reset option - NO ??? */
3430 3434          inq->inq_wbus32 = 0;    /* Supports 32 bit wide data xfers - NO */
3431 3435          inq->inq_wbus16 = 0;    /* Supports 16 bit wide data xfers - NO */
3432 3436  
3433 3437  #ifdef  _LITTLE_ENDIAN
3434 3438          /* Swap text fields to match SCSI format */
3435 3439          bcopy("ATA     ", inq->inq_vid, 8);             /* Vendor ID */
3436 3440          swab(sid->ai_model, inq->inq_pid, 16);          /* Product ID */
3437 3441          if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3438 3442                  swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3439 3443          else
3440 3444                  swab(&sid->ai_fw[4], inq->inq_revision, 4);     /* Rev. level */
3441 3445  #else   /* _LITTLE_ENDIAN */
3442 3446          bcopy("ATA     ", inq->inq_vid, 8);             /* Vendor ID */
3443 3447          bcopy(sid->ai_model, inq->inq_pid, 16);         /* Product ID */
3444 3448          if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3445 3449                  bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3446 3450          else
3447 3451                  bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3448 3452  #endif  /* _LITTLE_ENDIAN */
3449 3453  }
3450 3454  
3451 3455  
3452 3456  /*
3453 3457   * Scsi response set up for invalid command (command not supported)
3454 3458   *
3455 3459   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3456 3460   */
3457 3461  static int
3458 3462  sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3459 3463  {
3460 3464          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3461 3465          struct scsi_extended_sense *sense;
3462 3466  
3463 3467          scsipkt->pkt_reason = CMD_CMPLT;
3464 3468          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3465 3469              STATE_SENT_CMD | STATE_GOT_STATUS;
3466 3470  
3467 3471          *scsipkt->pkt_scbp = STATUS_CHECK;
3468 3472  
3469 3473          sense = sata_arq_sense(spx);
3470 3474          sense->es_key = KEY_ILLEGAL_REQUEST;
3471 3475          sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3472 3476  
3473 3477          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3474 3478              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3475 3479  
3476 3480          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3477 3481              scsipkt->pkt_comp != NULL) {
3478 3482                  /* scsi callback required */
3479 3483                  if (servicing_interrupt()) {
3480 3484                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3481 3485                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3482 3486                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3483 3487                                  return (TRAN_BUSY);
3484 3488                          }
3485 3489                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3486 3490                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3487 3491                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3488 3492                          /* Scheduling the callback failed */
3489 3493                          return (TRAN_BUSY);
3490 3494                  }
3491 3495          }
3492 3496          return (TRAN_ACCEPT);
3493 3497  }
3494 3498  
3495 3499  /*
3496 3500   * Scsi response set up for check condition with special sense key
3497 3501   * and additional sense code.
3498 3502   *
3499 3503   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3500 3504   */
3501 3505  static int
3502 3506  sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3503 3507  {
3504 3508          sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3505 3509          int cport = SATA_TXLT_CPORT(spx);
3506 3510          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3507 3511          struct scsi_extended_sense *sense;
3508 3512  
3509 3513          mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3510 3514          scsipkt->pkt_reason = CMD_CMPLT;
3511 3515          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3512 3516              STATE_SENT_CMD | STATE_GOT_STATUS;
3513 3517  
3514 3518          *scsipkt->pkt_scbp = STATUS_CHECK;
3515 3519  
3516 3520          sense = sata_arq_sense(spx);
3517 3521          sense->es_key = key;
3518 3522          sense->es_add_code = code;
3519 3523  
3520 3524          mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3521 3525  
3522 3526          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3523 3527              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3524 3528  
3525 3529          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3526 3530              scsipkt->pkt_comp != NULL) {
3527 3531                  /* scsi callback required */
3528 3532                  if (servicing_interrupt()) {
3529 3533                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3530 3534                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3531 3535                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3532 3536                                  return (TRAN_BUSY);
3533 3537                          }
3534 3538                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3535 3539                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3536 3540                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3537 3541                          /* Scheduling the callback failed */
3538 3542                          return (TRAN_BUSY);
3539 3543                  }
3540 3544          }
3541 3545          return (TRAN_ACCEPT);
3542 3546  }
3543 3547  
3544 3548  /*
3545 3549   * Scsi response setup for
3546 3550   * emulated non-data command that requires no action/return data
3547 3551   *
3548 3552   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3549 3553   */
3550 3554  static  int
3551 3555  sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3552 3556  {
3553 3557          int rval;
3554 3558          int reason;
3555 3559          kmutex_t *cport_mutex =  &(SATA_TXLT_CPORT_MUTEX(spx));
3556 3560  
3557 3561          mutex_enter(cport_mutex);
3558 3562  
3559 3563          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3560 3564              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3561 3565                  mutex_exit(cport_mutex);
3562 3566                  return (rval);
3563 3567          }
3564 3568          mutex_exit(cport_mutex);
3565 3569  
3566 3570          spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3567 3571              STATE_SENT_CMD | STATE_GOT_STATUS;
3568 3572          spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3569 3573          *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3570 3574  
3571 3575          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3572 3576              "Scsi_pkt completion reason %x\n",
3573 3577              spx->txlt_scsi_pkt->pkt_reason);
3574 3578  
3575 3579          if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3576 3580              spx->txlt_scsi_pkt->pkt_comp != NULL) {
3577 3581                  /* scsi callback required */
3578 3582                  if (servicing_interrupt()) {
3579 3583                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3580 3584                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3581 3585                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3582 3586                                  return (TRAN_BUSY);
3583 3587                          }
3584 3588                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3585 3589                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3586 3590                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3587 3591                          /* Scheduling the callback failed */
3588 3592                          return (TRAN_BUSY);
3589 3593                  }
3590 3594          }
3591 3595          return (TRAN_ACCEPT);
3592 3596  }
3593 3597  
3594 3598  
3595 3599  /*
3596 3600   * SATA translate command: Inquiry / Identify Device
3597 3601   * Use cached Identify Device data for now, rather than issuing actual
3598 3602   * Device Identify cmd request. If device is detached and re-attached,
3599 3603   * asynchronous event processing should fetch and refresh Identify Device
3600 3604   * data.
3601 3605   * VPD pages supported now:
3602 3606   * Vital Product Data page
3603 3607   * Unit Serial Number page
3604 3608   * Block Device Characteristics Page
3605 3609   * ATA Information Page
3606 3610   *
3607 3611   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3608 3612   */
3609 3613  
3610 3614  #define EVPD                    1       /* Extended Vital Product Data flag */
3611 3615  #define CMDDT                   2       /* Command Support Data - Obsolete */
3612 3616  #define INQUIRY_SUP_VPD_PAGE    0       /* Supported VPD Pages Page Code */
3613 3617  #define INQUIRY_USN_PAGE        0x80    /* Unit Serial Number Page Code */
3614 3618  #define INQUIRY_BDC_PAGE        0xB1    /* Block Device Characteristics Page */
3615 3619                                          /* Code */
3616 3620  #define INQUIRY_ATA_INFO_PAGE   0x89    /* ATA Information Page Code */
3617 3621  #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
3618 3622  
3619 3623  static int
3620 3624  sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3621 3625  {
3622 3626          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3623 3627          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3624 3628          sata_drive_info_t *sdinfo;
3625 3629          struct scsi_extended_sense *sense;
3626 3630          int count;
3627 3631          uint8_t *p;
3628 3632          int i, j;
3629 3633          uint8_t page_buf[1024]; /* Max length */
3630 3634          int rval, reason;
3631 3635          ushort_t rate;
3632 3636          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3633 3637  
3634 3638          mutex_enter(cport_mutex);
3635 3639  
3636 3640          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3637 3641              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3638 3642                  mutex_exit(cport_mutex);
3639 3643                  return (rval);
3640 3644          }
3641 3645  
3642 3646          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3643 3647              &spx->txlt_sata_pkt->satapkt_device);
3644 3648  
3645 3649          ASSERT(sdinfo != NULL);
3646 3650  
3647 3651          scsipkt->pkt_reason = CMD_CMPLT;
3648 3652          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3649 3653              STATE_SENT_CMD | STATE_GOT_STATUS;
3650 3654  
3651 3655          /* Reject not supported request */
3652 3656          if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3653 3657                  *scsipkt->pkt_scbp = STATUS_CHECK;
3654 3658                  sense = sata_arq_sense(spx);
3655 3659                  sense->es_key = KEY_ILLEGAL_REQUEST;
3656 3660                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3657 3661                  goto done;
3658 3662          }
3659 3663  
3660 3664          /* Valid Inquiry request */
3661 3665          *scsipkt->pkt_scbp = STATUS_GOOD;
3662 3666  
3663 3667          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
3664 3668  
3665 3669                  /*
3666 3670                   * Because it is fully emulated command storing data
3667 3671                   * programatically in the specified buffer, release
3668 3672                   * preallocated DMA resources before storing data in the buffer,
3669 3673                   * so no unwanted DMA sync would take place.
3670 3674                   */
3671 3675                  sata_scsi_dmafree(NULL, scsipkt);
3672 3676  
3673 3677                  if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3674 3678                          /* Standard Inquiry Data request */
3675 3679                          struct scsi_inquiry inq;
3676 3680                          unsigned int bufsize;
3677 3681  
3678 3682                          sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3679 3683                              sdinfo, (uint8_t *)&inq);
3680 3684                          /* Copy no more than requested */
3681 3685                          count = MIN(bp->b_bcount,
3682 3686                              sizeof (struct scsi_inquiry));
3683 3687                          bufsize = scsipkt->pkt_cdbp[4];
3684 3688                          bufsize |= scsipkt->pkt_cdbp[3] << 8;
3685 3689                          count = MIN(count, bufsize);
3686 3690                          bcopy(&inq, bp->b_un.b_addr, count);
3687 3691  
3688 3692                          scsipkt->pkt_state |= STATE_XFERRED_DATA;
3689 3693                          scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3690 3694                              bufsize - count : 0;
3691 3695                  } else {
3692 3696                          /*
3693 3697                           * peripheral_qualifier = 0;
3694 3698                           *
3695 3699                           * We are dealing only with HD and will be
3696 3700                           * dealing with CD/DVD devices soon
3697 3701                           */
3698 3702                          uint8_t peripheral_device_type =
3699 3703                              sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3700 3704                              DTYPE_DIRECT : DTYPE_RODIRECT;
3701 3705  
3702 3706                          bzero(page_buf, sizeof (page_buf));
3703 3707  
3704 3708                          switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3705 3709                          case INQUIRY_SUP_VPD_PAGE:
3706 3710                                  /*
3707 3711                                   * Request for supported Vital Product Data
3708 3712                                   * pages.
3709 3713                                   */
3710 3714                                  page_buf[0] = peripheral_device_type;
3711 3715                                  page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3712 3716                                  page_buf[2] = 0;
3713 3717                                  page_buf[3] = 4; /* page length */
3714 3718                                  page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3715 3719                                  page_buf[5] = INQUIRY_USN_PAGE;
3716 3720                                  page_buf[6] = INQUIRY_BDC_PAGE;
3717 3721                                  page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3718 3722                                  /* Copy no more than requested */
3719 3723                                  count = MIN(bp->b_bcount, 8);
3720 3724                                  bcopy(page_buf, bp->b_un.b_addr, count);
3721 3725                                  break;
3722 3726  
3723 3727                          case INQUIRY_USN_PAGE:
3724 3728                                  /*
3725 3729                                   * Request for Unit Serial Number page.
3726 3730                                   * Set-up the page.
3727 3731                                   */
3728 3732                                  page_buf[0] = peripheral_device_type;
3729 3733                                  page_buf[1] = INQUIRY_USN_PAGE;
3730 3734                                  page_buf[2] = 0;
3731 3735                                  /* remaining page length */
3732 3736                                  page_buf[3] = SATA_ID_SERIAL_LEN;
3733 3737  
3734 3738                                  /*
3735 3739                                   * Copy serial number from Identify Device data
3736 3740                                   * words into the inquiry page and swap bytes
3737 3741                                   * when necessary.
3738 3742                                   */
3739 3743                                  p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3740 3744  #ifdef  _LITTLE_ENDIAN
3741 3745                                  swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3742 3746  #else
3743 3747                                  bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3744 3748  #endif
3745 3749                                  /*
3746 3750                                   * Least significant character of the serial
3747 3751                                   * number shall appear as the last byte,
3748 3752                                   * according to SBC-3 spec.
3749 3753                                   * Count trailing spaces to determine the
3750 3754                                   * necessary shift length.
3751 3755                                   */
3752 3756                                  p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3753 3757                                  for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3754 3758                                          if (*(p - j) != '\0' &&
3755 3759                                              *(p - j) != '\040')
3756 3760                                                  break;
3757 3761                                  }
3758 3762  
3759 3763                                  /*
3760 3764                                   * Shift SN string right, so that the last
3761 3765                                   * non-blank character would appear in last
3762 3766                                   * byte of SN field in the page.
3763 3767                                   * 'j' is the shift length.
3764 3768                                   */
3765 3769                                  for (i = 0;
3766 3770                                      i < (SATA_ID_SERIAL_LEN - j) && j != 0;
3767 3771                                      i++, p--)
3768 3772                                          *p = *(p - j);
3769 3773  
3770 3774                                  /*
3771 3775                                   * Add leading spaces - same number as the
3772 3776                                   * shift size
3773 3777                                   */
3774 3778                                  for (; j > 0; j--)
3775 3779                                          page_buf[4 + j - 1] = '\040';
3776 3780  
3777 3781                                  count = MIN(bp->b_bcount,
3778 3782                                      SATA_ID_SERIAL_LEN + 4);
3779 3783                                  bcopy(page_buf, bp->b_un.b_addr, count);
3780 3784                                  break;
3781 3785  
3782 3786                          case INQUIRY_BDC_PAGE:
3783 3787                                  /*
3784 3788                                   * Request for Block Device Characteristics
3785 3789                                   * page.  Set-up the page.
3786 3790                                   */
3787 3791                                  page_buf[0] = peripheral_device_type;
3788 3792                                  page_buf[1] = INQUIRY_BDC_PAGE;
3789 3793                                  page_buf[2] = 0;
3790 3794                                  /* remaining page length */
3791 3795                                  page_buf[3] = SATA_ID_BDC_LEN;
3792 3796  
3793 3797                                  rate = sdinfo->satadrv_id.ai_medrotrate;
3794 3798                                  page_buf[4] = (rate >> 8) & 0xff;
3795 3799                                  page_buf[5] = rate & 0xff;
3796 3800                                  page_buf[6] = 0;
3797 3801                                  page_buf[7] = sdinfo->satadrv_id.
3798 3802                                      ai_nomformfactor & 0xf;
3799 3803  
3800 3804                                  count = MIN(bp->b_bcount,
3801 3805                                      SATA_ID_BDC_LEN + 4);
3802 3806                                  bcopy(page_buf, bp->b_un.b_addr, count);
3803 3807                                  break;
3804 3808  
3805 3809                          case INQUIRY_ATA_INFO_PAGE:
3806 3810                                  /*
3807 3811                                   * Request for ATA Information page.
3808 3812                                   */
3809 3813                                  page_buf[0] = peripheral_device_type;
3810 3814                                  page_buf[1] = INQUIRY_ATA_INFO_PAGE;
3811 3815                                  page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) &
3812 3816                                      0xff;
3813 3817                                  page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
3814 3818                                  /* page_buf[4-7] reserved */
3815 3819  #ifdef  _LITTLE_ENDIAN
3816 3820                                  bcopy("ATA     ", &page_buf[8], 8);
3817 3821                                  swab(sdinfo->satadrv_id.ai_model,
3818 3822                                      &page_buf[16], 16);
3819 3823                                  if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3820 3824                                      "    ", 4) == 0) {
3821 3825                                          swab(sdinfo->satadrv_id.ai_fw,
3822 3826                                              &page_buf[32], 4);
3823 3827                                  } else {
3824 3828                                          swab(&sdinfo->satadrv_id.ai_fw[4],
3825 3829                                              &page_buf[32], 4);
3826 3830                                  }
3827 3831  #else   /* _LITTLE_ENDIAN */
3828 3832                                  bcopy("ATA     ", &page_buf[8], 8);
3829 3833                                  bcopy(sdinfo->satadrv_id.ai_model,
3830 3834                                      &page_buf[16], 16);
3831 3835                                  if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3832 3836                                      "    ", 4) == 0) {
3833 3837                                          bcopy(sdinfo->satadrv_id.ai_fw,
3834 3838                                              &page_buf[32], 4);
3835 3839                                  } else {
3836 3840                                          bcopy(&sdinfo->satadrv_id.ai_fw[4],
3837 3841                                              &page_buf[32], 4);
3838 3842                                  }
3839 3843  #endif  /* _LITTLE_ENDIAN */
3840 3844                                  /*
3841 3845                                   * page_buf[36-55] which defines the device
3842 3846                                   * signature is not defined at this
3843 3847                                   * time.
3844 3848                                   */
3845 3849  
3846 3850                                  /* Set the command code */
3847 3851                                  if (sdinfo->satadrv_type ==
3848 3852                                      SATA_DTYPE_ATADISK) {
3849 3853                                          page_buf[56] = SATAC_ID_DEVICE;
3850 3854                                  } else if (sdinfo->satadrv_type ==
3851 3855                                      SATA_DTYPE_ATAPI) {
3852 3856                                          page_buf[56] = SATAC_ID_PACKET_DEVICE;
3853 3857                                  }
3854 3858                                  /*
3855 3859                                   * If the command code, page_buf[56], is not
3856 3860                                   * zero and if one of the identify commands
3857 3861                                   * succeeds, return the identify data.
3858 3862                                   */
3859 3863                                  if ((page_buf[56] != 0) &&
3860 3864                                      (sata_fetch_device_identify_data(
3861 3865                                      spx->txlt_sata_hba_inst, sdinfo) ==
3862 3866                                      SATA_SUCCESS)) {
3863 3867                                          bcopy(&sdinfo->satadrv_id,
3864 3868                                              &page_buf[60], sizeof (sata_id_t));
3865 3869                                  }
3866 3870  
3867 3871                                  /* Need to copy out the page_buf to bp */
3868 3872                                  count = MIN(bp->b_bcount,
3869 3873                                      SATA_ID_ATA_INFO_LEN + 4);
3870 3874                                  bcopy(page_buf, bp->b_un.b_addr, count);
3871 3875                                  break;
3872 3876  
3873 3877                          case INQUIRY_DEV_IDENTIFICATION_PAGE:
3874 3878                                  /*
3875 3879                                   * We may want to implement this page, when
3876 3880                                   * identifiers are common for SATA devices
3877 3881                                   * But not now.
3878 3882                                   */
3879 3883                                  /*FALLTHROUGH*/
3880 3884  
3881 3885                          default:
3882 3886                                  /* Request for unsupported VPD page */
3883 3887                                  *scsipkt->pkt_scbp = STATUS_CHECK;
3884 3888                                  sense = sata_arq_sense(spx);
3885 3889                                  sense->es_key = KEY_ILLEGAL_REQUEST;
3886 3890                                  sense->es_add_code =
3887 3891                                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3888 3892                                  goto done;
3889 3893                          }
3890 3894                  }
3891 3895                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
3892 3896                  scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3893 3897                      scsipkt->pkt_cdbp[4] - count : 0;
3894 3898          }
3895 3899  done:
3896 3900          mutex_exit(cport_mutex);
3897 3901  
3898 3902          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3899 3903              "Scsi_pkt completion reason %x\n",
3900 3904              scsipkt->pkt_reason);
3901 3905  
3902 3906          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3903 3907              scsipkt->pkt_comp != NULL) {
3904 3908                  /* scsi callback required */
3905 3909                  if (servicing_interrupt()) {
3906 3910                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3907 3911                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3908 3912                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3909 3913                                  return (TRAN_BUSY);
3910 3914                          }
3911 3915                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3912 3916                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3913 3917                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3914 3918                          /* Scheduling the callback failed */
3915 3919                          return (TRAN_BUSY);
3916 3920                  }
3917 3921          }
3918 3922          return (TRAN_ACCEPT);
3919 3923  }
3920 3924  
3921 3925  /*
3922 3926   * SATA translate command: Request Sense.
3923 3927   *
3924 3928   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3925 3929   * At the moment this is an emulated command (ATA version for SATA hard disks).
3926 3930   * May be translated into Check Power Mode command in the future.
3927 3931   *
3928 3932   * Note: There is a mismatch between already implemented Informational
3929 3933   * Exception Mode Select page 0x1C and this function.
3930 3934   * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
3931 3935   * NO SENSE and set additional sense code to the exception code - this is not
3932 3936   * implemented here.
3933 3937   */
3934 3938  static int
3935 3939  sata_txlt_request_sense(sata_pkt_txlate_t *spx)
3936 3940  {
3937 3941          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3938 3942          struct scsi_extended_sense sense;
3939 3943          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3940 3944          sata_drive_info_t *sdinfo;
3941 3945          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
3942 3946          int rval, reason, power_state = 0;
3943 3947          kmutex_t *cport_mutex;
3944 3948  
3945 3949          cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3946 3950          mutex_enter(cport_mutex);
3947 3951  
3948 3952          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
3949 3953              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3950 3954                  mutex_exit(cport_mutex);
3951 3955                  return (rval);
3952 3956          }
3953 3957  
3954 3958          scsipkt->pkt_reason = CMD_CMPLT;
3955 3959          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3956 3960              STATE_SENT_CMD | STATE_GOT_STATUS;
3957 3961          *scsipkt->pkt_scbp = STATUS_GOOD;
3958 3962  
3959 3963          /*
3960 3964           * when CONTROL field's NACA bit == 1
3961 3965           * return ILLEGAL_REQUEST
3962 3966           */
3963 3967          if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
3964 3968                  mutex_exit(cport_mutex);
3965 3969                  return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
3966 3970                      SD_SCSI_ASC_CMD_SEQUENCE_ERR));
3967 3971          }
3968 3972  
3969 3973          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3970 3974              &spx->txlt_sata_pkt->satapkt_device);
3971 3975          ASSERT(sdinfo != NULL);
3972 3976  
3973 3977          spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
3974 3978  
3975 3979          sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
3976 3980          scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
3977 3981          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
3978 3982          if (sata_hba_start(spx, &rval) != 0) {
3979 3983                  mutex_exit(cport_mutex);
3980 3984                  return (rval);
3981 3985          }
3982 3986          if (scmd->satacmd_error_reg != 0) {
3983 3987                  mutex_exit(cport_mutex);
3984 3988                  return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
3985 3989                      SD_SCSI_ASC_NO_ADD_SENSE));
3986 3990          }
3987 3991  
3988 3992          switch (scmd->satacmd_sec_count_lsb) {
3989 3993          case SATA_PWRMODE_STANDBY: /* device in standby mode */
3990 3994                  if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
3991 3995                          power_state = SATA_POWER_STOPPED;
3992 3996                  else {
3993 3997                          power_state = SATA_POWER_STANDBY;
3994 3998                          sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
3995 3999                  }
3996 4000                  break;
3997 4001          case SATA_PWRMODE_IDLE: /* device in idle mode */
3998 4002                  power_state = SATA_POWER_IDLE;
3999 4003                  sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4000 4004                  break;
4001 4005          case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4002 4006          default:                  /* 0x40, 0x41 active mode */
4003 4007                  if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4004 4008                          power_state = SATA_POWER_IDLE;
4005 4009                  else {
4006 4010                          power_state = SATA_POWER_ACTIVE;
4007 4011                          sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4008 4012                  }
4009 4013                  break;
4010 4014          }
4011 4015  
4012 4016          mutex_exit(cport_mutex);
4013 4017  
4014 4018          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4015 4019                  /*
4016 4020                   * Because it is fully emulated command storing data
4017 4021                   * programatically in the specified buffer, release
4018 4022                   * preallocated DMA resources before storing data in the buffer,
4019 4023                   * so no unwanted DMA sync would take place.
4020 4024                   */
4021 4025                  int count = MIN(bp->b_bcount,
4022 4026                      sizeof (struct scsi_extended_sense));
4023 4027                  sata_scsi_dmafree(NULL, scsipkt);
4024 4028                  bzero(&sense, sizeof (struct scsi_extended_sense));
4025 4029                  sense.es_valid = 0;     /* Valid LBA */
4026 4030                  sense.es_class = 7;     /* Response code 0x70 - current err */
4027 4031                  sense.es_key = KEY_NO_SENSE;
4028 4032                  sense.es_add_len = 6;   /* Additional length */
4029 4033                  /* Copy no more than requested */
4030 4034                  bcopy(&sense, bp->b_un.b_addr, count);
4031 4035                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
4032 4036                  scsipkt->pkt_resid = 0;
4033 4037                  switch (power_state) {
4034 4038                  case SATA_POWER_IDLE:
4035 4039                  case SATA_POWER_STANDBY:
4036 4040                          sense.es_add_code =
4037 4041                              SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4038 4042                          break;
4039 4043                  case SATA_POWER_STOPPED:
4040 4044                          sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4041 4045                          break;
4042 4046                  case SATA_POWER_ACTIVE:
4043 4047                  default:
4044 4048                          break;
4045 4049                  }
4046 4050          }
4047 4051  
4048 4052          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4049 4053              "Scsi_pkt completion reason %x\n",
4050 4054              scsipkt->pkt_reason);
4051 4055  
4052 4056          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4053 4057              scsipkt->pkt_comp != NULL) {
4054 4058                  /* scsi callback required */
4055 4059                  if (servicing_interrupt()) {
4056 4060                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4057 4061                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4058 4062                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4059 4063                                  return (TRAN_BUSY);
4060 4064                          }
4061 4065                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4062 4066                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4063 4067                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4064 4068                          /* Scheduling the callback failed */
4065 4069                          return (TRAN_BUSY);
4066 4070                  }
4067 4071          }
4068 4072          return (TRAN_ACCEPT);
4069 4073  }
4070 4074  
4071 4075  /*
4072 4076   * SATA translate command: Test Unit Ready
4073 4077   * (ATA version for SATA hard disks).
4074 4078   * It is translated into the Check Power Mode command.
4075 4079   *
4076 4080   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4077 4081   */
4078 4082  static int
4079 4083  sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4080 4084  {
4081 4085          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4082 4086          struct scsi_extended_sense *sense;
4083 4087          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4084 4088          sata_drive_info_t *sdinfo;
4085 4089          int power_state;
4086 4090          int rval, reason;
4087 4091          kmutex_t *cport_mutex =  &(SATA_TXLT_CPORT_MUTEX(spx));
4088 4092  
4089 4093          mutex_enter(cport_mutex);
4090 4094  
4091 4095          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4092 4096              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4093 4097                  mutex_exit(cport_mutex);
4094 4098                  return (rval);
4095 4099          }
4096 4100  
4097 4101          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4098 4102              &spx->txlt_sata_pkt->satapkt_device);
4099 4103          ASSERT(sdinfo != NULL);
4100 4104  
4101 4105          spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4102 4106  
4103 4107          /* send CHECK POWER MODE command */
4104 4108          sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4105 4109          scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4106 4110          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4107 4111          if (sata_hba_start(spx, &rval) != 0) {
4108 4112                  mutex_exit(cport_mutex);
4109 4113                  return (rval);
4110 4114          }
4111 4115  
4112 4116          if (scmd->satacmd_error_reg != 0) {
4113 4117                  mutex_exit(cport_mutex);
4114 4118                  return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4115 4119                      SD_SCSI_ASC_LU_NOT_RESPONSE));
4116 4120          }
4117 4121  
4118 4122          power_state = scmd->satacmd_sec_count_lsb;
4119 4123  
4120 4124          /*
4121 4125           * return NOT READY when device in STOPPED mode
4122 4126           */
4123 4127          if (power_state == SATA_PWRMODE_STANDBY &&
4124 4128              sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4125 4129                  *scsipkt->pkt_scbp = STATUS_CHECK;
4126 4130                  sense = sata_arq_sense(spx);
4127 4131                  sense->es_key = KEY_NOT_READY;
4128 4132                  sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4129 4133          } else {
4130 4134                  /*
4131 4135                   * For other power mode, return GOOD status
4132 4136                   */
4133 4137                  *scsipkt->pkt_scbp = STATUS_GOOD;
4134 4138          }
4135 4139  
4136 4140          scsipkt->pkt_reason = CMD_CMPLT;
4137 4141          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4138 4142              STATE_SENT_CMD | STATE_GOT_STATUS;
4139 4143  
4140 4144          mutex_exit(cport_mutex);
4141 4145  
4142 4146          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4143 4147              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4144 4148  
4145 4149          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4146 4150              scsipkt->pkt_comp != NULL) {
4147 4151                  /* scsi callback required */
4148 4152                  if (servicing_interrupt()) {
4149 4153                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4150 4154                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4151 4155                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4152 4156                                  return (TRAN_BUSY);
4153 4157                          }
4154 4158                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4155 4159                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4156 4160                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4157 4161                          /* Scheduling the callback failed */
4158 4162                          return (TRAN_BUSY);
4159 4163                  }
4160 4164          }
4161 4165  
4162 4166          return (TRAN_ACCEPT);
4163 4167  }
4164 4168  
4165 4169  /*
4166 4170   * SATA translate command: Start Stop Unit
4167 4171   * Translation depends on a command:
4168 4172   *
4169 4173   * Power condition bits will be supported
4170 4174   * and the power level should be maintained by SATL,
4171 4175   * When SATL received a command, it will check the
4172 4176   * power level firstly, and return the status according
4173 4177   * to SAT2 v2.6 and SAT-2 Standby Modifications
4174 4178   *
4175 4179   * SPC-4/SBC-3      SATL    ATA power condition  SATL      SPC/SBC
4176 4180   * -----------------------------------------------------------------------
4177 4181   * SSU_PC1 Active   <==>     ATA  Active         <==>     SSU:start_bit =1
4178 4182   * SSU_PC2 Idle     <==>     ATA  Idle           <==>     N/A
4179 4183   * SSU_PC3 Standby  <==>     ATA  Standby        <==>     N/A
4180 4184   * SSU_PC4 Stopped  <==>     ATA  Standby        <==>     SSU:start_bit = 0
4181 4185   *
4182 4186   *      Unload Media / NOT SUPPORTED YET
4183 4187   *      Load Media / NOT SUPPROTED YET
4184 4188   *      Immediate bit / NOT SUPPORTED YET (deferred error)
4185 4189   *
4186 4190   * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4187 4191   * appropriate values in scsi_pkt fields.
4188 4192   */
4189 4193  static int
4190 4194  sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4191 4195  {
4192 4196          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4193 4197          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4194 4198          int rval, reason;
4195 4199          sata_drive_info_t *sdinfo;
4196 4200          sata_id_t *sata_id;
4197 4201          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4198 4202  
4199 4203          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4200 4204              "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4201 4205  
4202 4206          mutex_enter(cport_mutex);
4203 4207  
4204 4208          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4205 4209              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4206 4210                  mutex_exit(cport_mutex);
4207 4211                  return (rval);
4208 4212          }
4209 4213  
4210 4214          if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4211 4215                  /* IMMED bit - not supported */
4212 4216                  mutex_exit(cport_mutex);
4213 4217                  return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4214 4218                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4215 4219          }
4216 4220  
4217 4221          spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4218 4222          spx->txlt_sata_pkt->satapkt_comp = NULL;
4219 4223  
4220 4224          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4221 4225              &spx->txlt_sata_pkt->satapkt_device);
4222 4226          ASSERT(sdinfo != NULL);
4223 4227          sata_id = &sdinfo->satadrv_id;
4224 4228  
4225 4229          switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4226 4230          case 0:
4227 4231                  if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4228 4232                          /* Load/Unload Media - invalid request */
4229 4233                          goto err_out;
4230 4234                  }
4231 4235                  if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4232 4236                          /* Start Unit */
4233 4237                          sata_build_read_verify_cmd(scmd, 1, 5);
4234 4238                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4235 4239                          /* Transfer command to HBA */
4236 4240                          if (sata_hba_start(spx, &rval) != 0) {
4237 4241                                  /* Pkt not accepted for execution */
4238 4242                                  mutex_exit(cport_mutex);
4239 4243                                  return (rval);
4240 4244                          }
4241 4245                          if (scmd->satacmd_error_reg != 0) {
4242 4246                                  goto err_out;
4243 4247                          }
4244 4248                          sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4245 4249                  } else {
4246 4250                          /* Stop Unit */
4247 4251                          sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4248 4252                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4249 4253                          if (sata_hba_start(spx, &rval) != 0) {
4250 4254                                  mutex_exit(cport_mutex);
4251 4255                                  return (rval);
4252 4256                          } else {
4253 4257                                  if (scmd->satacmd_error_reg != 0) {
4254 4258                                          goto err_out;
4255 4259                                  }
4256 4260                          }
4257 4261                          /* ata standby immediate command */
4258 4262                          sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4259 4263                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4260 4264                          if (sata_hba_start(spx, &rval) != 0) {
4261 4265                                  mutex_exit(cport_mutex);
4262 4266                                  return (rval);
4263 4267                          }
4264 4268                          if (scmd->satacmd_error_reg != 0) {
4265 4269                                  goto err_out;
4266 4270                          }
4267 4271                          sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4268 4272                  }
4269 4273                  break;
4270 4274          case 0x1:
4271 4275                  sata_build_generic_cmd(scmd, SATAC_IDLE);
4272 4276                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4273 4277                  if (sata_hba_start(spx, &rval) != 0) {
4274 4278                          mutex_exit(cport_mutex);
4275 4279                          return (rval);
4276 4280                  }
4277 4281                  if (scmd->satacmd_error_reg != 0) {
4278 4282                          goto err_out;
4279 4283                  }
4280 4284                  sata_build_read_verify_cmd(scmd, 1, 5);
4281 4285                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4282 4286                  /* Transfer command to HBA */
4283 4287                  if (sata_hba_start(spx, &rval) != 0) {
4284 4288                          /* Pkt not accepted for execution */
4285 4289                          mutex_exit(cport_mutex);
4286 4290                          return (rval);
4287 4291                  } else {
4288 4292                          if (scmd->satacmd_error_reg != 0) {
4289 4293                                  goto err_out;
4290 4294                          }
4291 4295                  }
4292 4296                  sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4293 4297                  break;
4294 4298          case 0x2:
4295 4299                  sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4296 4300                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4297 4301                  if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4298 4302                          if (sata_hba_start(spx, &rval) != 0) {
4299 4303                                  mutex_exit(cport_mutex);
4300 4304                                  return (rval);
4301 4305                          }
4302 4306                          if (scmd->satacmd_error_reg != 0) {
4303 4307                                  goto err_out;
4304 4308                          }
4305 4309                  }
4306 4310                  sata_build_generic_cmd(scmd, SATAC_IDLE);
4307 4311                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4308 4312                  if (sata_hba_start(spx, &rval) != 0) {
4309 4313                          mutex_exit(cport_mutex);
4310 4314                          return (rval);
4311 4315                  }
4312 4316                  if (scmd->satacmd_error_reg != 0) {
4313 4317                          goto err_out;
4314 4318                  }
4315 4319                  if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4316 4320                          /*
4317 4321                           *  POWER CONDITION MODIFIER bit set
4318 4322                           *  to 0x1 or larger it will be handled
4319 4323                           *  on the same way as bit = 0x1
4320 4324                           */
4321 4325                          if (!(sata_id->ai_cmdset84 &
4322 4326                              SATA_IDLE_UNLOAD_SUPPORTED)) {
4323 4327                                  sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4324 4328                                  break;
4325 4329                          }
4326 4330                          sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4327 4331                          scmd->satacmd_features_reg = 0x44;
4328 4332                          scmd->satacmd_lba_low_lsb = 0x4c;
4329 4333                          scmd->satacmd_lba_mid_lsb = 0x4e;
4330 4334                          scmd->satacmd_lba_high_lsb = 0x55;
4331 4335                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4332 4336                          if (sata_hba_start(spx, &rval) != 0) {
4333 4337                                  mutex_exit(cport_mutex);
4334 4338                                  return (rval);
4335 4339                          }
4336 4340                          if (scmd->satacmd_error_reg != 0) {
4337 4341                                  goto err_out;
4338 4342                          }
4339 4343                  }
4340 4344                  sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4341 4345                  break;
4342 4346          case 0x3:
4343 4347                  sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4344 4348                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4345 4349                  if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4346 4350                          if (sata_hba_start(spx, &rval) != 0) {
4347 4351                                  mutex_exit(cport_mutex);
4348 4352                                  return (rval);
4349 4353                          }
4350 4354                          if (scmd->satacmd_error_reg != 0) {
4351 4355                                  goto err_out;
4352 4356                          }
4353 4357                  }
4354 4358                  sata_build_generic_cmd(scmd, SATAC_STANDBY);
4355 4359                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4356 4360                  if (sata_hba_start(spx, &rval) != 0) {
4357 4361                          mutex_exit(cport_mutex);
4358 4362                          return (rval);
4359 4363                  }
4360 4364                  if (scmd->satacmd_error_reg != 0) {
4361 4365                          goto err_out;
4362 4366                  }
4363 4367                  sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4364 4368                  break;
4365 4369          case 0x7:
4366 4370                  sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4367 4371                  scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4368 4372                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4369 4373                  if (sata_hba_start(spx, &rval) != 0) {
4370 4374                          mutex_exit(cport_mutex);
4371 4375                          return (rval);
4372 4376                  }
4373 4377                  if (scmd->satacmd_error_reg != 0) {
4374 4378                          goto err_out;
4375 4379                  }
4376 4380                  switch (scmd->satacmd_sec_count_lsb) {
4377 4381                  case SATA_PWRMODE_STANDBY:
4378 4382                          sata_build_generic_cmd(scmd, SATAC_STANDBY);
4379 4383                          scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4380 4384                              sdinfo->satadrv_standby_timer);
4381 4385                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4382 4386                          if (sata_hba_start(spx, &rval) != 0) {
4383 4387                                  mutex_exit(cport_mutex);
4384 4388                                  return (rval);
4385 4389                          } else {
4386 4390                                  if (scmd->satacmd_error_reg != 0) {
4387 4391                                          goto err_out;
4388 4392                                  }
4389 4393                          }
4390 4394                          break;
4391 4395                  case SATA_PWRMODE_IDLE:
4392 4396                          sata_build_generic_cmd(scmd, SATAC_IDLE);
4393 4397                          scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4394 4398                              sdinfo->satadrv_standby_timer);
4395 4399                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4396 4400                          if (sata_hba_start(spx, &rval) != 0) {
4397 4401                                  mutex_exit(cport_mutex);
4398 4402                                  return (rval);
4399 4403                          } else {
4400 4404                                  if (scmd->satacmd_error_reg != 0) {
4401 4405                                          goto err_out;
4402 4406                                  }
4403 4407                          }
4404 4408                          break;
4405 4409                  case SATA_PWRMODE_ACTIVE_SPINDOWN:
4406 4410                  case SATA_PWRMODE_ACTIVE_SPINUP:
4407 4411                  case SATA_PWRMODE_ACTIVE:
4408 4412                          sata_build_generic_cmd(scmd, SATAC_IDLE);
4409 4413                          scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4410 4414                              sdinfo->satadrv_standby_timer);
4411 4415                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4412 4416                          if (sata_hba_start(spx, &rval) != 0) {
4413 4417                                  mutex_exit(cport_mutex);
4414 4418                                  return (rval);
4415 4419                          }
4416 4420                          if (scmd->satacmd_error_reg != 0) {
4417 4421                                  goto err_out;
4418 4422                          }
4419 4423                          sata_build_read_verify_cmd(scmd, 1, 5);
4420 4424                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4421 4425                          if (sata_hba_start(spx, &rval) != 0) {
4422 4426                                  mutex_exit(cport_mutex);
4423 4427                                  return (rval);
4424 4428                          }
4425 4429                          if (scmd->satacmd_error_reg != 0) {
4426 4430                                  goto err_out;
4427 4431                          }
4428 4432                          break;
4429 4433                  default:
4430 4434                          goto err_out;
4431 4435                  }
4432 4436                  break;
4433 4437          case 0xb:
4434 4438                  if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4435 4439                      0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4436 4440                          mutex_exit(cport_mutex);
4437 4441                          return (sata_txlt_check_condition(spx,
4438 4442                              KEY_ILLEGAL_REQUEST,
4439 4443                              SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4440 4444                  }
4441 4445                  sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4442 4446                  scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4443 4447                  if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4444 4448                          if (sata_hba_start(spx, &rval) != 0) {
4445 4449                                  mutex_exit(cport_mutex);
4446 4450                                  return (rval);
4447 4451                          }
4448 4452                          if (scmd->satacmd_error_reg != 0) {
4449 4453                                  goto err_out;
4450 4454                          }
4451 4455                          sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4452 4456                          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4453 4457                          if (sata_hba_start(spx, &rval) != 0) {
4454 4458                                  mutex_exit(cport_mutex);
4455 4459                                  return (rval);
4456 4460                          }
4457 4461                          if (scmd->satacmd_error_reg != 0) {
4458 4462                                  goto err_out;
4459 4463                          }
4460 4464                  }
4461 4465                  bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4462 4466                  break;
4463 4467          default:
4464 4468  err_out:
4465 4469                  mutex_exit(cport_mutex);
4466 4470                  return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4467 4471                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4468 4472          }
4469 4473  
4470 4474          /*
4471 4475           * Since it was a synchronous command,
4472 4476           * a callback function will be called directly.
4473 4477           */
4474 4478          mutex_exit(cport_mutex);
4475 4479          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4476 4480              "synchronous execution status %x\n",
4477 4481              spx->txlt_sata_pkt->satapkt_reason);
4478 4482  
4479 4483          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4480 4484              scsipkt->pkt_comp != NULL) {
4481 4485                  sata_set_arq_data(spx->txlt_sata_pkt);
4482 4486                  if (servicing_interrupt()) {
4483 4487                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4484 4488                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4485 4489                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4486 4490                                  return (TRAN_BUSY);
4487 4491                          }
4488 4492                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4489 4493                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4490 4494                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4491 4495                          /* Scheduling the callback failed */
4492 4496                          return (TRAN_BUSY);
4493 4497                  }
4494 4498          }
4495 4499          else
4496 4500  
4497 4501                  sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4498 4502  
4499 4503          return (TRAN_ACCEPT);
4500 4504  
4501 4505  }
4502 4506  
4503 4507  /*
4504 4508   * SATA translate command:  Read Capacity.
4505 4509   * Emulated command for SATA disks.
4506 4510   * Capacity is retrieved from cached Idenifty Device data.
4507 4511   * Identify Device data shows effective disk capacity, not the native
4508 4512   * capacity, which may be limitted by Set Max Address command.
4509 4513   * This is ATA version for SATA hard disks.
4510 4514   *
4511 4515   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4512 4516   */
4513 4517  static int
4514 4518  sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4515 4519  {
4516 4520          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4517 4521          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4518 4522          sata_drive_info_t *sdinfo;
4519 4523          uint64_t val;
4520 4524          uint32_t lbsize = DEV_BSIZE;
4521 4525          uchar_t *rbuf;
4522 4526          int rval, reason;
4523 4527          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4524 4528  
4525 4529          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4526 4530              "sata_txlt_read_capacity: ", NULL);
4527 4531  
4528 4532          mutex_enter(cport_mutex);
4529 4533  
4530 4534          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4531 4535              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4532 4536                  mutex_exit(cport_mutex);
4533 4537                  return (rval);
4534 4538          }
4535 4539  
4536 4540          scsipkt->pkt_reason = CMD_CMPLT;
4537 4541          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4538 4542              STATE_SENT_CMD | STATE_GOT_STATUS;
4539 4543          *scsipkt->pkt_scbp = STATUS_GOOD;
4540 4544          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4541 4545                  /*
4542 4546                   * Because it is fully emulated command storing data
4543 4547                   * programatically in the specified buffer, release
4544 4548                   * preallocated DMA resources before storing data in the buffer,
4545 4549                   * so no unwanted DMA sync would take place.
4546 4550                   */
4547 4551                  sata_scsi_dmafree(NULL, scsipkt);
4548 4552  
4549 4553                  sdinfo = sata_get_device_info(
4550 4554                      spx->txlt_sata_hba_inst,
4551 4555                      &spx->txlt_sata_pkt->satapkt_device);
4552 4556  
4553 4557                  /*
4554 4558                   * As per SBC-3, the "returned LBA" is either the highest
4555 4559                   * addressable LBA or 0xffffffff, whichever is smaller.
4556 4560                   */
4557 4561                  val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4558 4562  
4559 4563                  if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4560 4564                          /* physical/logical sector size word is valid */
4561 4565  
4562 4566                          if (sdinfo->satadrv_id.ai_phys_sect_sz &
4563 4567                              SATA_L2PS_BIG_SECTORS) {
4564 4568                                  /* if this set 117-118 words are valid */
4565 4569                                  lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4566 4570                                      (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4567 4571                                  lbsize <<= 1; /* convert from words to bytes */
4568 4572                          }
4569 4573                  }
4570 4574                  rbuf = (uchar_t *)bp->b_un.b_addr;
4571 4575                  /* Need to swap endians to match scsi format */
4572 4576                  rbuf[0] = (val >> 24) & 0xff;
4573 4577                  rbuf[1] = (val >> 16) & 0xff;
4574 4578                  rbuf[2] = (val >> 8) & 0xff;
4575 4579                  rbuf[3] = val & 0xff;
4576 4580                  rbuf[4] = (lbsize >> 24) & 0xff;
4577 4581                  rbuf[5] = (lbsize >> 16) & 0xff;
4578 4582                  rbuf[6] = (lbsize >> 8) & 0xff;
4579 4583                  rbuf[7] = lbsize & 0xff;
4580 4584  
4581 4585                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
4582 4586                  scsipkt->pkt_resid = 0;
4583 4587  
4584 4588                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4585 4589                      sdinfo->satadrv_capacity -1);
4586 4590          }
4587 4591          mutex_exit(cport_mutex);
4588 4592          /*
4589 4593           * If a callback was requested, do it now.
4590 4594           */
4591 4595          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4592 4596              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4593 4597  
4594 4598          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4595 4599              scsipkt->pkt_comp != NULL) {
4596 4600                  /* scsi callback required */
4597 4601                  if (servicing_interrupt()) {
4598 4602                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4599 4603                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4600 4604                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4601 4605                                  return (TRAN_BUSY);
4602 4606                          }
4603 4607                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4604 4608                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4605 4609                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4606 4610                          /* Scheduling the callback failed */
4607 4611                          return (TRAN_BUSY);
4608 4612                  }
4609 4613          }
4610 4614  
4611 4615          return (TRAN_ACCEPT);
4612 4616  }
4613 4617  
4614 4618  /*
4615 4619   * SATA translate command:  Read Capacity (16).
4616 4620   * Emulated command for SATA disks.
4617 4621   * Info is retrieved from cached Identify Device data.
4618 4622   * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4619 4623   *
4620 4624   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4621 4625   */
4622 4626  static int
4623 4627  sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4624 4628  {
4625 4629          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4626 4630          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4627 4631          sata_drive_info_t *sdinfo;
4628 4632          uint64_t val;
4629 4633          uint16_t l2p_exp;
4630 4634          uint32_t lbsize = DEV_BSIZE;
4631 4635          uchar_t *rbuf;
4632 4636          int rval, reason;
4633 4637  #define TPE     0x80
4634 4638  #define TPRZ    0x40
4635 4639          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4636 4640  
4637 4641          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4638 4642              "sata_txlt_read_capacity: ", NULL);
4639 4643  
4640 4644          mutex_enter(cport_mutex);
4641 4645  
4642 4646          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4643 4647              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4644 4648                  mutex_exit(cport_mutex);
4645 4649                  return (rval);
4646 4650          }
4647 4651  
4648 4652          scsipkt->pkt_reason = CMD_CMPLT;
4649 4653          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4650 4654              STATE_SENT_CMD | STATE_GOT_STATUS;
4651 4655          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4652 4656                  /*
4653 4657                   * Because it is fully emulated command storing data
4654 4658                   * programatically in the specified buffer, release
4655 4659                   * preallocated DMA resources before storing data in the buffer,
4656 4660                   * so no unwanted DMA sync would take place.
4657 4661                   */
4658 4662                  sata_scsi_dmafree(NULL, scsipkt);
4659 4663  
4660 4664                  /* Check SERVICE ACTION field */
4661 4665                  if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4662 4666                      SSVC_ACTION_READ_CAPACITY_G4) {
4663 4667                          mutex_exit(cport_mutex);
4664 4668                          return (sata_txlt_check_condition(spx,
4665 4669                              KEY_ILLEGAL_REQUEST,
4666 4670                              SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4667 4671                  }
4668 4672  
4669 4673                  /* Check LBA field */
4670 4674                  if ((scsipkt->pkt_cdbp[2] != 0) ||
4671 4675                      (scsipkt->pkt_cdbp[3] != 0) ||
4672 4676                      (scsipkt->pkt_cdbp[4] != 0) ||
4673 4677                      (scsipkt->pkt_cdbp[5] != 0) ||
4674 4678                      (scsipkt->pkt_cdbp[6] != 0) ||
4675 4679                      (scsipkt->pkt_cdbp[7] != 0) ||
4676 4680                      (scsipkt->pkt_cdbp[8] != 0) ||
4677 4681                      (scsipkt->pkt_cdbp[9] != 0)) {
4678 4682                          mutex_exit(cport_mutex);
4679 4683                          return (sata_txlt_check_condition(spx,
4680 4684                              KEY_ILLEGAL_REQUEST,
4681 4685                              SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4682 4686                  }
4683 4687  
4684 4688                  /* Check PMI bit */
4685 4689                  if (scsipkt->pkt_cdbp[14] & 0x1) {
4686 4690                          mutex_exit(cport_mutex);
4687 4691                          return (sata_txlt_check_condition(spx,
4688 4692                              KEY_ILLEGAL_REQUEST,
4689 4693                              SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4690 4694                  }
4691 4695  
4692 4696                  *scsipkt->pkt_scbp = STATUS_GOOD;
4693 4697  
4694 4698                  sdinfo = sata_get_device_info(
4695 4699                      spx->txlt_sata_hba_inst,
4696 4700                      &spx->txlt_sata_pkt->satapkt_device);
4697 4701  
4698 4702                  /* last logical block address */
4699 4703                  val = MIN(sdinfo->satadrv_capacity - 1,
4700 4704                      SCSI_READ_CAPACITY16_MAX_LBA);
4701 4705  
4702 4706                  /* logical to physical block size exponent */
4703 4707                  l2p_exp = 0;
4704 4708                  if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4705 4709                          /* physical/logical sector size word is valid */
4706 4710  
4707 4711                          if (sdinfo->satadrv_id.ai_phys_sect_sz &
4708 4712                              SATA_L2PS_HAS_MULT) {
4709 4713                                  /* multiple logical sectors per phys sectors */
4710 4714                                  l2p_exp =
4711 4715                                      sdinfo->satadrv_id.ai_phys_sect_sz &
4712 4716                                      SATA_L2PS_EXP_MASK;
4713 4717                          }
4714 4718  
4715 4719                          if (sdinfo->satadrv_id.ai_phys_sect_sz &
4716 4720                              SATA_L2PS_BIG_SECTORS) {
4717 4721                                  /* if this set 117-118 words are valid */
4718 4722                                  lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4719 4723                                      (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4720 4724                                  lbsize <<= 1; /* convert from words to bytes */
4721 4725                          }
4722 4726                  }
4723 4727  
4724 4728                  rbuf = (uchar_t *)bp->b_un.b_addr;
4725 4729                  bzero(rbuf, bp->b_bcount);
4726 4730  
4727 4731                  /* returned logical block address */
4728 4732                  rbuf[0] = (val >> 56) & 0xff;
4729 4733                  rbuf[1] = (val >> 48) & 0xff;
4730 4734                  rbuf[2] = (val >> 40) & 0xff;
4731 4735                  rbuf[3] = (val >> 32) & 0xff;
4732 4736                  rbuf[4] = (val >> 24) & 0xff;
4733 4737                  rbuf[5] = (val >> 16) & 0xff;
4734 4738                  rbuf[6] = (val >> 8) & 0xff;
4735 4739                  rbuf[7] = val & 0xff;
4736 4740                  rbuf[8] = (lbsize >> 24) & 0xff;
4737 4741                  rbuf[9] = (lbsize >> 16) & 0xff;
4738 4742                  rbuf[10] = (lbsize >> 8) & 0xff;
4739 4743                  rbuf[11] = lbsize & 0xff;
4740 4744  
4741 4745                  /* p_type, prot_en, unspecified by SAT-2 */
4742 4746                  /* rbuf[12] = 0; */
4743 4747  
4744 4748                  /* p_i_exponent, undefined by SAT-2 */
4745 4749                  /* logical blocks per physical block exponent */
4746 4750                  rbuf[13] = l2p_exp;
4747 4751  
4748 4752                  /* lowest aligned logical block address = 0 (for now) */
4749 4753                  /* tpe and tprz as defined in T10/10-079 r0 */
4750 4754                  if (sdinfo->satadrv_id.ai_addsupported &
4751 4755                      SATA_DETERMINISTIC_READ) {
4752 4756                          if (sdinfo->satadrv_id.ai_addsupported &
4753 4757                              SATA_READ_ZERO) {
4754 4758                                  rbuf[14] |= TPRZ;
4755 4759                          } else {
4756 4760                                  rbuf[14] |= TPE;
4757 4761                          }
4758 4762                  }
4759 4763                  /* rbuf[15] = 0; */
4760 4764  
4761 4765                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
4762 4766                  scsipkt->pkt_resid = 0;
4763 4767  
4764 4768                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
4765 4769                      sdinfo->satadrv_capacity -1);
4766 4770          }
4767 4771  
4768 4772          mutex_exit(cport_mutex);
4769 4773  
4770 4774          /*
4771 4775           * If a callback was requested, do it now.
4772 4776           */
4773 4777          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4774 4778              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4775 4779  
4776 4780          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4777 4781              scsipkt->pkt_comp != NULL) {
4778 4782                  /* scsi callback required */
4779 4783                  if (servicing_interrupt()) {
4780 4784                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4781 4785                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4782 4786                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4783 4787                                  return (TRAN_BUSY);
4784 4788                          }
4785 4789                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4786 4790                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4787 4791                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4788 4792                          /* Scheduling the callback failed */
4789 4793                          return (TRAN_BUSY);
4790 4794                  }
4791 4795          }
4792 4796  
4793 4797          return (TRAN_ACCEPT);
4794 4798  }
4795 4799  
4796 4800  /*
4797 4801   * Translate command: UNMAP
4798 4802   *
4799 4803   * The function cannot be called in interrupt context since it may sleep.
4800 4804   */
4801 4805  static int
4802 4806  sata_txlt_unmap(sata_pkt_txlate_t *spx)
4803 4807  {
4804 4808          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4805 4809          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4806 4810          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4807 4811          uint16_t count = 0;
4808 4812          int synch;
4809 4813          int rval, reason;
4810 4814          int i, x;
4811 4815          int bdlen = 0;
4812 4816          int ranges = 0;
4813 4817          int paramlen = 8;
4814 4818          uint8_t *data, *tmpbd;
4815 4819          sata_drive_info_t *sdinfo;
4816 4820          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4817 4821  #define TRIM    0x1
4818 4822  
4819 4823          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4820 4824              "sata_txlt_unmap: ", NULL);
4821 4825  
4822 4826          mutex_enter(cport_mutex);
4823 4827  
4824 4828          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4825 4829              &spx->txlt_sata_pkt->satapkt_device);
4826 4830          if (sdinfo != NULL) {
4827 4831                  SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4828 4832                      "DSM support 0x%x, max number of 512 byte blocks of LBA "
4829 4833                      "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
4830 4834                      sdinfo->satadrv_id.ai_maxcount);
4831 4835          }
4832 4836  
4833 4837          rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
4834 4838          if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4835 4839                  mutex_exit(cport_mutex);
4836 4840                  return (rval);
4837 4841          }
  
    | 
      ↓ open down ↓ | 
    3144 lines elided | 
    
      ↑ open up ↑ | 
  
4838 4842  
4839 4843          /*
4840 4844           * Need to modify bp to have TRIM data instead of UNMAP data.
4841 4845           * Start by getting the block descriptor data length by subtracting
4842 4846           * the 8 byte parameter list header from the parameter list length.
4843 4847           * The block descriptor size has to be a multiple of 16 bytes.
4844 4848           */
4845 4849          bdlen = scsipkt->pkt_cdbp[7];
4846 4850          bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
4847 4851          if ((bdlen < 0) || ((bdlen % 16) != 0) ||
4848      -            (bdlen > (bp->b_bcount - paramlen))) {
     4852 +            ((bp != NULL) && (bdlen > (bp->b_bcount - paramlen)))) {
4849 4853                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4850 4854                      "sata_txlt_unmap: invalid block descriptor length", NULL);
4851 4855                  mutex_exit(cport_mutex);
4852 4856                  return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4853 4857                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
4854 4858          }
4855 4859          /*
4856 4860           * If there are no parameter data or block descriptors, it is not
4857 4861           * considered an error so just complete the command without sending
4858 4862           * TRIM.
4859 4863           */
4860 4864          if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
4861 4865              (bp->b_bcount == 0)) {
4862 4866                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4863 4867                      "sata_txlt_unmap: no parameter data or block descriptors",
4864 4868                      NULL);
4865 4869                  mutex_exit(cport_mutex);
4866 4870                  return (sata_txlt_unmap_nodata_cmd(spx));
4867 4871          }
4868 4872          tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
4869 4873          data = kmem_zalloc(bdlen, KM_SLEEP);
4870 4874  
4871 4875          /*
4872 4876           * Loop through all the UNMAP block descriptors and convert the data
4873 4877           * into TRIM format.
4874 4878           */
4875 4879          for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
4876 4880                  /* get range length */
4877 4881                  data[x] = tmpbd[i+7];
4878 4882                  data[x+1] = tmpbd[i+6];
4879 4883                  /* get LBA */
4880 4884                  data[x+2] = tmpbd[i+5];
4881 4885                  data[x+3] = tmpbd[i+4];
4882 4886                  data[x+4] = tmpbd[i+3];
4883 4887                  data[x+5] = tmpbd[i+2];
4884 4888                  data[x+6] = tmpbd[i+11];
4885 4889                  data[x+7] = tmpbd[i+10];
4886 4890  
4887 4891                  ranges++;
4888 4892          }
4889 4893  
4890 4894          /*
4891 4895           * The TRIM command expects the data buffer to be a multiple of
4892 4896           * 512-byte blocks of range entries.  This means that the UNMAP buffer
4893 4897           * may be too small.  Free the original DMA resources and create a
4894 4898           * local buffer.
4895 4899           */
4896 4900          sata_common_free_dma_rsrcs(spx);
4897 4901  
4898 4902          /*
4899 4903           * Get count of 512-byte blocks of range entries.  The length
4900 4904           * of a range entry is 8 bytes which means one count has 64 range
4901 4905           * entries.
4902 4906           */
4903 4907          count = (ranges + 63)/64;
4904 4908  
4905 4909          /* Allocate a buffer that is a multiple of 512 bytes. */
4906 4910          mutex_exit(cport_mutex);
4907 4911          bp = sata_alloc_local_buffer(spx, count * 512);
4908 4912          if (bp == NULL) {
4909 4913                  SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
4910 4914                      "sata_txlt_unmap: "
4911 4915                      "cannot allocate buffer for TRIM command", NULL);
4912 4916                  kmem_free(data, bdlen);
4913 4917                  return (TRAN_BUSY);
4914 4918          }
4915 4919          bp_mapin(bp); /* make data buffer accessible */
4916 4920          mutex_enter(cport_mutex);
4917 4921  
4918 4922          bzero(bp->b_un.b_addr, bp->b_bcount);
4919 4923          bcopy(data, bp->b_un.b_addr, x);
4920 4924          kmem_free(data, bdlen);
4921 4925          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4922 4926              DDI_DMA_SYNC_FORDEV);
4923 4927          ASSERT(rval == DDI_SUCCESS);
4924 4928  
4925 4929          scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
4926 4930          scmd->satacmd_addr_type = ATA_ADDR_LBA48;
4927 4931          scmd->satacmd_cmd_reg = SATAC_DSM;
4928 4932          scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
4929 4933          scmd->satacmd_sec_count_lsb = count & 0xff;
4930 4934          scmd->satacmd_features_reg = TRIM;
4931 4935          scmd->satacmd_device_reg = SATA_ADH_LBA;
4932 4936          scmd->satacmd_status_reg = 0;
4933 4937          scmd->satacmd_error_reg = 0;
4934 4938  
4935 4939          /* Start processing command */
4936 4940          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
4937 4941                  spx->txlt_sata_pkt->satapkt_comp =
4938 4942                      sata_txlt_unmap_completion;
4939 4943                  synch = FALSE;
4940 4944          } else {
4941 4945                  synch = TRUE;
4942 4946          }
4943 4947  
4944 4948          if (sata_hba_start(spx, &rval) != 0) {
4945 4949                  mutex_exit(cport_mutex);
4946 4950                  return (rval);
4947 4951          }
4948 4952  
4949 4953          mutex_exit(cport_mutex);
4950 4954  
4951 4955          if (synch) {
4952 4956                  sata_txlt_unmap_completion(spx->txlt_sata_pkt);
4953 4957          }
4954 4958  
4955 4959          return (TRAN_ACCEPT);
4956 4960  }
4957 4961  
4958 4962  /*
4959 4963   * SATA translate command: Mode Sense.
4960 4964   * Translated into appropriate SATA command or emulated.
4961 4965   * Saved Values Page Control (03) are not supported.
4962 4966   *
4963 4967   * NOTE: only caching mode sense page is currently implemented.
4964 4968   *
4965 4969   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4966 4970   */
4967 4971  
4968 4972  #define LLBAA   0x10    /* Long LBA Accepted */
4969 4973  
4970 4974  static int
4971 4975  sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
4972 4976  {
4973 4977          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4974 4978          struct buf      *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4975 4979          sata_drive_info_t *sdinfo;
4976 4980          sata_id_t *sata_id;
4977 4981          struct scsi_extended_sense *sense;
4978 4982          int             len, bdlen, count, alc_len;
4979 4983          int             pc;     /* Page Control code */
4980 4984          uint8_t         *buf;   /* mode sense buffer */
4981 4985          int             rval, reason;
4982 4986          kmutex_t        *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4983 4987  
4984 4988          SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4985 4989              "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
4986 4990              spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
4987 4991              spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
4988 4992  
4989 4993          if (servicing_interrupt()) {
4990 4994                  buf = kmem_zalloc(1024, KM_NOSLEEP);
4991 4995                  if (buf == NULL) {
4992 4996                          return (TRAN_BUSY);
4993 4997                  }
4994 4998          } else {
4995 4999                  buf = kmem_zalloc(1024, KM_SLEEP);
4996 5000          }
4997 5001  
4998 5002          mutex_enter(cport_mutex);
4999 5003  
5000 5004          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5001 5005              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5002 5006                  mutex_exit(cport_mutex);
5003 5007                  kmem_free(buf, 1024);
5004 5008                  return (rval);
5005 5009          }
5006 5010  
5007 5011          scsipkt->pkt_reason = CMD_CMPLT;
5008 5012          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5009 5013              STATE_SENT_CMD | STATE_GOT_STATUS;
5010 5014  
5011 5015          pc = scsipkt->pkt_cdbp[2] >> 6;
5012 5016  
5013 5017          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5014 5018                  /*
5015 5019                   * Because it is fully emulated command storing data
5016 5020                   * programatically in the specified buffer, release
5017 5021                   * preallocated DMA resources before storing data in the buffer,
5018 5022                   * so no unwanted DMA sync would take place.
5019 5023                   */
5020 5024                  sata_scsi_dmafree(NULL, scsipkt);
5021 5025  
5022 5026                  len = 0;
5023 5027                  bdlen = 0;
5024 5028                  if (!(scsipkt->pkt_cdbp[1] & 8)) {
5025 5029                          if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5026 5030                              (scsipkt->pkt_cdbp[1] & LLBAA))
5027 5031                                  bdlen = 16;
5028 5032                          else
5029 5033                                  bdlen = 8;
5030 5034                  }
5031 5035                  /* Build mode parameter header */
5032 5036                  if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5033 5037                          /* 4-byte mode parameter header */
5034 5038                          buf[len++] = 0;         /* mode data length */
5035 5039                          buf[len++] = 0;         /* medium type */
5036 5040                          buf[len++] = 0;         /* dev-specific param */
5037 5041                          buf[len++] = bdlen;     /* Block Descriptor length */
5038 5042                  } else {
5039 5043                          /* 8-byte mode parameter header */
5040 5044                          buf[len++] = 0;         /* mode data length */
5041 5045                          buf[len++] = 0;
5042 5046                          buf[len++] = 0;         /* medium type */
5043 5047                          buf[len++] = 0;         /* dev-specific param */
5044 5048                          if (bdlen == 16)
5045 5049                                  buf[len++] = 1; /* long lba descriptor */
5046 5050                          else
5047 5051                                  buf[len++] = 0;
5048 5052                          buf[len++] = 0;
5049 5053                          buf[len++] = 0;         /* Block Descriptor length */
5050 5054                          buf[len++] = bdlen;
5051 5055                  }
5052 5056  
5053 5057                  sdinfo = sata_get_device_info(
5054 5058                      spx->txlt_sata_hba_inst,
5055 5059                      &spx->txlt_sata_pkt->satapkt_device);
5056 5060  
5057 5061                  /* Build block descriptor only if not disabled (DBD) */
5058 5062                  if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5059 5063                          /* Block descriptor - direct-access device format */
5060 5064                          if (bdlen == 8) {
5061 5065                                  /* build regular block descriptor */
5062 5066                                  buf[len++] =
5063 5067                                      (sdinfo->satadrv_capacity >> 24) & 0xff;
5064 5068                                  buf[len++] =
5065 5069                                      (sdinfo->satadrv_capacity >> 16) & 0xff;
5066 5070                                  buf[len++] =
5067 5071                                      (sdinfo->satadrv_capacity >> 8) & 0xff;
5068 5072                                  buf[len++] = sdinfo->satadrv_capacity & 0xff;
5069 5073                                  buf[len++] = 0; /* density code */
5070 5074                                  buf[len++] = 0;
5071 5075                                  if (sdinfo->satadrv_type ==
5072 5076                                      SATA_DTYPE_ATADISK)
5073 5077                                          buf[len++] = 2;
5074 5078                                  else
5075 5079                                          /* ATAPI */
5076 5080                                          buf[len++] = 8;
5077 5081                                  buf[len++] = 0;
5078 5082                          } else if (bdlen == 16) {
5079 5083                                  /* Long LBA Accepted */
5080 5084                                  /* build long lba block descriptor */
5081 5085  #ifndef __lock_lint
5082 5086                                  buf[len++] =
5083 5087                                      (sdinfo->satadrv_capacity >> 56) & 0xff;
5084 5088                                  buf[len++] =
5085 5089                                      (sdinfo->satadrv_capacity >> 48) & 0xff;
5086 5090                                  buf[len++] =
5087 5091                                      (sdinfo->satadrv_capacity >> 40) & 0xff;
5088 5092                                  buf[len++] =
5089 5093                                      (sdinfo->satadrv_capacity >> 32) & 0xff;
5090 5094  #endif
5091 5095                                  buf[len++] =
5092 5096                                      (sdinfo->satadrv_capacity >> 24) & 0xff;
5093 5097                                  buf[len++] =
5094 5098                                      (sdinfo->satadrv_capacity >> 16) & 0xff;
5095 5099                                  buf[len++] =
5096 5100                                      (sdinfo->satadrv_capacity >> 8) & 0xff;
5097 5101                                  buf[len++] = sdinfo->satadrv_capacity & 0xff;
5098 5102                                  buf[len++] = 0;
5099 5103                                  buf[len++] = 0; /* density code */
5100 5104                                  buf[len++] = 0;
5101 5105                                  buf[len++] = 0;
5102 5106                                  if (sdinfo->satadrv_type ==
5103 5107                                      SATA_DTYPE_ATADISK)
5104 5108                                          buf[len++] = 2;
5105 5109                                  else
5106 5110                                          /* ATAPI */
5107 5111                                          buf[len++] = 8;
5108 5112                                  buf[len++] = 0;
5109 5113                          }
5110 5114                  }
5111 5115  
5112 5116                  sata_id = &sdinfo->satadrv_id;
5113 5117  
5114 5118                  /*
5115 5119                   * Add requested pages.
5116 5120                   * Page 3 and 4 are obsolete and we are not supporting them.
5117 5121                   * We deal now with:
5118 5122                   * caching (read/write cache control).
5119 5123                   * We should eventually deal with following mode pages:
5120 5124                   * error recovery  (0x01),
5121 5125                   * power condition (0x1a),
5122 5126                   * exception control page (enables SMART) (0x1c),
5123 5127                   * enclosure management (ses),
5124 5128                   * protocol-specific port mode (port control).
5125 5129                   */
5126 5130                  switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5127 5131                  case MODEPAGE_RW_ERRRECOV:
5128 5132                          /* DAD_MODE_ERR_RECOV */
5129 5133                          /* R/W recovery */
5130 5134                          len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5131 5135                          break;
5132 5136                  case MODEPAGE_CACHING:
5133 5137                          /* DAD_MODE_CACHE */
5134 5138                          /* Reject not supported request for saved parameters */
5135 5139                          if (pc == 3) {
5136 5140                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5137 5141                                  sense = sata_arq_sense(spx);
5138 5142                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5139 5143                                  sense->es_add_code =
5140 5144                                      SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5141 5145                                  goto done;
5142 5146                          }
5143 5147  
5144 5148                          /* caching */
5145 5149                          len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5146 5150                          break;
5147 5151                  case MODEPAGE_INFO_EXCPT:
5148 5152                          /* exception cntrl */
5149 5153                          if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5150 5154                                  len += sata_build_msense_page_1c(sdinfo, pc,
5151 5155                                      buf+len);
5152 5156                          }
5153 5157                          else
5154 5158                                  goto err;
5155 5159                          break;
5156 5160                  case MODEPAGE_POWER_COND:
5157 5161                          /* DAD_MODE_POWER_COND */
5158 5162                          /* power condition */
5159 5163                          len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5160 5164                          break;
5161 5165  
5162 5166                  case MODEPAGE_ACOUSTIC_MANAG:
5163 5167                          /* acoustic management */
5164 5168                          len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5165 5169                          break;
5166 5170                  case MODEPAGE_ALLPAGES:
5167 5171                          /* all pages */
5168 5172                          len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5169 5173                          len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5170 5174                          len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5171 5175                          if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5172 5176                                  len += sata_build_msense_page_1c(sdinfo, pc,
5173 5177                                      buf+len);
5174 5178                          }
5175 5179                          len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5176 5180                          break;
5177 5181                  default:
5178 5182                  err:
5179 5183                          /* Invalid request */
5180 5184                          *scsipkt->pkt_scbp = STATUS_CHECK;
5181 5185                          sense = sata_arq_sense(spx);
5182 5186                          sense->es_key = KEY_ILLEGAL_REQUEST;
5183 5187                          sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5184 5188                          goto done;
5185 5189                  }
5186 5190  
5187 5191                  /* fix total mode data length */
5188 5192                  if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5189 5193                          /* 4-byte mode parameter header */
5190 5194                          buf[0] = len - 1;       /* mode data length */
5191 5195                  } else {
5192 5196                          buf[0] = (len -2) >> 8;
5193 5197                          buf[1] = (len -2) & 0xff;
5194 5198                  }
5195 5199  
5196 5200  
5197 5201                  /* Check allocation length */
5198 5202                  if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5199 5203                          alc_len = scsipkt->pkt_cdbp[4];
5200 5204                  } else {
5201 5205                          alc_len = scsipkt->pkt_cdbp[7];
5202 5206                          alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
5203 5207                  }
5204 5208                  /*
5205 5209                   * We do not check for possible parameters truncation
5206 5210                   * (alc_len < len) assuming that the target driver works
5207 5211                   * correctly. Just avoiding overrun.
5208 5212                   * Copy no more than requested and possible, buffer-wise.
5209 5213                   */
5210 5214                  count = MIN(alc_len, len);
5211 5215                  count = MIN(bp->b_bcount, count);
5212 5216                  bcopy(buf, bp->b_un.b_addr, count);
5213 5217  
5214 5218                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
5215 5219                  scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5216 5220          }
5217 5221          *scsipkt->pkt_scbp = STATUS_GOOD;
5218 5222  done:
5219 5223          mutex_exit(cport_mutex);
5220 5224          (void) kmem_free(buf, 1024);
5221 5225  
5222 5226          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5223 5227              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5224 5228  
5225 5229          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5226 5230              scsipkt->pkt_comp != NULL) {
5227 5231                  /* scsi callback required */
5228 5232                  if (servicing_interrupt()) {
5229 5233                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5230 5234                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5231 5235                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5232 5236                                  return (TRAN_BUSY);
5233 5237                          }
5234 5238                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5235 5239                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5236 5240                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5237 5241                          /* Scheduling the callback failed */
5238 5242                          return (TRAN_BUSY);
5239 5243                  }
5240 5244          }
5241 5245  
5242 5246          return (TRAN_ACCEPT);
5243 5247  }
5244 5248  
5245 5249  
5246 5250  /*
5247 5251   * SATA translate command: Mode Select.
5248 5252   * Translated into appropriate SATA command or emulated.
5249 5253   * Saving parameters is not supported.
5250 5254   * Changing device capacity is not supported (although theoretically
5251 5255   * possible by executing SET FEATURES/SET MAX ADDRESS)
5252 5256   *
5253 5257   * Assumption is that the target driver is working correctly.
5254 5258   *
5255 5259   * More than one SATA command may be executed to perform operations specified
5256 5260   * by mode select pages. The first error terminates further execution.
5257 5261   * Operations performed successully are not backed-up in such case.
5258 5262   *
5259 5263   * NOTE: Implemented pages:
5260 5264   * - caching page
5261 5265   * - informational exception page
5262 5266   * - acoustic management page
5263 5267   * - power condition page
5264 5268   * Caching setup is remembered so it could be re-stored in case of
5265 5269   * an unexpected device reset.
5266 5270   *
5267 5271   * Returns TRAN_XXXX.
5268 5272   * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5269 5273   */
5270 5274  
5271 5275  static int
5272 5276  sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5273 5277  {
5274 5278          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5275 5279          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5276 5280          struct scsi_extended_sense *sense;
5277 5281          int len, pagelen, count, pllen;
5278 5282          uint8_t *buf;   /* mode select buffer */
5279 5283          int rval, stat, reason;
5280 5284          uint_t nointr_flag;
5281 5285          int dmod = 0;
5282 5286          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5283 5287  
5284 5288          SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5285 5289              "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5286 5290              spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5287 5291              spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5288 5292  
5289 5293          mutex_enter(cport_mutex);
5290 5294  
5291 5295          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5292 5296              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5293 5297                  mutex_exit(cport_mutex);
5294 5298                  return (rval);
5295 5299          }
5296 5300  
5297 5301          rval = TRAN_ACCEPT;
5298 5302  
5299 5303          scsipkt->pkt_reason = CMD_CMPLT;
5300 5304          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5301 5305              STATE_SENT_CMD | STATE_GOT_STATUS;
5302 5306          nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5303 5307  
5304 5308          /* Reject not supported request */
5305 5309          if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5306 5310                  *scsipkt->pkt_scbp = STATUS_CHECK;
5307 5311                  sense = sata_arq_sense(spx);
5308 5312                  sense->es_key = KEY_ILLEGAL_REQUEST;
5309 5313                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5310 5314                  goto done;
5311 5315          }
5312 5316  
5313 5317          if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5314 5318                  pllen = scsipkt->pkt_cdbp[4];
5315 5319          } else {
5316 5320                  pllen = scsipkt->pkt_cdbp[7];
5317 5321                  pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5318 5322          }
5319 5323  
5320 5324          *scsipkt->pkt_scbp = STATUS_GOOD;       /* Presumed outcome */
5321 5325  
5322 5326          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5323 5327                  buf = (uint8_t *)bp->b_un.b_addr;
5324 5328                  count = MIN(bp->b_bcount, pllen);
5325 5329                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
5326 5330                  scsipkt->pkt_resid = 0;
5327 5331                  pllen = count;
5328 5332  
5329 5333                  /*
5330 5334                   * Check the header to skip the block descriptor(s) - we
5331 5335                   * do not support setting device capacity.
5332 5336                   * Existing macros do not recognize long LBA dscriptor,
5333 5337                   * hence manual calculation.
5334 5338                   */
5335 5339                  if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5336 5340                          /* 6-bytes CMD, 4 bytes header */
5337 5341                          if (count <= 4)
5338 5342                                  goto done;              /* header only */
5339 5343                          len = buf[3] + 4;
5340 5344                  } else {
5341 5345                          /* 10-bytes CMD, 8 bytes header */
5342 5346                          if (count <= 8)
5343 5347                                  goto done;              /* header only */
5344 5348                          len = buf[6];
5345 5349                          len = (len << 8) + buf[7] + 8;
5346 5350                  }
5347 5351                  if (len >= count)
5348 5352                          goto done;      /* header + descriptor(s) only */
5349 5353  
5350 5354                  pllen -= len;           /* remaining data length */
5351 5355  
5352 5356                  /*
5353 5357                   * We may be executing SATA command and want to execute it
5354 5358                   * in SYNCH mode, regardless of scsi_pkt setting.
5355 5359                   * Save scsi_pkt setting and indicate SYNCH mode
5356 5360                   */
5357 5361                  if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5358 5362                      scsipkt->pkt_comp != NULL) {
5359 5363                          scsipkt->pkt_flags |= FLAG_NOINTR;
5360 5364                  }
5361 5365                  spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5362 5366  
5363 5367                  /*
5364 5368                   * len is now the offset to a first mode select page
5365 5369                   * Process all pages
5366 5370                   */
5367 5371                  while (pllen > 0) {
5368 5372                          switch ((int)buf[len]) {
5369 5373                          case MODEPAGE_CACHING:
5370 5374                                  /* No support for SP (saving) */
5371 5375                                  if (scsipkt->pkt_cdbp[1] & 0x01) {
5372 5376                                          *scsipkt->pkt_scbp = STATUS_CHECK;
5373 5377                                          sense = sata_arq_sense(spx);
5374 5378                                          sense->es_key = KEY_ILLEGAL_REQUEST;
5375 5379                                          sense->es_add_code =
5376 5380                                              SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5377 5381                                          goto done;
5378 5382                                  }
5379 5383                                  stat = sata_mode_select_page_8(spx,
5380 5384                                      (struct mode_cache_scsi3 *)&buf[len],
5381 5385                                      pllen, &pagelen, &rval, &dmod);
5382 5386                                  /*
5383 5387                                   * The pagelen value indicates the number of
5384 5388                                   * parameter bytes already processed.
5385 5389                                   * The rval is the return value from
5386 5390                                   * sata_tran_start().
5387 5391                                   * The stat indicates the overall status of
5388 5392                                   * the operation(s).
5389 5393                                   */
5390 5394                                  if (stat != SATA_SUCCESS)
5391 5395                                          /*
5392 5396                                           * Page processing did not succeed -
5393 5397                                           * all error info is already set-up,
5394 5398                                           * just return
5395 5399                                           */
5396 5400                                          pllen = 0; /* this breaks the loop */
5397 5401                                  else {
5398 5402                                          len += pagelen;
5399 5403                                          pllen -= pagelen;
5400 5404                                  }
5401 5405                                  break;
5402 5406  
5403 5407                          case MODEPAGE_INFO_EXCPT:
5404 5408                                  stat = sata_mode_select_page_1c(spx,
5405 5409                                      (struct mode_info_excpt_page *)&buf[len],
5406 5410                                      pllen, &pagelen, &rval, &dmod);
5407 5411                                  /*
5408 5412                                   * The pagelen value indicates the number of
5409 5413                                   * parameter bytes already processed.
5410 5414                                   * The rval is the return value from
5411 5415                                   * sata_tran_start().
5412 5416                                   * The stat indicates the overall status of
5413 5417                                   * the operation(s).
5414 5418                                   */
5415 5419                                  if (stat != SATA_SUCCESS)
5416 5420                                          /*
5417 5421                                           * Page processing did not succeed -
5418 5422                                           * all error info is already set-up,
5419 5423                                           * just return
5420 5424                                           */
5421 5425                                          pllen = 0; /* this breaks the loop */
5422 5426                                  else {
5423 5427                                          len += pagelen;
5424 5428                                          pllen -= pagelen;
5425 5429                                  }
5426 5430                                  break;
5427 5431  
5428 5432                          case MODEPAGE_ACOUSTIC_MANAG:
5429 5433                                  stat = sata_mode_select_page_30(spx,
5430 5434                                      (struct mode_acoustic_management *)
5431 5435                                      &buf[len], pllen, &pagelen, &rval, &dmod);
5432 5436                                  /*
5433 5437                                   * The pagelen value indicates the number of
5434 5438                                   * parameter bytes already processed.
5435 5439                                   * The rval is the return value from
5436 5440                                   * sata_tran_start().
5437 5441                                   * The stat indicates the overall status of
5438 5442                                   * the operation(s).
5439 5443                                   */
5440 5444                                  if (stat != SATA_SUCCESS)
5441 5445                                          /*
5442 5446                                           * Page processing did not succeed -
5443 5447                                           * all error info is already set-up,
5444 5448                                           * just return
5445 5449                                           */
5446 5450                                          pllen = 0; /* this breaks the loop */
5447 5451                                  else {
5448 5452                                          len += pagelen;
5449 5453                                          pllen -= pagelen;
5450 5454                                  }
5451 5455  
5452 5456                                  break;
5453 5457                          case MODEPAGE_POWER_COND:
5454 5458                                  stat = sata_mode_select_page_1a(spx,
5455 5459                                      (struct mode_info_power_cond *)&buf[len],
5456 5460                                      pllen, &pagelen, &rval, &dmod);
5457 5461                                  /*
5458 5462                                   * The pagelen value indicates the number of
5459 5463                                   * parameter bytes already processed.
5460 5464                                   * The rval is the return value from
5461 5465                                   * sata_tran_start().
5462 5466                                   * The stat indicates the overall status of
5463 5467                                   * the operation(s).
5464 5468                                   */
5465 5469                                  if (stat != SATA_SUCCESS)
5466 5470                                          /*
5467 5471                                           * Page processing did not succeed -
5468 5472                                           * all error info is already set-up,
5469 5473                                           * just return
5470 5474                                           */
5471 5475                                          pllen = 0; /* this breaks the loop */
5472 5476                                  else {
5473 5477                                          len += pagelen;
5474 5478                                          pllen -= pagelen;
5475 5479                                  }
5476 5480                                  break;
5477 5481                          default:
5478 5482                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5479 5483                                  sense = sata_arq_sense(spx);
5480 5484                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5481 5485                                  sense->es_add_code =
5482 5486                                      SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5483 5487                                  goto done;
5484 5488                          }
5485 5489                  }
5486 5490          }
5487 5491  done:
5488 5492          mutex_exit(cport_mutex);
5489 5493          /*
5490 5494           * If device parameters were modified, fetch and store the new
5491 5495           * Identify Device data. Since port mutex could have been released
5492 5496           * for accessing HBA driver, we need to re-check device existence.
5493 5497           */
5494 5498          if (dmod != 0) {
5495 5499                  sata_drive_info_t new_sdinfo, *sdinfo;
5496 5500                  int rv = 0;
5497 5501  
5498 5502                  /*
5499 5503                   * Following statement has to be changed if this function is
5500 5504                   * used for devices other than SATA hard disks.
5501 5505                   */
5502 5506                  new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5503 5507  
5504 5508                  new_sdinfo.satadrv_addr =
5505 5509                      spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5506 5510                  rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5507 5511                      &new_sdinfo);
5508 5512  
5509 5513                  mutex_enter(cport_mutex);
5510 5514                  /*
5511 5515                   * Since port mutex could have been released when
5512 5516                   * accessing HBA driver, we need to re-check that the
5513 5517                   * framework still holds the device info structure.
5514 5518                   */
5515 5519                  sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5516 5520                      &spx->txlt_sata_pkt->satapkt_device);
5517 5521                  if (sdinfo != NULL) {
5518 5522                          /*
5519 5523                           * Device still has info structure in the
5520 5524                           * sata framework. Copy newly fetched info
5521 5525                           */
5522 5526                          if (rv == 0) {
5523 5527                                  sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5524 5528                                  sata_save_drive_settings(sdinfo);
5525 5529                          } else {
5526 5530                                  /*
5527 5531                                   * Could not fetch new data - invalidate
5528 5532                                   * sata_drive_info. That makes device
5529 5533                                   * unusable.
5530 5534                                   */
5531 5535                                  sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5532 5536                                  sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5533 5537                          }
5534 5538                  }
5535 5539                  if (rv != 0 || sdinfo == NULL) {
5536 5540                          /*
5537 5541                           * This changes the overall mode select completion
5538 5542                           * reason to a failed one !!!!!
5539 5543                           */
5540 5544                          *scsipkt->pkt_scbp = STATUS_CHECK;
5541 5545                          sense = sata_arq_sense(spx);
5542 5546                          scsipkt->pkt_reason = CMD_INCOMPLETE;
5543 5547                          rval = TRAN_ACCEPT;
5544 5548                  }
5545 5549                  mutex_exit(cport_mutex);
5546 5550          }
5547 5551          /* Restore the scsi pkt flags */
5548 5552          scsipkt->pkt_flags &= ~FLAG_NOINTR;
5549 5553          scsipkt->pkt_flags |= nointr_flag;
5550 5554  
5551 5555          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5552 5556              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5553 5557  
5554 5558          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5555 5559              scsipkt->pkt_comp != NULL) {
5556 5560                  /* scsi callback required */
5557 5561                  if (servicing_interrupt()) {
5558 5562                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5559 5563                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5560 5564                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5561 5565                                  return (TRAN_BUSY);
5562 5566                          }
5563 5567                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5564 5568                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5565 5569                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5566 5570                          /* Scheduling the callback failed */
5567 5571                          return (TRAN_BUSY);
5568 5572                  }
5569 5573          }
5570 5574  
5571 5575          return (rval);
5572 5576  }
5573 5577  
5574 5578  /*
5575 5579   * Translate command: ATA Pass Through
5576 5580   * Incomplete implementation.  Only supports No-Data, PIO Data-In, and
5577 5581   * PIO Data-Out protocols.  Also supports CK_COND bit.
5578 5582   *
5579 5583   * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5580 5584   * described in Table 111 of SAT-2 (Draft 9).
5581 5585   */
5582 5586  static  int
5583 5587  sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5584 5588  {
5585 5589          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5586 5590          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5587 5591          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5588 5592          int extend;
5589 5593          uint64_t lba;
5590 5594          uint16_t feature, sec_count;
5591 5595          int t_len, synch;
5592 5596          int rval, reason;
5593 5597          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5594 5598  
5595 5599          mutex_enter(cport_mutex);
5596 5600  
5597 5601          rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5598 5602          if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5599 5603                  mutex_exit(cport_mutex);
5600 5604                  return (rval);
5601 5605          }
5602 5606  
5603 5607          /* T_DIR bit */
5604 5608          if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5605 5609                  scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5606 5610          else
5607 5611                  scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5608 5612  
5609 5613          /* MULTIPLE_COUNT field.  If non-zero, invalid command (for now). */
5610 5614          if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5611 5615                  mutex_exit(cport_mutex);
5612 5616                  return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5613 5617          }
5614 5618  
5615 5619          /* OFFLINE field. If non-zero, invalid command (for now). */
5616 5620          if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5617 5621                  mutex_exit(cport_mutex);
5618 5622                  return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5619 5623          }
5620 5624  
5621 5625          /* PROTOCOL field */
5622 5626          switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5623 5627          case SATL_APT_P_HW_RESET:
5624 5628          case SATL_APT_P_SRST:
5625 5629          case SATL_APT_P_DMA:
5626 5630          case SATL_APT_P_DMA_QUEUED:
5627 5631          case SATL_APT_P_DEV_DIAG:
5628 5632          case SATL_APT_P_DEV_RESET:
5629 5633          case SATL_APT_P_UDMA_IN:
5630 5634          case SATL_APT_P_UDMA_OUT:
5631 5635          case SATL_APT_P_FPDMA:
5632 5636          case SATL_APT_P_RET_RESP:
5633 5637                  /* Not yet implemented */
5634 5638          default:
5635 5639                  mutex_exit(cport_mutex);
5636 5640                  return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5637 5641  
5638 5642          case SATL_APT_P_NON_DATA:
5639 5643                  scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5640 5644                  break;
5641 5645  
5642 5646          case SATL_APT_P_PIO_DATA_IN:
5643 5647                  /* If PROTOCOL disagrees with T_DIR, invalid command */
5644 5648                  if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5645 5649                          mutex_exit(cport_mutex);
5646 5650                          return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5647 5651                  }
5648 5652  
5649 5653                  /* if there is a buffer, release its DMA resources */
5650 5654                  if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5651 5655                          sata_scsi_dmafree(NULL, scsipkt);
5652 5656                  } else {
5653 5657                          /* if there is no buffer, how do you PIO in? */
5654 5658                          mutex_exit(cport_mutex);
5655 5659                          return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5656 5660                  }
5657 5661  
5658 5662                  break;
5659 5663  
5660 5664          case SATL_APT_P_PIO_DATA_OUT:
5661 5665                  /* If PROTOCOL disagrees with T_DIR, invalid command */
5662 5666                  if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5663 5667                          mutex_exit(cport_mutex);
5664 5668                          return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5665 5669                  }
5666 5670  
5667 5671                  /* if there is a buffer, release its DMA resources */
5668 5672                  if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5669 5673                          sata_scsi_dmafree(NULL, scsipkt);
5670 5674                  } else {
5671 5675                          /* if there is no buffer, how do you PIO out? */
5672 5676                          mutex_exit(cport_mutex);
5673 5677                          return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5674 5678                  }
5675 5679  
5676 5680                  break;
5677 5681          }
5678 5682  
5679 5683          /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5680 5684          switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5681 5685          case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5682 5686                  feature = scsipkt->pkt_cdbp[3];
5683 5687  
5684 5688                  sec_count = scsipkt->pkt_cdbp[4];
5685 5689  
5686 5690                  lba = scsipkt->pkt_cdbp[8] & 0xf;
5687 5691                  lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5688 5692                  lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5689 5693                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5690 5694  
5691 5695                  scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 0xf0;
5692 5696                  scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
5693 5697  
5694 5698                  break;
5695 5699  
5696 5700          case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5697 5701                  if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
5698 5702                          extend = 1;
5699 5703  
5700 5704                          feature = scsipkt->pkt_cdbp[3];
5701 5705                          feature = (feature << 8) | scsipkt->pkt_cdbp[4];
5702 5706  
5703 5707                          sec_count = scsipkt->pkt_cdbp[5];
5704 5708                          sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[6];
5705 5709  
5706 5710                          lba = scsipkt->pkt_cdbp[11];
5707 5711                          lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5708 5712                          lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5709 5713                          lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5710 5714                          lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5711 5715                          lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5712 5716  
5713 5717                          scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
5714 5718                          scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5715 5719                  } else {
5716 5720                          feature = scsipkt->pkt_cdbp[3];
5717 5721  
5718 5722                          sec_count = scsipkt->pkt_cdbp[5];
5719 5723  
5720 5724                          lba = scsipkt->pkt_cdbp[13] & 0xf;
5721 5725                          lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5722 5726                          lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5723 5727                          lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5724 5728  
5725 5729                          scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] &
5726 5730                              0xf0;
5727 5731                          scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5728 5732                  }
5729 5733  
5730 5734                  break;
5731 5735          }
5732 5736  
5733 5737          /* CK_COND bit */
5734 5738          if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5735 5739                  if (extend) {
5736 5740                          scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
5737 5741                          scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
5738 5742                          scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
5739 5743                          scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
5740 5744                  }
5741 5745  
5742 5746                  scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
5743 5747                  scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
5744 5748                  scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
5745 5749                  scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
5746 5750                  scmd->satacmd_flags.sata_copy_out_device_reg = 1;
5747 5751                  scmd->satacmd_flags.sata_copy_out_error_reg = 1;
5748 5752          }
5749 5753  
5750 5754          /* Transfer remaining parsed ATA cmd values to the satacmd */
5751 5755          if (extend) {
5752 5756                  scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5753 5757  
5754 5758                  scmd->satacmd_features_reg_ext = (feature >> 8) & 0xff;
5755 5759                  scmd->satacmd_sec_count_msb = (sec_count >> 8) & 0xff;
5756 5760                  scmd->satacmd_lba_low_msb = (lba >> 8) & 0xff;
5757 5761                  scmd->satacmd_lba_mid_msb = (lba >> 8) & 0xff;
5758 5762                  scmd->satacmd_lba_high_msb = lba >> 40;
5759 5763          } else {
5760 5764                  scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5761 5765  
5762 5766                  scmd->satacmd_features_reg_ext = 0;
5763 5767                  scmd->satacmd_sec_count_msb = 0;
5764 5768                  scmd->satacmd_lba_low_msb = 0;
5765 5769                  scmd->satacmd_lba_mid_msb = 0;
5766 5770                  scmd->satacmd_lba_high_msb = 0;
5767 5771          }
5768 5772  
5769 5773          scmd->satacmd_features_reg = feature & 0xff;
5770 5774          scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5771 5775          scmd->satacmd_lba_low_lsb = lba & 0xff;
5772 5776          scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5773 5777          scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5774 5778  
5775 5779          /* Determine transfer length */
5776 5780          switch (scsipkt->pkt_cdbp[2] & 0x3) {           /* T_LENGTH field */
5777 5781          case 1:
5778 5782                  t_len = feature;
5779 5783                  break;
5780 5784          case 2:
5781 5785                  t_len = sec_count;
5782 5786                  break;
5783 5787          default:
5784 5788                  t_len = 0;
5785 5789                  break;
5786 5790          }
5787 5791  
5788 5792          /* Adjust transfer length for the Byte Block bit */
5789 5793          if ((scsipkt->pkt_cdbp[2] >> 2) & 1)
5790 5794                  t_len *= SATA_DISK_SECTOR_SIZE;
5791 5795  
5792 5796          /* Start processing command */
5793 5797          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5794 5798                  spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
5795 5799                  synch = FALSE;
5796 5800          } else {
5797 5801                  synch = TRUE;
5798 5802          }
5799 5803  
5800 5804          if (sata_hba_start(spx, &rval) != 0) {
5801 5805                  mutex_exit(cport_mutex);
5802 5806                  return (rval);
5803 5807          }
5804 5808  
5805 5809          mutex_exit(cport_mutex);
5806 5810  
5807 5811          if (synch) {
5808 5812                  sata_txlt_apt_completion(spx->txlt_sata_pkt);
5809 5813          }
5810 5814  
5811 5815          return (TRAN_ACCEPT);
5812 5816  }
5813 5817  
5814 5818  /*
5815 5819   * Translate command: Log Sense
5816 5820   */
5817 5821  static  int
5818 5822  sata_txlt_log_sense(sata_pkt_txlate_t *spx)
5819 5823  {
5820 5824          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5821 5825          struct buf      *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5822 5826          sata_drive_info_t *sdinfo;
5823 5827          struct scsi_extended_sense *sense;
5824 5828          int             len, count, alc_len;
5825 5829          int             pc;     /* Page Control code */
5826 5830          int             page_code;      /* Page code */
5827 5831          uint8_t         *buf;   /* log sense buffer */
5828 5832          int             rval, reason;
5829 5833  #define MAX_LOG_SENSE_PAGE_SIZE 512
5830 5834          kmutex_t        *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5831 5835  
5832 5836          SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5833 5837              "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
5834 5838              spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5835 5839              spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5836 5840  
5837 5841          if (servicing_interrupt()) {
5838 5842                  buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
5839 5843                  if (buf == NULL) {
5840 5844                          return (TRAN_BUSY);
5841 5845                  }
5842 5846          } else {
5843 5847                  buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
5844 5848          }
5845 5849  
5846 5850          mutex_enter(cport_mutex);
5847 5851  
5848 5852          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5849 5853              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5850 5854                  mutex_exit(cport_mutex);
5851 5855                  kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5852 5856                  return (rval);
5853 5857          }
5854 5858  
5855 5859          scsipkt->pkt_reason = CMD_CMPLT;
5856 5860          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5857 5861              STATE_SENT_CMD | STATE_GOT_STATUS;
5858 5862  
5859 5863          pc = scsipkt->pkt_cdbp[2] >> 6;
5860 5864          page_code = scsipkt->pkt_cdbp[2] & 0x3f;
5861 5865  
5862 5866          /* Reject not supported request for all but cumulative values */
5863 5867          switch (pc) {
5864 5868          case PC_CUMULATIVE_VALUES:
5865 5869                  break;
5866 5870          default:
5867 5871                  *scsipkt->pkt_scbp = STATUS_CHECK;
5868 5872                  sense = sata_arq_sense(spx);
5869 5873                  sense->es_key = KEY_ILLEGAL_REQUEST;
5870 5874                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5871 5875                  goto done;
5872 5876          }
5873 5877  
5874 5878          switch (page_code) {
5875 5879          case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5876 5880          case PAGE_CODE_SELF_TEST_RESULTS:
5877 5881          case PAGE_CODE_INFORMATION_EXCEPTIONS:
5878 5882          case PAGE_CODE_SMART_READ_DATA:
5879 5883          case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5880 5884                  break;
5881 5885          default:
5882 5886                  *scsipkt->pkt_scbp = STATUS_CHECK;
5883 5887                  sense = sata_arq_sense(spx);
5884 5888                  sense->es_key = KEY_ILLEGAL_REQUEST;
5885 5889                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5886 5890                  goto done;
5887 5891          }
5888 5892  
5889 5893          if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5890 5894                  /*
5891 5895                   * Because log sense uses local buffers for data retrieval from
5892 5896                   * the devices and sets the data programatically in the
5893 5897                   * original specified buffer, release preallocated DMA
5894 5898                   * resources before storing data in the original buffer,
5895 5899                   * so no unwanted DMA sync would take place.
5896 5900                   */
5897 5901                  sata_id_t *sata_id;
5898 5902  
5899 5903                  sata_scsi_dmafree(NULL, scsipkt);
5900 5904  
5901 5905                  len = 0;
5902 5906  
5903 5907                  /* Build log parameter header */
5904 5908                  buf[len++] = page_code; /* page code as in the CDB */
5905 5909                  buf[len++] = 0;         /* reserved */
5906 5910                  buf[len++] = 0;         /* Zero out page length for now (MSB) */
5907 5911                  buf[len++] = 0;         /* (LSB) */
5908 5912  
5909 5913                  sdinfo = sata_get_device_info(
5910 5914                      spx->txlt_sata_hba_inst,
5911 5915                      &spx->txlt_sata_pkt->satapkt_device);
5912 5916  
5913 5917                  /*
5914 5918                   * Add requested pages.
5915 5919                   */
5916 5920                  switch (page_code) {
5917 5921                  case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5918 5922                          len = sata_build_lsense_page_0(sdinfo, buf + len);
5919 5923                          break;
5920 5924                  case PAGE_CODE_SELF_TEST_RESULTS:
5921 5925                          sata_id = &sdinfo->satadrv_id;
5922 5926                          if ((! (sata_id->ai_cmdset84 &
5923 5927                              SATA_SMART_SELF_TEST_SUPPORTED)) ||
5924 5928                              (! (sata_id->ai_features87 &
5925 5929                              SATA_SMART_SELF_TEST_SUPPORTED))) {
5926 5930                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5927 5931                                  sense = sata_arq_sense(spx);
5928 5932                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5929 5933                                  sense->es_add_code =
5930 5934                                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5931 5935  
5932 5936                                  goto done;
5933 5937                          }
5934 5938                          len = sata_build_lsense_page_10(sdinfo, buf + len,
5935 5939                              spx->txlt_sata_hba_inst);
5936 5940                          break;
5937 5941                  case PAGE_CODE_INFORMATION_EXCEPTIONS:
5938 5942                          sata_id = &sdinfo->satadrv_id;
5939 5943                          if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5940 5944                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5941 5945                                  sense = sata_arq_sense(spx);
5942 5946                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5943 5947                                  sense->es_add_code =
5944 5948                                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5945 5949  
5946 5950                                  goto done;
5947 5951                          }
5948 5952                          if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5949 5953                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5950 5954                                  sense = sata_arq_sense(spx);
5951 5955                                  sense->es_key = KEY_ABORTED_COMMAND;
5952 5956                                  sense->es_add_code =
5953 5957                                      SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5954 5958                                  sense->es_qual_code =
5955 5959                                      SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5956 5960  
5957 5961                                  goto done;
5958 5962                          }
5959 5963  
5960 5964                          len = sata_build_lsense_page_2f(sdinfo, buf + len,
5961 5965                              spx->txlt_sata_hba_inst);
5962 5966                          break;
5963 5967                  case PAGE_CODE_SMART_READ_DATA:
5964 5968                          sata_id = &sdinfo->satadrv_id;
5965 5969                          if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5966 5970                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5967 5971                                  sense = sata_arq_sense(spx);
5968 5972                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5969 5973                                  sense->es_add_code =
5970 5974                                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5971 5975  
5972 5976                                  goto done;
5973 5977                          }
5974 5978                          if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5975 5979                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5976 5980                                  sense = sata_arq_sense(spx);
5977 5981                                  sense->es_key = KEY_ABORTED_COMMAND;
5978 5982                                  sense->es_add_code =
5979 5983                                      SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5980 5984                                  sense->es_qual_code =
5981 5985                                      SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5982 5986  
5983 5987                                  goto done;
5984 5988                          }
5985 5989  
5986 5990                          /* This page doesn't include a page header */
5987 5991                          len = sata_build_lsense_page_30(sdinfo, buf,
5988 5992                              spx->txlt_sata_hba_inst);
5989 5993                          goto no_header;
5990 5994                  case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5991 5995                          sata_id = &sdinfo->satadrv_id;
5992 5996                          if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5993 5997                                  *scsipkt->pkt_scbp = STATUS_CHECK;
5994 5998                                  sense = sata_arq_sense(spx);
5995 5999                                  sense->es_key = KEY_ILLEGAL_REQUEST;
5996 6000                                  sense->es_add_code =
5997 6001                                      SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5998 6002  
5999 6003                                  goto done;
6000 6004                          }
6001 6005                          if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6002 6006                                  *scsipkt->pkt_scbp = STATUS_CHECK;
6003 6007                                  sense = sata_arq_sense(spx);
6004 6008                                  sense->es_key = KEY_ABORTED_COMMAND;
6005 6009                                  sense->es_add_code =
6006 6010                                      SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6007 6011                                  sense->es_qual_code =
6008 6012                                      SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6009 6013  
6010 6014                                  goto done;
6011 6015                          }
6012 6016                          len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6013 6017                          goto no_header;
6014 6018                  default:
6015 6019                          /* Invalid request */
6016 6020                          *scsipkt->pkt_scbp = STATUS_CHECK;
6017 6021                          sense = sata_arq_sense(spx);
6018 6022                          sense->es_key = KEY_ILLEGAL_REQUEST;
6019 6023                          sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6020 6024                          goto done;
6021 6025                  }
6022 6026  
6023 6027                  /* set parameter log sense data length */
6024 6028                  buf[2] = len >> 8;      /* log sense length (MSB) */
6025 6029                  buf[3] = len & 0xff;    /* log sense length (LSB) */
6026 6030  
6027 6031                  len += SCSI_LOG_PAGE_HDR_LEN;
6028 6032                  ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6029 6033  
6030 6034  no_header:
6031 6035                  /* Check allocation length */
6032 6036                  alc_len = scsipkt->pkt_cdbp[7];
6033 6037                  alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
6034 6038  
6035 6039                  /*
6036 6040                   * We do not check for possible parameters truncation
6037 6041                   * (alc_len < len) assuming that the target driver works
6038 6042                   * correctly. Just avoiding overrun.
6039 6043                   * Copy no more than requested and possible, buffer-wise.
6040 6044                   */
6041 6045                  count = MIN(alc_len, len);
6042 6046                  count = MIN(bp->b_bcount, count);
6043 6047                  bcopy(buf, bp->b_un.b_addr, count);
6044 6048  
6045 6049                  scsipkt->pkt_state |= STATE_XFERRED_DATA;
6046 6050                  scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6047 6051          }
6048 6052          *scsipkt->pkt_scbp = STATUS_GOOD;
6049 6053  done:
6050 6054          mutex_exit(cport_mutex);
6051 6055          (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6052 6056  
6053 6057          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6054 6058              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6055 6059  
6056 6060          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6057 6061              scsipkt->pkt_comp != NULL) {
6058 6062                  /* scsi callback required */
6059 6063                  if (servicing_interrupt()) {
6060 6064                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6061 6065                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6062 6066                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6063 6067                                  return (TRAN_BUSY);
6064 6068                          }
6065 6069                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6066 6070                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6067 6071                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6068 6072                          /* Scheduling the callback failed */
6069 6073                          return (TRAN_BUSY);
6070 6074                  }
6071 6075          }
6072 6076  
6073 6077          return (TRAN_ACCEPT);
6074 6078  }
6075 6079  
6076 6080  /*
6077 6081   * Translate command: Log Select
6078 6082   * Not implemented at this time - returns invalid command response.
6079 6083   */
6080 6084  static  int
6081 6085  sata_txlt_log_select(sata_pkt_txlate_t *spx)
6082 6086  {
6083 6087          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6084 6088              "sata_txlt_log_select\n", NULL);
6085 6089  
6086 6090          return (sata_txlt_invalid_command(spx));
6087 6091  }
6088 6092  
6089 6093  
6090 6094  /*
6091 6095   * Translate command: Read (various types).
6092 6096   * Translated into appropriate type of ATA READ command
6093 6097   * for SATA hard disks.
6094 6098   * Both the device capabilities and requested operation mode are
6095 6099   * considered.
6096 6100   *
6097 6101   * Following scsi cdb fields are ignored:
6098 6102   * rdprotect, dpo, fua, fua_nv, group_number.
6099 6103   *
6100 6104   * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6101 6105   * enable variable sata_func_enable), the capability of the controller and
6102 6106   * capability of a device are checked and if both support queueing, read
6103 6107   * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6104 6108   * command rather than plain READ_XXX command.
6105 6109   * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6106 6110   * both the controller and device suport such functionality, the read
6107 6111   * request will be translated to READ_FPDMA_QUEUED command.
6108 6112   * In both cases the maximum queue depth is derived as minimum of:
6109 6113   * HBA capability,device capability and sata_max_queue_depth variable setting.
6110 6114   * The value passed to HBA driver is decremented by 1, because only 5 bits are
6111 6115   * used to pass max queue depth value, and the maximum possible queue depth
6112 6116   * is 32.
6113 6117   *
6114 6118   * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6115 6119   * appropriate values in scsi_pkt fields.
6116 6120   */
6117 6121  static int
6118 6122  sata_txlt_read(sata_pkt_txlate_t *spx)
6119 6123  {
6120 6124          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6121 6125          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6122 6126          sata_drive_info_t *sdinfo;
6123 6127          sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6124 6128          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6125 6129          uint16_t sec_count;
6126 6130          uint64_t lba;
6127 6131          int rval, reason;
6128 6132          int synch;
6129 6133  
6130 6134          mutex_enter(cport_mutex);
6131 6135  
6132 6136          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6133 6137              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6134 6138                  mutex_exit(cport_mutex);
6135 6139                  return (rval);
6136 6140          }
6137 6141  
6138 6142          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6139 6143              &spx->txlt_sata_pkt->satapkt_device);
6140 6144  
6141 6145          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6142 6146          /*
6143 6147           * Extract LBA and sector count from scsi CDB.
6144 6148           */
6145 6149          switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6146 6150          case SCMD_READ:
6147 6151                  /* 6-byte scsi read cmd : 0x08 */
6148 6152                  lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6149 6153                  lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6150 6154                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6151 6155                  sec_count = scsipkt->pkt_cdbp[4];
6152 6156                  /* sec_count 0 will be interpreted as 256 by a device */
6153 6157                  break;
6154 6158          case SCMD_READ_G1:
6155 6159                  /* 10-bytes scsi read command : 0x28 */
6156 6160                  lba = scsipkt->pkt_cdbp[2];
6157 6161                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6158 6162                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6159 6163                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6160 6164                  sec_count = scsipkt->pkt_cdbp[7];
6161 6165                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6162 6166                  break;
6163 6167          case SCMD_READ_G5:
6164 6168                  /* 12-bytes scsi read command : 0xA8 */
6165 6169                  lba = scsipkt->pkt_cdbp[2];
6166 6170                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6167 6171                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6168 6172                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6169 6173                  sec_count = scsipkt->pkt_cdbp[6];
6170 6174                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6171 6175                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6172 6176                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6173 6177                  break;
6174 6178          case SCMD_READ_G4:
6175 6179                  /* 16-bytes scsi read command : 0x88 */
6176 6180                  lba = scsipkt->pkt_cdbp[2];
6177 6181                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6178 6182                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6179 6183                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6180 6184                  lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6181 6185                  lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6182 6186                  lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6183 6187                  lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6184 6188                  sec_count = scsipkt->pkt_cdbp[10];
6185 6189                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6186 6190                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6187 6191                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6188 6192                  break;
6189 6193          default:
6190 6194                  /* Unsupported command */
6191 6195                  mutex_exit(cport_mutex);
6192 6196                  return (sata_txlt_invalid_command(spx));
6193 6197          }
6194 6198  
6195 6199          /*
6196 6200           * Check if specified address exceeds device capacity
6197 6201           */
6198 6202          if ((lba >= sdinfo->satadrv_capacity) ||
6199 6203              ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6200 6204                  /* LBA out of range */
6201 6205                  mutex_exit(cport_mutex);
6202 6206                  return (sata_txlt_lba_out_of_range(spx));
6203 6207          }
6204 6208  
6205 6209          /*
6206 6210           * For zero-length transfer, emulate good completion of the command
6207 6211           * (reasons for rejecting the command were already checked).
6208 6212           * No DMA resources were allocated.
6209 6213           */
6210 6214          if (spx->txlt_dma_cookie_list == NULL) {
6211 6215                  mutex_exit(cport_mutex);
6212 6216                  return (sata_emul_rw_completion(spx));
6213 6217          }
6214 6218  
6215 6219          /*
6216 6220           * Build cmd block depending on the device capability and
6217 6221           * requested operation mode.
6218 6222           * Do not bother with non-dma mode - we are working only with
6219 6223           * devices supporting DMA.
6220 6224           */
6221 6225          scmd->satacmd_addr_type = ATA_ADDR_LBA;
6222 6226          scmd->satacmd_device_reg = SATA_ADH_LBA;
6223 6227          scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6224 6228          if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6225 6229                  scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6226 6230                  scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6227 6231                  scmd->satacmd_sec_count_msb = sec_count >> 8;
6228 6232  #ifndef __lock_lint
6229 6233                  scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6230 6234                  scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6231 6235                  scmd->satacmd_lba_high_msb = lba >> 40;
6232 6236  #endif
6233 6237          } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6234 6238                  scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6235 6239                  scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6236 6240          }
6237 6241          scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6238 6242          scmd->satacmd_lba_low_lsb = lba & 0xff;
6239 6243          scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6240 6244          scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6241 6245          scmd->satacmd_features_reg = 0;
6242 6246          scmd->satacmd_status_reg = 0;
6243 6247          scmd->satacmd_error_reg = 0;
6244 6248  
6245 6249          /*
6246 6250           * Check if queueing commands should be used and switch
6247 6251           * to appropriate command if possible
6248 6252           */
6249 6253          if (sata_func_enable & SATA_ENABLE_QUEUING) {
6250 6254                  boolean_t using_queuing;
6251 6255  
6252 6256                  /* Queuing supported by controller and device? */
6253 6257                  if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6254 6258                      (sdinfo->satadrv_features_support &
6255 6259                      SATA_DEV_F_NCQ) &&
6256 6260                      (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6257 6261                      SATA_CTLF_NCQ)) {
6258 6262                          using_queuing = B_TRUE;
6259 6263  
6260 6264                          /* NCQ supported - use FPDMA READ */
6261 6265                          scmd->satacmd_cmd_reg =
6262 6266                              SATAC_READ_FPDMA_QUEUED;
6263 6267                          scmd->satacmd_features_reg_ext =
6264 6268                              scmd->satacmd_sec_count_msb;
6265 6269                          scmd->satacmd_sec_count_msb = 0;
6266 6270                  } else if ((sdinfo->satadrv_features_support &
6267 6271                      SATA_DEV_F_TCQ) &&
6268 6272                      (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6269 6273                      SATA_CTLF_QCMD)) {
6270 6274                          using_queuing = B_TRUE;
6271 6275  
6272 6276                          /* Legacy queueing */
6273 6277                          if (sdinfo->satadrv_features_support &
6274 6278                              SATA_DEV_F_LBA48) {
6275 6279                                  scmd->satacmd_cmd_reg =
6276 6280                                      SATAC_READ_DMA_QUEUED_EXT;
6277 6281                                  scmd->satacmd_features_reg_ext =
6278 6282                                      scmd->satacmd_sec_count_msb;
6279 6283                                  scmd->satacmd_sec_count_msb = 0;
6280 6284                          } else {
6281 6285                                  scmd->satacmd_cmd_reg =
6282 6286                                      SATAC_READ_DMA_QUEUED;
6283 6287                          }
6284 6288                  } else  /* NCQ nor legacy queuing not supported */
6285 6289                          using_queuing = B_FALSE;
6286 6290  
6287 6291                  /*
6288 6292                   * If queuing, the sector count goes in the features register
6289 6293                   * and the secount count will contain the tag.
6290 6294                   */
6291 6295                  if (using_queuing) {
6292 6296                          scmd->satacmd_features_reg =
6293 6297                              scmd->satacmd_sec_count_lsb;
6294 6298                          scmd->satacmd_sec_count_lsb = 0;
6295 6299                          scmd->satacmd_flags.sata_queued = B_TRUE;
6296 6300  
6297 6301                          /* Set-up maximum queue depth */
6298 6302                          scmd->satacmd_flags.sata_max_queue_depth =
6299 6303                              sdinfo->satadrv_max_queue_depth - 1;
6300 6304                  } else if (sdinfo->satadrv_features_enabled &
6301 6305                      SATA_DEV_F_E_UNTAGGED_QING) {
6302 6306                          /*
6303 6307                           * Although NCQ/TCQ is not enabled, untagged queuing
6304 6308                           * may be still used.
6305 6309                           * Set-up the maximum untagged queue depth.
6306 6310                           * Use controller's queue depth from sata_hba_tran.
6307 6311                           * SATA HBA drivers may ignore this value and rely on
6308 6312                           * the internal limits.For drivers that do not
6309 6313                           * ignore untaged queue depth, limit the value to
6310 6314                           * SATA_MAX_QUEUE_DEPTH (32), as this is the
6311 6315                           * largest value that can be passed via
6312 6316                           * satacmd_flags.sata_max_queue_depth.
6313 6317                           */
6314 6318                          scmd->satacmd_flags.sata_max_queue_depth =
6315 6319                              SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6316 6320                              SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6317 6321  
6318 6322                  } else {
6319 6323                          scmd->satacmd_flags.sata_max_queue_depth = 0;
6320 6324                  }
6321 6325          } else
6322 6326                  scmd->satacmd_flags.sata_max_queue_depth = 0;
6323 6327  
6324 6328          SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6325 6329              "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6326 6330              scmd->satacmd_cmd_reg, lba, sec_count);
6327 6331  
6328 6332          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6329 6333                  /* Need callback function */
6330 6334                  spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6331 6335                  synch = FALSE;
6332 6336          } else
6333 6337                  synch = TRUE;
6334 6338  
6335 6339          /* Transfer command to HBA */
6336 6340          if (sata_hba_start(spx, &rval) != 0) {
6337 6341                  /* Pkt not accepted for execution */
6338 6342                  mutex_exit(cport_mutex);
6339 6343                  return (rval);
6340 6344          }
6341 6345          mutex_exit(cport_mutex);
6342 6346          /*
6343 6347           * If execution is non-synchronous,
6344 6348           * a callback function will handle potential errors, translate
6345 6349           * the response and will do a callback to a target driver.
6346 6350           * If it was synchronous, check execution status using the same
6347 6351           * framework callback.
6348 6352           */
6349 6353          if (synch) {
6350 6354                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6351 6355                      "synchronous execution status %x\n",
6352 6356                      spx->txlt_sata_pkt->satapkt_reason);
6353 6357                  sata_txlt_rw_completion(spx->txlt_sata_pkt);
6354 6358          }
6355 6359          return (TRAN_ACCEPT);
6356 6360  }
6357 6361  
6358 6362  
6359 6363  /*
6360 6364   * SATA translate command: Write (various types)
6361 6365   * Translated into appropriate type of ATA WRITE command
6362 6366   * for SATA hard disks.
6363 6367   * Both the device capabilities and requested operation mode are
6364 6368   * considered.
6365 6369   *
6366 6370   * Following scsi cdb fields are ignored:
6367 6371   * rwprotect, dpo, fua, fua_nv, group_number.
6368 6372   *
6369 6373   * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6370 6374   * enable variable sata_func_enable), the capability of the controller and
6371 6375   * capability of a device are checked and if both support queueing, write
6372 6376   * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6373 6377   * command rather than plain WRITE_XXX command.
6374 6378   * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6375 6379   * both the controller and device suport such functionality, the write
6376 6380   * request will be translated to WRITE_FPDMA_QUEUED command.
6377 6381   * In both cases the maximum queue depth is derived as minimum of:
6378 6382   * HBA capability,device capability and sata_max_queue_depth variable setting.
6379 6383   * The value passed to HBA driver is decremented by 1, because only 5 bits are
6380 6384   * used to pass max queue depth value, and the maximum possible queue depth
6381 6385   * is 32.
6382 6386   *
6383 6387   * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6384 6388   * appropriate values in scsi_pkt fields.
6385 6389   */
6386 6390  static int
6387 6391  sata_txlt_write(sata_pkt_txlate_t *spx)
6388 6392  {
6389 6393          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6390 6394          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6391 6395          sata_drive_info_t *sdinfo;
6392 6396          sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6393 6397          uint16_t sec_count;
6394 6398          uint64_t lba;
6395 6399          int rval, reason;
6396 6400          int synch;
6397 6401          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6398 6402  
6399 6403          mutex_enter(cport_mutex);
6400 6404  
6401 6405          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6402 6406              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6403 6407                  mutex_exit(cport_mutex);
6404 6408                  return (rval);
6405 6409          }
6406 6410  
6407 6411          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6408 6412              &spx->txlt_sata_pkt->satapkt_device);
6409 6413  
6410 6414          scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6411 6415          /*
6412 6416           * Extract LBA and sector count from scsi CDB
6413 6417           */
6414 6418          switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6415 6419          case SCMD_WRITE:
6416 6420                  /* 6-byte scsi read cmd : 0x0A */
6417 6421                  lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6418 6422                  lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6419 6423                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6420 6424                  sec_count = scsipkt->pkt_cdbp[4];
6421 6425                  /* sec_count 0 will be interpreted as 256 by a device */
6422 6426                  break;
6423 6427          case SCMD_WRITE_G1:
6424 6428                  /* 10-bytes scsi write command : 0x2A */
6425 6429                  lba = scsipkt->pkt_cdbp[2];
6426 6430                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6427 6431                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6428 6432                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6429 6433                  sec_count = scsipkt->pkt_cdbp[7];
6430 6434                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6431 6435                  break;
6432 6436          case SCMD_WRITE_G5:
6433 6437                  /* 12-bytes scsi read command : 0xAA */
6434 6438                  lba = scsipkt->pkt_cdbp[2];
6435 6439                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6436 6440                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6437 6441                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6438 6442                  sec_count = scsipkt->pkt_cdbp[6];
6439 6443                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6440 6444                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6441 6445                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6442 6446                  break;
6443 6447          case SCMD_WRITE_G4:
6444 6448                  /* 16-bytes scsi write command : 0x8A */
6445 6449                  lba = scsipkt->pkt_cdbp[2];
6446 6450                  lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6447 6451                  lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6448 6452                  lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6449 6453                  lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6450 6454                  lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6451 6455                  lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6452 6456                  lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6453 6457                  sec_count = scsipkt->pkt_cdbp[10];
6454 6458                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6455 6459                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6456 6460                  sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6457 6461                  break;
6458 6462          default:
6459 6463                  /* Unsupported command */
6460 6464                  mutex_exit(cport_mutex);
6461 6465                  return (sata_txlt_invalid_command(spx));
6462 6466          }
6463 6467  
6464 6468          /*
6465 6469           * Check if specified address and length exceeds device capacity
6466 6470           */
6467 6471          if ((lba >= sdinfo->satadrv_capacity) ||
6468 6472              ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6469 6473                  /* LBA out of range */
6470 6474                  mutex_exit(cport_mutex);
6471 6475                  return (sata_txlt_lba_out_of_range(spx));
6472 6476          }
6473 6477  
6474 6478          /*
6475 6479           * For zero-length transfer, emulate good completion of the command
6476 6480           * (reasons for rejecting the command were already checked).
6477 6481           * No DMA resources were allocated.
6478 6482           */
6479 6483          if (spx->txlt_dma_cookie_list == NULL) {
6480 6484                  mutex_exit(cport_mutex);
6481 6485                  return (sata_emul_rw_completion(spx));
6482 6486          }
6483 6487  
6484 6488          /*
6485 6489           * Build cmd block depending on the device capability and
6486 6490           * requested operation mode.
6487 6491           * Do not bother with non-dma mode- we are working only with
6488 6492           * devices supporting DMA.
6489 6493           */
6490 6494          scmd->satacmd_addr_type = ATA_ADDR_LBA;
6491 6495          scmd->satacmd_device_reg = SATA_ADH_LBA;
6492 6496          scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6493 6497          if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6494 6498                  scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6495 6499                  scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6496 6500                  scmd->satacmd_sec_count_msb = sec_count >> 8;
6497 6501                  scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6498 6502  #ifndef __lock_lint
6499 6503                  scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6500 6504                  scmd->satacmd_lba_high_msb = lba >> 40;
6501 6505  #endif
6502 6506          } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6503 6507                  scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6504 6508                  scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6505 6509          }
6506 6510          scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6507 6511          scmd->satacmd_lba_low_lsb = lba & 0xff;
6508 6512          scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6509 6513          scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6510 6514          scmd->satacmd_features_reg = 0;
6511 6515          scmd->satacmd_status_reg = 0;
6512 6516          scmd->satacmd_error_reg = 0;
6513 6517  
6514 6518          /*
6515 6519           * Check if queueing commands should be used and switch
6516 6520           * to appropriate command if possible
6517 6521           */
6518 6522          if (sata_func_enable & SATA_ENABLE_QUEUING) {
6519 6523                  boolean_t using_queuing;
6520 6524  
6521 6525                  /* Queuing supported by controller and device? */
6522 6526                  if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6523 6527                      (sdinfo->satadrv_features_support &
6524 6528                      SATA_DEV_F_NCQ) &&
6525 6529                      (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6526 6530                      SATA_CTLF_NCQ)) {
6527 6531                          using_queuing = B_TRUE;
6528 6532  
6529 6533                          /* NCQ supported - use FPDMA WRITE */
6530 6534                          scmd->satacmd_cmd_reg =
6531 6535                              SATAC_WRITE_FPDMA_QUEUED;
6532 6536                          scmd->satacmd_features_reg_ext =
6533 6537                              scmd->satacmd_sec_count_msb;
6534 6538                          scmd->satacmd_sec_count_msb = 0;
6535 6539                  } else if ((sdinfo->satadrv_features_support &
6536 6540                      SATA_DEV_F_TCQ) &&
6537 6541                      (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6538 6542                      SATA_CTLF_QCMD)) {
6539 6543                          using_queuing = B_TRUE;
6540 6544  
6541 6545                          /* Legacy queueing */
6542 6546                          if (sdinfo->satadrv_features_support &
6543 6547                              SATA_DEV_F_LBA48) {
6544 6548                                  scmd->satacmd_cmd_reg =
6545 6549                                      SATAC_WRITE_DMA_QUEUED_EXT;
6546 6550                                  scmd->satacmd_features_reg_ext =
6547 6551                                      scmd->satacmd_sec_count_msb;
6548 6552                                  scmd->satacmd_sec_count_msb = 0;
6549 6553                          } else {
6550 6554                                  scmd->satacmd_cmd_reg =
6551 6555                                      SATAC_WRITE_DMA_QUEUED;
6552 6556                          }
6553 6557                  } else  /*  NCQ nor legacy queuing not supported */
6554 6558                          using_queuing = B_FALSE;
6555 6559  
6556 6560                  if (using_queuing) {
6557 6561                          scmd->satacmd_features_reg =
6558 6562                              scmd->satacmd_sec_count_lsb;
6559 6563                          scmd->satacmd_sec_count_lsb = 0;
6560 6564                          scmd->satacmd_flags.sata_queued = B_TRUE;
6561 6565                          /* Set-up maximum queue depth */
6562 6566                          scmd->satacmd_flags.sata_max_queue_depth =
6563 6567                              sdinfo->satadrv_max_queue_depth - 1;
6564 6568                  } else if (sdinfo->satadrv_features_enabled &
6565 6569                      SATA_DEV_F_E_UNTAGGED_QING) {
6566 6570                          /*
6567 6571                           * Although NCQ/TCQ is not enabled, untagged queuing
6568 6572                           * may be still used.
6569 6573                           * Set-up the maximum untagged queue depth.
6570 6574                           * Use controller's queue depth from sata_hba_tran.
6571 6575                           * SATA HBA drivers may ignore this value and rely on
6572 6576                           * the internal limits. For drivera that do not
6573 6577                           * ignore untaged queue depth, limit the value to
6574 6578                           * SATA_MAX_QUEUE_DEPTH (32), as this is the
6575 6579                           * largest value that can be passed via
6576 6580                           * satacmd_flags.sata_max_queue_depth.
6577 6581                           */
6578 6582                          scmd->satacmd_flags.sata_max_queue_depth =
6579 6583                              SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6580 6584                              SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6581 6585  
6582 6586                  } else {
6583 6587                          scmd->satacmd_flags.sata_max_queue_depth = 0;
6584 6588                  }
6585 6589          } else
6586 6590                  scmd->satacmd_flags.sata_max_queue_depth = 0;
6587 6591  
6588 6592          SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6589 6593              "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6590 6594              scmd->satacmd_cmd_reg, lba, sec_count);
6591 6595  
6592 6596          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6593 6597                  /* Need callback function */
6594 6598                  spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6595 6599                  synch = FALSE;
6596 6600          } else
6597 6601                  synch = TRUE;
6598 6602  
6599 6603          /* Transfer command to HBA */
6600 6604          if (sata_hba_start(spx, &rval) != 0) {
6601 6605                  /* Pkt not accepted for execution */
6602 6606                  mutex_exit(cport_mutex);
6603 6607                  return (rval);
6604 6608          }
6605 6609          mutex_exit(cport_mutex);
6606 6610  
6607 6611          /*
6608 6612           * If execution is non-synchronous,
6609 6613           * a callback function will handle potential errors, translate
6610 6614           * the response and will do a callback to a target driver.
6611 6615           * If it was synchronous, check execution status using the same
6612 6616           * framework callback.
6613 6617           */
6614 6618          if (synch) {
6615 6619                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6616 6620                      "synchronous execution status %x\n",
6617 6621                      spx->txlt_sata_pkt->satapkt_reason);
6618 6622                  sata_txlt_rw_completion(spx->txlt_sata_pkt);
6619 6623          }
6620 6624          return (TRAN_ACCEPT);
6621 6625  }
6622 6626  
6623 6627  
6624 6628  /*
6625 6629   * Implements SCSI SBC WRITE BUFFER command download microcode option
6626 6630   */
6627 6631  static int
6628 6632  sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6629 6633  {
6630 6634  #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE                   4
6631 6635  #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE                     5
6632 6636  
6633 6637          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6634 6638          struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6635 6639          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6636 6640  
6637 6641          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6638 6642          struct scsi_extended_sense *sense;
6639 6643          int rval, mode, sector_count, reason;
6640 6644          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6641 6645  
6642 6646          mode = scsipkt->pkt_cdbp[1] & 0x1f;
6643 6647  
6644 6648          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6645 6649              "sata_txlt_write_buffer, mode 0x%x\n", mode);
6646 6650  
6647 6651          mutex_enter(cport_mutex);
6648 6652  
6649 6653          if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6650 6654              TRAN_ACCEPT) {
6651 6655                  mutex_exit(cport_mutex);
6652 6656                  return (rval);
6653 6657          }
6654 6658  
6655 6659          /* Use synchronous mode */
6656 6660          spx->txlt_sata_pkt->satapkt_op_mode
6657 6661              |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6658 6662  
6659 6663          scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6660 6664  
6661 6665          scsipkt->pkt_reason = CMD_CMPLT;
6662 6666          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6663 6667              STATE_SENT_CMD | STATE_GOT_STATUS;
6664 6668  
6665 6669          /*
6666 6670           * The SCSI to ATA translation specification only calls
6667 6671           * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6668 6672           * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6669 6673           * ATA 8 (draft) got rid of download microcode for temp
6670 6674           * and it is even optional for ATA 7, so it may be aborted.
6671 6675           * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6672 6676           * it is not specified and the buffer offset for SCSI is a 16-bit
6673 6677           * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6674 6678           * sectors.  Thus the offset really doesn't buy us anything.
6675 6679           * If and when ATA 8 is stabilized and the SCSI to ATA specification
6676 6680           * is revised, this can be revisisted.
6677 6681           */
6678 6682          /* Reject not supported request */
6679 6683          switch (mode) {
6680 6684          case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
6681 6685                  scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
6682 6686                  break;
6683 6687          case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
6684 6688                  scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
6685 6689                  break;
6686 6690          default:
6687 6691                  goto bad_param;
6688 6692          }
6689 6693  
6690 6694          *scsipkt->pkt_scbp = STATUS_GOOD;       /* Presumed outcome */
6691 6695  
6692 6696          scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
6693 6697          if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
6694 6698                  goto bad_param;
6695 6699          sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
6696 6700          scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
6697 6701          scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
6698 6702          scmd->satacmd_lba_mid_lsb = 0;
6699 6703          scmd->satacmd_lba_high_lsb = 0;
6700 6704          scmd->satacmd_device_reg = 0;
6701 6705          spx->txlt_sata_pkt->satapkt_comp = NULL;
6702 6706          scmd->satacmd_addr_type = 0;
6703 6707  
6704 6708          /* Transfer command to HBA */
6705 6709          if (sata_hba_start(spx, &rval) != 0) {
6706 6710                  /* Pkt not accepted for execution */
6707 6711                  mutex_exit(cport_mutex);
6708 6712                  return (rval);
6709 6713          }
6710 6714  
6711 6715          mutex_exit(cport_mutex);
6712 6716  
6713 6717          /* Then we need synchronous check the status of the disk */
6714 6718          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6715 6719              STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6716 6720          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6717 6721                  scsipkt->pkt_reason = CMD_CMPLT;
6718 6722  
6719 6723                  /* Download commmand succeed, so probe and identify device */
6720 6724                  sata_reidentify_device(spx);
6721 6725          } else {
6722 6726                  /* Something went wrong, microcode download command failed */
6723 6727                  scsipkt->pkt_reason = CMD_INCOMPLETE;
6724 6728                  *scsipkt->pkt_scbp = STATUS_CHECK;
6725 6729                  sense = sata_arq_sense(spx);
6726 6730                  switch (sata_pkt->satapkt_reason) {
6727 6731                  case SATA_PKT_PORT_ERROR:
6728 6732                          /*
6729 6733                           * We have no device data. Assume no data transfered.
6730 6734                           */
6731 6735                          sense->es_key = KEY_HARDWARE_ERROR;
6732 6736                          break;
6733 6737  
6734 6738                  case SATA_PKT_DEV_ERROR:
6735 6739                          if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6736 6740                              SATA_STATUS_ERR) {
6737 6741                                  /*
6738 6742                                   * determine dev error reason from error
6739 6743                                   * reg content
6740 6744                                   */
6741 6745                                  sata_decode_device_error(spx, sense);
6742 6746                                  break;
6743 6747                          }
6744 6748                          /* No extended sense key - no info available */
6745 6749                          break;
6746 6750  
6747 6751                  case SATA_PKT_TIMEOUT:
6748 6752                          scsipkt->pkt_reason = CMD_TIMEOUT;
6749 6753                          scsipkt->pkt_statistics |=
6750 6754                              STAT_TIMEOUT | STAT_DEV_RESET;
6751 6755                          /* No extended sense key ? */
6752 6756                          break;
6753 6757  
6754 6758                  case SATA_PKT_ABORTED:
6755 6759                          scsipkt->pkt_reason = CMD_ABORTED;
6756 6760                          scsipkt->pkt_statistics |= STAT_ABORTED;
6757 6761                          /* No extended sense key ? */
6758 6762                          break;
6759 6763  
6760 6764                  case SATA_PKT_RESET:
6761 6765                          /* pkt aborted by an explicit reset from a host */
6762 6766                          scsipkt->pkt_reason = CMD_RESET;
6763 6767                          scsipkt->pkt_statistics |= STAT_DEV_RESET;
6764 6768                          break;
6765 6769  
6766 6770                  default:
6767 6771                          SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6768 6772                              "sata_txlt_nodata_cmd_completion: "
6769 6773                              "invalid packet completion reason %d",
6770 6774                              sata_pkt->satapkt_reason));
6771 6775                          scsipkt->pkt_reason = CMD_TRAN_ERR;
6772 6776                          break;
6773 6777                  }
6774 6778  
6775 6779                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6776 6780                      "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6777 6781  
6778 6782                  if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6779 6783                          /* scsi callback required */
6780 6784                          scsi_hba_pkt_comp(scsipkt);
6781 6785          }
6782 6786          return (TRAN_ACCEPT);
6783 6787  
6784 6788  bad_param:
6785 6789          mutex_exit(cport_mutex);
6786 6790          *scsipkt->pkt_scbp = STATUS_CHECK;
6787 6791          sense = sata_arq_sense(spx);
6788 6792          sense->es_key = KEY_ILLEGAL_REQUEST;
6789 6793          sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6790 6794          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6791 6795              scsipkt->pkt_comp != NULL) {
6792 6796                  /* scsi callback required */
6793 6797                  if (servicing_interrupt()) {
6794 6798                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6795 6799                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6796 6800                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6797 6801                                  return (TRAN_BUSY);
6798 6802                          }
6799 6803                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6800 6804                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6801 6805                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6802 6806                          /* Scheduling the callback failed */
6803 6807                          return (TRAN_BUSY);
6804 6808                  }
6805 6809          }
6806 6810          return (rval);
6807 6811  }
6808 6812  
6809 6813  /*
6810 6814   * Re-identify device after doing a firmware download.
6811 6815   */
6812 6816  static void
6813 6817  sata_reidentify_device(sata_pkt_txlate_t *spx)
6814 6818  {
6815 6819  #define DOWNLOAD_WAIT_TIME_SECS 60
6816 6820  #define DOWNLOAD_WAIT_INTERVAL_SECS     1
6817 6821          int rval;
6818 6822          int retry_cnt;
6819 6823          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6820 6824          sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6821 6825          sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
6822 6826          sata_drive_info_t *sdinfo;
6823 6827  
6824 6828          /*
6825 6829           * Before returning good status, probe device.
6826 6830           * Device probing will get IDENTIFY DEVICE data, if possible.
6827 6831           * The assumption is that the new microcode is applied by the
6828 6832           * device. It is a caller responsibility to verify this.
6829 6833           */
6830 6834          for (retry_cnt = 0;
6831 6835              retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
6832 6836              retry_cnt++) {
6833 6837                  rval = sata_probe_device(sata_hba_inst, &sata_device);
6834 6838  
6835 6839                  if (rval == SATA_SUCCESS) { /* Set default features */
6836 6840                          sdinfo = sata_get_device_info(sata_hba_inst,
6837 6841                              &sata_device);
6838 6842                          if (sata_initialize_device(sata_hba_inst, sdinfo) !=
6839 6843                              SATA_SUCCESS) {
6840 6844                                  /* retry */
6841 6845                                  rval = sata_initialize_device(sata_hba_inst,
6842 6846                                      sdinfo);
6843 6847                                  if (rval == SATA_RETRY)
6844 6848                                          sata_log(sata_hba_inst, CE_WARN,
6845 6849                                              "SATA device at port %d pmport %d -"
6846 6850                                              " default device features could not"
6847 6851                                              " be set. Device may not operate "
6848 6852                                              "as expected.",
6849 6853                                              sata_device.satadev_addr.cport,
6850 6854                                              sata_device.satadev_addr.pmport);
6851 6855                          }
6852 6856                          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6853 6857                                  scsi_hba_pkt_comp(scsipkt);
6854 6858                          return;
6855 6859                  } else if (rval == SATA_RETRY) {
6856 6860                          delay(drv_usectohz(1000000 *
6857 6861                              DOWNLOAD_WAIT_INTERVAL_SECS));
6858 6862                          continue;
6859 6863                  } else  /* failed - no reason to retry */
6860 6864                          break;
6861 6865          }
6862 6866  
6863 6867          /*
6864 6868           * Something went wrong, device probing failed.
6865 6869           */
6866 6870          SATA_LOG_D((sata_hba_inst, CE_WARN,
6867 6871              "Cannot probe device after downloading microcode\n"));
6868 6872  
6869 6873          /* Reset device to force retrying the probe. */
6870 6874          (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
6871 6875              (SATA_DIP(sata_hba_inst), &sata_device);
6872 6876  
6873 6877          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6874 6878                  scsi_hba_pkt_comp(scsipkt);
6875 6879  }
6876 6880  
6877 6881  
6878 6882  /*
6879 6883   * Translate command: Synchronize Cache.
6880 6884   * Translates into Flush Cache command for SATA hard disks.
6881 6885   *
6882 6886   * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6883 6887   * appropriate values in scsi_pkt fields.
6884 6888   */
6885 6889  static  int
6886 6890  sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
6887 6891  {
6888 6892          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6889 6893          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6890 6894          int rval, reason;
6891 6895          int synch;
6892 6896  
6893 6897          mutex_enter(cport_mutex);
6894 6898  
6895 6899          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6896 6900              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6897 6901                  mutex_exit(cport_mutex);
6898 6902                  return (rval);
6899 6903          }
6900 6904  
6901 6905          scmd->satacmd_addr_type = 0;
6902 6906          scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
6903 6907          scmd->satacmd_device_reg = 0;
6904 6908          scmd->satacmd_sec_count_lsb = 0;
6905 6909          scmd->satacmd_lba_low_lsb = 0;
6906 6910          scmd->satacmd_lba_mid_lsb = 0;
6907 6911          scmd->satacmd_lba_high_lsb = 0;
6908 6912          scmd->satacmd_features_reg = 0;
6909 6913          scmd->satacmd_status_reg = 0;
6910 6914          scmd->satacmd_error_reg = 0;
6911 6915  
6912 6916          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6913 6917              "sata_txlt_synchronize_cache\n", NULL);
6914 6918  
6915 6919          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6916 6920                  /* Need to set-up a callback function */
6917 6921                  spx->txlt_sata_pkt->satapkt_comp =
6918 6922                      sata_txlt_nodata_cmd_completion;
6919 6923                  synch = FALSE;
6920 6924          } else
6921 6925                  synch = TRUE;
6922 6926  
6923 6927          /* Transfer command to HBA */
6924 6928          if (sata_hba_start(spx, &rval) != 0) {
6925 6929                  /* Pkt not accepted for execution */
6926 6930                  mutex_exit(cport_mutex);
6927 6931                  return (rval);
6928 6932          }
6929 6933          mutex_exit(cport_mutex);
6930 6934  
6931 6935          /*
6932 6936           * If execution non-synchronous, it had to be completed
6933 6937           * a callback function will handle potential errors, translate
6934 6938           * the response and will do a callback to a target driver.
6935 6939           * If it was synchronous, check status, using the same
6936 6940           * framework callback.
6937 6941           */
6938 6942          if (synch) {
6939 6943                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6940 6944                      "synchronous execution status %x\n",
6941 6945                      spx->txlt_sata_pkt->satapkt_reason);
6942 6946                  sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
6943 6947          }
6944 6948          return (TRAN_ACCEPT);
6945 6949  }
6946 6950  
6947 6951  
6948 6952  /*
6949 6953   * Send pkt to SATA HBA driver
6950 6954   *
6951 6955   * This function may be called only if the operation is requested by scsi_pkt,
6952 6956   * i.e. scsi_pkt is not NULL.
6953 6957   *
6954 6958   * This function has to be called with cport mutex held. It does release
6955 6959   * the mutex when it calls HBA driver sata_tran_start function and
6956 6960   * re-acquires it afterwards.
6957 6961   *
6958 6962   * If return value is 0, pkt was accepted, -1 otherwise
6959 6963   * rval is set to appropriate sata_scsi_start return value.
6960 6964   *
6961 6965   * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
6962 6966   * have called the sata_pkt callback function for this packet.
6963 6967   *
6964 6968   * The scsi callback has to be performed by the caller of this routine.
6965 6969   */
6966 6970  static int
6967 6971  sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
6968 6972  {
6969 6973          int stat;
6970 6974          uint8_t cport = SATA_TXLT_CPORT(spx);
6971 6975          uint8_t pmport = SATA_TXLT_PMPORT(spx);
6972 6976          sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6973 6977          sata_drive_info_t *sdinfo;
6974 6978          sata_pmult_info_t *pminfo;
6975 6979          sata_pmport_info_t *pmportinfo = NULL;
6976 6980          sata_device_t *sata_device = NULL;
6977 6981          uint8_t cmd;
6978 6982          struct sata_cmd_flags cmd_flags;
6979 6983  
6980 6984          ASSERT(spx->txlt_sata_pkt != NULL);
6981 6985  
6982 6986          ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6983 6987  
6984 6988          sdinfo = sata_get_device_info(sata_hba_inst,
6985 6989              &spx->txlt_sata_pkt->satapkt_device);
6986 6990          ASSERT(sdinfo != NULL);
6987 6991  
6988 6992          /* Clear device reset state? */
6989 6993          /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
6990 6994          if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
6991 6995              sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
6992 6996  
6993 6997                  /*
6994 6998                   * Get the pmult_info of the its parent port multiplier, all
6995 6999                   * sub-devices share a common device reset flags on in
6996 7000                   * pmult_info.
6997 7001                   */
6998 7002                  pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
6999 7003                  pmportinfo = pminfo->pmult_dev_port[pmport];
7000 7004                  ASSERT(pminfo != NULL);
7001 7005                  if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7002 7006                          spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7003 7007                              sata_clear_dev_reset = B_TRUE;
7004 7008                          pminfo->pmult_event_flags &=
7005 7009                              ~SATA_EVNT_CLEAR_DEVICE_RESET;
7006 7010                          SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7007 7011                              "sata_hba_start: clearing device reset state"
7008 7012                              "on pmult.\n", NULL);
7009 7013                  }
7010 7014          } else {
7011 7015                  if (sdinfo->satadrv_event_flags &
7012 7016                      SATA_EVNT_CLEAR_DEVICE_RESET) {
7013 7017                          spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7014 7018                              sata_clear_dev_reset = B_TRUE;
7015 7019                          sdinfo->satadrv_event_flags &=
7016 7020                              ~SATA_EVNT_CLEAR_DEVICE_RESET;
7017 7021                          SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7018 7022                              "sata_hba_start: clearing device reset state\n",
7019 7023                              NULL);
7020 7024                  }
7021 7025          }
7022 7026  
7023 7027          cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7024 7028          cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7025 7029          sata_device = &spx->txlt_sata_pkt->satapkt_device;
7026 7030  
7027 7031          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7028 7032  
7029 7033          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7030 7034              "Sata cmd 0x%2x\n", cmd);
7031 7035  
7032 7036          stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7033 7037              spx->txlt_sata_pkt);
7034 7038          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7035 7039          /*
7036 7040           * If sata pkt was accepted and executed in asynchronous mode, i.e.
7037 7041           * with the sata callback, the sata_pkt could be already destroyed
7038 7042           * by the time we check ther return status from the hba_start()
7039 7043           * function, because sata_scsi_destroy_pkt() could have been already
7040 7044           * called (perhaps in the interrupt context). So, in such case, there
7041 7045           * should be no references to it. In other cases, sata_pkt still
7042 7046           * exists.
7043 7047           */
7044 7048          if (stat == SATA_TRAN_ACCEPTED) {
7045 7049                  /*
7046 7050                   * pkt accepted for execution.
7047 7051                   * If it was executed synchronously, it is already completed
7048 7052                   * and pkt completion_reason indicates completion status.
7049 7053                   */
7050 7054                  *rval = TRAN_ACCEPT;
7051 7055                  return (0);
7052 7056          }
7053 7057  
7054 7058          sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7055 7059          switch (stat) {
7056 7060          case SATA_TRAN_QUEUE_FULL:
7057 7061                  /*
7058 7062                   * Controller detected queue full condition.
7059 7063                   */
7060 7064                  SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7061 7065                      "sata_hba_start: queue full\n", NULL);
7062 7066  
7063 7067                  spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7064 7068                  *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7065 7069  
7066 7070                  *rval = TRAN_BUSY;
7067 7071                  break;
7068 7072  
7069 7073          case SATA_TRAN_PORT_ERROR:
7070 7074                  /*
7071 7075                   * Communication/link with device or general port error
7072 7076                   * detected before pkt execution begun.
7073 7077                   */
7074 7078                  if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7075 7079                      SATA_ADDR_CPORT ||
7076 7080                      spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7077 7081                      SATA_ADDR_DCPORT)
7078 7082                          sata_log(sata_hba_inst, CE_CONT,
7079 7083                              "SATA port %d error",
7080 7084                              sata_device->satadev_addr.cport);
7081 7085                  else
7082 7086                          sata_log(sata_hba_inst, CE_CONT,
7083 7087                              "SATA port %d:%d error\n",
7084 7088                              sata_device->satadev_addr.cport,
7085 7089                              sata_device->satadev_addr.pmport);
7086 7090  
7087 7091                  /*
7088 7092                   * Update the port/device structure.
7089 7093                   * sata_pkt should be still valid. Since port error is
7090 7094                   * returned, sata_device content should reflect port
7091 7095                   * state - it means, that sata address have been changed,
7092 7096                   * because original packet's sata address refered to a device
7093 7097                   * attached to some port.
7094 7098                   */
7095 7099                  if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7096 7100                      sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7097 7101                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7098 7102                          mutex_enter(&pmportinfo->pmport_mutex);
7099 7103                          sata_update_pmport_info(sata_hba_inst, sata_device);
7100 7104                          mutex_exit(&pmportinfo->pmport_mutex);
7101 7105                          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7102 7106                  } else {
7103 7107                          sata_update_port_info(sata_hba_inst, sata_device);
7104 7108                  }
7105 7109  
7106 7110                  spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7107 7111                  *rval = TRAN_FATAL_ERROR;
7108 7112                  break;
7109 7113  
7110 7114          case SATA_TRAN_CMD_UNSUPPORTED:
7111 7115                  /*
7112 7116                   * Command rejected by HBA as unsupported. It was HBA driver
7113 7117                   * that rejected the command, command was not sent to
7114 7118                   * an attached device.
7115 7119                   */
7116 7120                  if ((sdinfo != NULL) &&
7117 7121                      (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7118 7122                          SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7119 7123                              "sat_hba_start: cmd 0x%2x rejected "
7120 7124                              "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7121 7125  
7122 7126                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7123 7127                  (void) sata_txlt_invalid_command(spx);
7124 7128                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7125 7129  
7126 7130                  *rval = TRAN_ACCEPT;
7127 7131                  break;
7128 7132  
7129 7133          case SATA_TRAN_BUSY:
7130 7134                  /*
7131 7135                   * Command rejected by HBA because other operation prevents
7132 7136                   * accepting the packet, or device is in RESET condition.
7133 7137                   */
7134 7138                  if (sdinfo != NULL) {
7135 7139                          sdinfo->satadrv_state =
7136 7140                              spx->txlt_sata_pkt->satapkt_device.satadev_state;
7137 7141  
7138 7142                          if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7139 7143                                  SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7140 7144                                      "sata_hba_start: cmd 0x%2x rejected "
7141 7145                                      "because of device reset condition\n",
7142 7146                                      cmd);
7143 7147                          } else {
7144 7148                                  SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7145 7149                                      "sata_hba_start: cmd 0x%2x rejected "
7146 7150                                      "with SATA_TRAN_BUSY status\n",
7147 7151                                      cmd);
7148 7152                          }
7149 7153                  }
7150 7154                  spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7151 7155                  *rval = TRAN_BUSY;
7152 7156                  break;
7153 7157  
7154 7158          default:
7155 7159                  /* Unrecognized HBA response */
7156 7160                  SATA_LOG_D((sata_hba_inst, CE_WARN,
7157 7161                      "sata_hba_start: unrecognized HBA response "
7158 7162                      "to cmd : 0x%2x resp 0x%x", cmd, rval));
7159 7163                  spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7160 7164                  *rval = TRAN_FATAL_ERROR;
7161 7165                  break;
7162 7166          }
7163 7167  
7164 7168          /*
7165 7169           * If we got here, the packet was rejected.
7166 7170           * Check if we need to remember reset state clearing request
7167 7171           */
7168 7172          if (cmd_flags.sata_clear_dev_reset) {
7169 7173                  /*
7170 7174                   * Check if device is still configured - it may have
7171 7175                   * disapeared from the configuration
7172 7176                   */
7173 7177                  sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7174 7178                  if (sdinfo != NULL) {
7175 7179                          /*
7176 7180                           * Restore the flag that requests clearing of
7177 7181                           * the device reset state,
7178 7182                           * so the next sata packet may carry it to HBA.
7179 7183                           */
7180 7184                          if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7181 7185                              sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7182 7186                                  pminfo->pmult_event_flags |=
7183 7187                                      SATA_EVNT_CLEAR_DEVICE_RESET;
7184 7188                          } else {
7185 7189                                  sdinfo->satadrv_event_flags |=
7186 7190                                      SATA_EVNT_CLEAR_DEVICE_RESET;
7187 7191                          }
7188 7192                  }
7189 7193          }
7190 7194          return (-1);
7191 7195  }
7192 7196  
7193 7197  /*
7194 7198   * Scsi response setup for invalid LBA
7195 7199   *
7196 7200   * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7197 7201   */
7198 7202  static int
7199 7203  sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7200 7204  {
7201 7205          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7202 7206          struct scsi_extended_sense *sense;
7203 7207  
7204 7208          scsipkt->pkt_reason = CMD_CMPLT;
7205 7209          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7206 7210              STATE_SENT_CMD | STATE_GOT_STATUS;
7207 7211          *scsipkt->pkt_scbp = STATUS_CHECK;
7208 7212  
7209 7213          *scsipkt->pkt_scbp = STATUS_CHECK;
7210 7214          sense = sata_arq_sense(spx);
7211 7215          sense->es_key = KEY_ILLEGAL_REQUEST;
7212 7216          sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7213 7217  
7214 7218          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7215 7219              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7216 7220  
7217 7221          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7218 7222              scsipkt->pkt_comp != NULL) {
7219 7223                  /* scsi callback required */
7220 7224                  if (servicing_interrupt()) {
7221 7225                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7222 7226                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7223 7227                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7224 7228                                  return (TRAN_BUSY);
7225 7229                          }
7226 7230                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7227 7231                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7228 7232                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7229 7233                          /* Scheduling the callback failed */
7230 7234                          return (TRAN_BUSY);
7231 7235                  }
7232 7236          }
7233 7237          return (TRAN_ACCEPT);
7234 7238  }
7235 7239  
7236 7240  
7237 7241  /*
7238 7242   * Analyze device status and error registers and translate them into
7239 7243   * appropriate scsi sense codes.
7240 7244   * NOTE: non-packet commands only for now
7241 7245   */
7242 7246  static void
7243 7247  sata_decode_device_error(sata_pkt_txlate_t *spx,
7244 7248      struct scsi_extended_sense *sense)
7245 7249  {
7246 7250          uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7247 7251  
7248 7252          ASSERT(sense != NULL);
7249 7253          ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7250 7254              SATA_STATUS_ERR);
7251 7255  
7252 7256  
7253 7257          if (err_reg & SATA_ERROR_ICRC) {
7254 7258                  sense->es_key = KEY_ABORTED_COMMAND;
7255 7259                  sense->es_add_code = 0x08; /* Communication failure */
7256 7260                  return;
7257 7261          }
7258 7262  
7259 7263          if (err_reg & SATA_ERROR_UNC) {
7260 7264                  sense->es_key = KEY_MEDIUM_ERROR;
7261 7265                  /* Information bytes (LBA) need to be set by a caller */
7262 7266                  return;
7263 7267          }
7264 7268  
7265 7269          /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7266 7270          if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7267 7271                  sense->es_key = KEY_UNIT_ATTENTION;
7268 7272                  sense->es_add_code = 0x3a; /* No media present */
7269 7273                  return;
7270 7274          }
7271 7275  
7272 7276          if (err_reg & SATA_ERROR_IDNF) {
7273 7277                  if (err_reg & SATA_ERROR_ABORT) {
7274 7278                          sense->es_key = KEY_ABORTED_COMMAND;
7275 7279                  } else {
7276 7280                          sense->es_key = KEY_ILLEGAL_REQUEST;
7277 7281                          sense->es_add_code = 0x21; /* LBA out of range */
7278 7282                  }
7279 7283                  return;
7280 7284          }
7281 7285  
7282 7286          if (err_reg & SATA_ERROR_ABORT) {
7283 7287                  ASSERT(spx->txlt_sata_pkt != NULL);
7284 7288                  sense->es_key = KEY_ABORTED_COMMAND;
7285 7289                  return;
7286 7290          }
7287 7291  }
7288 7292  
7289 7293  /*
7290 7294   * Extract error LBA from sata_pkt.satapkt_cmd register fields
7291 7295   */
7292 7296  static void
7293 7297  sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7294 7298  {
7295 7299          sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7296 7300  
7297 7301          *lba = 0;
7298 7302          if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7299 7303                  *lba = sata_cmd->satacmd_lba_high_msb;
7300 7304                  *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7301 7305                  *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7302 7306          } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7303 7307                  *lba = sata_cmd->satacmd_device_reg & 0xf;
7304 7308          }
7305 7309          *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7306 7310          *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7307 7311          *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7308 7312  }
7309 7313  
7310 7314  /*
7311 7315   * This is fixed sense format - if LBA exceeds the info field size,
7312 7316   * no valid info will be returned (valid bit in extended sense will
7313 7317   * be set to 0).
7314 7318   */
7315 7319  static struct scsi_extended_sense *
7316 7320  sata_arq_sense(sata_pkt_txlate_t *spx)
7317 7321  {
7318 7322          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7319 7323          struct scsi_arq_status *arqs;
7320 7324          struct scsi_extended_sense *sense;
7321 7325  
7322 7326          /* Fill ARQ sense data */
7323 7327          scsipkt->pkt_state |= STATE_ARQ_DONE;
7324 7328          arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7325 7329          *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7326 7330          *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7327 7331          arqs->sts_rqpkt_reason = CMD_CMPLT;
7328 7332          arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7329 7333              STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7330 7334          arqs->sts_rqpkt_resid = 0;
7331 7335          sense = &arqs->sts_sensedata;
7332 7336          bzero(sense, sizeof (struct scsi_extended_sense));
7333 7337          sata_fixed_sense_data_preset(sense);
7334 7338          return (sense);
7335 7339  }
7336 7340  
7337 7341  /*
7338 7342   * ATA Pass Through support
7339 7343   * Sets flags indicating that an invalid value was found in some
7340 7344   * field in the command.  It could be something illegal according to
7341 7345   * the SAT-2 spec or it could be a feature that is not (yet?)
7342 7346   * supported.
7343 7347   */
7344 7348  static int
7345 7349  sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7346 7350  {
7347 7351          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7348 7352          struct scsi_extended_sense *sense = sata_arq_sense(spx);
7349 7353  
7350 7354          scsipkt->pkt_reason = CMD_CMPLT;
7351 7355          *scsipkt->pkt_scbp = STATUS_CHECK;
7352 7356          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7353 7357              STATE_SENT_CMD | STATE_GOT_STATUS;
7354 7358  
7355 7359          sense = sata_arq_sense(spx);
7356 7360          sense->es_key = KEY_ILLEGAL_REQUEST;
7357 7361          sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7358 7362  
7359 7363          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7360 7364              scsipkt->pkt_comp != NULL) {
7361 7365                  /* scsi callback required */
7362 7366                  if (servicing_interrupt()) {
7363 7367                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7364 7368                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7365 7369                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7366 7370                                  return (TRAN_BUSY);
7367 7371                          }
7368 7372                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7369 7373                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7370 7374                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7371 7375                          /* Scheduling the callback failed */
7372 7376                          return (TRAN_BUSY);
7373 7377                  }
7374 7378          }
7375 7379  
7376 7380          return (TRAN_ACCEPT);
7377 7381  }
7378 7382  
7379 7383  /*
7380 7384   * The UNMAP command considers it not to be an error if the parameter length
7381 7385   * or block descriptor length is 0.  For this case, there is nothing for TRIM
7382 7386   * to do so just complete the command.
7383 7387   */
7384 7388  static int
7385 7389  sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7386 7390  {
7387 7391          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7388 7392  
7389 7393          scsipkt->pkt_reason = CMD_CMPLT;
7390 7394          *scsipkt->pkt_scbp = STATUS_GOOD;
7391 7395          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7392 7396              STATE_SENT_CMD | STATE_GOT_STATUS;
7393 7397  
7394 7398          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7395 7399              scsipkt->pkt_comp != NULL) {
7396 7400                  /* scsi callback required */
7397 7401                  if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7398 7402                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7399 7403                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7400 7404                          /* Scheduling the callback failed */
7401 7405                          return (TRAN_BUSY);
7402 7406                  }
7403 7407          }
7404 7408  
7405 7409          return (TRAN_ACCEPT);
7406 7410  }
7407 7411  
7408 7412  /*
7409 7413   * Emulated SATA Read/Write command completion for zero-length requests.
7410 7414   * This request always succedes, so in synchronous mode it always returns
7411 7415   * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7412 7416   * callback cannot be scheduled.
7413 7417   */
7414 7418  static int
7415 7419  sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7416 7420  {
7417 7421          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7418 7422  
7419 7423          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7420 7424              STATE_SENT_CMD | STATE_GOT_STATUS;
7421 7425          scsipkt->pkt_reason = CMD_CMPLT;
7422 7426          *scsipkt->pkt_scbp = STATUS_GOOD;
7423 7427          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7424 7428                  /* scsi callback required - have to schedule it */
7425 7429                  if (servicing_interrupt()) {
7426 7430                          if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7427 7431                              (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7428 7432                              (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7429 7433                                  return (TRAN_BUSY);
7430 7434                          }
7431 7435                  } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7432 7436                      (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7433 7437                      (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7434 7438                          /* Scheduling the callback failed */
7435 7439                          return (TRAN_BUSY);
7436 7440                  }
7437 7441          }
7438 7442          return (TRAN_ACCEPT);
7439 7443  }
7440 7444  
7441 7445  
7442 7446  /*
7443 7447   * Translate completion status of SATA read/write commands into scsi response.
7444 7448   * pkt completion_reason is checked to determine the completion status.
7445 7449   * Do scsi callback if necessary.
7446 7450   *
7447 7451   * Note: this function may be called also for synchronously executed
7448 7452   * commands.
7449 7453   * This function may be used only if scsi_pkt is non-NULL.
7450 7454   */
7451 7455  static void
7452 7456  sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
7453 7457  {
7454 7458          sata_pkt_txlate_t *spx =
7455 7459              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7456 7460          sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7457 7461          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7458 7462          struct scsi_extended_sense *sense;
7459 7463          uint64_t lba;
7460 7464          struct buf *bp;
7461 7465          int rval;
7462 7466          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7463 7467                  /* Normal completion */
7464 7468                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7465 7469                      STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7466 7470                  scsipkt->pkt_reason = CMD_CMPLT;
7467 7471                  *scsipkt->pkt_scbp = STATUS_GOOD;
7468 7472                  if (spx->txlt_tmp_buf != NULL) {
7469 7473                          /* Temporary buffer was used */
7470 7474                          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7471 7475                          if (bp->b_flags & B_READ) {
7472 7476                                  rval = ddi_dma_sync(
7473 7477                                      spx->txlt_buf_dma_handle, 0, 0,
7474 7478                                      DDI_DMA_SYNC_FORCPU);
7475 7479                                  ASSERT(rval == DDI_SUCCESS);
7476 7480                                  bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7477 7481                                      bp->b_bcount);
7478 7482                          }
7479 7483                  }
7480 7484          } else {
7481 7485                  /*
7482 7486                   * Something went wrong - analyze return
7483 7487                   */
7484 7488                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7485 7489                      STATE_SENT_CMD | STATE_GOT_STATUS;
7486 7490                  scsipkt->pkt_reason = CMD_INCOMPLETE;
7487 7491                  *scsipkt->pkt_scbp = STATUS_CHECK;
7488 7492                  sense = sata_arq_sense(spx);
7489 7493                  ASSERT(sense != NULL);
7490 7494  
7491 7495                  /*
7492 7496                   * SATA_PKT_DEV_ERROR is the only case where we may be able to
7493 7497                   * extract from device registers the failing LBA.
7494 7498                   */
7495 7499                  if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
7496 7500                          if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
7497 7501                              (scmd->satacmd_lba_mid_msb != 0 ||
7498 7502                              scmd->satacmd_lba_high_msb != 0)) {
7499 7503                                  /*
7500 7504                                   * We have problem reporting this cmd LBA
7501 7505                                   * in fixed sense data format, because of
7502 7506                                   * the size of the scsi LBA fields.
7503 7507                                   */
7504 7508                                  sense->es_valid = 0;
7505 7509                          } else {
7506 7510                                  sata_extract_error_lba(spx, &lba);
7507 7511                                  sense->es_info_1 = (lba & 0xFF000000) >> 24;
7508 7512                                  sense->es_info_2 = (lba & 0xFF0000) >> 16;
7509 7513                                  sense->es_info_3 = (lba & 0xFF00) >> 8;
7510 7514                                  sense->es_info_4 = lba & 0xFF;
7511 7515                          }
7512 7516                  } else {
7513 7517                          /* Invalid extended sense info */
7514 7518                          sense->es_valid = 0;
7515 7519                  }
7516 7520  
7517 7521                  switch (sata_pkt->satapkt_reason) {
7518 7522                  case SATA_PKT_PORT_ERROR:
7519 7523                          /* We may want to handle DEV GONE state as well */
7520 7524                          /*
7521 7525                           * We have no device data. Assume no data transfered.
7522 7526                           */
7523 7527                          sense->es_key = KEY_HARDWARE_ERROR;
7524 7528                          break;
7525 7529  
7526 7530                  case SATA_PKT_DEV_ERROR:
7527 7531                          if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7528 7532                              SATA_STATUS_ERR) {
7529 7533                                  /*
7530 7534                                   * determine dev error reason from error
7531 7535                                   * reg content
7532 7536                                   */
7533 7537                                  sata_decode_device_error(spx, sense);
7534 7538                                  if (sense->es_key == KEY_MEDIUM_ERROR) {
7535 7539                                          switch (scmd->satacmd_cmd_reg) {
7536 7540                                          case SATAC_READ_DMA:
7537 7541                                          case SATAC_READ_DMA_EXT:
7538 7542                                          case SATAC_READ_DMA_QUEUED:
7539 7543                                          case SATAC_READ_DMA_QUEUED_EXT:
7540 7544                                          case SATAC_READ_FPDMA_QUEUED:
7541 7545                                                  /* Unrecovered read error */
7542 7546                                                  sense->es_add_code =
7543 7547                                                      SD_SCSI_ASC_UNREC_READ_ERR;
7544 7548                                                  break;
7545 7549                                          case SATAC_WRITE_DMA:
7546 7550                                          case SATAC_WRITE_DMA_EXT:
7547 7551                                          case SATAC_WRITE_DMA_QUEUED:
7548 7552                                          case SATAC_WRITE_DMA_QUEUED_EXT:
7549 7553                                          case SATAC_WRITE_FPDMA_QUEUED:
7550 7554                                                  /* Write error */
7551 7555                                                  sense->es_add_code =
7552 7556                                                      SD_SCSI_ASC_WRITE_ERR;
7553 7557                                                  break;
7554 7558                                          default:
7555 7559                                                  /* Internal error */
7556 7560                                                  SATA_LOG_D((
7557 7561                                                      spx->txlt_sata_hba_inst,
7558 7562                                                      CE_WARN,
7559 7563                                                      "sata_txlt_rw_completion :"
7560 7564                                                      "internal error - invalid "
7561 7565                                                      "command 0x%2x",
7562 7566                                                      scmd->satacmd_cmd_reg));
7563 7567                                                  break;
7564 7568                                          }
7565 7569                                  }
7566 7570                                  break;
7567 7571                          }
7568 7572                          /* No extended sense key - no info available */
7569 7573                          scsipkt->pkt_reason = CMD_INCOMPLETE;
7570 7574                          break;
7571 7575  
7572 7576                  case SATA_PKT_TIMEOUT:
7573 7577                          scsipkt->pkt_reason = CMD_TIMEOUT;
7574 7578                          scsipkt->pkt_statistics |=
7575 7579                              STAT_TIMEOUT | STAT_DEV_RESET;
7576 7580                          sense->es_key = KEY_ABORTED_COMMAND;
7577 7581                          break;
7578 7582  
7579 7583                  case SATA_PKT_ABORTED:
7580 7584                          scsipkt->pkt_reason = CMD_ABORTED;
7581 7585                          scsipkt->pkt_statistics |= STAT_ABORTED;
7582 7586                          sense->es_key = KEY_ABORTED_COMMAND;
7583 7587                          break;
7584 7588  
7585 7589                  case SATA_PKT_RESET:
7586 7590                          scsipkt->pkt_reason = CMD_RESET;
7587 7591                          scsipkt->pkt_statistics |= STAT_DEV_RESET;
7588 7592                          sense->es_key = KEY_ABORTED_COMMAND;
7589 7593                          break;
7590 7594  
7591 7595                  default:
7592 7596                          SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7593 7597                              "sata_txlt_rw_completion: "
7594 7598                              "invalid packet completion reason"));
7595 7599                          scsipkt->pkt_reason = CMD_TRAN_ERR;
7596 7600                          break;
7597 7601                  }
7598 7602          }
7599 7603          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7600 7604              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7601 7605  
7602 7606          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7603 7607                  /* scsi callback required */
7604 7608                  scsi_hba_pkt_comp(scsipkt);
7605 7609  }
7606 7610  
7607 7611  
7608 7612  /*
7609 7613   * Translate completion status of non-data commands (i.e. commands returning
7610 7614   * no data).
7611 7615   * pkt completion_reason is checked to determine the completion status.
7612 7616   * Do scsi callback if necessary (FLAG_NOINTR == 0)
7613 7617   *
7614 7618   * Note: this function may be called also for synchronously executed
7615 7619   * commands.
7616 7620   * This function may be used only if scsi_pkt is non-NULL.
7617 7621   */
7618 7622  
7619 7623  static  void
7620 7624  sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
7621 7625  {
7622 7626          sata_pkt_txlate_t *spx =
7623 7627              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7624 7628          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7625 7629  
7626 7630          sata_set_arq_data(sata_pkt);
7627 7631  
7628 7632          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7629 7633                  /* scsi callback required */
7630 7634                  scsi_hba_pkt_comp(scsipkt);
7631 7635  }
7632 7636  
7633 7637  /*
7634 7638   * Completion handler for ATA Pass Through command
7635 7639   */
7636 7640  static void
7637 7641  sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
7638 7642  {
7639 7643          sata_pkt_txlate_t *spx =
7640 7644              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7641 7645          sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7642 7646          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7643 7647          struct buf *bp;
7644 7648          uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7645 7649  
7646 7650          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7647 7651                  /* Normal completion */
7648 7652                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7649 7653                      STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7650 7654                  scsipkt->pkt_reason = CMD_CMPLT;
7651 7655                  *scsipkt->pkt_scbp = STATUS_GOOD;
7652 7656  
7653 7657                  /*
7654 7658                   * If the command has CK_COND set
7655 7659                   */
7656 7660                  if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
7657 7661                          *scsipkt->pkt_scbp = STATUS_CHECK;
7658 7662                          sata_fill_ata_return_desc(sata_pkt,
7659 7663                              KEY_RECOVERABLE_ERROR,
7660 7664                              SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
7661 7665                  }
7662 7666  
7663 7667                  if (spx->txlt_tmp_buf != NULL) {
7664 7668                          /* Temporary buffer was used */
7665 7669                          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7666 7670                          if (bp->b_flags & B_READ) {
7667 7671                                  bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7668 7672                                      bp->b_bcount);
7669 7673                          }
7670 7674                  }
7671 7675          } else {
7672 7676                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7673 7677                      STATE_SENT_CMD | STATE_GOT_STATUS;
7674 7678                  scsipkt->pkt_reason = CMD_INCOMPLETE;
7675 7679                  *scsipkt->pkt_scbp = STATUS_CHECK;
7676 7680  
7677 7681                  /*
7678 7682                   * If DF or ERR was set, the HBA should have copied out the
7679 7683                   * status and error registers to the satacmd structure.
7680 7684                   */
7681 7685                  if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7682 7686                          sense_key = KEY_HARDWARE_ERROR;
7683 7687                          addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7684 7688                          addl_sense_qual = 0;
7685 7689                  } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7686 7690                          if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7687 7691                                  sense_key = KEY_NOT_READY;
7688 7692                                  addl_sense_code =
7689 7693                                      SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7690 7694                                  addl_sense_qual = 0;
7691 7695                          } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7692 7696                                  sense_key = KEY_MEDIUM_ERROR;
7693 7697                                  addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
7694 7698                                  addl_sense_qual = 0;
7695 7699                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7696 7700                                  sense_key = KEY_DATA_PROTECT;
7697 7701                                  addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7698 7702                                  addl_sense_qual = 0;
7699 7703                          } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7700 7704                                  sense_key = KEY_ILLEGAL_REQUEST;
7701 7705                                  addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7702 7706                                  addl_sense_qual = 0;
7703 7707                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7704 7708                                  sense_key = KEY_ABORTED_COMMAND;
7705 7709                                  addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7706 7710                                  addl_sense_qual = 0;
7707 7711                          } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7708 7712                                  sense_key = KEY_UNIT_ATTENTION;
7709 7713                                  addl_sense_code =
7710 7714                                      SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7711 7715                                  addl_sense_qual = 0;
7712 7716                          } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7713 7717                                  sense_key = KEY_UNIT_ATTENTION;
7714 7718                                  addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7715 7719                                  addl_sense_qual = 0;
7716 7720                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7717 7721                                  sense_key = KEY_ABORTED_COMMAND;
7718 7722                                  addl_sense_code =
7719 7723                                      SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7720 7724                                  addl_sense_qual = 0;
7721 7725                          }
7722 7726                  }
7723 7727  
7724 7728                  sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7725 7729                      addl_sense_qual);
7726 7730          }
7727 7731  
7728 7732          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7729 7733                  /* scsi callback required */
7730 7734                  scsi_hba_pkt_comp(scsipkt);
7731 7735  }
7732 7736  
7733 7737  /*
7734 7738   * Completion handler for unmap translation command
7735 7739   */
7736 7740  static void
7737 7741  sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
7738 7742  {
7739 7743          sata_pkt_txlate_t *spx =
7740 7744              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7741 7745          sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7742 7746          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7743 7747          struct buf *bp;
7744 7748          uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7745 7749  
7746 7750          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7747 7751                  /* Normal completion */
7748 7752                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7749 7753                      STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7750 7754                  scsipkt->pkt_reason = CMD_CMPLT;
7751 7755                  *scsipkt->pkt_scbp = STATUS_GOOD;
7752 7756  
7753 7757                  if (spx->txlt_tmp_buf != NULL) {
7754 7758                          /* Temporary buffer was used */
7755 7759                          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7756 7760                          if (bp->b_flags & B_READ) {
7757 7761                                  bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7758 7762                                      bp->b_bcount);
7759 7763                          }
7760 7764                  }
7761 7765          } else {
7762 7766                  scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7763 7767                      STATE_SENT_CMD | STATE_GOT_STATUS;
7764 7768                  scsipkt->pkt_reason = CMD_INCOMPLETE;
7765 7769                  *scsipkt->pkt_scbp = STATUS_CHECK;
7766 7770  
7767 7771                  /*
7768 7772                   * If DF or ERR was set, the HBA should have copied out the
7769 7773                   * status and error registers to the satacmd structure.
7770 7774                   */
7771 7775                  if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7772 7776                          sense_key = KEY_HARDWARE_ERROR;
7773 7777                          addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7774 7778                          addl_sense_qual = 0;
7775 7779                  } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7776 7780                          if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7777 7781                                  sense_key = KEY_NOT_READY;
7778 7782                                  addl_sense_code =
7779 7783                                      SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7780 7784                                  addl_sense_qual = 0;
7781 7785                          } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7782 7786                                  sense_key = KEY_MEDIUM_ERROR;
7783 7787                                  addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
7784 7788                                  addl_sense_qual = 0;
7785 7789                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7786 7790                                  sense_key = KEY_DATA_PROTECT;
7787 7791                                  addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7788 7792                                  addl_sense_qual = 0;
7789 7793                          } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7790 7794                                  sense_key = KEY_ILLEGAL_REQUEST;
7791 7795                                  addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7792 7796                                  addl_sense_qual = 0;
7793 7797                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7794 7798                                  sense_key = KEY_ABORTED_COMMAND;
7795 7799                                  addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7796 7800                                  addl_sense_qual = 0;
7797 7801                          } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7798 7802                                  sense_key = KEY_UNIT_ATTENTION;
7799 7803                                  addl_sense_code =
7800 7804                                      SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7801 7805                                  addl_sense_qual = 0;
7802 7806                          } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7803 7807                                  sense_key = KEY_UNIT_ATTENTION;
7804 7808                                  addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7805 7809                                  addl_sense_qual = 0;
7806 7810                          } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7807 7811                                  sense_key = KEY_ABORTED_COMMAND;
7808 7812                                  addl_sense_code =
7809 7813                                      SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7810 7814                                  addl_sense_qual = 0;
7811 7815                          }
7812 7816                  }
7813 7817  
7814 7818                  sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7815 7819                      addl_sense_qual);
7816 7820          }
7817 7821  
7818 7822          sata_free_local_buffer(spx);
7819 7823  
7820 7824          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7821 7825                  /* scsi callback required */
7822 7826                  scsi_hba_pkt_comp(scsipkt);
7823 7827  }
7824 7828  
7825 7829  /*
7826 7830   *
7827 7831   */
7828 7832  static void
7829 7833  sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
7830 7834      uint8_t addl_sense_code, uint8_t addl_sense_qual)
7831 7835  {
7832 7836          sata_pkt_txlate_t *spx =
7833 7837              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7834 7838          sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7835 7839          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7836 7840          struct sata_apt_sense_data *apt_sd =
7837 7841              (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
7838 7842          struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
7839 7843          struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
7840 7844              &(apt_sd->apt_sd_sense);
7841 7845          int extend = 0;
7842 7846  
7843 7847          if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
7844 7848              (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
7845 7849                  extend = 1;
7846 7850  
7847 7851          scsipkt->pkt_state |= STATE_ARQ_DONE;
7848 7852  
7849 7853          /* update the residual count */
7850 7854          *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
7851 7855          *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
7852 7856          apt_sd->apt_rqpkt_reason = CMD_CMPLT;
7853 7857          apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7854 7858              STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7855 7859          apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
7856 7860              sizeof (struct sata_apt_sense_data);
7857 7861  
7858 7862          /*
7859 7863           * Fill in the Descriptor sense header
7860 7864           */
7861 7865          bzero(sds, sizeof (struct scsi_descr_sense_hdr));
7862 7866          sds->ds_code = CODE_FMT_DESCR_CURRENT;
7863 7867          sds->ds_class = CLASS_EXTENDED_SENSE;
7864 7868          sds->ds_key = sense_key & 0xf;
7865 7869          sds->ds_add_code = addl_sense_code;
7866 7870          sds->ds_qual_code = addl_sense_qual;
7867 7871          sds->ds_addl_sense_length =
7868 7872              sizeof (struct scsi_ata_status_ret_sense_descr);
7869 7873  
7870 7874          /*
7871 7875           * Fill in the ATA Return descriptor sense data
7872 7876           */
7873 7877          bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
7874 7878          ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
7875 7879          ata_ret_desc->ars_addl_length = 0xc;
7876 7880          ata_ret_desc->ars_error = scmd->satacmd_error_reg;
7877 7881          ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
7878 7882          ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
7879 7883          ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
7880 7884          ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
7881 7885          ata_ret_desc->ars_device = scmd->satacmd_device_reg;
7882 7886          ata_ret_desc->ars_status = scmd->satacmd_status_reg;
7883 7887  
7884 7888          if (extend == 1) {
7885 7889                  ata_ret_desc->ars_extend = 1;
7886 7890                  ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
7887 7891                  ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
7888 7892                  ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
7889 7893                  ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
7890 7894          } else {
7891 7895                  ata_ret_desc->ars_extend = 0;
7892 7896                  ata_ret_desc->ars_sec_count_msb = 0;
7893 7897                  ata_ret_desc->ars_lba_low_msb = 0;
7894 7898                  ata_ret_desc->ars_lba_mid_msb = 0;
7895 7899                  ata_ret_desc->ars_lba_high_msb = 0;
7896 7900          }
7897 7901  }
7898 7902  
7899 7903  static  void
7900 7904  sata_set_arq_data(sata_pkt_t *sata_pkt)
7901 7905  {
7902 7906          sata_pkt_txlate_t *spx =
7903 7907              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7904 7908          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7905 7909          struct scsi_extended_sense *sense;
7906 7910  
7907 7911          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7908 7912              STATE_SENT_CMD | STATE_GOT_STATUS;
7909 7913          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7910 7914                  /* Normal completion */
7911 7915                  scsipkt->pkt_reason = CMD_CMPLT;
7912 7916                  *scsipkt->pkt_scbp = STATUS_GOOD;
7913 7917          } else {
7914 7918                  /* Something went wrong */
7915 7919                  scsipkt->pkt_reason = CMD_INCOMPLETE;
7916 7920                  *scsipkt->pkt_scbp = STATUS_CHECK;
7917 7921                  sense = sata_arq_sense(spx);
7918 7922                  switch (sata_pkt->satapkt_reason) {
7919 7923                  case SATA_PKT_PORT_ERROR:
7920 7924                          /*
7921 7925                           * We have no device data. Assume no data transfered.
7922 7926                           */
7923 7927                          sense->es_key = KEY_HARDWARE_ERROR;
7924 7928                          break;
7925 7929  
7926 7930                  case SATA_PKT_DEV_ERROR:
7927 7931                          if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7928 7932                              SATA_STATUS_ERR) {
7929 7933                                  /*
7930 7934                                   * determine dev error reason from error
7931 7935                                   * reg content
7932 7936                                   */
7933 7937                                  sata_decode_device_error(spx, sense);
7934 7938                                  break;
7935 7939                          }
7936 7940                          /* No extended sense key - no info available */
7937 7941                          break;
7938 7942  
7939 7943                  case SATA_PKT_TIMEOUT:
7940 7944                          scsipkt->pkt_reason = CMD_TIMEOUT;
7941 7945                          scsipkt->pkt_statistics |=
7942 7946                              STAT_TIMEOUT | STAT_DEV_RESET;
7943 7947                          /* No extended sense key ? */
7944 7948                          break;
7945 7949  
7946 7950                  case SATA_PKT_ABORTED:
7947 7951                          scsipkt->pkt_reason = CMD_ABORTED;
7948 7952                          scsipkt->pkt_statistics |= STAT_ABORTED;
7949 7953                          /* No extended sense key ? */
7950 7954                          break;
7951 7955  
7952 7956                  case SATA_PKT_RESET:
7953 7957                          /* pkt aborted by an explicit reset from a host */
7954 7958                          scsipkt->pkt_reason = CMD_RESET;
7955 7959                          scsipkt->pkt_statistics |= STAT_DEV_RESET;
7956 7960                          break;
7957 7961  
7958 7962                  default:
7959 7963                          SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7960 7964                              "sata_txlt_nodata_cmd_completion: "
7961 7965                              "invalid packet completion reason %d",
7962 7966                              sata_pkt->satapkt_reason));
7963 7967                          scsipkt->pkt_reason = CMD_TRAN_ERR;
7964 7968                          break;
7965 7969                  }
7966 7970  
7967 7971          }
7968 7972          SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7969 7973              "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7970 7974  }
7971 7975  
7972 7976  
7973 7977  /*
7974 7978   * Build Mode sense R/W recovery page
7975 7979   * NOT IMPLEMENTED
7976 7980   */
7977 7981  
7978 7982  static int
7979 7983  sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7980 7984  {
7981 7985  #ifndef __lock_lint
7982 7986          _NOTE(ARGUNUSED(sdinfo))
7983 7987          _NOTE(ARGUNUSED(pcntrl))
7984 7988          _NOTE(ARGUNUSED(buf))
7985 7989  #endif
7986 7990          return (0);
7987 7991  }
7988 7992  
7989 7993  /*
7990 7994   * Build Mode sense caching page  -  scsi-3 implementation.
7991 7995   * Page length distinguishes previous format from scsi-3 format.
7992 7996   * buf must have space for 0x12 bytes.
7993 7997   * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
7994 7998   *
7995 7999   */
7996 8000  static int
7997 8001  sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7998 8002  {
7999 8003          struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8000 8004          sata_id_t *sata_id = &sdinfo->satadrv_id;
8001 8005  
8002 8006          /*
8003 8007           * Most of the fields are set to 0, being not supported and/or disabled
8004 8008           */
8005 8009          bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8006 8010  
8007 8011          /* Saved paramters not supported */
8008 8012          if (pcntrl == 3)
8009 8013                  return (0);
8010 8014          if (pcntrl == 0 || pcntrl == 2) {
8011 8015                  /*
8012 8016                   * For now treat current and default parameters as same
8013 8017                   * That may have to change, if target driver will complain
8014 8018                   */
8015 8019                  page->mode_page.code = MODEPAGE_CACHING;        /* PS = 0 */
8016 8020                  page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8017 8021  
8018 8022                  if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8019 8023                      !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8020 8024                          page->dra = 1;          /* Read Ahead disabled */
8021 8025                          page->rcd = 1;          /* Read Cache disabled */
8022 8026                  }
8023 8027                  if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8024 8028                      SATA_WRITE_CACHE_ENABLED(*sata_id))
8025 8029                          page->wce = 1;          /* Write Cache enabled */
8026 8030          } else {
8027 8031                  /* Changeable parameters */
8028 8032                  page->mode_page.code = MODEPAGE_CACHING;
8029 8033                  page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8030 8034                  if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8031 8035                          page->dra = 1;
8032 8036                          page->rcd = 1;
8033 8037                  }
8034 8038                  if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8035 8039                          page->wce = 1;
8036 8040          }
8037 8041          return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8038 8042              sizeof (struct mode_page));
8039 8043  }
8040 8044  
8041 8045  /*
8042 8046   * Build Mode sense exception cntrl page
8043 8047   */
8044 8048  static int
8045 8049  sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8046 8050  {
8047 8051          struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8048 8052          sata_id_t *sata_id = &sdinfo->satadrv_id;
8049 8053  
8050 8054          /*
8051 8055           * Most of the fields are set to 0, being not supported and/or disabled
8052 8056           */
8053 8057          bzero(buf, PAGELENGTH_INFO_EXCPT);
8054 8058  
8055 8059          page->mode_page.code = MODEPAGE_INFO_EXCPT;
8056 8060          page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8057 8061  
8058 8062          /* Indicate that this is page is saveable */
8059 8063          page->mode_page.ps = 1;
8060 8064  
8061 8065          /*
8062 8066           * We will return the same data for default, current and saved page.
8063 8067           * The only changeable bit is dexcpt and that bit is required
8064 8068           * by the ATA specification to be preserved across power cycles.
8065 8069           */
8066 8070          if (pcntrl != 1) {
8067 8071                  page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8068 8072                  page->mrie = MRIE_ONLY_ON_REQUEST;
8069 8073          }
8070 8074          else
8071 8075                  page->dexcpt = 1;       /* Only changeable parameter */
8072 8076  
8073 8077          return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8074 8078  }
8075 8079  
8076 8080  
8077 8081  static int
8078 8082  sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8079 8083  {
8080 8084          struct mode_acoustic_management *page =
8081 8085              (struct mode_acoustic_management *)buf;
8082 8086          sata_id_t *sata_id = &sdinfo->satadrv_id;
8083 8087  
8084 8088          /*
8085 8089           * Most of the fields are set to 0, being not supported and/or disabled
8086 8090           */
8087 8091          bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8088 8092  
8089 8093          switch (pcntrl) {
8090 8094          case P_CNTRL_DEFAULT:
8091 8095                  /*  default paramters not supported */
8092 8096                  return (0);
8093 8097  
8094 8098          case P_CNTRL_CURRENT:
8095 8099          case P_CNTRL_SAVED:
8096 8100                  /* Saved and current are supported and are identical */
8097 8101                  page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8098 8102                  page->mode_page.length =
8099 8103                      PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8100 8104                  page->mode_page.ps = 1;
8101 8105  
8102 8106                  /* Word 83 indicates if feature is supported */
8103 8107                  /* If feature is not supported */
8104 8108                  if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8105 8109                          page->acoustic_manag_enable =
8106 8110                              ACOUSTIC_DISABLED;
8107 8111                  } else {
8108 8112                          page->acoustic_manag_enable =
8109 8113                              ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8110 8114                              != 0);
8111 8115                          /* Word 94 inidicates the value */
8112 8116  #ifdef  _LITTLE_ENDIAN
8113 8117                          page->acoustic_manag_level =
8114 8118                              (uchar_t)sata_id->ai_acoustic;
8115 8119                          page->vendor_recommended_value =
8116 8120                              sata_id->ai_acoustic >> 8;
8117 8121  #else
8118 8122                          page->acoustic_manag_level =
8119 8123                              sata_id->ai_acoustic >> 8;
8120 8124                          page->vendor_recommended_value =
8121 8125                              (uchar_t)sata_id->ai_acoustic;
8122 8126  #endif
8123 8127                  }
8124 8128                  break;
8125 8129  
8126 8130          case P_CNTRL_CHANGEABLE:
8127 8131                  page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8128 8132                  page->mode_page.length =
8129 8133                      PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8130 8134                  page->mode_page.ps = 1;
8131 8135  
8132 8136                  /* Word 83 indicates if the feature is supported */
8133 8137                  if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8134 8138                          page->acoustic_manag_enable =
8135 8139                              ACOUSTIC_ENABLED;
8136 8140                          page->acoustic_manag_level = 0xff;
8137 8141                  }
8138 8142                  break;
8139 8143          }
8140 8144          return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8141 8145              sizeof (struct mode_page));
8142 8146  }
8143 8147  
8144 8148  
8145 8149  /*
8146 8150   * Build Mode sense power condition page.
8147 8151   */
8148 8152  static int
8149 8153  sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8150 8154  {
8151 8155          struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8152 8156          sata_id_t *sata_id = &sdinfo->satadrv_id;
8153 8157  
8154 8158          /*
8155 8159           * Most of the fields are set to 0, being not supported and/or disabled
8156 8160           * power condition page length was 0x0a
8157 8161           */
8158 8162          bzero(buf, sizeof (struct mode_info_power_cond));
8159 8163  
8160 8164          if (pcntrl == P_CNTRL_DEFAULT) {
8161 8165                  /*  default paramters not supported */
8162 8166                  return (0);
8163 8167          }
8164 8168  
8165 8169          page->mode_page.code = MODEPAGE_POWER_COND;
8166 8170          page->mode_page.length = sizeof (struct mode_info_power_cond);
8167 8171  
8168 8172          if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8169 8173                  page->standby = 1;
8170 8174                  bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8171 8175                      sizeof (uchar_t) * 4);
8172 8176          }
8173 8177  
8174 8178          return (sizeof (struct mode_info_power_cond));
8175 8179  }
8176 8180  
8177 8181  /*
8178 8182   * Process mode select caching page 8 (scsi3 format only).
8179 8183   * Read Ahead (same as read cache) and Write Cache may be turned on and off
8180 8184   * if these features are supported by the device. If these features are not
8181 8185   * supported, the command will be terminated with STATUS_CHECK.
8182 8186   * This function fails only if the SET FEATURE command sent to
8183 8187   * the device fails. The page format is not verified, assuming that the
8184 8188   * target driver operates correctly - if parameters length is too short,
8185 8189   * we just drop the page.
8186 8190   * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8187 8191   * setting have to be changed.
8188 8192   * SET FEATURE command is executed synchronously, i.e. we wait here until
8189 8193   * it is completed, regardless of the scsi pkt directives.
8190 8194   *
8191 8195   * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8192 8196   * changing DRA will change RCD.
8193 8197   *
8194 8198   * More than one SATA command may be executed to perform operations specified
8195 8199   * by mode select pages. The first error terminates further execution.
8196 8200   * Operations performed successully are not backed-up in such case.
8197 8201   *
8198 8202   * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8199 8203   * If operation resulted in changing device setup, dmod flag should be set to
8200 8204   * one (1). If parameters were not changed, dmod flag should be set to 0.
8201 8205   * Upon return, if operation required sending command to the device, the rval
8202 8206   * should be set to the value returned by sata_hba_start. If operation
8203 8207   * did not require device access, rval should be set to TRAN_ACCEPT.
8204 8208   * The pagelen should be set to the length of the page.
8205 8209   *
8206 8210   * This function has to be called with a port mutex held.
8207 8211   *
8208 8212   * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8209 8213   */
8210 8214  int
8211 8215  sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8212 8216      int parmlen, int *pagelen, int *rval, int *dmod)
8213 8217  {
8214 8218          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8215 8219          sata_drive_info_t *sdinfo;
8216 8220          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8217 8221          sata_id_t *sata_id;
8218 8222          struct scsi_extended_sense *sense;
8219 8223          int wce, dra;   /* Current settings */
8220 8224  
8221 8225          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8222 8226              &spx->txlt_sata_pkt->satapkt_device);
8223 8227          sata_id = &sdinfo->satadrv_id;
8224 8228          *dmod = 0;
8225 8229  
8226 8230          /* Verify parameters length. If too short, drop it */
8227 8231          if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8228 8232              sizeof (struct mode_page)) > parmlen) {
8229 8233                  *scsipkt->pkt_scbp = STATUS_CHECK;
8230 8234                  sense = sata_arq_sense(spx);
8231 8235                  sense->es_key = KEY_ILLEGAL_REQUEST;
8232 8236                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8233 8237                  *pagelen = parmlen;
8234 8238                  *rval = TRAN_ACCEPT;
8235 8239                  return (SATA_FAILURE);
8236 8240          }
8237 8241  
8238 8242          *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8239 8243  
8240 8244          /* Current setting of Read Ahead (and Read Cache) */
8241 8245          if (SATA_READ_AHEAD_ENABLED(*sata_id))
8242 8246                  dra = 0;        /* 0 == not disabled */
8243 8247          else
8244 8248                  dra = 1;
8245 8249          /* Current setting of Write Cache */
8246 8250          if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8247 8251                  wce = 1;
8248 8252          else
8249 8253                  wce = 0;
8250 8254  
8251 8255          if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8252 8256                  /* nothing to do */
8253 8257                  *rval = TRAN_ACCEPT;
8254 8258                  return (SATA_SUCCESS);
8255 8259          }
8256 8260  
8257 8261          /*
8258 8262           * Need to flip some setting
8259 8263           * Set-up Internal SET FEATURES command(s)
8260 8264           */
8261 8265          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8262 8266          scmd->satacmd_addr_type = 0;
8263 8267          scmd->satacmd_device_reg = 0;
8264 8268          scmd->satacmd_status_reg = 0;
8265 8269          scmd->satacmd_error_reg = 0;
8266 8270          scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8267 8271          if (page->dra != dra || page->rcd != dra) {
8268 8272                  if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8269 8273                          /* Need to flip read ahead setting */
8270 8274                          if (dra == 0)
8271 8275                                  /* Disable read ahead / read cache */
8272 8276                                  scmd->satacmd_features_reg =
8273 8277                                      SATAC_SF_DISABLE_READ_AHEAD;
8274 8278                          else
8275 8279                                  /* Enable read ahead  / read cache */
8276 8280                                  scmd->satacmd_features_reg =
8277 8281                                      SATAC_SF_ENABLE_READ_AHEAD;
8278 8282  
8279 8283                          /* Transfer command to HBA */
8280 8284                          if (sata_hba_start(spx, rval) != 0)
8281 8285                                  /*
8282 8286                                   * Pkt not accepted for execution.
8283 8287                                   */
8284 8288                                  return (SATA_FAILURE);
8285 8289  
8286 8290                          *dmod = 1;
8287 8291  
8288 8292                          /* Now process return */
8289 8293                          if (spx->txlt_sata_pkt->satapkt_reason !=
8290 8294                              SATA_PKT_COMPLETED) {
8291 8295                                  goto failure;   /* Terminate */
8292 8296                          }
8293 8297                  } else {
8294 8298                          *scsipkt->pkt_scbp = STATUS_CHECK;
8295 8299                          sense = sata_arq_sense(spx);
8296 8300                          sense->es_key = KEY_ILLEGAL_REQUEST;
8297 8301                          sense->es_add_code =
8298 8302                              SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8299 8303                          *pagelen = parmlen;
8300 8304                          *rval = TRAN_ACCEPT;
8301 8305                          return (SATA_FAILURE);
8302 8306                  }
8303 8307          }
8304 8308  
8305 8309          /* Note that the packet is not removed, so it could be re-used */
8306 8310          if (page->wce != wce) {
8307 8311                  if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8308 8312                          /* Need to flip Write Cache setting */
8309 8313                          if (page->wce == 1)
8310 8314                                  /* Enable write cache */
8311 8315                                  scmd->satacmd_features_reg =
8312 8316                                      SATAC_SF_ENABLE_WRITE_CACHE;
8313 8317                          else
8314 8318                                  /* Disable write cache */
8315 8319                                  scmd->satacmd_features_reg =
8316 8320                                      SATAC_SF_DISABLE_WRITE_CACHE;
8317 8321  
8318 8322                          /* Transfer command to HBA */
8319 8323                          if (sata_hba_start(spx, rval) != 0)
8320 8324                                  /*
8321 8325                                   * Pkt not accepted for execution.
8322 8326                                   */
8323 8327                                  return (SATA_FAILURE);
8324 8328  
8325 8329                          *dmod = 1;
8326 8330  
8327 8331                          /* Now process return */
8328 8332                          if (spx->txlt_sata_pkt->satapkt_reason !=
8329 8333                              SATA_PKT_COMPLETED) {
8330 8334                                  goto failure;
8331 8335                          }
8332 8336                  } else {
8333 8337                          *scsipkt->pkt_scbp = STATUS_CHECK;
8334 8338                          sense = sata_arq_sense(spx);
8335 8339                          sense->es_key = KEY_ILLEGAL_REQUEST;
8336 8340                          sense->es_add_code =
8337 8341                              SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8338 8342                          *pagelen = parmlen;
8339 8343                          *rval = TRAN_ACCEPT;
8340 8344                          return (SATA_FAILURE);
8341 8345                  }
8342 8346          }
8343 8347          return (SATA_SUCCESS);
8344 8348  
8345 8349  failure:
8346 8350          sata_xlate_errors(spx);
8347 8351  
8348 8352          return (SATA_FAILURE);
8349 8353  }
8350 8354  
8351 8355  /*
8352 8356   * Process mode select informational exceptions control page 0x1c
8353 8357   *
8354 8358   * The only changeable bit is dexcpt (disable exceptions).
8355 8359   * MRIE (method of reporting informational exceptions) must be
8356 8360   * "only on request".
8357 8361   * This page applies to informational exceptions that report
8358 8362   * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8359 8363   * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8360 8364   * Informational exception conditions occur as the result of background scan
8361 8365   * errors, background self-test errors, or vendor specific events within a
8362 8366   * logical unit. An informational exception condition may occur asynchronous
8363 8367   * to any commands.
8364 8368   *
8365 8369   * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8366 8370   * If operation resulted in changing device setup, dmod flag should be set to
8367 8371   * one (1). If parameters were not changed, dmod flag should be set to 0.
8368 8372   * Upon return, if operation required sending command to the device, the rval
8369 8373   * should be set to the value returned by sata_hba_start. If operation
8370 8374   * did not require device access, rval should be set to TRAN_ACCEPT.
8371 8375   * The pagelen should be set to the length of the page.
8372 8376   *
8373 8377   * This function has to be called with a port mutex held.
8374 8378   *
8375 8379   * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8376 8380   *
8377 8381   * Cannot be called in the interrupt context.
8378 8382   */
8379 8383  static  int
8380 8384  sata_mode_select_page_1c(
8381 8385          sata_pkt_txlate_t *spx,
8382 8386          struct mode_info_excpt_page *page,
8383 8387          int parmlen,
8384 8388          int *pagelen,
8385 8389          int *rval,
8386 8390          int *dmod)
8387 8391  {
8388 8392          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8389 8393          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8390 8394          sata_drive_info_t *sdinfo;
8391 8395          sata_id_t *sata_id;
8392 8396          struct scsi_extended_sense *sense;
8393 8397  
8394 8398          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8395 8399              &spx->txlt_sata_pkt->satapkt_device);
8396 8400          sata_id = &sdinfo->satadrv_id;
8397 8401  
8398 8402          *dmod = 0;
8399 8403  
8400 8404          /* Verify parameters length. If too short, drop it */
8401 8405          if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8402 8406              page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8403 8407                  *scsipkt->pkt_scbp = STATUS_CHECK;
8404 8408                  sense = sata_arq_sense(spx);
8405 8409                  sense->es_key = KEY_ILLEGAL_REQUEST;
8406 8410                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8407 8411                  *pagelen = parmlen;
8408 8412                  *rval = TRAN_ACCEPT;
8409 8413                  return (SATA_FAILURE);
8410 8414          }
8411 8415  
8412 8416          *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8413 8417  
8414 8418          if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8415 8419                  *scsipkt->pkt_scbp = STATUS_CHECK;
8416 8420                  sense = sata_arq_sense(spx);
8417 8421                  sense->es_key = KEY_ILLEGAL_REQUEST;
8418 8422                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8419 8423                  *pagelen = parmlen;
8420 8424                  *rval = TRAN_ACCEPT;
8421 8425                  return (SATA_FAILURE);
8422 8426          }
8423 8427  
8424 8428          /* If already in the state requested, we are done */
8425 8429          if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8426 8430                  /* nothing to do */
8427 8431                  *rval = TRAN_ACCEPT;
8428 8432                  return (SATA_SUCCESS);
8429 8433          }
8430 8434  
8431 8435          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8432 8436  
8433 8437          /* Build SMART_ENABLE or SMART_DISABLE command */
8434 8438          scmd->satacmd_addr_type = 0;            /* N/A */
8435 8439          scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8436 8440          scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8437 8441          scmd->satacmd_features_reg = page->dexcpt ?
8438 8442              SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8439 8443          scmd->satacmd_device_reg = 0;           /* Always device 0 */
8440 8444          scmd->satacmd_cmd_reg = SATAC_SMART;
8441 8445  
8442 8446          /* Transfer command to HBA */
8443 8447          if (sata_hba_start(spx, rval) != 0)
8444 8448                  /*
8445 8449                   * Pkt not accepted for execution.
8446 8450                   */
8447 8451                  return (SATA_FAILURE);
8448 8452  
8449 8453          *dmod = 1;      /* At least may have been modified */
8450 8454  
8451 8455          /* Now process return */
8452 8456          if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
8453 8457                  return (SATA_SUCCESS);
8454 8458  
8455 8459          /* Packet did not complete successfully */
8456 8460          sata_xlate_errors(spx);
8457 8461  
8458 8462          return (SATA_FAILURE);
8459 8463  }
8460 8464  
8461 8465  /*
8462 8466   * Process mode select acoustic management control page 0x30
8463 8467   *
8464 8468   *
8465 8469   * This function has to be called with a port mutex held.
8466 8470   *
8467 8471   * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8468 8472   *
8469 8473   * Cannot be called in the interrupt context.
8470 8474   */
8471 8475  int
8472 8476  sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
8473 8477      mode_acoustic_management *page, int parmlen, int *pagelen,
8474 8478      int *rval, int *dmod)
8475 8479  {
8476 8480          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8477 8481          sata_drive_info_t *sdinfo;
8478 8482          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8479 8483          sata_id_t *sata_id;
8480 8484          struct scsi_extended_sense *sense;
8481 8485  
8482 8486          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8483 8487              &spx->txlt_sata_pkt->satapkt_device);
8484 8488          sata_id = &sdinfo->satadrv_id;
8485 8489          *dmod = 0;
8486 8490  
8487 8491          /* If parmlen is too short or the feature is not supported, drop it */
8488 8492          if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8489 8493              sizeof (struct mode_page)) > parmlen) ||
8490 8494              (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
8491 8495                  *scsipkt->pkt_scbp = STATUS_CHECK;
8492 8496                  sense = sata_arq_sense(spx);
8493 8497                  sense->es_key = KEY_ILLEGAL_REQUEST;
8494 8498                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8495 8499                  *pagelen = parmlen;
8496 8500                  *rval = TRAN_ACCEPT;
8497 8501                  return (SATA_FAILURE);
8498 8502          }
8499 8503  
8500 8504          *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8501 8505              sizeof (struct mode_page);
8502 8506  
8503 8507          /*
8504 8508           * We can enable and disable acoustice management and
8505 8509           * set the acoustic management level.
8506 8510           */
8507 8511  
8508 8512          /*
8509 8513           * Set-up Internal SET FEATURES command(s)
8510 8514           */
8511 8515          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8512 8516          scmd->satacmd_addr_type = 0;
8513 8517          scmd->satacmd_device_reg = 0;
8514 8518          scmd->satacmd_status_reg = 0;
8515 8519          scmd->satacmd_error_reg = 0;
8516 8520          scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8517 8521          if (page->acoustic_manag_enable) {
8518 8522                  scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
8519 8523                  scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
8520 8524          } else {        /* disabling acoustic management */
8521 8525                  scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
8522 8526          }
8523 8527  
8524 8528          /* Transfer command to HBA */
8525 8529          if (sata_hba_start(spx, rval) != 0)
8526 8530                  /*
8527 8531                   * Pkt not accepted for execution.
8528 8532                   */
8529 8533                  return (SATA_FAILURE);
8530 8534  
8531 8535          /* Now process return */
8532 8536          if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
8533 8537                  sata_xlate_errors(spx);
8534 8538                  return (SATA_FAILURE);
8535 8539          }
8536 8540  
8537 8541          *dmod = 1;
8538 8542  
8539 8543          return (SATA_SUCCESS);
8540 8544  }
8541 8545  
8542 8546  /*
8543 8547   * Process mode select power condition page 0x1a
8544 8548   *
8545 8549   * This function has to be called with a port mutex held.
8546 8550   *
8547 8551   * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8548 8552   *
8549 8553   * Cannot be called in the interrupt context.
8550 8554   */
8551 8555  int
8552 8556  sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
8553 8557      mode_info_power_cond *page, int parmlen, int *pagelen,
8554 8558      int *rval, int *dmod)
8555 8559  {
8556 8560          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8557 8561          sata_drive_info_t *sdinfo;
8558 8562          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8559 8563          sata_id_t *sata_id;
8560 8564          struct scsi_extended_sense *sense;
8561 8565          uint8_t ata_count;
8562 8566          int i, len;
8563 8567  
8564 8568          sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8565 8569              &spx->txlt_sata_pkt->satapkt_device);
8566 8570          sata_id = &sdinfo->satadrv_id;
8567 8571          *dmod = 0;
8568 8572  
8569 8573          len = sizeof (struct mode_info_power_cond);
8570 8574          len += sizeof (struct mode_page);
8571 8575  
8572 8576          /* If parmlen is too short or the feature is not supported, drop it */
8573 8577          if ((len < parmlen) || (page->idle == 1) ||
8574 8578              (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
8575 8579                  *scsipkt->pkt_scbp = STATUS_CHECK;
8576 8580                  sense = sata_arq_sense(spx);
8577 8581                  sense->es_key = KEY_ILLEGAL_REQUEST;
8578 8582                  sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8579 8583                  *pagelen = parmlen;
8580 8584                  *rval = TRAN_ACCEPT;
8581 8585                  return (SATA_FAILURE);
8582 8586          }
8583 8587  
8584 8588          *pagelen = len;
8585 8589  
8586 8590          /*
8587 8591           * Set-up Internal STANDBY command(s)
8588 8592           */
8589 8593          if (page->standby == 0)
8590 8594                  goto out;
8591 8595  
8592 8596          ata_count = sata_get_standby_timer(page->standby_cond_timer);
8593 8597  
8594 8598          scmd->satacmd_addr_type = 0;
8595 8599          scmd->satacmd_sec_count_lsb = ata_count;
8596 8600          scmd->satacmd_lba_low_lsb = 0;
8597 8601          scmd->satacmd_lba_mid_lsb = 0;
8598 8602          scmd->satacmd_lba_high_lsb = 0;
8599 8603          scmd->satacmd_features_reg = 0;
8600 8604          scmd->satacmd_device_reg = 0;
8601 8605          scmd->satacmd_status_reg = 0;
8602 8606          scmd->satacmd_cmd_reg = SATAC_STANDBY;
8603 8607          scmd->satacmd_flags.sata_special_regs = B_TRUE;
8604 8608          scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
8605 8609  
8606 8610          /* Transfer command to HBA */
8607 8611          if (sata_hba_start(spx, rval) != 0) {
8608 8612                  return (SATA_FAILURE);
8609 8613          } else {
8610 8614                  if ((scmd->satacmd_error_reg != 0) ||
8611 8615                      (spx->txlt_sata_pkt->satapkt_reason !=
8612 8616                      SATA_PKT_COMPLETED)) {
8613 8617                          sata_xlate_errors(spx);
8614 8618                          return (SATA_FAILURE);
8615 8619                  }
8616 8620          }
8617 8621  
8618 8622          for (i = 0; i < 4; i++) {
8619 8623                  sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
8620 8624          }
8621 8625  out:
8622 8626          *dmod = 1;
8623 8627          return (SATA_SUCCESS);
8624 8628  }
8625 8629  
8626 8630  /*
8627 8631   * sata_build_lsense_page0() is used to create the
8628 8632   * SCSI LOG SENSE page 0 (supported log pages)
8629 8633   *
8630 8634   * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
8631 8635   * (supported log pages, self-test results, informational exceptions
8632 8636   * Sun vendor specific ATA SMART data, and start stop cycle counter).
8633 8637   *
8634 8638   * Takes a sata_drive_info t * and the address of a buffer
8635 8639   * in which to create the page information.
8636 8640   *
8637 8641   * Returns the number of bytes valid in the buffer.
8638 8642   */
8639 8643  static  int
8640 8644  sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
8641 8645  {
8642 8646          struct log_parameter *lpp = (struct log_parameter *)buf;
8643 8647          uint8_t *page_ptr = (uint8_t *)lpp->param_values;
8644 8648          int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
8645 8649          sata_id_t *sata_id = &sdinfo->satadrv_id;
8646 8650  
8647 8651          lpp->param_code[0] = 0;
8648 8652          lpp->param_code[1] = 0;
8649 8653          lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
8650 8654          *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
8651 8655  
8652 8656          if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
8653 8657                  if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
8654 8658                          *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
8655 8659                          ++num_pages_supported;
8656 8660                  }
8657 8661                  *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
8658 8662                  ++num_pages_supported;
8659 8663                  *page_ptr++ = PAGE_CODE_SMART_READ_DATA;
8660 8664                  ++num_pages_supported;
8661 8665                  *page_ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
8662 8666                  ++num_pages_supported;
8663 8667          }
8664 8668  
8665 8669          lpp->param_len = num_pages_supported;
8666 8670  
8667 8671          return ((&lpp->param_values[0] - (uint8_t *)lpp) +
8668 8672              num_pages_supported);
8669 8673  }
8670 8674  
8671 8675  /*
8672 8676   * sata_build_lsense_page_10() is used to create the
8673 8677   * SCSI LOG SENSE page 0x10 (self-test results)
8674 8678   *
8675 8679   * Takes a sata_drive_info t * and the address of a buffer
8676 8680   * in which to create the page information as well as a sata_hba_inst_t *.
8677 8681   *
8678 8682   * Returns the number of bytes valid in the buffer.
8679 8683   *
8680 8684   * Note: Self test and SMART data is accessible in device log pages.
8681 8685   * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
8682 8686   * of data can be transferred by a single command), or by the General Purpose
8683 8687   * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
8684 8688   * - approximately 33MB - can be transferred by a single command.
8685 8689   * The SCT Command response (either error or command) is the same for both
8686 8690   * the SMART and GPL methods of issuing commands.
8687 8691   * This function uses READ LOG EXT command when drive supports LBA48, and
8688 8692   * SMART READ command otherwise.
8689 8693   *
8690 8694   * Since above commands are executed in a synchronous mode, this function
8691 8695   * should not be called in an interrupt context.
8692 8696   */
8693 8697  static  int
8694 8698  sata_build_lsense_page_10(
8695 8699          sata_drive_info_t *sdinfo,
8696 8700          uint8_t *buf,
8697 8701          sata_hba_inst_t *sata_hba_inst)
8698 8702  {
8699 8703          struct log_parameter *lpp = (struct log_parameter *)buf;
8700 8704          int rval;
8701 8705  
8702 8706          if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
8703 8707                  struct smart_ext_selftest_log *ext_selftest_log;
8704 8708  
8705 8709                  ext_selftest_log = kmem_zalloc(
8706 8710                      sizeof (struct smart_ext_selftest_log), KM_SLEEP);
8707 8711  
8708 8712                  rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
8709 8713                      ext_selftest_log, 0);
8710 8714                  if (rval == 0) {
8711 8715                          int index, start_index;
8712 8716                          struct smart_ext_selftest_log_entry *entry;
8713 8717                          static const struct smart_ext_selftest_log_entry empty =
8714 8718                              {0};
8715 8719                          uint16_t block_num;
8716 8720                          int count;
8717 8721                          boolean_t only_one_block = B_FALSE;
8718 8722  
8719 8723                          index = ext_selftest_log->
8720 8724                              smart_ext_selftest_log_index[0];
8721 8725                          index |= ext_selftest_log->
8722 8726                              smart_ext_selftest_log_index[1] << 8;
8723 8727                          if (index == 0)
8724 8728                                  goto out;
8725 8729  
8726 8730                          --index;        /* Correct for 0 origin */
8727 8731                          start_index = index;    /* remember where we started */
8728 8732                          block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8729 8733                          if (block_num != 0) {
8730 8734                                  rval = sata_ext_smart_selftest_read_log(
8731 8735                                      sata_hba_inst, sdinfo, ext_selftest_log,
8732 8736                                      block_num);
8733 8737                                  if (rval != 0)
8734 8738                                          goto out;
8735 8739                          }
8736 8740                          index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8737 8741                          entry =
8738 8742                              &ext_selftest_log->
8739 8743                              smart_ext_selftest_log_entries[index];
8740 8744  
8741 8745                          for (count = 1;
8742 8746                              count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8743 8747                              ++count) {
8744 8748                                  uint8_t status;
8745 8749                                  uint8_t code;
8746 8750                                  uint8_t sense_key;
8747 8751                                  uint8_t add_sense_code;
8748 8752                                  uint8_t add_sense_code_qual;
8749 8753  
8750 8754                                  /* If this is an unused entry, we are done */
8751 8755                                  if (bcmp(entry, &empty, sizeof (empty)) == 0) {
8752 8756                                          /* Broken firmware on some disks */
8753 8757                                          if (index + 1 ==
8754 8758                                              ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
8755 8759                                                  --entry;
8756 8760                                                  --index;
8757 8761                                                  if (bcmp(entry, &empty,
8758 8762                                                      sizeof (empty)) == 0)
8759 8763                                                          goto out;
8760 8764                                          } else
8761 8765                                                  goto out;
8762 8766                                  }
8763 8767  
8764 8768                                  if (only_one_block &&
8765 8769                                      start_index == index)
8766 8770                                          goto out;
8767 8771  
8768 8772                                  lpp->param_code[0] = 0;
8769 8773                                  lpp->param_code[1] = count;
8770 8774                                  lpp->param_ctrl_flags =
8771 8775                                      LOG_CTRL_LP | LOG_CTRL_LBIN;
8772 8776                                  lpp->param_len =
8773 8777                                      SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8774 8778  
8775 8779                                  status = entry->smart_ext_selftest_log_status;
8776 8780                                  status >>= 4;
8777 8781                                  switch (status) {
8778 8782                                  case 0:
8779 8783                                  default:
8780 8784                                          sense_key = KEY_NO_SENSE;
8781 8785                                          add_sense_code =
8782 8786                                              SD_SCSI_ASC_NO_ADD_SENSE;
8783 8787                                          add_sense_code_qual = 0;
8784 8788                                          break;
8785 8789                                  case 1:
8786 8790                                          sense_key = KEY_ABORTED_COMMAND;
8787 8791                                          add_sense_code =
8788 8792                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8789 8793                                          add_sense_code_qual = SCSI_COMPONENT_81;
8790 8794                                          break;
8791 8795                                  case 2:
8792 8796                                          sense_key = KEY_ABORTED_COMMAND;
8793 8797                                          add_sense_code =
8794 8798                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8795 8799                                          add_sense_code_qual = SCSI_COMPONENT_82;
8796 8800                                          break;
8797 8801                                  case 3:
8798 8802                                          sense_key = KEY_ABORTED_COMMAND;
8799 8803                                          add_sense_code =
8800 8804                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8801 8805                                          add_sense_code_qual = SCSI_COMPONENT_83;
8802 8806                                          break;
8803 8807                                  case 4:
8804 8808                                          sense_key = KEY_HARDWARE_ERROR;
8805 8809                                          add_sense_code =
8806 8810                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8807 8811                                          add_sense_code_qual = SCSI_COMPONENT_84;
8808 8812                                          break;
8809 8813                                  case 5:
8810 8814                                          sense_key = KEY_HARDWARE_ERROR;
8811 8815                                          add_sense_code =
8812 8816                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8813 8817                                          add_sense_code_qual = SCSI_COMPONENT_85;
8814 8818                                          break;
8815 8819                                  case 6:
8816 8820                                          sense_key = KEY_HARDWARE_ERROR;
8817 8821                                          add_sense_code =
8818 8822                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8819 8823                                          add_sense_code_qual = SCSI_COMPONENT_86;
8820 8824                                          break;
8821 8825                                  case 7:
8822 8826                                          sense_key = KEY_MEDIUM_ERROR;
8823 8827                                          add_sense_code =
8824 8828                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8825 8829                                          add_sense_code_qual = SCSI_COMPONENT_87;
8826 8830                                          break;
8827 8831                                  case 8:
8828 8832                                          sense_key = KEY_HARDWARE_ERROR;
8829 8833                                          add_sense_code =
8830 8834                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8831 8835                                          add_sense_code_qual = SCSI_COMPONENT_88;
8832 8836                                          break;
8833 8837                                  }
8834 8838                                  code = 0;       /* unspecified */
8835 8839                                  status |= (code << 4);
8836 8840                                  lpp->param_values[0] = status;
8837 8841                                  lpp->param_values[1] = 0; /* unspecified */
8838 8842                                  lpp->param_values[2] = entry->
8839 8843                                      smart_ext_selftest_log_timestamp[1];
8840 8844                                  lpp->param_values[3] = entry->
8841 8845                                      smart_ext_selftest_log_timestamp[0];
8842 8846                                  if (status != 0) {
8843 8847                                          lpp->param_values[4] = 0;
8844 8848                                          lpp->param_values[5] = 0;
8845 8849                                          lpp->param_values[6] = entry->
8846 8850                                              smart_ext_selftest_log_failing_lba
8847 8851                                              [5];
8848 8852                                          lpp->param_values[7] = entry->
8849 8853                                              smart_ext_selftest_log_failing_lba
8850 8854                                              [4];
8851 8855                                          lpp->param_values[8] = entry->
8852 8856                                              smart_ext_selftest_log_failing_lba
8853 8857                                              [3];
8854 8858                                          lpp->param_values[9] = entry->
8855 8859                                              smart_ext_selftest_log_failing_lba
8856 8860                                              [2];
8857 8861                                          lpp->param_values[10] = entry->
8858 8862                                              smart_ext_selftest_log_failing_lba
8859 8863                                              [1];
8860 8864                                          lpp->param_values[11] = entry->
8861 8865                                              smart_ext_selftest_log_failing_lba
8862 8866                                              [0];
8863 8867                                  } else {        /* No bad block address */
8864 8868                                          lpp->param_values[4] = 0xff;
8865 8869                                          lpp->param_values[5] = 0xff;
8866 8870                                          lpp->param_values[6] = 0xff;
8867 8871                                          lpp->param_values[7] = 0xff;
8868 8872                                          lpp->param_values[8] = 0xff;
8869 8873                                          lpp->param_values[9] = 0xff;
8870 8874                                          lpp->param_values[10] = 0xff;
8871 8875                                          lpp->param_values[11] = 0xff;
8872 8876                                  }
8873 8877  
8874 8878                                  lpp->param_values[12] = sense_key;
8875 8879                                  lpp->param_values[13] = add_sense_code;
8876 8880                                  lpp->param_values[14] = add_sense_code_qual;
8877 8881                                  lpp->param_values[15] = 0; /* undefined */
8878 8882  
8879 8883                                  lpp = (struct log_parameter *)
8880 8884                                      (((uint8_t *)lpp) +
8881 8885                                      SCSI_LOG_PARAM_HDR_LEN +
8882 8886                                      SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
8883 8887  
8884 8888                                  --index;        /* Back up to previous entry */
8885 8889                                  if (index < 0) {
8886 8890                                          if (block_num > 0) {
8887 8891                                                  --block_num;
8888 8892                                          } else {
8889 8893                                                  struct read_log_ext_directory
8890 8894                                                      logdir;
8891 8895  
8892 8896                                                  rval =
8893 8897                                                      sata_read_log_ext_directory(
8894 8898                                                      sata_hba_inst, sdinfo,
8895 8899                                                      &logdir);
8896 8900                                                  if (rval == -1)
8897 8901                                                          goto out;
8898 8902                                                  if ((logdir.read_log_ext_vers
8899 8903                                                      [0] == 0) &&
8900 8904                                                      (logdir.read_log_ext_vers
8901 8905                                                      [1] == 0))
8902 8906                                                          goto out;
8903 8907                                                  block_num =
8904 8908                                                      logdir.read_log_ext_nblks
8905 8909                                                      [EXT_SMART_SELFTEST_LOG_PAGE
8906 8910                                                      - 1][0];
8907 8911                                                  block_num |= logdir.
8908 8912                                                      read_log_ext_nblks
8909 8913                                                      [EXT_SMART_SELFTEST_LOG_PAGE
8910 8914                                                      - 1][1] << 8;
8911 8915                                                  --block_num;
8912 8916                                                  only_one_block =
8913 8917                                                      (block_num == 0);
8914 8918                                          }
8915 8919                                          rval = sata_ext_smart_selftest_read_log(
8916 8920                                              sata_hba_inst, sdinfo,
8917 8921                                              ext_selftest_log, block_num);
8918 8922                                          if (rval != 0)
8919 8923                                                  goto out;
8920 8924  
8921 8925                                          index =
8922 8926                                              ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
8923 8927                                              1;
8924 8928                                  }
8925 8929                                  index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8926 8930                                  entry = &ext_selftest_log->
8927 8931                                      smart_ext_selftest_log_entries[index];
8928 8932                          }
8929 8933                  }
8930 8934  out:
8931 8935                  kmem_free(ext_selftest_log,
8932 8936                      sizeof (struct smart_ext_selftest_log));
8933 8937          } else {
8934 8938                  struct smart_selftest_log *selftest_log;
8935 8939  
8936 8940                  selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
8937 8941                      KM_SLEEP);
8938 8942  
8939 8943                  rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
8940 8944                      selftest_log);
8941 8945  
8942 8946                  if (rval == 0) {
8943 8947                          int index;
8944 8948                          int count;
8945 8949                          struct smart_selftest_log_entry *entry;
8946 8950                          static const struct smart_selftest_log_entry empty =
8947 8951                              { 0 };
8948 8952  
8949 8953                          index = selftest_log->smart_selftest_log_index;
8950 8954                          if (index == 0)
8951 8955                                  goto done;
8952 8956                          --index;        /* Correct for 0 origin */
8953 8957                          entry = &selftest_log->
8954 8958                              smart_selftest_log_entries[index];
8955 8959                          for (count = 1;
8956 8960                              count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8957 8961                              ++count) {
8958 8962                                  uint8_t status;
8959 8963                                  uint8_t code;
8960 8964                                  uint8_t sense_key;
8961 8965                                  uint8_t add_sense_code;
8962 8966                                  uint8_t add_sense_code_qual;
8963 8967  
8964 8968                                  if (bcmp(entry, &empty, sizeof (empty)) == 0)
8965 8969                                          goto done;
8966 8970  
8967 8971                                  lpp->param_code[0] = 0;
8968 8972                                  lpp->param_code[1] = count;
8969 8973                                  lpp->param_ctrl_flags =
8970 8974                                      LOG_CTRL_LP | LOG_CTRL_LBIN;
8971 8975                                  lpp->param_len =
8972 8976                                      SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8973 8977  
8974 8978                                  status = entry->smart_selftest_log_status;
8975 8979                                  status >>= 4;
8976 8980                                  switch (status) {
8977 8981                                  case 0:
8978 8982                                  default:
8979 8983                                          sense_key = KEY_NO_SENSE;
8980 8984                                          add_sense_code =
8981 8985                                              SD_SCSI_ASC_NO_ADD_SENSE;
8982 8986                                          break;
8983 8987                                  case 1:
8984 8988                                          sense_key = KEY_ABORTED_COMMAND;
8985 8989                                          add_sense_code =
8986 8990                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8987 8991                                          add_sense_code_qual = SCSI_COMPONENT_81;
8988 8992                                          break;
8989 8993                                  case 2:
8990 8994                                          sense_key = KEY_ABORTED_COMMAND;
8991 8995                                          add_sense_code =
8992 8996                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8993 8997                                          add_sense_code_qual = SCSI_COMPONENT_82;
8994 8998                                          break;
8995 8999                                  case 3:
8996 9000                                          sense_key = KEY_ABORTED_COMMAND;
8997 9001                                          add_sense_code =
8998 9002                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
8999 9003                                          add_sense_code_qual = SCSI_COMPONENT_83;
9000 9004                                          break;
9001 9005                                  case 4:
9002 9006                                          sense_key = KEY_HARDWARE_ERROR;
9003 9007                                          add_sense_code =
9004 9008                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
9005 9009                                          add_sense_code_qual = SCSI_COMPONENT_84;
9006 9010                                          break;
9007 9011                                  case 5:
9008 9012                                          sense_key = KEY_HARDWARE_ERROR;
9009 9013                                          add_sense_code =
9010 9014                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
9011 9015                                          add_sense_code_qual = SCSI_COMPONENT_85;
9012 9016                                          break;
9013 9017                                  case 6:
9014 9018                                          sense_key = KEY_HARDWARE_ERROR;
9015 9019                                          add_sense_code =
9016 9020                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
9017 9021                                          add_sense_code_qual = SCSI_COMPONENT_86;
9018 9022                                          break;
9019 9023                                  case 7:
9020 9024                                          sense_key = KEY_MEDIUM_ERROR;
9021 9025                                          add_sense_code =
9022 9026                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
9023 9027                                          add_sense_code_qual = SCSI_COMPONENT_87;
9024 9028                                          break;
9025 9029                                  case 8:
9026 9030                                          sense_key = KEY_HARDWARE_ERROR;
9027 9031                                          add_sense_code =
9028 9032                                              DIAGNOSTIC_FAILURE_ON_COMPONENT;
9029 9033                                          add_sense_code_qual = SCSI_COMPONENT_88;
9030 9034                                          break;
9031 9035                                  }
9032 9036                                  code = 0;       /* unspecified */
9033 9037                                  status |= (code << 4);
9034 9038                                  lpp->param_values[0] = status;
9035 9039                                  lpp->param_values[1] = 0; /* unspecified */
9036 9040                                  lpp->param_values[2] = entry->
9037 9041                                      smart_selftest_log_timestamp[1];
9038 9042                                  lpp->param_values[3] = entry->
9039 9043                                      smart_selftest_log_timestamp[0];
9040 9044                                  if (status != 0) {
9041 9045                                          lpp->param_values[4] = 0;
9042 9046                                          lpp->param_values[5] = 0;
9043 9047                                          lpp->param_values[6] = 0;
9044 9048                                          lpp->param_values[7] = 0;
9045 9049                                          lpp->param_values[8] = entry->
9046 9050                                              smart_selftest_log_failing_lba[3];
9047 9051                                          lpp->param_values[9] = entry->
9048 9052                                              smart_selftest_log_failing_lba[2];
9049 9053                                          lpp->param_values[10] = entry->
9050 9054                                              smart_selftest_log_failing_lba[1];
9051 9055                                          lpp->param_values[11] = entry->
9052 9056                                              smart_selftest_log_failing_lba[0];
9053 9057                                  } else {        /* No block address */
9054 9058                                          lpp->param_values[4] = 0xff;
9055 9059                                          lpp->param_values[5] = 0xff;
9056 9060                                          lpp->param_values[6] = 0xff;
9057 9061                                          lpp->param_values[7] = 0xff;
9058 9062                                          lpp->param_values[8] = 0xff;
9059 9063                                          lpp->param_values[9] = 0xff;
9060 9064                                          lpp->param_values[10] = 0xff;
9061 9065                                          lpp->param_values[11] = 0xff;
9062 9066                                  }
9063 9067                                  lpp->param_values[12] = sense_key;
9064 9068                                  lpp->param_values[13] = add_sense_code;
9065 9069                                  lpp->param_values[14] = add_sense_code_qual;
9066 9070                                  lpp->param_values[15] = 0; /* undefined */
9067 9071  
9068 9072                                  lpp = (struct log_parameter *)
9069 9073                                      (((uint8_t *)lpp) +
9070 9074                                      SCSI_LOG_PARAM_HDR_LEN +
9071 9075                                      SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9072 9076                                  --index;        /* back up to previous entry */
9073 9077                                  if (index < 0) {
9074 9078                                          index =
9075 9079                                              NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9076 9080                                  }
9077 9081                                  entry = &selftest_log->
9078 9082                                      smart_selftest_log_entries[index];
9079 9083                          }
9080 9084                  }
9081 9085  done:
9082 9086                  kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9083 9087          }
9084 9088  
9085 9089          return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9086 9090              SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9087 9091  }
9088 9092  
9089 9093  /*
9090 9094   * sata_build_lsense_page_2f() is used to create the
9091 9095   * SCSI LOG SENSE page 0x2f (informational exceptions)
9092 9096   *
9093 9097   * Takes a sata_drive_info t * and the address of a buffer
9094 9098   * in which to create the page information as well as a sata_hba_inst_t *.
9095 9099   *
9096 9100   * Returns the number of bytes valid in the buffer.
9097 9101   *
9098 9102   * Because it invokes function(s) that send synchronously executed command
9099 9103   * to the HBA, it cannot be called in the interrupt context.
9100 9104   */
9101 9105  static  int
9102 9106  sata_build_lsense_page_2f(
9103 9107          sata_drive_info_t *sdinfo,
9104 9108          uint8_t *buf,
9105 9109          sata_hba_inst_t *sata_hba_inst)
9106 9110  {
9107 9111          struct log_parameter *lpp = (struct log_parameter *)buf;
9108 9112          int rval;
9109 9113          uint8_t *smart_data;
9110 9114          uint8_t temp;
9111 9115          sata_id_t *sata_id;
9112 9116  #define SMART_NO_TEMP   0xff
9113 9117  
9114 9118          lpp->param_code[0] = 0;
9115 9119          lpp->param_code[1] = 0;
9116 9120          lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9117 9121  
9118 9122          /* Now get the SMART status w.r.t. threshold exceeded */
9119 9123          rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9120 9124          switch (rval) {
9121 9125          case 1:
9122 9126                  lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9123 9127                  lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9124 9128                  break;
9125 9129          case 0:
9126 9130          case -1:        /* failed to get data */
9127 9131                  lpp->param_values[0] = 0;       /* No failure predicted */
9128 9132                  lpp->param_values[1] = 0;
9129 9133                  break;
9130 9134  #if defined(SATA_DEBUG)
9131 9135          default:
9132 9136                  cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9133 9137                  /* NOTREACHED */
9134 9138  #endif
9135 9139          }
9136 9140  
9137 9141          sata_id = &sdinfo->satadrv_id;
9138 9142          if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
9139 9143                  temp = SMART_NO_TEMP;
9140 9144          else {
9141 9145                  /* Now get the temperature */
9142 9146                  smart_data = kmem_zalloc(512, KM_SLEEP);
9143 9147                  rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
9144 9148                      SCT_STATUS_LOG_PAGE, 1);
9145 9149                  if (rval == -1)
9146 9150                          temp = SMART_NO_TEMP;
9147 9151                  else {
9148 9152                          temp = smart_data[200];
9149 9153                          if (temp & 0x80) {
9150 9154                                  if (temp & 0x7f)
9151 9155                                          temp = 0;
9152 9156                                  else
9153 9157                                          temp = SMART_NO_TEMP;
9154 9158                          }
9155 9159                  }
9156 9160                  kmem_free(smart_data, 512);
9157 9161          }
9158 9162  
9159 9163          lpp->param_values[2] = temp;    /* most recent temperature */
9160 9164          lpp->param_values[3] = 0;       /* required vendor specific byte */
9161 9165  
9162 9166          lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9163 9167  
9164 9168  
9165 9169          return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9166 9170  }
9167 9171  
9168 9172  /*
9169 9173   * sata_build_lsense_page_30() is used to create the
9170 9174   * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9171 9175   *
9172 9176   * Takes a sata_drive_info t * and the address of a buffer
9173 9177   * in which to create the page information as well as a sata_hba_inst_t *.
9174 9178   *
9175 9179   * Returns the number of bytes valid in the buffer.
9176 9180   */
9177 9181  static int
9178 9182  sata_build_lsense_page_30(
9179 9183          sata_drive_info_t *sdinfo,
9180 9184          uint8_t *buf,
9181 9185          sata_hba_inst_t *sata_hba_inst)
9182 9186  {
9183 9187          struct smart_data *smart_data = (struct smart_data *)buf;
9184 9188          int rval;
9185 9189  
9186 9190          /* Now do the SMART READ DATA */
9187 9191          rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9188 9192          if (rval == -1)
9189 9193                  return (0);
9190 9194  
9191 9195          return (sizeof (struct smart_data));
9192 9196  }
9193 9197  
9194 9198  /*
9195 9199   * sata_build_lsense_page_0e() is used to create the
9196 9200   * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9197 9201   *
9198 9202   * Date of Manufacture (0x0001)
9199 9203   *      YEAR = "0000"
9200 9204   *      WEEK = "00"
9201 9205   * Accounting Date (0x0002)
9202 9206   *      6 ASCII space character(20h)
9203 9207   * Specified cycle count over device lifetime
9204 9208   *      VALUE - THRESH - the delta between max and min;
9205 9209   * Accumulated start-stop cycles
9206 9210   *      VALUE - WORST - the accumulated cycles;
  
    | 
      ↓ open down ↓ | 
    4348 lines elided | 
    
      ↑ open up ↑ | 
  
9207 9211   *
9208 9212   * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9209 9213   *
9210 9214   * Takes a sata_drive_info t * and the address of a buffer
9211 9215   * in which to create the page information as well as a sata_hba_inst_t *.
9212 9216   *
9213 9217   * Returns the number of bytes valid in the buffer.
9214 9218   */
9215 9219  static  int
9216 9220  sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9217      -        sata_pkt_txlate_t *spx)
     9221 +    sata_pkt_txlate_t *spx)
9218 9222  {
9219 9223          struct start_stop_cycle_counter_log *log_page;
9220 9224          int i, rval, index;
9221 9225          uint8_t smart_data[512], id, value, worst, thresh;
9222 9226          uint32_t max_count, cycles;
9223 9227  
9224 9228          /* Now do the SMART READ DATA */
9225 9229          rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9226 9230              (struct smart_data *)smart_data);
9227 9231          if (rval == -1)
9228 9232                  return (0);
9229 9233          for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9230 9234                  index = (i * 12) + 2;
9231 9235                  id = smart_data[index];
9232 9236                  if (id != SMART_START_STOP_COUNT_ID)
9233 9237                          continue;
9234 9238                  else {
9235 9239                          thresh = smart_data[index + 2];
9236 9240                          value = smart_data[index + 3];
9237 9241                          worst = smart_data[index + 4];
9238 9242                          break;
9239 9243                  }
9240 9244          }
9241 9245          if (id != SMART_START_STOP_COUNT_ID)
9242 9246                  return (0);
9243 9247          max_count = value - thresh;
9244 9248          cycles = value - worst;
9245 9249  
9246 9250          log_page = (struct start_stop_cycle_counter_log *)buf;
9247 9251          bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9248 9252          log_page->code = 0x0e;
9249 9253          log_page->page_len_low = 0x24;
9250 9254  
9251 9255          log_page->manufactor_date_low = 0x1;
9252 9256          log_page->param_1.fmt_link = 0x1; /* 01b */
9253 9257          log_page->param_len_1 = 0x06;
9254 9258          for (i = 0; i < 4; i++) {
9255 9259                  log_page->year_manu[i] = 0x30;
9256 9260                  if (i < 2)
9257 9261                          log_page->week_manu[i] = 0x30;
9258 9262          }
9259 9263  
9260 9264          log_page->account_date_low = 0x02;
9261 9265          log_page->param_2.fmt_link = 0x01; /* 01b */
9262 9266          log_page->param_len_2 = 0x06;
9263 9267          for (i = 0; i < 4; i++) {
9264 9268                  log_page->year_account[i] = 0x20;
9265 9269                  if (i < 2)
9266 9270                          log_page->week_account[i] = 0x20;
9267 9271          }
9268 9272  
9269 9273          log_page->lifetime_code_low = 0x03;
9270 9274          log_page->param_3.fmt_link = 0x03; /* 11b */
9271 9275          log_page->param_len_3 = 0x04;
9272 9276          /* VALUE - THRESH - the delta between max and min */
9273 9277          log_page->cycle_code_low = 0x04;
9274 9278          log_page->param_4.fmt_link = 0x03; /* 11b */
9275 9279          log_page->param_len_4 = 0x04;
9276 9280          /* WORST - THRESH - the distance from 'now' to min */
9277 9281  
9278 9282          for (i = 0; i < 4; i++) {
9279 9283                  log_page->cycle_lifetime[i] =
9280 9284                      (max_count >> (8 * (3 - i))) & 0xff;
9281 9285                  log_page->cycle_accumulated[i] =
9282 9286                      (cycles >> (8 * (3 - i))) & 0xff;
9283 9287          }
9284 9288  
9285 9289          return (sizeof (struct start_stop_cycle_counter_log));
9286 9290  }
9287 9291  
9288 9292  /*
9289 9293   * This function was used for build a ATA read verify sector command
9290 9294   */
9291 9295  static void
9292 9296  sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
9293 9297  {
9294 9298          scmd->satacmd_cmd_reg = SATAC_RDVER;
9295 9299          scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9296 9300          scmd->satacmd_flags.sata_special_regs = B_TRUE;
9297 9301  
9298 9302          scmd->satacmd_sec_count_lsb = sec & 0xff;
9299 9303          scmd->satacmd_lba_low_lsb = lba & 0xff;
9300 9304          scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9301 9305          scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9302 9306          scmd->satacmd_device_reg = (SATA_ADH_LBA | (lba >> 24) & 0xf);
9303 9307          scmd->satacmd_features_reg = 0;
9304 9308          scmd->satacmd_status_reg = 0;
9305 9309          scmd->satacmd_error_reg = 0;
9306 9310  }
9307 9311  
9308 9312  /*
9309 9313   * This function was used for building an ATA
9310 9314   * command, and only command register need to
9311 9315   * be defined, other register will be zero or na.
9312 9316   */
9313 9317  static void
9314 9318  sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
9315 9319  {
9316 9320          scmd->satacmd_addr_type = 0;
9317 9321          scmd->satacmd_cmd_reg = cmd;
9318 9322          scmd->satacmd_device_reg = 0;
9319 9323          scmd->satacmd_sec_count_lsb = 0;
9320 9324          scmd->satacmd_lba_low_lsb = 0;
9321 9325          scmd->satacmd_lba_mid_lsb = 0;
9322 9326          scmd->satacmd_lba_high_lsb = 0;
9323 9327          scmd->satacmd_features_reg = 0;
9324 9328          scmd->satacmd_status_reg = 0;
9325 9329          scmd->satacmd_error_reg = 0;
9326 9330          scmd->satacmd_flags.sata_special_regs = B_TRUE;
9327 9331  }
9328 9332  
9329 9333  /*
9330 9334   * This function was used for changing the standby
9331 9335   * timer format from SCSI to ATA.
9332 9336   */
9333 9337  static uint8_t
9334 9338  sata_get_standby_timer(uint8_t *timer)
9335 9339  {
9336 9340          uint32_t i = 0, count = 0;
9337 9341          uint8_t ata_count;
9338 9342  
9339 9343          for (i = 0; i < 4; i++) {
9340 9344                  count = count << 8 | timer[i];
9341 9345          }
9342 9346  
9343 9347          if (count == 0)
9344 9348                  return (0);
9345 9349  
9346 9350          if (count >= 1 && count <= 12000)
9347 9351                  ata_count = (count -1) / 50 + 1;
9348 9352          else if (count > 12000 && count <= 12600)
9349 9353                  ata_count = 0xfc;
9350 9354          else if (count > 12601 && count <= 12750)
9351 9355                  ata_count = 0xff;
9352 9356          else if (count > 12750 && count <= 17999)
9353 9357                  ata_count = 0xf1;
9354 9358          else if (count > 18000 && count <= 198000)
9355 9359                  ata_count = count / 18000 + 240;
9356 9360          else
9357 9361                  ata_count = 0xfd;
9358 9362          return (ata_count);
9359 9363  }
9360 9364  
9361 9365  /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
9362 9366  
9363 9367  /*
9364 9368   * Start command for ATAPI device.
9365 9369   * This function processes scsi_pkt requests.
9366 9370   * Now CD/DVD, tape and ATAPI disk devices are supported.
9367 9371   * Most commands are packet without any translation into Packet Command.
9368 9372   * Some may be trapped and executed as SATA commands (not clear which one).
9369 9373   *
9370 9374   * Returns TRAN_ACCEPT if command is accepted for execution (or completed
9371 9375   * execution).
9372 9376   * Returns other TRAN_XXXX codes if command is not accepted or completed
9373 9377   * (see return values for sata_hba_start()).
9374 9378   *
9375 9379   * Note:
9376 9380   * Inquiry cdb format differs between transport version 2 and 3.
9377 9381   * However, the transport version 3 devices that were checked did not adhere
9378 9382   * to the specification (ignored MSB of the allocation length). Therefore,
9379 9383   * the transport version is not checked, but Inquiry allocation length is
9380 9384   * truncated to 255 bytes if the original allocation length set-up by the
9381 9385   * target driver is greater than 255 bytes.
9382 9386   */
9383 9387  static int
9384 9388  sata_txlt_atapi(sata_pkt_txlate_t *spx)
9385 9389  {
9386 9390          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9387 9391          sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9388 9392          struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9389 9393          sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
9390 9394          sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
9391 9395              &spx->txlt_sata_pkt->satapkt_device);
9392 9396          kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
9393 9397          int cdblen;
9394 9398          int rval, reason;
9395 9399          int synch;
9396 9400          union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
9397 9401  
9398 9402          mutex_enter(cport_mutex);
9399 9403  
9400 9404          if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
9401 9405              TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
9402 9406                  mutex_exit(cport_mutex);
9403 9407                  return (rval);
9404 9408          }
9405 9409  
9406 9410          /*
9407 9411           * ATAPI device executes some ATA commands in addition to those
9408 9412           * commands sent via PACKET command. These ATA commands may be
9409 9413           * executed by the regular SATA translation functions. None needs
9410 9414           * to be captured now.
9411 9415           *
9412 9416           * Commands sent via PACKET command include:
9413 9417           *      MMC command set for ATAPI CD/DVD device
9414 9418           *      SSC command set for ATAPI TAPE device
9415 9419           *      SBC command set for ATAPI disk device
9416 9420           *
9417 9421           */
9418 9422  
9419 9423          /* Check the size of cdb */
9420 9424  
9421 9425          switch (GETGROUP(cdbp)) {
9422 9426          case CDB_GROUPID_3:   /* Reserved, per SPC-4 */
9423 9427                  /*
9424 9428                   * opcodes 0x7e and 0x7f identify variable-length CDBs and
9425 9429                   * therefore require special handling.  Return failure, for now.
9426 9430                   */
9427 9431                  mutex_exit(cport_mutex);
9428 9432                  return (TRAN_BADPKT);
9429 9433  
9430 9434          case CDB_GROUPID_6:   /* Vendor-specific, per SPC-4 */
9431 9435          case CDB_GROUPID_7:   /* Vendor-specific, per SPC-4 */
9432 9436                  /* obtain length from the scsi_pkt */
9433 9437                  cdblen = scsipkt->pkt_cdblen;
9434 9438                  break;
9435 9439  
9436 9440          default:
9437 9441                  /* CDB's length is statically known, per SPC-4 */
9438 9442                  cdblen = scsi_cdb_size[GETGROUP(cdbp)];
9439 9443                  break;
9440 9444          }
9441 9445  
9442 9446          if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
9443 9447                  sata_log(NULL, CE_WARN,
9444 9448                      "sata: invalid ATAPI cdb length %d",
9445 9449                      cdblen);
9446 9450                  mutex_exit(cport_mutex);
9447 9451                  return (TRAN_BADPKT);
9448 9452          }
9449 9453  
9450 9454          SATAATAPITRACE(spx, cdblen);
9451 9455  
9452 9456          /*
9453 9457           * For non-read/write commands we need to
9454 9458           * map buffer
9455 9459           */
9456 9460          switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9457 9461          case SCMD_READ:
9458 9462          case SCMD_READ_G1:
9459 9463          case SCMD_READ_G5:
9460 9464          case SCMD_READ_G4:
9461 9465          case SCMD_WRITE:
9462 9466          case SCMD_WRITE_G1:
9463 9467          case SCMD_WRITE_G5:
9464 9468          case SCMD_WRITE_G4:
9465 9469                  break;
9466 9470          default:
9467 9471                  if (bp != NULL) {
9468 9472                          if (bp->b_flags & (B_PHYS | B_PAGEIO))
9469 9473                                  bp_mapin(bp);
9470 9474                  }
9471 9475                  break;
9472 9476          }
9473 9477          /*
9474 9478           * scmd->satacmd_flags.sata_data_direction default -
9475 9479           * SATA_DIR_NODATA_XFER - is set by
9476 9480           * sata_txlt_generic_pkt_info().
9477 9481           */
9478 9482          if (scmd->satacmd_bp) {
9479 9483                  if (scmd->satacmd_bp->b_flags & B_READ) {
9480 9484                          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9481 9485                  } else {
9482 9486                          scmd->satacmd_flags.sata_data_direction =
9483 9487                              SATA_DIR_WRITE;
9484 9488                  }
9485 9489          }
9486 9490  
9487 9491          /*
9488 9492           * Set up ATAPI packet command.
9489 9493           */
9490 9494  
9491 9495          sata_atapi_packet_cmd_setup(scmd, sdinfo);
9492 9496  
9493 9497          /* Copy cdb into sata_cmd */
9494 9498          scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9495 9499          bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
9496 9500          bcopy(cdbp, scmd->satacmd_acdb, cdblen);
9497 9501  
9498 9502          /* See note in the command header */
9499 9503          if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
9500 9504                  if (scmd->satacmd_acdb[3] != 0)
9501 9505                          scmd->satacmd_acdb[4] = 255;
9502 9506          }
9503 9507  
9504 9508  #ifdef SATA_DEBUG
9505 9509          if (sata_debug_flags & SATA_DBG_ATAPI) {
9506 9510                  uint8_t *p = scmd->satacmd_acdb;
9507 9511                  char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
9508 9512  
9509 9513                  (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
9510 9514                      "%02x %02x %02x %02x %02x %02x %02x %02x "
9511 9515                      "%2x %02x %02x %02x %02x %02x %02x %02x",
9512 9516                      p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9513 9517                      p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9514 9518                  buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
9515 9519                  cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
9516 9520          }
9517 9521  #endif
9518 9522  
9519 9523          /*
9520 9524           * Preset request sense data to NO SENSE.
9521 9525           * If there is no way to get error information via Request Sense,
9522 9526           * the packet request sense data would not have to be modified by HBA,
9523 9527           * but it could be returned as is.
9524 9528           */
9525 9529          bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9526 9530          sata_fixed_sense_data_preset(
9527 9531              (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9528 9532  
9529 9533          if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9530 9534                  /* Need callback function */
9531 9535                  spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
9532 9536                  synch = FALSE;
9533 9537          } else
9534 9538                  synch = TRUE;
9535 9539  
9536 9540          /* Transfer command to HBA */
9537 9541          if (sata_hba_start(spx, &rval) != 0) {
9538 9542                  /* Pkt not accepted for execution */
9539 9543                  mutex_exit(cport_mutex);
9540 9544                  return (rval);
9541 9545          }
9542 9546          mutex_exit(cport_mutex);
9543 9547          /*
9544 9548           * If execution is non-synchronous,
9545 9549           * a callback function will handle potential errors, translate
9546 9550           * the response and will do a callback to a target driver.
9547 9551           * If it was synchronous, use the same framework callback to check
9548 9552           * an execution status.
9549 9553           */
9550 9554          if (synch) {
9551 9555                  SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9552 9556                      "synchronous execution status %x\n",
9553 9557                      spx->txlt_sata_pkt->satapkt_reason);
9554 9558                  sata_txlt_atapi_completion(spx->txlt_sata_pkt);
9555 9559          }
9556 9560          return (TRAN_ACCEPT);
9557 9561  }
9558 9562  
9559 9563  
9560 9564  /*
9561 9565   * ATAPI Packet command completion.
9562 9566   *
9563 9567   * Failure of the command passed via Packet command are considered device
9564 9568   * error. SATA HBA driver would have to retrieve error data (via Request
9565 9569   * Sense command delivered via error retrieval sata packet) and copy it
9566 9570   * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
9567 9571   */
9568 9572  static void
9569 9573  sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
9570 9574  {
9571 9575          sata_pkt_txlate_t *spx =
9572 9576              (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9573 9577          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9574 9578          struct scsi_extended_sense *sense;
9575 9579          struct buf *bp;
9576 9580          int rval;
9577 9581  
9578 9582  #ifdef SATA_DEBUG
9579 9583          uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
9580 9584  #endif
9581 9585  
9582 9586          scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9583 9587              STATE_SENT_CMD | STATE_GOT_STATUS;
9584 9588  
9585 9589          if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9586 9590                  /* Normal completion */
9587 9591                  if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
9588 9592                          scsipkt->pkt_state |= STATE_XFERRED_DATA;
9589 9593                  scsipkt->pkt_reason = CMD_CMPLT;
9590 9594                  *scsipkt->pkt_scbp = STATUS_GOOD;
9591 9595                  if (spx->txlt_tmp_buf != NULL) {
9592 9596                          /* Temporary buffer was used */
9593 9597                          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9594 9598                          if (bp->b_flags & B_READ) {
9595 9599                                  rval = ddi_dma_sync(
9596 9600                                      spx->txlt_buf_dma_handle, 0, 0,
9597 9601                                      DDI_DMA_SYNC_FORCPU);
9598 9602                                  ASSERT(rval == DDI_SUCCESS);
9599 9603                                  bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
9600 9604                                      bp->b_bcount);
9601 9605                          }
9602 9606                  }
9603 9607          } else {
9604 9608                  /*
9605 9609                   * Something went wrong - analyze return
9606 9610                   */
9607 9611                  *scsipkt->pkt_scbp = STATUS_CHECK;
9608 9612                  sense = sata_arq_sense(spx);
9609 9613  
9610 9614                  if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9611 9615                          /*
9612 9616                           * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
9613 9617                           * Under this condition ERR bit is set for ATA command,
9614 9618                           * and CHK bit set for ATAPI command.
9615 9619                           *
9616 9620                           * Please check st_intr & sdintr about how pkt_reason
9617 9621                           * is used.
9618 9622                           */
9619 9623                          scsipkt->pkt_reason = CMD_CMPLT;
9620 9624  
9621 9625                          /*
9622 9626                           * We may not have ARQ data if there was a double
9623 9627                           * error. But sense data in sata packet was pre-set
9624 9628                           * with NO SENSE so it is valid even if HBA could
9625 9629                           * not retrieve a real sense data.
9626 9630                           * Just copy this sense data into scsi pkt sense area.
9627 9631                           */
9628 9632                          bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
9629 9633                              SATA_ATAPI_MIN_RQSENSE_LEN);
9630 9634  #ifdef SATA_DEBUG
9631 9635                          if (sata_debug_flags & SATA_DBG_SCSI_IF) {
9632 9636                                  sata_log(spx->txlt_sata_hba_inst, CE_WARN,
9633 9637                                      "sata_txlt_atapi_completion: %02x\n"
9634 9638                                      "RQSENSE:  %02x %02x %02x %02x %02x %02x "
9635 9639                                      "          %02x %02x %02x %02x %02x %02x "
9636 9640                                      "          %02x %02x %02x %02x %02x %02x\n",
9637 9641                                      scsipkt->pkt_reason,
9638 9642                                      rqsp[0], rqsp[1], rqsp[2], rqsp[3],
9639 9643                                      rqsp[4], rqsp[5], rqsp[6], rqsp[7],
9640 9644                                      rqsp[8], rqsp[9], rqsp[10], rqsp[11],
9641 9645                                      rqsp[12], rqsp[13], rqsp[14], rqsp[15],
9642 9646                                      rqsp[16], rqsp[17]);
9643 9647                          }
9644 9648  #endif
9645 9649                  } else {
9646 9650                          switch (sata_pkt->satapkt_reason) {
9647 9651                          case SATA_PKT_PORT_ERROR:
9648 9652                                  /*
9649 9653                                   * We have no device data.
9650 9654                                   */
9651 9655                                  scsipkt->pkt_reason = CMD_INCOMPLETE;
9652 9656                                  scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9653 9657                                      STATE_GOT_TARGET | STATE_SENT_CMD |
9654 9658                                      STATE_GOT_STATUS);
9655 9659                                  sense->es_key = KEY_HARDWARE_ERROR;
9656 9660                                  break;
9657 9661  
9658 9662                          case SATA_PKT_TIMEOUT:
9659 9663                                  scsipkt->pkt_reason = CMD_TIMEOUT;
9660 9664                                  scsipkt->pkt_statistics |=
9661 9665                                      STAT_TIMEOUT | STAT_DEV_RESET;
9662 9666                                  /*
9663 9667                                   * Need to check if HARDWARE_ERROR/
9664 9668                                   * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
9665 9669                                   * appropriate.
9666 9670                                   */
9667 9671                                  break;
9668 9672  
9669 9673                          case SATA_PKT_ABORTED:
9670 9674                                  scsipkt->pkt_reason = CMD_ABORTED;
9671 9675                                  scsipkt->pkt_statistics |= STAT_ABORTED;
9672 9676                                  /* Should we set key COMMAND_ABPRTED? */
9673 9677                                  break;
9674 9678  
9675 9679                          case SATA_PKT_RESET:
9676 9680                                  scsipkt->pkt_reason = CMD_RESET;
9677 9681                                  scsipkt->pkt_statistics |= STAT_DEV_RESET;
9678 9682                                  /*
9679 9683                                   * May be we should set Unit Attention /
9680 9684                                   * Reset. Perhaps the same should be
9681 9685                                   * returned for disks....
9682 9686                                   */
9683 9687                                  sense->es_key = KEY_UNIT_ATTENTION;
9684 9688                                  sense->es_add_code = SD_SCSI_ASC_RESET;
9685 9689                                  break;
9686 9690  
9687 9691                          default:
9688 9692                                  SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9689 9693                                      "sata_txlt_atapi_completion: "
9690 9694                                      "invalid packet completion reason"));
9691 9695                                  scsipkt->pkt_reason = CMD_TRAN_ERR;
9692 9696                                  scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9693 9697                                      STATE_GOT_TARGET | STATE_SENT_CMD |
9694 9698                                      STATE_GOT_STATUS);
9695 9699                                  break;
9696 9700                          }
9697 9701                  }
9698 9702          }
9699 9703  
9700 9704          SATAATAPITRACE(spx, 0);
9701 9705  
9702 9706          if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9703 9707              scsipkt->pkt_comp != NULL) {
9704 9708                  /* scsi callback required */
9705 9709                  (*scsipkt->pkt_comp)(scsipkt);
9706 9710          }
9707 9711  }
9708 9712  
9709 9713  /*
9710 9714   * Set up error retrieval sata command for ATAPI Packet Command error data
9711 9715   * recovery.
9712 9716   *
9713 9717   * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
9714 9718   * returns SATA_FAILURE otherwise.
9715 9719   */
9716 9720  
9717 9721  static int
9718 9722  sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
9719 9723  {
9720 9724          sata_pkt_t *spkt = spx->txlt_sata_pkt;
9721 9725          sata_cmd_t *scmd;
9722 9726          struct buf *bp;
9723 9727  
9724 9728          /*
9725 9729           * Allocate dma-able buffer error data.
9726 9730           * Buffer allocation will take care of buffer alignment and other DMA
9727 9731           * attributes.
9728 9732           */
9729 9733          bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
9730 9734          if (bp == NULL) {
9731 9735                  SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
9732 9736                      "sata_get_err_retrieval_pkt: "
9733 9737                      "cannot allocate buffer for error data", NULL);
9734 9738                  return (SATA_FAILURE);
9735 9739          }
9736 9740          bp_mapin(bp); /* make data buffer accessible */
9737 9741  
9738 9742          /* Operation modes are up to the caller */
9739 9743          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9740 9744  
9741 9745          /* Synchronous mode, no callback - may be changed by the caller */
9742 9746          spkt->satapkt_comp = NULL;
9743 9747          spkt->satapkt_time = sata_default_pkt_time;
9744 9748  
9745 9749          scmd = &spkt->satapkt_cmd;
9746 9750          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9747 9751          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9748 9752  
9749 9753          sata_atapi_packet_cmd_setup(scmd, sdinfo);
9750 9754  
9751 9755          /*
9752 9756           * Set-up acdb. Request Sense CDB (packet command content) is
9753 9757           * not in DMA-able buffer. Its handling is HBA-specific (how
9754 9758           * it is transfered into packet FIS).
9755 9759           */
9756 9760          scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9757 9761          bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
9758 9762          /* Following zeroing of pad bytes may not be necessary */
9759 9763          bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
9760 9764              sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
9761 9765  
9762 9766          /*
9763 9767           * Set-up pointer to the buffer handle, so HBA can sync buffer
9764 9768           * before accessing it. Handle is in usual place in translate struct.
9765 9769           */
9766 9770          scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
9767 9771  
9768 9772          /*
9769 9773           * Preset request sense data to NO SENSE.
9770 9774           * Here it is redundant, only for a symetry with scsi-originated
9771 9775           * packets. It should not be used for anything but debugging.
9772 9776           */
9773 9777          bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9774 9778          sata_fixed_sense_data_preset(
9775 9779              (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9776 9780  
9777 9781          ASSERT(scmd->satacmd_num_dma_cookies != 0);
9778 9782          ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9779 9783  
9780 9784          return (SATA_SUCCESS);
9781 9785  }
9782 9786  
9783 9787  /*
9784 9788   * Set-up ATAPI packet command.
9785 9789   * Data transfer direction has to be set-up in sata_cmd structure prior to
9786 9790   * calling this function.
9787 9791   *
9788 9792   * Returns void
9789 9793   */
9790 9794  
9791 9795  static void
9792 9796  sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
9793 9797  {
9794 9798          scmd->satacmd_addr_type = 0;            /* N/A */
9795 9799          scmd->satacmd_sec_count_lsb = 0;        /* no tag */
9796 9800          scmd->satacmd_lba_low_lsb = 0;          /* N/A */
9797 9801          scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
9798 9802          scmd->satacmd_lba_high_lsb =
9799 9803              (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
9800 9804          scmd->satacmd_cmd_reg = SATAC_PACKET;   /* Command */
9801 9805  
9802 9806          /*
9803 9807           * We want all data to be transfered via DMA.
9804 9808           * But specify it only if drive supports DMA and DMA mode is
9805 9809           * selected - some drives are sensitive about it.
9806 9810           * Hopefully it wil work for all drives....
9807 9811           */
9808 9812          if (sdinfo->satadrv_settings & SATA_DEV_DMA)
9809 9813                  scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
9810 9814  
9811 9815          /*
9812 9816           * Features register requires special care for devices that use
9813 9817           * Serial ATA bridge - they need an explicit specification of
9814 9818           * the data transfer direction for Packet DMA commands.
9815 9819           * Setting this bit is harmless if DMA is not used.
9816 9820           *
9817 9821           * Many drives do not implement word 80, specifying what ATA/ATAPI
9818 9822           * spec they follow.
9819 9823           * We are arbitrarily following the latest SerialATA 2.6 spec,
9820 9824           * which uses ATA/ATAPI 6 specification for Identify Data, unless
9821 9825           * ATA/ATAPI-7 support is explicitly indicated.
9822 9826           */
9823 9827          if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9824 9828              sdinfo->satadrv_id.ai_majorversion != 0xffff &&
9825 9829              (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
9826 9830                  /*
9827 9831                   * Specification of major version is valid and version 7
9828 9832                   * is supported. It does automatically imply that all
9829 9833                   * spec features are supported. For now, we assume that
9830 9834                   * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
9831 9835                   */
9832 9836                  if ((sdinfo->satadrv_id.ai_dirdma &
9833 9837                      SATA_ATAPI_ID_DMADIR_REQ) != 0) {
9834 9838                          if (scmd->satacmd_flags.sata_data_direction ==
9835 9839                              SATA_DIR_READ)
9836 9840                          scmd->satacmd_features_reg |=
9837 9841                              SATA_ATAPI_F_DATA_DIR_READ;
9838 9842                  }
9839 9843          }
9840 9844  }
9841 9845  
9842 9846  
9843 9847  #ifdef SATA_DEBUG
9844 9848  
9845 9849  /* Display 18 bytes of Inquiry data */
9846 9850  static void
9847 9851  sata_show_inqry_data(uint8_t *buf)
9848 9852  {
9849 9853          struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9850 9854          uint8_t *p;
9851 9855  
9852 9856          cmn_err(CE_NOTE, "Inquiry data:");
9853 9857          cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
9854 9858          cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
9855 9859          cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
9856 9860          cmn_err(CE_NOTE, "ATAPI transport version %d",
9857 9861              SATA_ATAPI_TRANS_VERSION(inq));
9858 9862          cmn_err(CE_NOTE, "response data format %d, aenc %d",
9859 9863              inq->inq_rdf, inq->inq_aenc);
9860 9864          cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
9861 9865          cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
9862 9866          p = (uint8_t *)inq->inq_vid;
9863 9867          cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
9864 9868              "%02x %02x %02x %02x",
9865 9869              p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9866 9870          p = (uint8_t *)inq->inq_vid;
9867 9871          cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
9868 9872              p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9869 9873  
9870 9874          p = (uint8_t *)inq->inq_pid;
9871 9875          cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
9872 9876              "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
9873 9877              p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9874 9878              p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9875 9879          p = (uint8_t *)inq->inq_pid;
9876 9880          cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
9877 9881              "%c %c %c %c %c %c %c %c",
9878 9882              p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9879 9883              p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9880 9884  
9881 9885          p = (uint8_t *)inq->inq_revision;
9882 9886          cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
9883 9887              p[0], p[1], p[2], p[3]);
9884 9888          p = (uint8_t *)inq->inq_revision;
9885 9889          cmn_err(CE_NOTE, "revision: %c %c %c %c",
9886 9890              p[0], p[1], p[2], p[3]);
9887 9891  
9888 9892  }
9889 9893  
9890 9894  
9891 9895  static void
9892 9896  sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
9893 9897  {
9894 9898          struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
9895 9899  
9896 9900          if (scsi_pkt == NULL)
9897 9901                  return;
9898 9902          if (count != 0) {
9899 9903                  /* saving cdb */
9900 9904                  bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
9901 9905                      SATA_ATAPI_MAX_CDB_LEN);
9902 9906                  bcopy(scsi_pkt->pkt_cdbp,
9903 9907                      sata_atapi_trace[sata_atapi_trace_index].acdb, count);
9904 9908          } else {
9905 9909                  bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
9906 9910                      sts_sensedata,
9907 9911                      sata_atapi_trace[sata_atapi_trace_index].arqs,
9908 9912                      SATA_ATAPI_MIN_RQSENSE_LEN);
9909 9913                  sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
9910 9914                      scsi_pkt->pkt_reason;
9911 9915                  sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
9912 9916                      spx->txlt_sata_pkt->satapkt_reason;
9913 9917  
9914 9918                  if (++sata_atapi_trace_index >= 64)
9915 9919                          sata_atapi_trace_index = 0;
9916 9920          }
9917 9921  }
9918 9922  
9919 9923  #endif
9920 9924  
9921 9925  /*
9922 9926   * Fetch inquiry data from ATAPI device
9923 9927   * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9924 9928   *
9925 9929   * Note:
9926 9930   * inqb pointer does not point to a DMA-able buffer. It is a local buffer
9927 9931   * where the caller expects to see the inquiry data.
9928 9932   *
9929 9933   */
9930 9934  
9931 9935  static int
9932 9936  sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
9933 9937      sata_address_t *saddr, struct scsi_inquiry *inq)
9934 9938  {
9935 9939          sata_pkt_txlate_t *spx;
9936 9940          sata_pkt_t *spkt;
9937 9941          struct buf *bp;
9938 9942          sata_drive_info_t *sdinfo;
9939 9943          sata_cmd_t *scmd;
9940 9944          int rval;
9941 9945          uint8_t *rqsp;
9942 9946          dev_info_t *dip = SATA_DIP(sata_hba);
9943 9947  #ifdef SATA_DEBUG
9944 9948          char msg_buf[MAXPATHLEN];
9945 9949  #endif
9946 9950          kmutex_t *cport_mutex;
9947 9951  
9948 9952          ASSERT(sata_hba != NULL);
9949 9953  
9950 9954          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9951 9955          spx->txlt_sata_hba_inst = sata_hba;
9952 9956          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
9953 9957          spkt = sata_pkt_alloc(spx, NULL);
9954 9958          if (spkt == NULL) {
9955 9959                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
9956 9960                  return (SATA_FAILURE);
9957 9961          }
9958 9962          /* address is needed now */
9959 9963          spkt->satapkt_device.satadev_addr = *saddr;
9960 9964  
9961 9965          /* scsi_inquiry size buffer */
9962 9966          bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
9963 9967          if (bp == NULL) {
9964 9968                  sata_pkt_free(spx);
9965 9969                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
9966 9970                  SATA_LOG_D((sata_hba, CE_WARN,
9967 9971                      "sata_get_atapi_inquiry_data: "
9968 9972                      "cannot allocate data buffer"));
9969 9973                  return (SATA_FAILURE);
9970 9974          }
9971 9975          bp_mapin(bp); /* make data buffer accessible */
9972 9976  
9973 9977          scmd = &spkt->satapkt_cmd;
9974 9978          ASSERT(scmd->satacmd_num_dma_cookies != 0);
9975 9979          ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9976 9980  
9977 9981          /* Use synchronous mode */
9978 9982          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9979 9983          spkt->satapkt_comp = NULL;
9980 9984          spkt->satapkt_time = sata_default_pkt_time;
9981 9985  
9982 9986          /* Issue inquiry command - 6 bytes cdb, data transfer, read */
9983 9987  
9984 9988          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9985 9989          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9986 9990  
9987 9991          cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
9988 9992          mutex_enter(cport_mutex);
9989 9993          sdinfo = sata_get_device_info(sata_hba,
9990 9994              &spx->txlt_sata_pkt->satapkt_device);
9991 9995          if (sdinfo == NULL) {
9992 9996                  /* we have to be carefull about the disapearing device */
9993 9997                  mutex_exit(cport_mutex);
9994 9998                  rval = SATA_FAILURE;
9995 9999                  goto cleanup;
9996 10000          }
9997 10001          sata_atapi_packet_cmd_setup(scmd, sdinfo);
9998 10002  
9999 10003          /*
10000 10004           * Set-up acdb. This works for atapi transport version 2 and later.
10001 10005           */
10002 10006          scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10003 10007          bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10004 10008          scmd->satacmd_acdb[0] = 0x12;   /* Inquiry */
10005 10009          scmd->satacmd_acdb[1] = 0x00;
10006 10010          scmd->satacmd_acdb[2] = 0x00;
10007 10011          scmd->satacmd_acdb[3] = 0x00;
10008 10012          scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10009 10013          scmd->satacmd_acdb[5] = 0x00;
10010 10014  
10011 10015          sata_fixed_sense_data_preset(
10012 10016              (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10013 10017  
10014 10018          /* Transfer command to HBA */
10015 10019          if (sata_hba_start(spx, &rval) != 0) {
10016 10020                  /* Pkt not accepted for execution */
10017 10021                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10018 10022                      "sata_get_atapi_inquiry_data: "
10019 10023                      "Packet not accepted for execution - ret: %02x", rval);
10020 10024                  mutex_exit(cport_mutex);
10021 10025                  rval = SATA_FAILURE;
10022 10026                  goto cleanup;
10023 10027          }
10024 10028          mutex_exit(cport_mutex);
10025 10029  
10026 10030          if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10027 10031                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10028 10032                      "sata_get_atapi_inquiry_data: "
10029 10033                      "Packet completed successfully - ret: %02x", rval);
10030 10034                  if (spx->txlt_buf_dma_handle != NULL) {
10031 10035                          /*
10032 10036                           * Sync buffer. Handle is in usual place in translate
10033 10037                           * struct.
10034 10038                           */
10035 10039                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10036 10040                              DDI_DMA_SYNC_FORCPU);
10037 10041                          ASSERT(rval == DDI_SUCCESS);
10038 10042                  }
10039 10043  
10040 10044                  if (sata_check_for_dma_error(dip, spx)) {
10041 10045                          ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10042 10046                          rval = SATA_FAILURE;
10043 10047                  } else {
10044 10048                          /*
10045 10049                           * Normal completion - copy data into caller's buffer
10046 10050                           */
10047 10051                          bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10048 10052                              sizeof (struct scsi_inquiry));
10049 10053  #ifdef SATA_DEBUG
10050 10054                          if (sata_debug_flags & SATA_DBG_ATAPI) {
10051 10055                                  sata_show_inqry_data((uint8_t *)inq);
10052 10056                          }
10053 10057  #endif
10054 10058                          rval = SATA_SUCCESS;
10055 10059                  }
10056 10060          } else {
10057 10061                  /*
10058 10062                   * Something went wrong - analyze return - check rqsense data
10059 10063                   */
10060 10064                  rval = SATA_FAILURE;
10061 10065                  if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10062 10066                          /*
10063 10067                           * ARQ data hopefull show something other than NO SENSE
10064 10068                           */
10065 10069                          rqsp = scmd->satacmd_rqsense;
10066 10070  #ifdef SATA_DEBUG
10067 10071                          if (sata_debug_flags & SATA_DBG_ATAPI) {
10068 10072                                  msg_buf[0] = '\0';
10069 10073                                  (void) snprintf(msg_buf, MAXPATHLEN,
10070 10074                                      "ATAPI packet completion reason: %02x\n"
10071 10075                                      "RQSENSE:  %02x %02x %02x %02x %02x %02x\n"
10072 10076                                      "          %02x %02x %02x %02x %02x %02x\n"
10073 10077                                      "          %02x %02x %02x %02x %02x %02x",
10074 10078                                      spkt->satapkt_reason,
10075 10079                                      rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10076 10080                                      rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10077 10081                                      rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10078 10082                                      rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10079 10083                                      rqsp[16], rqsp[17]);
10080 10084                                  sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10081 10085                                      "%s", msg_buf);
10082 10086                          }
10083 10087  #endif
10084 10088                  } else {
10085 10089                          switch (spkt->satapkt_reason) {
10086 10090                          case SATA_PKT_PORT_ERROR:
10087 10091                                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10088 10092                                      "sata_get_atapi_inquiry_data: "
10089 10093                                      "packet reason: port error", NULL);
10090 10094                                  break;
10091 10095  
10092 10096                          case SATA_PKT_TIMEOUT:
10093 10097                                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10094 10098                                      "sata_get_atapi_inquiry_data: "
10095 10099                                      "packet reason: timeout", NULL);
10096 10100                                  break;
10097 10101  
10098 10102                          case SATA_PKT_ABORTED:
10099 10103                                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10100 10104                                      "sata_get_atapi_inquiry_data: "
10101 10105                                      "packet reason: aborted", NULL);
10102 10106                                  break;
10103 10107  
10104 10108                          case SATA_PKT_RESET:
10105 10109                                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10106 10110                                      "sata_get_atapi_inquiry_data: "
10107 10111                                      "packet reason: reset\n", NULL);
10108 10112                                  break;
10109 10113                          default:
10110 10114                                  SATADBG1(SATA_DBG_ATAPI, sata_hba,
10111 10115                                      "sata_get_atapi_inquiry_data: "
10112 10116                                      "invalid packet reason: %02x\n",
10113 10117                                      spkt->satapkt_reason);
10114 10118                                  break;
10115 10119                          }
10116 10120                  }
10117 10121          }
10118 10122  cleanup:
10119 10123          sata_free_local_buffer(spx);
10120 10124          sata_pkt_free(spx);
10121 10125          kmem_free(spx, sizeof (sata_pkt_txlate_t));
10122 10126          return (rval);
10123 10127  }
10124 10128  
10125 10129  
10126 10130  
10127 10131  
10128 10132  
10129 10133  #if 0
10130 10134  #ifdef SATA_DEBUG
10131 10135  
10132 10136  /*
10133 10137   * Test ATAPI packet command.
10134 10138   * Single threaded test: send packet command in synch mode, process completion
10135 10139   *
10136 10140   */
10137 10141  static void
10138 10142  sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
10139 10143  {
10140 10144          sata_pkt_txlate_t *spx;
10141 10145          sata_pkt_t *spkt;
10142 10146          struct buf *bp;
10143 10147          sata_device_t sata_device;
10144 10148          sata_drive_info_t *sdinfo;
10145 10149          sata_cmd_t *scmd;
10146 10150          int rval;
10147 10151          uint8_t *rqsp;
10148 10152  
10149 10153          ASSERT(sata_hba_inst != NULL);
10150 10154          sata_device.satadev_addr.cport = cport;
10151 10155          sata_device.satadev_addr.pmport = 0;
10152 10156          sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
10153 10157          sata_device.satadev_rev = SATA_DEVICE_REV;
10154 10158          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10155 10159          sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10156 10160          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10157 10161          if (sdinfo == NULL) {
10158 10162                  sata_log(sata_hba_inst, CE_WARN,
10159 10163                      "sata_test_atapi_packet_command: "
10160 10164                      "no device info for cport %d",
10161 10165                      sata_device.satadev_addr.cport);
10162 10166                  return;
10163 10167          }
10164 10168  
10165 10169          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10166 10170          spx->txlt_sata_hba_inst = sata_hba_inst;
10167 10171          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
10168 10172          spkt = sata_pkt_alloc(spx, NULL);
10169 10173          if (spkt == NULL) {
10170 10174                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
10171 10175                  return;
10172 10176          }
10173 10177          /* address is needed now */
10174 10178          spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
10175 10179  
10176 10180          /* 1024k buffer */
10177 10181          bp = sata_alloc_local_buffer(spx, 1024);
10178 10182          if (bp == NULL) {
10179 10183                  sata_pkt_free(spx);
10180 10184                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
10181 10185                  sata_log(sata_hba_inst, CE_WARN,
10182 10186                      "sata_test_atapi_packet_command: "
10183 10187                      "cannot allocate data buffer");
10184 10188                  return;
10185 10189          }
10186 10190          bp_mapin(bp); /* make data buffer accessible */
10187 10191  
10188 10192          scmd = &spkt->satapkt_cmd;
10189 10193          ASSERT(scmd->satacmd_num_dma_cookies != 0);
10190 10194          ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10191 10195  
10192 10196          /* Use synchronous mode */
10193 10197          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10194 10198  
10195 10199          /* Synchronous mode, no callback - may be changed by the caller */
10196 10200          spkt->satapkt_comp = NULL;
10197 10201          spkt->satapkt_time = sata_default_pkt_time;
10198 10202  
10199 10203          /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10200 10204  
10201 10205          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10202 10206          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10203 10207  
10204 10208          sata_atapi_packet_cmd_setup(scmd, sdinfo);
10205 10209  
10206 10210          /* Set-up acdb. */
10207 10211          scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10208 10212          bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10209 10213          scmd->satacmd_acdb[0] = 0x12;   /* Inquiry */
10210 10214          scmd->satacmd_acdb[1] = 0x00;
10211 10215          scmd->satacmd_acdb[2] = 0x00;
10212 10216          scmd->satacmd_acdb[3] = 0x00;
10213 10217          scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10214 10218          scmd->satacmd_acdb[5] = 0x00;
10215 10219  
10216 10220          sata_fixed_sense_data_preset(
10217 10221              (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10218 10222  
10219 10223          /* Transfer command to HBA */
10220 10224          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10221 10225          if (sata_hba_start(spx, &rval) != 0) {
10222 10226                  /* Pkt not accepted for execution */
10223 10227                  sata_log(sata_hba_inst, CE_WARN,
10224 10228                      "sata_test_atapi_packet_command: "
10225 10229                      "Packet not accepted for execution - ret: %02x", rval);
10226 10230                  mutex_exit(
10227 10231                      &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10228 10232                  goto cleanup;
10229 10233          }
10230 10234          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10231 10235  
10232 10236          if (spx->txlt_buf_dma_handle != NULL) {
10233 10237                  /*
10234 10238                   * Sync buffer. Handle is in usual place in translate struct.
10235 10239                   */
10236 10240                  rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10237 10241                      DDI_DMA_SYNC_FORCPU);
10238 10242                  ASSERT(rval == DDI_SUCCESS);
10239 10243          }
10240 10244          if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10241 10245                  sata_log(sata_hba_inst, CE_WARN,
10242 10246                      "sata_test_atapi_packet_command: "
10243 10247                      "Packet completed successfully");
10244 10248                  /*
10245 10249                   * Normal completion - show inquiry data
10246 10250                   */
10247 10251                  sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
10248 10252          } else {
10249 10253                  /*
10250 10254                   * Something went wrong - analyze return - check rqsense data
10251 10255                   */
10252 10256                  if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10253 10257                          /*
10254 10258                           * ARQ data hopefull show something other than NO SENSE
10255 10259                           */
10256 10260                          rqsp = scmd->satacmd_rqsense;
10257 10261                          sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10258 10262                              "ATAPI packet completion reason: %02x\n"
10259 10263                              "RQSENSE:  %02x %02x %02x %02x %02x %02x "
10260 10264                              "          %02x %02x %02x %02x %02x %02x "
10261 10265                              "          %02x %02x %02x %02x %02x %02x\n",
10262 10266                              spkt->satapkt_reason,
10263 10267                              rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10264 10268                              rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10265 10269                              rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10266 10270                              rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10267 10271                              rqsp[16], rqsp[17]);
10268 10272                  } else {
10269 10273                          switch (spkt->satapkt_reason) {
10270 10274                          case SATA_PKT_PORT_ERROR:
10271 10275                                  sata_log(sata_hba_inst, CE_WARN,
10272 10276                                      "sata_test_atapi_packet_command: "
10273 10277                                      "packet reason: port error\n");
10274 10278                                  break;
10275 10279  
10276 10280                          case SATA_PKT_TIMEOUT:
10277 10281                                  sata_log(sata_hba_inst, CE_WARN,
10278 10282                                      "sata_test_atapi_packet_command: "
10279 10283                                      "packet reason: timeout\n");
10280 10284                                  break;
10281 10285  
10282 10286                          case SATA_PKT_ABORTED:
10283 10287                                  sata_log(sata_hba_inst, CE_WARN,
10284 10288                                      "sata_test_atapi_packet_command: "
10285 10289                                      "packet reason: aborted\n");
10286 10290                                  break;
10287 10291  
10288 10292                          case SATA_PKT_RESET:
10289 10293                                  sata_log(sata_hba_inst, CE_WARN,
10290 10294                                      "sata_test_atapi_packet_command: "
10291 10295                                      "packet reason: reset\n");
10292 10296                                  break;
10293 10297                          default:
10294 10298                                  sata_log(sata_hba_inst, CE_WARN,
10295 10299                                      "sata_test_atapi_packet_command: "
10296 10300                                      "invalid packet reason: %02x\n",
10297 10301                                      spkt->satapkt_reason);
10298 10302                                  break;
10299 10303                          }
10300 10304                  }
10301 10305          }
10302 10306  cleanup:
10303 10307          sata_free_local_buffer(spx);
10304 10308          sata_pkt_free(spx);
10305 10309          kmem_free(spx, sizeof (sata_pkt_txlate_t));
10306 10310  }
10307 10311  
10308 10312  #endif /* SATA_DEBUG */
10309 10313  #endif /* 1 */
10310 10314  
10311 10315  
10312 10316  /* ************************** LOCAL HELPER FUNCTIONS *********************** */
10313 10317  
10314 10318  /*
10315 10319   * Validate sata_tran info
10316 10320   * SATA_FAILURE returns if structure is inconsistent or structure revision
10317 10321   * does not match one used by the framework.
10318 10322   *
10319 10323   * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
10320 10324   * required function pointers.
10321 10325   * Returns SATA_FAILURE otherwise.
10322 10326   */
10323 10327  static int
10324 10328  sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
10325 10329  {
10326 10330          /*
10327 10331           * SATA_TRAN_HBA_REV is the current (highest) revision number
10328 10332           * of the SATA interface.
10329 10333           */
10330 10334          if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
10331 10335                  sata_log(NULL, CE_WARN,
10332 10336                      "sata: invalid sata_hba_tran version %d for driver %s",
10333 10337                      sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
10334 10338                  return (SATA_FAILURE);
10335 10339          }
10336 10340  
10337 10341          if (dip != sata_tran->sata_tran_hba_dip) {
10338 10342                  SATA_LOG_D((NULL, CE_WARN,
10339 10343                      "sata: inconsistent sata_tran_hba_dip "
10340 10344                      "%p / %p", sata_tran->sata_tran_hba_dip, dip));
10341 10345                  return (SATA_FAILURE);
10342 10346          }
10343 10347  
10344 10348          if (sata_tran->sata_tran_probe_port == NULL ||
10345 10349              sata_tran->sata_tran_start == NULL ||
10346 10350              sata_tran->sata_tran_abort == NULL ||
10347 10351              sata_tran->sata_tran_reset_dport == NULL ||
10348 10352              sata_tran->sata_tran_hotplug_ops == NULL ||
10349 10353              sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
10350 10354              sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
10351 10355              NULL) {
10352 10356                  SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
10353 10357                      "required functions"));
10354 10358          }
10355 10359          return (SATA_SUCCESS);
10356 10360  }
10357 10361  
10358 10362  /*
10359 10363   * Remove HBA instance from sata_hba_list.
10360 10364   */
10361 10365  static void
10362 10366  sata_remove_hba_instance(dev_info_t *dip)
10363 10367  {
10364 10368          sata_hba_inst_t *sata_hba_inst;
10365 10369  
10366 10370          mutex_enter(&sata_mutex);
10367 10371          for (sata_hba_inst = sata_hba_list;
10368 10372              sata_hba_inst != (struct sata_hba_inst *)NULL;
10369 10373              sata_hba_inst = sata_hba_inst->satahba_next) {
10370 10374                  if (sata_hba_inst->satahba_dip == dip)
10371 10375                          break;
10372 10376          }
10373 10377  
10374 10378          if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
10375 10379  #ifdef SATA_DEBUG
10376 10380                  cmn_err(CE_WARN, "sata_remove_hba_instance: "
10377 10381                      "unknown HBA instance\n");
10378 10382  #endif
10379 10383                  ASSERT(FALSE);
10380 10384          }
10381 10385          if (sata_hba_inst == sata_hba_list) {
10382 10386                  sata_hba_list = sata_hba_inst->satahba_next;
10383 10387                  if (sata_hba_list) {
10384 10388                          sata_hba_list->satahba_prev =
10385 10389                              (struct sata_hba_inst *)NULL;
10386 10390                  }
10387 10391                  if (sata_hba_inst == sata_hba_list_tail) {
10388 10392                          sata_hba_list_tail = NULL;
10389 10393                  }
10390 10394          } else if (sata_hba_inst == sata_hba_list_tail) {
10391 10395                  sata_hba_list_tail = sata_hba_inst->satahba_prev;
10392 10396                  if (sata_hba_list_tail) {
10393 10397                          sata_hba_list_tail->satahba_next =
10394 10398                              (struct sata_hba_inst *)NULL;
10395 10399                  }
10396 10400          } else {
10397 10401                  sata_hba_inst->satahba_prev->satahba_next =
10398 10402                      sata_hba_inst->satahba_next;
10399 10403                  sata_hba_inst->satahba_next->satahba_prev =
10400 10404                      sata_hba_inst->satahba_prev;
10401 10405          }
10402 10406          mutex_exit(&sata_mutex);
10403 10407  }
10404 10408  
10405 10409  /*
10406 10410   * Probe all SATA ports of the specified HBA instance.
10407 10411   * The assumption is that there are no target and attachment point minor nodes
10408 10412   * created by the boot subsystems, so we do not need to prune device tree.
10409 10413   *
10410 10414   * This function is called only from sata_hba_attach(). It does not have to
10411 10415   * be protected by controller mutex, because the hba_attached flag is not set
10412 10416   * yet and no one would be touching this HBA instance other than this thread.
10413 10417   * Determines if port is active and what type of the device is attached
10414 10418   * (if any). Allocates necessary structures for each port.
10415 10419   *
10416 10420   * An AP (Attachement Point) node is created for each SATA device port even
10417 10421   * when there is no device attached.
10418 10422   */
10419 10423  
10420 10424  static  void
10421 10425  sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
10422 10426  {
10423 10427          dev_info_t              *dip = SATA_DIP(sata_hba_inst);
10424 10428          int                     ncport;
10425 10429          sata_cport_info_t       *cportinfo;
10426 10430          sata_drive_info_t       *drive;
10427 10431          sata_device_t           sata_device;
10428 10432          int                     rval;
10429 10433          dev_t                   minor_number;
10430 10434          char                    name[16];
10431 10435          clock_t                 start_time, cur_time;
10432 10436  
10433 10437          /*
10434 10438           * Probe controller ports first, to find port status and
10435 10439           * any port multiplier attached.
10436 10440           */
10437 10441          for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
10438 10442                  /* allocate cport structure */
10439 10443                  cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
10440 10444                  ASSERT(cportinfo != NULL);
10441 10445                  mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
10442 10446  
10443 10447                  mutex_enter(&cportinfo->cport_mutex);
10444 10448  
10445 10449                  cportinfo->cport_addr.cport = ncport;
10446 10450                  cportinfo->cport_addr.pmport = 0;
10447 10451                  cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
10448 10452                  cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
10449 10453                  cportinfo->cport_state |= SATA_STATE_PROBING;
10450 10454                  SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
10451 10455  
10452 10456                  /*
10453 10457                   * Regardless if a port is usable or not, create
10454 10458                   * an attachment point
10455 10459                   */
10456 10460                  mutex_exit(&cportinfo->cport_mutex);
10457 10461                  minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
10458 10462                      ncport, 0, SATA_ADDR_CPORT);
10459 10463                  (void) sprintf(name, "%d", ncport);
10460 10464                  if (ddi_create_minor_node(dip, name, S_IFCHR,
10461 10465                      minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
10462 10466                      DDI_SUCCESS) {
10463 10467                          sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
10464 10468                              "cannot create SATA attachment point for port %d",
10465 10469                              ncport);
10466 10470                  }
10467 10471  
10468 10472                  /* Probe port */
10469 10473                  start_time = ddi_get_lbolt();
10470 10474          reprobe_cport:
10471 10475                  sata_device.satadev_addr.cport = ncport;
10472 10476                  sata_device.satadev_addr.pmport = 0;
10473 10477                  sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
10474 10478                  sata_device.satadev_rev = SATA_DEVICE_REV;
10475 10479  
10476 10480                  rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10477 10481                      (dip, &sata_device);
10478 10482  
10479 10483                  mutex_enter(&cportinfo->cport_mutex);
10480 10484                  cportinfo->cport_scr = sata_device.satadev_scr;
10481 10485                  if (rval != SATA_SUCCESS) {
10482 10486                          /* Something went wrong? Fail the port */
10483 10487                          cportinfo->cport_state = SATA_PSTATE_FAILED;
10484 10488                          mutex_exit(&cportinfo->cport_mutex);
10485 10489                          continue;
10486 10490                  }
10487 10491                  cportinfo->cport_state &= ~SATA_STATE_PROBING;
10488 10492                  cportinfo->cport_state |= SATA_STATE_PROBED;
10489 10493                  cportinfo->cport_dev_type = sata_device.satadev_type;
10490 10494  
10491 10495                  cportinfo->cport_state |= SATA_STATE_READY;
10492 10496                  if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
10493 10497                          mutex_exit(&cportinfo->cport_mutex);
10494 10498                          continue;
10495 10499                  }
10496 10500                  if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
10497 10501                          /*
10498 10502                           * There is some device attached.
10499 10503                           * Allocate device info structure
10500 10504                           */
10501 10505                          if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
10502 10506                                  mutex_exit(&cportinfo->cport_mutex);
10503 10507                                  SATA_CPORTINFO_DRV_INFO(cportinfo) =
10504 10508                                      kmem_zalloc(sizeof (sata_drive_info_t),
10505 10509                                      KM_SLEEP);
10506 10510                                  mutex_enter(&cportinfo->cport_mutex);
10507 10511                          }
10508 10512                          drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
10509 10513                          drive->satadrv_addr = cportinfo->cport_addr;
10510 10514                          drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
10511 10515                          drive->satadrv_type = cportinfo->cport_dev_type;
10512 10516                          drive->satadrv_state = SATA_STATE_UNKNOWN;
10513 10517  
10514 10518                          mutex_exit(&cportinfo->cport_mutex);
10515 10519                          if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
10516 10520                              SATA_SUCCESS) {
10517 10521                                  /*
10518 10522                                   * Plugged device was not correctly identified.
10519 10523                                   * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
10520 10524                                   */
10521 10525                                  cur_time = ddi_get_lbolt();
10522 10526                                  if ((cur_time - start_time) <
10523 10527                                      drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
10524 10528                                          /* sleep for a while */
10525 10529                                          delay(drv_usectohz(
10526 10530                                              SATA_DEV_RETRY_DLY));
10527 10531                                          goto reprobe_cport;
10528 10532                                  }
10529 10533                          }
10530 10534                  } else { /* SATA_DTYPE_PMULT */
10531 10535                          mutex_exit(&cportinfo->cport_mutex);
10532 10536  
10533 10537                          /* Allocate sata_pmult_info and sata_pmport_info */
10534 10538                          if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
10535 10539                              SATA_SUCCESS)
10536 10540                                  continue;
10537 10541  
10538 10542                          /* Log the information of the port multiplier */
10539 10543                          sata_show_pmult_info(sata_hba_inst, &sata_device);
10540 10544  
10541 10545                          /* Probe its pmports */
10542 10546                          sata_probe_pmports(sata_hba_inst, ncport);
10543 10547                  }
10544 10548          }
10545 10549  }
10546 10550  
10547 10551  /*
10548 10552   * Probe all device ports behind a port multiplier.
10549 10553   *
10550 10554   * PMult-related structure should be allocated before by sata_alloc_pmult().
10551 10555   *
10552 10556   * NOTE1: Only called from sata_probe_ports()
10553 10557   * NOTE2: No mutex should be hold.
10554 10558   */
10555 10559  static void
10556 10560  sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
10557 10561  {
10558 10562          dev_info_t              *dip = SATA_DIP(sata_hba_inst);
10559 10563          sata_pmult_info_t       *pmultinfo = NULL;
10560 10564          sata_pmport_info_t      *pmportinfo = NULL;
10561 10565          sata_drive_info_t       *drive = NULL;
10562 10566          sata_device_t           sata_device;
10563 10567  
10564 10568          clock_t                 start_time, cur_time;
10565 10569          int                     npmport;
10566 10570          int                     rval;
10567 10571  
10568 10572          pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
10569 10573  
10570 10574          /* Probe Port Multiplier ports */
10571 10575          for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
10572 10576                  pmportinfo = pmultinfo->pmult_dev_port[npmport];
10573 10577                  start_time = ddi_get_lbolt();
10574 10578  reprobe_pmport:
10575 10579                  sata_device.satadev_addr.cport = ncport;
10576 10580                  sata_device.satadev_addr.pmport = npmport;
10577 10581                  sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
10578 10582                  sata_device.satadev_rev = SATA_DEVICE_REV;
10579 10583  
10580 10584                  /* Let HBA driver probe it. */
10581 10585                  rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10582 10586                      (dip, &sata_device);
10583 10587                  mutex_enter(&pmportinfo->pmport_mutex);
10584 10588  
10585 10589                  pmportinfo->pmport_scr = sata_device.satadev_scr;
10586 10590  
10587 10591                  if (rval != SATA_SUCCESS) {
10588 10592                          pmportinfo->pmport_state =
10589 10593                              SATA_PSTATE_FAILED;
10590 10594                          mutex_exit(&pmportinfo->pmport_mutex);
10591 10595                          continue;
10592 10596                  }
10593 10597                  pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
10594 10598                  pmportinfo->pmport_state |= SATA_STATE_PROBED;
10595 10599                  pmportinfo->pmport_dev_type = sata_device.satadev_type;
10596 10600  
10597 10601                  pmportinfo->pmport_state |= SATA_STATE_READY;
10598 10602                  if (pmportinfo->pmport_dev_type ==
10599 10603                      SATA_DTYPE_NONE) {
10600 10604                          SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
10601 10605                              "no device found at port %d:%d", ncport, npmport);
10602 10606                          mutex_exit(&pmportinfo->pmport_mutex);
10603 10607                          continue;
10604 10608                  }
10605 10609                  /* Port multipliers cannot be chained */
10606 10610                  ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
10607 10611                  /*
10608 10612                   * There is something attached to Port
10609 10613                   * Multiplier device port
10610 10614                   * Allocate device info structure
10611 10615                   */
10612 10616                  if (pmportinfo->pmport_sata_drive == NULL) {
10613 10617                          mutex_exit(&pmportinfo->pmport_mutex);
10614 10618                          pmportinfo->pmport_sata_drive =
10615 10619                              kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
10616 10620                          mutex_enter(&pmportinfo->pmport_mutex);
10617 10621                  }
10618 10622                  drive = pmportinfo->pmport_sata_drive;
10619 10623                  drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
10620 10624                  drive->satadrv_addr.pmport = npmport;
10621 10625                  drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
10622 10626                  drive->satadrv_type = pmportinfo-> pmport_dev_type;
10623 10627                  drive->satadrv_state = SATA_STATE_UNKNOWN;
10624 10628  
10625 10629                  mutex_exit(&pmportinfo->pmport_mutex);
10626 10630                  rval = sata_add_device(dip, sata_hba_inst, &sata_device);
10627 10631  
10628 10632                  if (rval != SATA_SUCCESS) {
10629 10633                          /*
10630 10634                           * Plugged device was not correctly identified.
10631 10635                           * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
10632 10636                           */
10633 10637                          cur_time = ddi_get_lbolt();
10634 10638                          if ((cur_time - start_time) < drv_usectohz(
10635 10639                              SATA_DEV_IDENTIFY_TIMEOUT)) {
10636 10640                                  /* sleep for a while */
10637 10641                                  delay(drv_usectohz(SATA_DEV_RETRY_DLY));
10638 10642                                  goto reprobe_pmport;
10639 10643                          }
10640 10644                  }
10641 10645          }
10642 10646  }
10643 10647  
10644 10648  /*
10645 10649   * Add SATA device for specified HBA instance & port (SCSI target
10646 10650   * device nodes).
10647 10651   * This function is called (indirectly) only from sata_hba_attach().
10648 10652   * A target node is created when there is a supported type device attached,
10649 10653   * but may be removed if it cannot be put online.
10650 10654   *
10651 10655   * This function cannot be called from an interrupt context.
10652 10656   *
10653 10657   * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
10654 10658   *
10655 10659   * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
10656 10660   * device identification failed - adding a device could be retried.
10657 10661   *
10658 10662   */
10659 10663  static  int
10660 10664  sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
10661 10665      sata_device_t *sata_device)
10662 10666  {
10663 10667          sata_cport_info_t       *cportinfo;
10664 10668          sata_pmult_info_t       *pminfo;
10665 10669          sata_pmport_info_t      *pmportinfo;
10666 10670          dev_info_t              *cdip;          /* child dip */
10667 10671          sata_address_t          *saddr = &sata_device->satadev_addr;
10668 10672          uint8_t                 cport, pmport;
10669 10673          int                     rval;
10670 10674  
10671 10675          cport = saddr->cport;
10672 10676          pmport = saddr->pmport;
10673 10677          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
10674 10678          ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
10675 10679  
10676 10680          /*
10677 10681           * Some device is attached to a controller port.
10678 10682           * We rely on controllers distinquishing between no-device,
10679 10683           * attached port multiplier and other kind of attached device.
10680 10684           * We need to get Identify Device data and determine
10681 10685           * positively the dev type before trying to attach
10682 10686           * the target driver.
10683 10687           */
10684 10688          sata_device->satadev_rev = SATA_DEVICE_REV;
10685 10689          switch (saddr->qual) {
10686 10690          case SATA_ADDR_CPORT:
10687 10691                  /*
10688 10692                   * Add a non-port-multiplier device at controller port.
10689 10693                   */
10690 10694                  saddr->qual = SATA_ADDR_DCPORT;
10691 10695  
10692 10696                  rval = sata_probe_device(sata_hba_inst, sata_device);
10693 10697                  if (rval != SATA_SUCCESS ||
10694 10698                      sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
10695 10699                          return (SATA_FAILURE);
10696 10700  
10697 10701                  mutex_enter(&cportinfo->cport_mutex);
10698 10702                  sata_show_drive_info(sata_hba_inst,
10699 10703                      SATA_CPORTINFO_DRV_INFO(cportinfo));
10700 10704  
10701 10705                  if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10702 10706                          /*
10703 10707                           * Could not determine device type or
10704 10708                           * a device is not supported.
10705 10709                           * Degrade this device to unknown.
10706 10710                           */
10707 10711                          cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
10708 10712                          mutex_exit(&cportinfo->cport_mutex);
10709 10713                          return (SATA_SUCCESS);
10710 10714                  }
10711 10715                  cportinfo->cport_dev_type = sata_device->satadev_type;
10712 10716                  cportinfo->cport_tgtnode_clean = B_TRUE;
10713 10717                  mutex_exit(&cportinfo->cport_mutex);
10714 10718  
10715 10719                  /*
10716 10720                   * Initialize device to the desired state. Even if it
10717 10721                   * fails, the device will still attach but syslog
10718 10722                   * will show the warning.
10719 10723                   */
10720 10724                  if (sata_initialize_device(sata_hba_inst,
10721 10725                      SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
10722 10726                          /* Retry */
10723 10727                          rval = sata_initialize_device(sata_hba_inst,
10724 10728                              SATA_CPORTINFO_DRV_INFO(cportinfo));
10725 10729  
10726 10730                          if (rval == SATA_RETRY)
10727 10731                                  sata_log(sata_hba_inst, CE_WARN,
10728 10732                                      "SATA device at port %d - "
10729 10733                                      "default device features could not be set."
10730 10734                                      " Device may not operate as expected.",
10731 10735                                      cport);
10732 10736                  }
10733 10737  
10734 10738                  cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10735 10739                  if (cdip == NULL) {
10736 10740                          /*
10737 10741                           * Attaching target node failed.
10738 10742                           * We retain sata_drive_info structure...
10739 10743                           */
10740 10744                          return (SATA_SUCCESS);
10741 10745                  }
10742 10746  
10743 10747                  mutex_enter(&cportinfo->cport_mutex);
10744 10748                  (SATA_CPORTINFO_DRV_INFO(cportinfo))->
10745 10749                      satadrv_state = SATA_STATE_READY;
10746 10750                  mutex_exit(&cportinfo->cport_mutex);
10747 10751  
10748 10752                  break;
10749 10753  
10750 10754          case SATA_ADDR_PMPORT:
10751 10755                  saddr->qual = SATA_ADDR_DPMPORT;
10752 10756  
10753 10757                  mutex_enter(&cportinfo->cport_mutex);
10754 10758                  /* It must be a Port Multiplier at the controller port */
10755 10759                  ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
10756 10760  
10757 10761                  pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
10758 10762                  pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
10759 10763                  mutex_exit(&cportinfo->cport_mutex);
10760 10764  
10761 10765                  rval = sata_probe_device(sata_hba_inst, sata_device);
10762 10766                  if (rval != SATA_SUCCESS ||
10763 10767                      sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
10764 10768                          return (SATA_FAILURE);
10765 10769                  }
10766 10770  
10767 10771                  mutex_enter(&pmportinfo->pmport_mutex);
10768 10772                  sata_show_drive_info(sata_hba_inst,
10769 10773                      SATA_PMPORTINFO_DRV_INFO(pmportinfo));
10770 10774  
10771 10775                  if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10772 10776                          /*
10773 10777                           * Could not determine device type.
10774 10778                           * Degrade this device to unknown.
10775 10779                           */
10776 10780                          pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
10777 10781                          mutex_exit(&pmportinfo->pmport_mutex);
10778 10782                          return (SATA_SUCCESS);
10779 10783                  }
10780 10784                  pmportinfo->pmport_dev_type = sata_device->satadev_type;
10781 10785                  pmportinfo->pmport_tgtnode_clean = B_TRUE;
10782 10786                  mutex_exit(&pmportinfo->pmport_mutex);
10783 10787  
10784 10788                  /*
10785 10789                   * Initialize device to the desired state.
10786 10790                   * Even if it fails, the device will still
10787 10791                   * attach but syslog will show the warning.
10788 10792                   */
10789 10793                  if (sata_initialize_device(sata_hba_inst,
10790 10794                      pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
10791 10795                          /* Retry */
10792 10796                          rval = sata_initialize_device(sata_hba_inst,
10793 10797                              pmportinfo->pmport_sata_drive);
10794 10798  
10795 10799                          if (rval == SATA_RETRY)
10796 10800                                  sata_log(sata_hba_inst, CE_WARN,
10797 10801                                      "SATA device at port %d:%d - "
10798 10802                                      "default device features could not be set."
10799 10803                                      " Device may not operate as expected.",
10800 10804                                      cport, pmport);
10801 10805                  }
10802 10806  
10803 10807                  cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10804 10808                  if (cdip == NULL) {
10805 10809                          /*
10806 10810                           * Attaching target node failed.
10807 10811                           * We retain sata_drive_info structure...
10808 10812                           */
10809 10813                          return (SATA_SUCCESS);
10810 10814                  }
10811 10815                  mutex_enter(&pmportinfo->pmport_mutex);
10812 10816                  pmportinfo->pmport_sata_drive->satadrv_state |=
10813 10817                      SATA_STATE_READY;
10814 10818                  mutex_exit(&pmportinfo->pmport_mutex);
10815 10819  
10816 10820                  break;
10817 10821  
10818 10822          default:
10819 10823                  return (SATA_FAILURE);
10820 10824          }
10821 10825  
10822 10826          return (SATA_SUCCESS);
10823 10827  }
10824 10828  
10825 10829  /*
10826 10830   * Clean up target node at specific address.
10827 10831   *
10828 10832   * NOTE: No Mutex should be hold.
10829 10833   */
10830 10834  static int
10831 10835  sata_offline_device(sata_hba_inst_t *sata_hba_inst,
10832 10836      sata_device_t *sata_device, sata_drive_info_t *sdinfo)
10833 10837  {
10834 10838          uint8_t cport, pmport, qual;
10835 10839          dev_info_t *tdip;
10836 10840  
10837 10841          cport = sata_device->satadev_addr.cport;
10838 10842          pmport = sata_device->satadev_addr.pmport;
10839 10843          qual = sata_device->satadev_addr.qual;
10840 10844  
10841 10845          if (qual == SATA_ADDR_DCPORT) {
10842 10846                  SATA_LOG_D((sata_hba_inst, CE_WARN,
10843 10847                      "sata_hba_ioctl: disconnect device at port %d", cport));
10844 10848          } else {
10845 10849                  SATA_LOG_D((sata_hba_inst, CE_WARN,
10846 10850                      "sata_hba_ioctl: disconnect device at port %d:%d",
10847 10851                      cport, pmport));
10848 10852          }
10849 10853  
10850 10854          /* We are addressing attached device, not a port */
10851 10855          sata_device->satadev_addr.qual =
10852 10856              sdinfo->satadrv_addr.qual;
10853 10857          tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
10854 10858              &sata_device->satadev_addr);
10855 10859          if (tdip != NULL && ndi_devi_offline(tdip,
10856 10860              NDI_DEVI_REMOVE) != NDI_SUCCESS) {
10857 10861                  /*
10858 10862                   * Problem :
10859 10863                   * The target node remained attached.
10860 10864                   * This happens when the device file was open
10861 10865                   * or a node was waiting for resources.
10862 10866                   * Cannot do anything about it.
10863 10867                   */
10864 10868                  if (qual == SATA_ADDR_DCPORT) {
10865 10869                          SATA_LOG_D((sata_hba_inst, CE_WARN,
10866 10870                              "sata_hba_ioctl: disconnect: could "
10867 10871                              "not unconfigure device before "
10868 10872                              "disconnecting the SATA port %d",
10869 10873                              cport));
10870 10874                  } else {
10871 10875                          SATA_LOG_D((sata_hba_inst, CE_WARN,
10872 10876                              "sata_hba_ioctl: disconnect: could "
10873 10877                              "not unconfigure device before "
10874 10878                              "disconnecting the SATA port %d:%d",
10875 10879                              cport, pmport));
10876 10880                  }
10877 10881                  /*
10878 10882                   * Set DEVICE REMOVED state in the target
10879 10883                   * node. It will prevent access to the device
10880 10884                   * even when a new device is attached, until
10881 10885                   * the old target node is released, removed and
10882 10886                   * recreated for a new  device.
10883 10887                   */
10884 10888                  sata_set_device_removed(tdip);
10885 10889  
10886 10890                  /*
10887 10891                   * Instruct event daemon to try the target
10888 10892                   * node cleanup later.
10889 10893                   */
10890 10894                  sata_set_target_node_cleanup(
10891 10895                      sata_hba_inst, &sata_device->satadev_addr);
10892 10896          }
10893 10897  
10894 10898  
10895 10899          return (SATA_SUCCESS);
10896 10900  }
10897 10901  
10898 10902  
10899 10903  /*
  
    | 
      ↓ open down ↓ | 
    1672 lines elided | 
    
      ↑ open up ↑ | 
  
10900 10904   * Create scsi target node for attached device, create node properties and
10901 10905   * attach the node.
10902 10906   * The node could be removed if the device onlining fails.
10903 10907   *
10904 10908   * A dev_info_t pointer is returned if operation is successful, NULL is
10905 10909   * returned otherwise.
10906 10910   */
10907 10911  
10908 10912  static dev_info_t *
10909 10913  sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
10910      -                        sata_address_t *sata_addr)
     10914 +    sata_address_t *sata_addr)
10911 10915  {
10912 10916          dev_info_t *cdip = NULL;
10913 10917          int rval;
10914 10918          char *nname = NULL;
10915 10919          char **compatible = NULL;
10916 10920          int ncompatible;
10917 10921          struct scsi_inquiry inq;
10918 10922          sata_device_t sata_device;
10919 10923          sata_drive_info_t *sdinfo;
10920 10924          int target;
10921 10925          int i;
10922 10926  
10923 10927          sata_device.satadev_rev = SATA_DEVICE_REV;
10924 10928          sata_device.satadev_addr = *sata_addr;
10925 10929  
10926 10930          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
10927 10931  
10928 10932          sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10929 10933  
10930 10934          target = SATA_TO_SCSI_TARGET(sata_addr->cport,
10931 10935              sata_addr->pmport, sata_addr->qual);
10932 10936  
10933 10937          if (sdinfo == NULL) {
10934 10938                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10935 10939                      sata_addr->cport)));
10936 10940                  SATA_LOG_D((sata_hba_inst, CE_WARN,
10937 10941                      "sata_create_target_node: no sdinfo for target %x",
10938 10942                      target));
10939 10943                  return (NULL);
10940 10944          }
10941 10945  
10942 10946          /*
10943 10947           * create or get scsi inquiry data, expected by
10944 10948           * scsi_hba_nodename_compatible_get()
10945 10949           * SATA hard disks get Identify Data translated into Inguiry Data.
10946 10950           * ATAPI devices respond directly to Inquiry request.
10947 10951           */
10948 10952          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10949 10953                  sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
10950 10954                      (uint8_t *)&inq);
10951 10955                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10952 10956                      sata_addr->cport)));
10953 10957          } else { /* Assume supported ATAPI device */
10954 10958                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10955 10959                      sata_addr->cport)));
10956 10960                  if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
10957 10961                      &inq) == SATA_FAILURE)
10958 10962                          return (NULL);
10959 10963                  /*
10960 10964                   * Save supported ATAPI transport version
10961 10965                   */
10962 10966                  sdinfo->satadrv_atapi_trans_ver =
10963 10967                      SATA_ATAPI_TRANS_VERSION(&inq);
10964 10968          }
10965 10969  
10966 10970          /* determine the node name and compatible */
10967 10971          scsi_hba_nodename_compatible_get(&inq, NULL,
10968 10972              inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
10969 10973  
10970 10974  #ifdef SATA_DEBUG
10971 10975          if (sata_debug_flags & SATA_DBG_NODES) {
10972 10976                  if (nname == NULL) {
10973 10977                          cmn_err(CE_NOTE, "sata_create_target_node: "
10974 10978                              "cannot determine nodename for target %d\n",
10975 10979                              target);
10976 10980                  } else {
10977 10981                          cmn_err(CE_WARN, "sata_create_target_node: "
10978 10982                              "target %d nodename: %s\n", target, nname);
10979 10983                  }
10980 10984                  if (compatible == NULL) {
10981 10985                          cmn_err(CE_WARN,
10982 10986                              "sata_create_target_node: no compatible name\n");
10983 10987                  } else {
10984 10988                          for (i = 0; i < ncompatible; i++) {
10985 10989                                  cmn_err(CE_WARN, "sata_create_target_node: "
10986 10990                                      "compatible name: %s\n", compatible[i]);
10987 10991                          }
10988 10992                  }
10989 10993          }
10990 10994  #endif
10991 10995  
10992 10996          /* if nodename can't be determined, log error and exit */
10993 10997          if (nname == NULL) {
10994 10998                  SATA_LOG_D((sata_hba_inst, CE_WARN,
10995 10999                      "sata_create_target_node: cannot determine nodename "
10996 11000                      "for target %d\n", target));
10997 11001                  scsi_hba_nodename_compatible_free(nname, compatible);
10998 11002                  return (NULL);
10999 11003          }
11000 11004          /*
11001 11005           * Create scsi target node
11002 11006           */
11003 11007          ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11004 11008          rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11005 11009              "device-type", "scsi");
11006 11010  
11007 11011          if (rval != DDI_PROP_SUCCESS) {
11008 11012                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11009 11013                      "updating device_type prop failed %d", rval));
11010 11014                  goto fail;
11011 11015          }
11012 11016  
11013 11017          /*
11014 11018           * Create target node properties: target & lun
11015 11019           */
11016 11020          rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11017 11021          if (rval != DDI_PROP_SUCCESS) {
11018 11022                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11019 11023                      "updating target prop failed %d", rval));
11020 11024                  goto fail;
11021 11025          }
11022 11026          rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11023 11027          if (rval != DDI_PROP_SUCCESS) {
11024 11028                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11025 11029                      "updating target prop failed %d", rval));
11026 11030                  goto fail;
11027 11031          }
11028 11032  
11029 11033          if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11030 11034                  /*
11031 11035                   * Add "variant" property
11032 11036                   */
11033 11037                  rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11034 11038                      "variant", "atapi");
11035 11039                  if (rval != DDI_PROP_SUCCESS) {
11036 11040                          SATA_LOG_D((sata_hba_inst, CE_WARN,
11037 11041                              "sata_create_target_node: variant atapi "
11038 11042                              "property could not be created: %d", rval));
11039 11043                          goto fail;
11040 11044                  }
11041 11045          }
11042 11046          /* decorate the node with compatible */
11043 11047          if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11044 11048              compatible, ncompatible) != DDI_PROP_SUCCESS) {
11045 11049                  SATA_LOG_D((sata_hba_inst, CE_WARN,
11046 11050                      "sata_create_target_node: FAIL compatible props cdip 0x%p",
11047 11051                      (void *)cdip));
11048 11052                  goto fail;
11049 11053          }
11050 11054  
11051 11055          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11052 11056                  /*
11053 11057                   * Add "sata-phy" property
11054 11058                   */
11055 11059                  if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11056 11060                      (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11057 11061                          SATA_LOG_D((sata_hba_inst, CE_WARN,
11058 11062                              "sata_create_target_node: failed to create "
11059 11063                              "\"sata-phy\" property: port %d",
11060 11064                              sata_addr->cport));
11061 11065                  }
11062 11066          }
11063 11067  
11064 11068  
11065 11069          /*
11066 11070           * Now, try to attach the driver. If probing of the device fails,
11067 11071           * the target node may be removed
11068 11072           */
11069 11073          rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
11070 11074  
11071 11075          scsi_hba_nodename_compatible_free(nname, compatible);
11072 11076  
11073 11077          if (rval == NDI_SUCCESS)
11074 11078                  return (cdip);
11075 11079  
11076 11080          /* target node was removed - are we sure? */
11077 11081          return (NULL);
11078 11082  
11079 11083  fail:
11080 11084          scsi_hba_nodename_compatible_free(nname, compatible);
11081 11085          ddi_prop_remove_all(cdip);
11082 11086          rval = ndi_devi_free(cdip);
11083 11087          if (rval != NDI_SUCCESS) {
11084 11088                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11085 11089                      "node removal failed %d", rval));
11086 11090          }
11087 11091          sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
  
    | 
      ↓ open down ↓ | 
    167 lines elided | 
    
      ↑ open up ↑ | 
  
11088 11092              "cannot create target node for SATA device at port %d",
11089 11093              sata_addr->cport);
11090 11094          return (NULL);
11091 11095  }
11092 11096  
11093 11097  /*
11094 11098   * Remove a target node.
11095 11099   */
11096 11100  static void
11097 11101  sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
11098      -                        sata_address_t *sata_addr)
     11102 +    sata_address_t *sata_addr)
11099 11103  {
11100 11104          dev_info_t *tdip;
11101 11105          uint8_t cport = sata_addr->cport;
11102 11106          uint8_t pmport = sata_addr->pmport;
11103 11107          uint8_t qual = sata_addr->qual;
11104 11108  
11105 11109          /* Note the sata daemon uses the address of the port/pmport */
11106 11110          ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
11107 11111  
11108 11112          /* Remove target node */
11109 11113          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
11110 11114          if (tdip != NULL) {
11111 11115                  /*
11112 11116                   * Target node exists.  Unconfigure device
11113 11117                   * then remove the target node (one ndi
11114 11118                   * operation).
11115 11119                   */
11116 11120                  if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11117 11121                          /*
11118 11122                           * PROBLEM - no device, but target node remained. This
11119 11123                           * happens when the file was open or node was waiting
11120 11124                           * for resources.
11121 11125                           */
11122 11126                          SATA_LOG_D((sata_hba_inst, CE_WARN,
11123 11127                              "sata_remove_target_node: "
11124 11128                              "Failed to remove target node for "
11125 11129                              "detached SATA device."));
11126 11130                          /*
11127 11131                           * Set target node state to DEVI_DEVICE_REMOVED. But
11128 11132                           * re-check first that the node still exists.
11129 11133                           */
11130 11134                          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
11131 11135                              cport, pmport);
11132 11136                          if (tdip != NULL) {
11133 11137                                  sata_set_device_removed(tdip);
11134 11138                                  /*
11135 11139                                   * Instruct event daemon to retry the cleanup
11136 11140                                   * later.
11137 11141                                   */
11138 11142                                  sata_set_target_node_cleanup(sata_hba_inst,
11139 11143                                      sata_addr);
11140 11144                          }
11141 11145                  }
11142 11146  
11143 11147                  if (qual == SATA_ADDR_CPORT)
11144 11148                          sata_log(sata_hba_inst, CE_WARN,
11145 11149                              "SATA device detached at port %d", cport);
11146 11150                  else
11147 11151                          sata_log(sata_hba_inst, CE_WARN,
11148 11152                              "SATA device detached at port %d:%d",
11149 11153                              cport, pmport);
11150 11154          }
11151 11155  #ifdef SATA_DEBUG
11152 11156          else {
11153 11157                  if (qual == SATA_ADDR_CPORT)
11154 11158                          sata_log(sata_hba_inst, CE_WARN,
11155 11159                              "target node not found at port %d", cport);
11156 11160                  else
11157 11161                          sata_log(sata_hba_inst, CE_WARN,
11158 11162                              "target node not found at port %d:%d",
11159 11163                              cport, pmport);
11160 11164          }
11161 11165  #endif
11162 11166  }
11163 11167  
11164 11168  
11165 11169  /*
11166 11170   * Re-probe sata port, check for a device and attach info
11167 11171   * structures when necessary. Identify Device data is fetched, if possible.
11168 11172   * Assumption: sata address is already validated.
11169 11173   * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11170 11174   * the presence of a device and its type.
11171 11175   *
11172 11176   * flag arg specifies that the function should try multiple times to identify
11173 11177   * device type and to initialize it, or it should return immediately on failure.
11174 11178   * SATA_DEV_IDENTIFY_RETRY - retry
11175 11179   * SATA_DEV_IDENTIFY_NORETRY - no retry
11176 11180   *
11177 11181   * SATA_FAILURE is returned if one of the operations failed.
11178 11182   *
11179 11183   * This function cannot be called in interrupt context - it may sleep.
11180 11184   *
11181 11185   * Note: Port multiplier is supported.
11182 11186   */
11183 11187  static int
11184 11188  sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11185 11189      int flag)
11186 11190  {
11187 11191          sata_cport_info_t *cportinfo;
11188 11192          sata_pmult_info_t *pmultinfo;
11189 11193          sata_drive_info_t *sdinfo, *osdinfo;
11190 11194          boolean_t init_device = B_FALSE;
11191 11195          int prev_device_type = SATA_DTYPE_NONE;
11192 11196          int prev_device_settings = 0;
11193 11197          int prev_device_state = 0;
11194 11198          clock_t start_time;
11195 11199          int retry = B_FALSE;
11196 11200          uint8_t cport = sata_device->satadev_addr.cport;
11197 11201          int rval_probe, rval_init;
11198 11202  
11199 11203          /*
11200 11204           * If target is pmport, sata_reprobe_pmport() will handle it.
11201 11205           */
11202 11206          if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
11203 11207              sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
11204 11208                  return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
11205 11209  
11206 11210          /* We only care about host sata cport for now */
11207 11211          cportinfo = SATA_CPORT_INFO(sata_hba_inst,
11208 11212              sata_device->satadev_addr.cport);
11209 11213  
11210 11214          /*
11211 11215           * If a port multiplier was previously attached (we have no idea it
11212 11216           * still there or not), sata_reprobe_pmult() will handle it.
11213 11217           */
11214 11218          if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
11215 11219                  return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
11216 11220  
11217 11221          /* Store sata_drive_info when a non-pmult device was attached. */
11218 11222          osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11219 11223          if (osdinfo != NULL) {
11220 11224                  /*
11221 11225                   * We are re-probing port with a previously attached device.
11222 11226                   * Save previous device type and settings.
11223 11227                   */
11224 11228                  prev_device_type = cportinfo->cport_dev_type;
11225 11229                  prev_device_settings = osdinfo->satadrv_settings;
11226 11230                  prev_device_state = osdinfo->satadrv_state;
11227 11231          }
11228 11232          if (flag == SATA_DEV_IDENTIFY_RETRY) {
11229 11233                  start_time = ddi_get_lbolt();
11230 11234                  retry = B_TRUE;
11231 11235          }
11232 11236  retry_probe:
11233 11237  
11234 11238          /* probe port */
11235 11239          mutex_enter(&cportinfo->cport_mutex);
11236 11240          cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11237 11241          cportinfo->cport_state |= SATA_STATE_PROBING;
11238 11242          mutex_exit(&cportinfo->cport_mutex);
11239 11243  
11240 11244          rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11241 11245              (SATA_DIP(sata_hba_inst), sata_device);
11242 11246  
11243 11247          mutex_enter(&cportinfo->cport_mutex);
11244 11248          if (rval_probe != SATA_SUCCESS) {
11245 11249                  cportinfo->cport_state = SATA_PSTATE_FAILED;
11246 11250                  mutex_exit(&cportinfo->cport_mutex);
11247 11251                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
11248 11252                      "SATA port %d probing failed",
11249 11253                      cportinfo->cport_addr.cport));
11250 11254                  return (SATA_FAILURE);
11251 11255          }
11252 11256  
11253 11257          /*
11254 11258           * update sata port state and set device type
11255 11259           */
11256 11260          sata_update_port_info(sata_hba_inst, sata_device);
11257 11261          cportinfo->cport_state &= ~SATA_STATE_PROBING;
11258 11262  
11259 11263          /*
11260 11264           * Sanity check - Port is active? Is the link active?
11261 11265           * Is there any device attached?
11262 11266           */
11263 11267          if ((cportinfo->cport_state &
11264 11268              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11265 11269              (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11266 11270              SATA_PORT_DEVLINK_UP) {
11267 11271                  /*
11268 11272                   * Port in non-usable state or no link active/no device.
11269 11273                   * Free info structure if necessary (direct attached drive
11270 11274                   * only, for now!
11271 11275                   */
11272 11276                  sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11273 11277                  SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11274 11278                  /* Add here differentiation for device attached or not */
11275 11279                  cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11276 11280                  mutex_exit(&cportinfo->cport_mutex);
11277 11281                  if (sdinfo != NULL)
11278 11282                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11279 11283                  return (SATA_SUCCESS);
11280 11284          }
11281 11285  
11282 11286          cportinfo->cport_state |= SATA_STATE_READY;
11283 11287          cportinfo->cport_state |= SATA_STATE_PROBED;
11284 11288  
11285 11289          cportinfo->cport_dev_type = sata_device->satadev_type;
11286 11290          sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11287 11291  
11288 11292          /*
11289 11293           * If we are re-probing the port, there may be
11290 11294           * sata_drive_info structure attached
11291 11295           */
11292 11296          if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11293 11297  
11294 11298                  /*
11295 11299                   * There is no device, so remove device info structure,
11296 11300                   * if necessary.
11297 11301                   */
11298 11302                  /* Device change: Drive -> None */
11299 11303                  SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11300 11304                  cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11301 11305                  if (sdinfo != NULL) {
11302 11306                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11303 11307                          sata_log(sata_hba_inst, CE_WARN,
11304 11308                              "SATA device detached "
11305 11309                              "from port %d", cportinfo->cport_addr.cport);
11306 11310                  }
11307 11311                  mutex_exit(&cportinfo->cport_mutex);
11308 11312                  return (SATA_SUCCESS);
11309 11313  
11310 11314          }
11311 11315  
11312 11316          if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11313 11317  
11314 11318                  /* Device (may) change: Drive -> Drive */
11315 11319                  if (sdinfo == NULL) {
11316 11320                          /*
11317 11321                           * There is some device attached, but there is
11318 11322                           * no sata_drive_info structure - allocate one
11319 11323                           */
11320 11324                          mutex_exit(&cportinfo->cport_mutex);
11321 11325                          sdinfo = kmem_zalloc(
11322 11326                              sizeof (sata_drive_info_t), KM_SLEEP);
11323 11327                          mutex_enter(&cportinfo->cport_mutex);
11324 11328                          /*
11325 11329                           * Recheck, that the port state did not change when we
11326 11330                           * released mutex.
11327 11331                           */
11328 11332                          if (cportinfo->cport_state & SATA_STATE_READY) {
11329 11333                                  SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
11330 11334                                  sdinfo->satadrv_addr = cportinfo->cport_addr;
11331 11335                                  sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
11332 11336                                  sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11333 11337                                  sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11334 11338                          } else {
11335 11339                                  /*
11336 11340                                   * Port is not in ready state, we
11337 11341                                   * cannot attach a device.
11338 11342                                   */
11339 11343                                  mutex_exit(&cportinfo->cport_mutex);
11340 11344                                  kmem_free(sdinfo, sizeof (sata_drive_info_t));
11341 11345                                  return (SATA_SUCCESS);
11342 11346                          }
11343 11347                          /*
11344 11348                           * Since we are adding device, presumably new one,
11345 11349                           * indicate that it  should be initalized,
11346 11350                           * as well as some internal framework states).
11347 11351                           */
11348 11352                          init_device = B_TRUE;
11349 11353                  }
11350 11354                  cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11351 11355                  sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11352 11356          } else {
11353 11357                  /* Device change: Drive -> PMult */
11354 11358                  SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11355 11359                  if (sdinfo != NULL) {
11356 11360                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11357 11361                          sata_log(sata_hba_inst, CE_WARN,
11358 11362                              "SATA device detached "
11359 11363                              "from port %d", cportinfo->cport_addr.cport);
11360 11364                  }
11361 11365  
11362 11366                  sata_log(sata_hba_inst, CE_WARN,
11363 11367                      "SATA port multiplier detected at port %d",
11364 11368                      cportinfo->cport_addr.cport);
11365 11369  
11366 11370                  mutex_exit(&cportinfo->cport_mutex);
11367 11371                  if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
11368 11372                      SATA_SUCCESS)
11369 11373                          return (SATA_FAILURE);
11370 11374                  sata_show_pmult_info(sata_hba_inst, sata_device);
11371 11375                  mutex_enter(&cportinfo->cport_mutex);
11372 11376  
11373 11377                  /*
11374 11378                   * Mark all the port multiplier port behind the port
11375 11379                   * multiplier behind with link events, so that the sata daemon
11376 11380                   * will update their status.
11377 11381                   */
11378 11382                  pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11379 11383                  pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11380 11384                  mutex_exit(&cportinfo->cport_mutex);
11381 11385                  return (SATA_SUCCESS);
11382 11386          }
11383 11387          mutex_exit(&cportinfo->cport_mutex);
11384 11388  
11385 11389          /*
11386 11390           * Figure out what kind of device we are really
11387 11391           * dealing with. Failure of identifying device does not fail this
11388 11392           * function.
11389 11393           */
11390 11394          rval_probe = sata_probe_device(sata_hba_inst, sata_device);
11391 11395          rval_init = SATA_FAILURE;
11392 11396          mutex_enter(&cportinfo->cport_mutex);
11393 11397          if (rval_probe == SATA_SUCCESS) {
11394 11398                  /*
11395 11399                   * If we are dealing with the same type of a device as before,
11396 11400                   * restore its settings flags.
11397 11401                   */
11398 11402                  if (osdinfo != NULL &&
11399 11403                      sata_device->satadev_type == prev_device_type)
11400 11404                          sdinfo->satadrv_settings = prev_device_settings;
11401 11405  
11402 11406                  mutex_exit(&cportinfo->cport_mutex);
11403 11407                  rval_init = SATA_SUCCESS;
11404 11408                  /* Set initial device features, if necessary */
11405 11409                  if (init_device == B_TRUE) {
11406 11410                          rval_init = sata_initialize_device(sata_hba_inst,
11407 11411                              sdinfo);
11408 11412                  }
11409 11413                  if (rval_init == SATA_SUCCESS)
11410 11414                          return (rval_init);
11411 11415                  /* else we will retry if retry was asked for */
11412 11416  
11413 11417          } else {
11414 11418                  /*
11415 11419                   * If there was some device info before we probe the device,
11416 11420                   * restore previous device setting, so we can retry from scratch
11417 11421                   * later. Providing, of course, that device has not disapear
11418 11422                   * during probing process.
11419 11423                   */
11420 11424                  if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11421 11425                          if (osdinfo != NULL) {
11422 11426                                  cportinfo->cport_dev_type = prev_device_type;
11423 11427                                  sdinfo->satadrv_type = prev_device_type;
11424 11428                                  sdinfo->satadrv_state = prev_device_state;
11425 11429                          }
11426 11430                  } else {
11427 11431                          /* device is gone */
11428 11432                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11429 11433                          cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11430 11434                          SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11431 11435                          mutex_exit(&cportinfo->cport_mutex);
11432 11436                          return (SATA_SUCCESS);
11433 11437                  }
11434 11438                  mutex_exit(&cportinfo->cport_mutex);
11435 11439          }
11436 11440  
11437 11441          if (retry) {
11438 11442                  clock_t cur_time = ddi_get_lbolt();
11439 11443                  /*
11440 11444                   * A device was not successfully identified or initialized.
11441 11445                   * Track retry time for device identification.
11442 11446                   */
11443 11447                  if ((cur_time - start_time) <
11444 11448                      drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11445 11449                          /* sleep for a while */
11446 11450                          delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11447 11451                          goto retry_probe;
11448 11452                  }
11449 11453                  /* else no more retries */
11450 11454                  mutex_enter(&cportinfo->cport_mutex);
11451 11455                  if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
11452 11456                          if (rval_init == SATA_RETRY) {
11453 11457                                  /*
11454 11458                                   * Setting drive features have failed, but
11455 11459                                   * because the drive is still accessible,
11456 11460                                   * keep it and emit a warning message.
11457 11461                                   */
11458 11462                                  sata_log(sata_hba_inst, CE_WARN,
11459 11463                                      "SATA device at port %d - desired "
11460 11464                                      "drive features could not be set. "
11461 11465                                      "Device may not operate as expected.",
11462 11466                                      cportinfo->cport_addr.cport);
11463 11467                          } else {
11464 11468                                  SATA_CPORTINFO_DRV_INFO(cportinfo)->
11465 11469                                      satadrv_state = SATA_DSTATE_FAILED;
11466 11470                          }
11467 11471                  }
11468 11472                  mutex_exit(&cportinfo->cport_mutex);
11469 11473          }
11470 11474          return (SATA_SUCCESS);
11471 11475  }
11472 11476  
11473 11477  /*
11474 11478   * Reprobe a controller port that connected to a port multiplier.
11475 11479   *
11476 11480   * NOTE: No Mutex should be hold.
11477 11481   */
11478 11482  static int
11479 11483  sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11480 11484      int flag)
11481 11485  {
11482 11486          _NOTE(ARGUNUSED(flag))
11483 11487          sata_cport_info_t *cportinfo;
11484 11488          sata_pmult_info_t *pmultinfo;
11485 11489          uint8_t cport = sata_device->satadev_addr.cport;
11486 11490          int rval_probe;
11487 11491  
11488 11492          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11489 11493          pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11490 11494  
11491 11495          /* probe port */
11492 11496          mutex_enter(&cportinfo->cport_mutex);
11493 11497          cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11494 11498          cportinfo->cport_state |= SATA_STATE_PROBING;
11495 11499          mutex_exit(&cportinfo->cport_mutex);
11496 11500  
11497 11501          rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11498 11502              (SATA_DIP(sata_hba_inst), sata_device);
11499 11503  
11500 11504          mutex_enter(&cportinfo->cport_mutex);
11501 11505          if (rval_probe != SATA_SUCCESS) {
11502 11506                  cportinfo->cport_state = SATA_PSTATE_FAILED;
11503 11507                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
11504 11508                      "SATA port %d probing failed", cport));
11505 11509                  sata_log(sata_hba_inst, CE_WARN,
11506 11510                      "SATA port multiplier detached at port %d", cport);
11507 11511                  mutex_exit(&cportinfo->cport_mutex);
11508 11512                  sata_free_pmult(sata_hba_inst, sata_device);
11509 11513                  return (SATA_FAILURE);
11510 11514          }
11511 11515  
11512 11516          /*
11513 11517           * update sata port state and set device type
11514 11518           */
11515 11519          sata_update_port_info(sata_hba_inst, sata_device);
11516 11520          cportinfo->cport_state &= ~SATA_STATE_PROBING;
11517 11521          cportinfo->cport_state |= SATA_STATE_PROBED;
11518 11522  
11519 11523          /*
11520 11524           * Sanity check - Port is active? Is the link active?
11521 11525           * Is there any device attached?
11522 11526           */
11523 11527          if ((cportinfo->cport_state &
11524 11528              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11525 11529              (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11526 11530              SATA_PORT_DEVLINK_UP ||
11527 11531              (sata_device->satadev_type == SATA_DTYPE_NONE)) {
11528 11532                  cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11529 11533                  mutex_exit(&cportinfo->cport_mutex);
11530 11534                  sata_free_pmult(sata_hba_inst, sata_device);
11531 11535                  sata_log(sata_hba_inst, CE_WARN,
11532 11536                      "SATA port multiplier detached at port %d", cport);
11533 11537                  return (SATA_SUCCESS);
11534 11538          }
11535 11539  
11536 11540          /*
11537 11541           * Device changed: PMult -> Non-PMult
11538 11542           *
11539 11543           * This situation is uncommon, most possibly being caused by errors
11540 11544           * after which the port multiplier is not correct initialized and
11541 11545           * recognized. In that case the new device will be marked as unknown
11542 11546           * and will not be automatically probed in this routine. Instead
11543 11547           * system administrator could manually restart it via cfgadm(1M).
11544 11548           */
11545 11549          if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11546 11550                  cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11547 11551                  mutex_exit(&cportinfo->cport_mutex);
11548 11552                  sata_free_pmult(sata_hba_inst, sata_device);
11549 11553                  sata_log(sata_hba_inst, CE_WARN,
11550 11554                      "SATA port multiplier detached at port %d", cport);
11551 11555                  return (SATA_FAILURE);
11552 11556          }
11553 11557  
11554 11558          /*
11555 11559           * Now we know it is a port multiplier. However, if this is not the
11556 11560           * previously attached port multiplier - they may have different
11557 11561           * pmport numbers - we need to re-allocate data structures for every
11558 11562           * pmport and drive.
11559 11563           *
11560 11564           * Port multipliers of the same model have identical values in these
11561 11565           * registers, so it is still necessary to update the information of
11562 11566           * all drives attached to the previous port multiplier afterwards.
11563 11567           */
11564 11568          /* Device changed: PMult -> another PMult */
11565 11569          mutex_exit(&cportinfo->cport_mutex);
11566 11570          sata_free_pmult(sata_hba_inst, sata_device);
11567 11571          if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
11568 11572                  return (SATA_FAILURE);
11569 11573          mutex_enter(&cportinfo->cport_mutex);
11570 11574  
11571 11575          SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11572 11576              "SATA port multiplier [changed] at port %d", cport);
11573 11577          sata_log(sata_hba_inst, CE_WARN,
11574 11578              "SATA port multiplier detected at port %d", cport);
11575 11579  
11576 11580          /*
11577 11581           * Mark all the port multiplier port behind the port
11578 11582           * multiplier behind with link events, so that the sata daemon
11579 11583           * will update their status.
11580 11584           */
11581 11585          pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11582 11586          mutex_exit(&cportinfo->cport_mutex);
11583 11587  
11584 11588          return (SATA_SUCCESS);
11585 11589  }
11586 11590  
11587 11591  /*
11588 11592   * Re-probe a port multiplier port, check for a device and attach info
11589 11593   * structures when necessary. Identify Device data is fetched, if possible.
11590 11594   * Assumption: sata address is already validated as port multiplier port.
11591 11595   * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11592 11596   * the presence of a device and its type.
11593 11597   *
11594 11598   * flag arg specifies that the function should try multiple times to identify
11595 11599   * device type and to initialize it, or it should return immediately on failure.
11596 11600   * SATA_DEV_IDENTIFY_RETRY - retry
11597 11601   * SATA_DEV_IDENTIFY_NORETRY - no retry
11598 11602   *
11599 11603   * SATA_FAILURE is returned if one of the operations failed.
11600 11604   *
11601 11605   * This function cannot be called in interrupt context - it may sleep.
11602 11606   *
11603 11607   * NOTE: Should be only called by sata_probe_port() in case target port is a
11604 11608   *       port multiplier port.
11605 11609   * NOTE: No Mutex should be hold.
11606 11610   */
11607 11611  static int
11608 11612  sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11609 11613      int flag)
11610 11614  {
11611 11615          sata_cport_info_t *cportinfo = NULL;
11612 11616          sata_pmport_info_t *pmportinfo = NULL;
11613 11617          sata_drive_info_t *sdinfo, *osdinfo;
11614 11618          sata_device_t sdevice;
11615 11619          boolean_t init_device = B_FALSE;
11616 11620          int prev_device_type = SATA_DTYPE_NONE;
11617 11621          int prev_device_settings = 0;
11618 11622          int prev_device_state = 0;
11619 11623          clock_t start_time;
11620 11624          uint8_t cport = sata_device->satadev_addr.cport;
11621 11625          uint8_t pmport = sata_device->satadev_addr.pmport;
11622 11626          int rval;
11623 11627  
11624 11628          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11625 11629          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
11626 11630          osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11627 11631  
11628 11632          if (osdinfo != NULL) {
11629 11633                  /*
11630 11634                   * We are re-probing port with a previously attached device.
11631 11635                   * Save previous device type and settings.
11632 11636                   */
11633 11637                  prev_device_type = pmportinfo->pmport_dev_type;
11634 11638                  prev_device_settings = osdinfo->satadrv_settings;
11635 11639                  prev_device_state = osdinfo->satadrv_state;
11636 11640          }
11637 11641  
11638 11642          start_time = ddi_get_lbolt();
11639 11643  
11640 11644          /* check parent status */
11641 11645          mutex_enter(&cportinfo->cport_mutex);
11642 11646          if ((cportinfo->cport_state &
11643 11647              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11644 11648              (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11645 11649              SATA_PORT_DEVLINK_UP) {
11646 11650                  mutex_exit(&cportinfo->cport_mutex);
11647 11651                  return (SATA_FAILURE);
11648 11652          }
11649 11653          mutex_exit(&cportinfo->cport_mutex);
11650 11654  
11651 11655  retry_probe_pmport:
11652 11656  
11653 11657          /* probe port */
11654 11658          mutex_enter(&pmportinfo->pmport_mutex);
11655 11659          pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11656 11660          pmportinfo->pmport_state |= SATA_STATE_PROBING;
11657 11661          mutex_exit(&pmportinfo->pmport_mutex);
11658 11662  
11659 11663          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11660 11664              (SATA_DIP(sata_hba_inst), sata_device);
11661 11665  
11662 11666          /* might need retry because we cannot touch registers. */
11663 11667          if (rval == SATA_FAILURE) {
11664 11668                  mutex_enter(&pmportinfo->pmport_mutex);
11665 11669                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
11666 11670                  mutex_exit(&pmportinfo->pmport_mutex);
11667 11671                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11668 11672                      "SATA port %d:%d probing failed",
11669 11673                      cport, pmport));
11670 11674                  return (SATA_FAILURE);
11671 11675          } else if (rval == SATA_RETRY) {
11672 11676                  SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11673 11677                      "SATA port %d:%d probing failed, retrying...",
11674 11678                      cport, pmport));
11675 11679                  clock_t cur_time = ddi_get_lbolt();
11676 11680                  /*
11677 11681                   * A device was not successfully identified or initialized.
11678 11682                   * Track retry time for device identification.
11679 11683                   */
11680 11684                  if ((cur_time - start_time) <
11681 11685                      drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11682 11686                          /* sleep for a while */
11683 11687                          delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11684 11688                          goto retry_probe_pmport;
11685 11689                  } else {
11686 11690                          mutex_enter(&pmportinfo->pmport_mutex);
11687 11691                          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11688 11692                                  SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11689 11693                                      satadrv_state = SATA_DSTATE_FAILED;
11690 11694                          mutex_exit(&pmportinfo->pmport_mutex);
11691 11695                          return (SATA_SUCCESS);
11692 11696                  }
11693 11697          }
11694 11698  
11695 11699          /*
11696 11700           * Sanity check - Controller port is active? Is the link active?
11697 11701           * Is it still a port multiplier?
11698 11702           */
11699 11703          if ((cportinfo->cport_state &
11700 11704              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11701 11705              (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11702 11706              SATA_PORT_DEVLINK_UP ||
11703 11707              (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
11704 11708                  /*
11705 11709                   * Port in non-usable state or no link active/no
11706 11710                   * device. Free info structure.
11707 11711                   */
11708 11712                  cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11709 11713  
11710 11714                  sdevice.satadev_addr.cport = cport;
11711 11715                  sdevice.satadev_addr.pmport = pmport;
11712 11716                  sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
11713 11717                  mutex_exit(&cportinfo->cport_mutex);
11714 11718  
11715 11719                  sata_free_pmult(sata_hba_inst, &sdevice);
11716 11720                  return (SATA_FAILURE);
11717 11721          }
11718 11722  
11719 11723          /* SATA_SUCCESS NOW */
11720 11724          /*
11721 11725           * update sata port state and set device type
11722 11726           */
11723 11727          mutex_enter(&pmportinfo->pmport_mutex);
11724 11728          sata_update_pmport_info(sata_hba_inst, sata_device);
11725 11729          pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11726 11730  
11727 11731          /*
11728 11732           * Sanity check - Port is active? Is the link active?
11729 11733           * Is there any device attached?
11730 11734           */
11731 11735          if ((pmportinfo->pmport_state &
11732 11736              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11733 11737              (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11734 11738              SATA_PORT_DEVLINK_UP) {
11735 11739                  /*
11736 11740                   * Port in non-usable state or no link active/no device.
11737 11741                   * Free info structure if necessary (direct attached drive
11738 11742                   * only, for now!
11739 11743                   */
11740 11744                  sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11741 11745                  SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11742 11746                  /* Add here differentiation for device attached or not */
11743 11747                  pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11744 11748                  mutex_exit(&pmportinfo->pmport_mutex);
11745 11749                  if (sdinfo != NULL)
11746 11750                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11747 11751                  return (SATA_SUCCESS);
11748 11752          }
11749 11753  
11750 11754          pmportinfo->pmport_state |= SATA_STATE_READY;
11751 11755          pmportinfo->pmport_dev_type = sata_device->satadev_type;
11752 11756          sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11753 11757  
11754 11758          /*
11755 11759           * If we are re-probing the port, there may be
11756 11760           * sata_drive_info structure attached
11757 11761           * (or sata_pm_info, if PMult is supported).
11758 11762           */
11759 11763          if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11760 11764                  /*
11761 11765                   * There is no device, so remove device info structure,
11762 11766                   * if necessary.
11763 11767                   */
11764 11768                  SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11765 11769                  pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11766 11770                  if (sdinfo != NULL) {
11767 11771                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11768 11772                          sata_log(sata_hba_inst, CE_WARN,
11769 11773                              "SATA device detached from port %d:%d",
11770 11774                              cport, pmport);
11771 11775                  }
11772 11776                  mutex_exit(&pmportinfo->pmport_mutex);
11773 11777                  return (SATA_SUCCESS);
11774 11778          }
11775 11779  
11776 11780          /* this should not be a pmult */
11777 11781          ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
11778 11782          if (sdinfo == NULL) {
11779 11783                  /*
11780 11784                   * There is some device attached, but there is
11781 11785                   * no sata_drive_info structure - allocate one
11782 11786                   */
11783 11787                  mutex_exit(&pmportinfo->pmport_mutex);
11784 11788                  sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
11785 11789                      KM_SLEEP);
11786 11790                  mutex_enter(&pmportinfo->pmport_mutex);
11787 11791                  /*
11788 11792                   * Recheck, that the port state did not change when we
11789 11793                   * released mutex.
11790 11794                   */
11791 11795                  if (pmportinfo->pmport_state & SATA_STATE_READY) {
11792 11796                          SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
11793 11797                          sdinfo->satadrv_addr = pmportinfo->pmport_addr;
11794 11798                          sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11795 11799                          sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11796 11800                          sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11797 11801                  } else {
11798 11802                          /*
11799 11803                           * Port is not in ready state, we
11800 11804                           * cannot attach a device.
11801 11805                           */
11802 11806                          mutex_exit(&pmportinfo->pmport_mutex);
11803 11807                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11804 11808                          return (SATA_SUCCESS);
11805 11809                  }
11806 11810                  /*
11807 11811                   * Since we are adding device, presumably new one,
11808 11812                   * indicate that it  should be initalized,
11809 11813                   * as well as some internal framework states).
11810 11814                   */
11811 11815                  init_device = B_TRUE;
11812 11816          }
11813 11817  
11814 11818          pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11815 11819          sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11816 11820  
11817 11821          mutex_exit(&pmportinfo->pmport_mutex);
11818 11822          /*
11819 11823           * Figure out what kind of device we are really
11820 11824           * dealing with.
11821 11825           */
11822 11826          rval = sata_probe_device(sata_hba_inst, sata_device);
11823 11827  
11824 11828          mutex_enter(&pmportinfo->pmport_mutex);
11825 11829          if (rval == SATA_SUCCESS) {
11826 11830                  /*
11827 11831                   * If we are dealing with the same type of a device as before,
11828 11832                   * restore its settings flags.
11829 11833                   */
11830 11834                  if (osdinfo != NULL &&
11831 11835                      sata_device->satadev_type == prev_device_type)
11832 11836                          sdinfo->satadrv_settings = prev_device_settings;
11833 11837  
11834 11838                  mutex_exit(&pmportinfo->pmport_mutex);
11835 11839                  /* Set initial device features, if necessary */
11836 11840                  if (init_device == B_TRUE) {
11837 11841                          rval = sata_initialize_device(sata_hba_inst, sdinfo);
11838 11842                  }
11839 11843                  if (rval == SATA_SUCCESS)
11840 11844                          return (rval);
11841 11845          } else {
11842 11846                  /*
11843 11847                   * If there was some device info before we probe the device,
11844 11848                   * restore previous device setting, so we can retry from scratch
11845 11849                   * later. Providing, of course, that device has not disappeared
11846 11850                   * during probing process.
11847 11851                   */
11848 11852                  if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11849 11853                          if (osdinfo != NULL) {
11850 11854                                  pmportinfo->pmport_dev_type = prev_device_type;
11851 11855                                  sdinfo->satadrv_type = prev_device_type;
11852 11856                                  sdinfo->satadrv_state = prev_device_state;
11853 11857                          }
11854 11858                  } else {
11855 11859                          /* device is gone */
11856 11860                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
11857 11861                          pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11858 11862                          SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11859 11863                          mutex_exit(&pmportinfo->pmport_mutex);
11860 11864                          return (SATA_SUCCESS);
11861 11865                  }
11862 11866                  mutex_exit(&pmportinfo->pmport_mutex);
11863 11867          }
11864 11868  
11865 11869          if (flag == SATA_DEV_IDENTIFY_RETRY) {
11866 11870                  clock_t cur_time = ddi_get_lbolt();
11867 11871                  /*
11868 11872                   * A device was not successfully identified or initialized.
11869 11873                   * Track retry time for device identification.
11870 11874                   */
11871 11875                  if ((cur_time - start_time) <
11872 11876                      drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11873 11877                          /* sleep for a while */
11874 11878                          delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11875 11879                          goto retry_probe_pmport;
11876 11880                  } else {
11877 11881                          mutex_enter(&pmportinfo->pmport_mutex);
11878 11882                          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11879 11883                                  SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11880 11884                                      satadrv_state = SATA_DSTATE_FAILED;
11881 11885                          mutex_exit(&pmportinfo->pmport_mutex);
11882 11886                  }
11883 11887          }
11884 11888          return (SATA_SUCCESS);
11885 11889  }
11886 11890  
11887 11891  /*
11888 11892   * Allocated related structure for a port multiplier and its device ports
11889 11893   *
11890 11894   * Port multiplier should be ready and probed, and related information like
11891 11895   * the number of the device ports should be store in sata_device_t.
11892 11896   *
11893 11897   * NOTE: No Mutex should be hold.
11894 11898   */
11895 11899  static int
11896 11900  sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
11897 11901  {
11898 11902          dev_info_t *dip = SATA_DIP(sata_hba_inst);
11899 11903          sata_cport_info_t *cportinfo = NULL;
11900 11904          sata_pmult_info_t *pmultinfo = NULL;
11901 11905          sata_pmport_info_t *pmportinfo = NULL;
11902 11906          sata_device_t sd;
11903 11907          dev_t minor_number;
11904 11908          char name[16];
11905 11909          uint8_t cport = sata_device->satadev_addr.cport;
11906 11910          int rval;
11907 11911          int npmport;
11908 11912  
11909 11913          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11910 11914  
11911 11915          /* This function might be called while a port-mult is hot-plugged. */
11912 11916          mutex_enter(&cportinfo->cport_mutex);
11913 11917  
11914 11918          /* dev_type's not updated when get called from sata_reprobe_port() */
11915 11919          if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
11916 11920                  /* Create a pmult_info structure */
11917 11921                  SATA_CPORTINFO_PMULT_INFO(cportinfo) =
11918 11922                      kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
11919 11923          }
11920 11924          pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11921 11925  
11922 11926          pmultinfo->pmult_addr = sata_device->satadev_addr;
11923 11927          pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
11924 11928          pmultinfo->pmult_state = SATA_STATE_PROBING;
11925 11929  
11926 11930          /*
11927 11931           * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
11928 11932           * The HBA driver should initialize and register the port multiplier,
11929 11933           * sata_register_pmult() will fill following fields,
11930 11934           *   + sata_pmult_info.pmult_gscr
11931 11935           *   + sata_pmult_info.pmult_num_dev_ports
11932 11936           */
11933 11937          sd.satadev_addr = sata_device->satadev_addr;
11934 11938          sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
11935 11939          mutex_exit(&cportinfo->cport_mutex);
11936 11940          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11937 11941              (SATA_DIP(sata_hba_inst), &sd);
11938 11942          mutex_enter(&cportinfo->cport_mutex);
11939 11943  
11940 11944          if (rval != SATA_SUCCESS ||
11941 11945              (sd.satadev_type != SATA_DTYPE_PMULT) ||
11942 11946              !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
11943 11947                  SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
11944 11948                  kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
11945 11949                  cportinfo->cport_state = SATA_PSTATE_FAILED;
11946 11950                  cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11947 11951                  mutex_exit(&cportinfo->cport_mutex);
11948 11952                  SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11949 11953                      "sata_alloc_pmult: failed to initialize pmult "
11950 11954                      "at port %d.", cport)
11951 11955                  return (SATA_FAILURE);
11952 11956          }
11953 11957  
11954 11958          /* Initialize pmport_info structure */
11955 11959          for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
11956 11960              npmport++) {
11957 11961  
11958 11962                  /* if everything is allocated, skip */
11959 11963                  if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
11960 11964                          continue;
11961 11965  
11962 11966                  pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
11963 11967                  mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
11964 11968                  mutex_exit(&cportinfo->cport_mutex);
11965 11969  
11966 11970                  mutex_enter(&pmportinfo->pmport_mutex);
11967 11971                  pmportinfo->pmport_addr.cport = cport;
11968 11972                  pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
11969 11973                  pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
11970 11974                  pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11971 11975                  mutex_exit(&pmportinfo->pmport_mutex);
11972 11976  
11973 11977                  mutex_enter(&cportinfo->cport_mutex);
11974 11978                  SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
11975 11979  
11976 11980                  /* Create an attachment point */
11977 11981                  minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
11978 11982                      cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
11979 11983                  (void) sprintf(name, "%d.%d", cport, npmport);
11980 11984  
11981 11985                  if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
11982 11986                      DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
11983 11987                          sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
11984 11988                              "cannot create SATA attachment point for "
11985 11989                              "port %d:%d", cport, npmport);
11986 11990                  }
11987 11991          }
11988 11992  
11989 11993          pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
11990 11994          pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
11991 11995          cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
11992 11996  
11993 11997          mutex_exit(&cportinfo->cport_mutex);
11994 11998          return (SATA_SUCCESS);
11995 11999  }
11996 12000  
11997 12001  /*
11998 12002   * Free data structures when a port multiplier is removed.
11999 12003   *
12000 12004   * NOTE: No Mutex should be hold.
12001 12005   */
12002 12006  static void
12003 12007  sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12004 12008  {
12005 12009          sata_cport_info_t *cportinfo;
12006 12010          sata_pmult_info_t *pmultinfo;
12007 12011          sata_pmport_info_t *pmportinfo;
12008 12012          sata_device_t pmport_device;
12009 12013          sata_drive_info_t *sdinfo;
12010 12014          dev_info_t *tdip;
12011 12015          char name[16];
12012 12016          uint8_t cport = sata_device->satadev_addr.cport;
12013 12017          int npmport;
12014 12018  
12015 12019          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12016 12020  
12017 12021          /* This function might be called while port-mult is hot plugged. */
12018 12022          mutex_enter(&cportinfo->cport_mutex);
12019 12023  
12020 12024          cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12021 12025          pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12022 12026          ASSERT(pmultinfo != NULL);
12023 12027  
12024 12028          /* Free pmport_info structure */
12025 12029          for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12026 12030              npmport++) {
12027 12031                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12028 12032                  if (pmportinfo == NULL)
12029 12033                          continue;
12030 12034                  mutex_exit(&cportinfo->cport_mutex);
12031 12035  
12032 12036                  mutex_enter(&pmportinfo->pmport_mutex);
12033 12037                  sdinfo = pmportinfo->pmport_sata_drive;
12034 12038                  SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12035 12039                  mutex_exit(&pmportinfo->pmport_mutex);
12036 12040  
12037 12041                  /* Remove attachment point. */
12038 12042                  name[0] = '\0';
12039 12043                  (void) sprintf(name, "%d.%d", cport, npmport);
12040 12044                  ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12041 12045                  sata_log(sata_hba_inst, CE_NOTE,
12042 12046                      "Remove attachment point of port %d:%d",
12043 12047                      cport, npmport);
12044 12048  
12045 12049                  /*
12046 12050                   * Rumove target node
12047 12051                   */
12048 12052                  bzero(&pmport_device, sizeof (sata_device_t));
12049 12053                  pmport_device.satadev_rev = SATA_DEVICE_REV;
12050 12054                  pmport_device.satadev_addr.cport = cport;
12051 12055                  pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12052 12056                  pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12053 12057  
12054 12058                  tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12055 12059                      &(pmport_device.satadev_addr));
12056 12060                  if (tdip != NULL && ndi_devi_offline(tdip,
12057 12061                      NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12058 12062                          /*
12059 12063                           * Problem :
12060 12064                           * The target node remained attached.
12061 12065                           * This happens when the device file was open
12062 12066                           * or a node was waiting for resources.
12063 12067                           * Cannot do anything about it.
12064 12068                           */
12065 12069                          SATA_LOG_D((sata_hba_inst, CE_WARN,
12066 12070                              "sata_free_pmult: could not unconfigure device "
12067 12071                              "before disconnecting the SATA port %d:%d",
12068 12072                              cport, npmport));
12069 12073  
12070 12074                          /*
12071 12075                           * Set DEVICE REMOVED state in the target
12072 12076                           * node. It will prevent access to the device
12073 12077                           * even when a new device is attached, until
12074 12078                           * the old target node is released, removed and
12075 12079                           * recreated for a new  device.
12076 12080                           */
12077 12081                          sata_set_device_removed(tdip);
12078 12082  
12079 12083                          /*
12080 12084                           * Instruct event daemon to try the target
12081 12085                           * node cleanup later.
12082 12086                           */
12083 12087                          sata_set_target_node_cleanup(
12084 12088                              sata_hba_inst, &(pmport_device.satadev_addr));
12085 12089  
12086 12090                  }
12087 12091                  mutex_enter(&cportinfo->cport_mutex);
12088 12092  
12089 12093                  /*
12090 12094                   * Add here differentiation for device attached or not
12091 12095                   */
12092 12096                  if (sdinfo != NULL)  {
12093 12097                          sata_log(sata_hba_inst, CE_WARN,
12094 12098                              "SATA device detached from port %d:%d",
12095 12099                              cport, npmport);
12096 12100                          kmem_free(sdinfo, sizeof (sata_drive_info_t));
12097 12101                  }
12098 12102  
12099 12103                  mutex_destroy(&pmportinfo->pmport_mutex);
12100 12104                  kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
12101 12105          }
12102 12106  
12103 12107          kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12104 12108  
12105 12109          cportinfo->cport_devp.cport_sata_pmult = NULL;
12106 12110  
12107 12111          sata_log(sata_hba_inst, CE_WARN,
12108 12112              "SATA port multiplier detached at port %d", cport);
12109 12113  
12110 12114          mutex_exit(&cportinfo->cport_mutex);
12111 12115  }
12112 12116  
12113 12117  /*
12114 12118   * Initialize device
12115 12119   * Specified device is initialized to a default state.
12116 12120   *
12117 12121   * Returns SATA_SUCCESS if all device features are set successfully,
12118 12122   * SATA_RETRY if device is accessible but device features were not set
12119 12123   * successfully, and SATA_FAILURE otherwise.
12120 12124   */
12121 12125  static int
12122 12126  sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
12123 12127      sata_drive_info_t *sdinfo)
12124 12128  {
12125 12129          int rval;
12126 12130  
12127 12131          sata_save_drive_settings(sdinfo);
12128 12132  
12129 12133          sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12130 12134  
12131 12135          sata_init_write_cache_mode(sdinfo);
12132 12136  
12133 12137          rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
12134 12138  
12135 12139          /* Determine current data transfer mode */
12136 12140          if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
12137 12141                  sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12138 12142          } else if ((sdinfo->satadrv_id.ai_validinfo &
12139 12143              SATA_VALIDINFO_88) != 0 &&
12140 12144              (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
12141 12145                  sdinfo->satadrv_settings |= SATA_DEV_DMA;
12142 12146          } else if ((sdinfo->satadrv_id.ai_dworddma &
12143 12147              SATA_MDMA_SEL_MASK) != 0) {
12144 12148                  sdinfo->satadrv_settings |= SATA_DEV_DMA;
12145 12149          } else
12146 12150                  /* DMA supported, not no DMA transfer mode is selected !? */
12147 12151                  sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12148 12152  
12149 12153          if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
12150 12154              (sdinfo->satadrv_id.ai_features86 & 0x20))
12151 12155                  sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
12152 12156          else
12153 12157                  sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
12154 12158  
12155 12159          return (rval);
12156 12160  }
12157 12161  
12158 12162  
12159 12163  /*
12160 12164   * Initialize write cache mode.
12161 12165   *
12162 12166   * The default write cache setting for SATA HDD is provided by sata_write_cache
12163 12167   * static variable. ATAPI CD/DVDs devices have write cache default is
12164 12168   * determined by sata_atapicdvd_write_cache static variable.
12165 12169   * ATAPI tape devices have write cache default is determined by
12166 12170   * sata_atapitape_write_cache static variable.
12167 12171   * ATAPI disk devices have write cache default is determined by
12168 12172   * sata_atapidisk_write_cache static variable.
12169 12173   * 1 - enable
12170 12174   * 0 - disable
12171 12175   * any other value - current drive setting
12172 12176   *
12173 12177   * Although there is not reason to disable write cache on CD/DVD devices,
12174 12178   * tape devices and ATAPI disk devices, the default setting control is provided
12175 12179   * for the maximun flexibility.
12176 12180   *
12177 12181   * In the future, it may be overridden by the
12178 12182   * disk-write-cache-enable property setting, if it is defined.
12179 12183   * Returns SATA_SUCCESS if all device features are set successfully,
12180 12184   * SATA_FAILURE otherwise.
12181 12185   */
12182 12186  static void
12183 12187  sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
12184 12188  {
12185 12189          switch (sdinfo->satadrv_type) {
12186 12190          case SATA_DTYPE_ATADISK:
12187 12191                  if (sata_write_cache == 1)
12188 12192                          sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12189 12193                  else if (sata_write_cache == 0)
12190 12194                          sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12191 12195                  /*
12192 12196                   * When sata_write_cache value is not 0 or 1,
12193 12197                   * a current setting of the drive's write cache is used.
12194 12198                   */
12195 12199                  break;
12196 12200          case SATA_DTYPE_ATAPICD:
12197 12201                  if (sata_atapicdvd_write_cache == 1)
12198 12202                          sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12199 12203                  else if (sata_atapicdvd_write_cache == 0)
12200 12204                          sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12201 12205                  /*
12202 12206                   * When sata_atapicdvd_write_cache value is not 0 or 1,
12203 12207                   * a current setting of the drive's write cache is used.
12204 12208                   */
12205 12209                  break;
12206 12210          case SATA_DTYPE_ATAPITAPE:
12207 12211                  if (sata_atapitape_write_cache == 1)
12208 12212                          sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12209 12213                  else if (sata_atapitape_write_cache == 0)
12210 12214                          sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12211 12215                  /*
12212 12216                   * When sata_atapitape_write_cache value is not 0 or 1,
12213 12217                   * a current setting of the drive's write cache is used.
12214 12218                   */
12215 12219                  break;
12216 12220          case SATA_DTYPE_ATAPIDISK:
12217 12221                  if (sata_atapidisk_write_cache == 1)
12218 12222                          sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12219 12223                  else if (sata_atapidisk_write_cache == 0)
12220 12224                          sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12221 12225                  /*
12222 12226                   * When sata_atapidisk_write_cache value is not 0 or 1,
12223 12227                   * a current setting of the drive's write cache is used.
12224 12228                   */
12225 12229                  break;
12226 12230          }
12227 12231  }
12228 12232  
12229 12233  
  
    | 
      ↓ open down ↓ | 
    1121 lines elided | 
    
      ↑ open up ↑ | 
  
12230 12234  /*
12231 12235   * Validate sata address.
12232 12236   * Specified cport, pmport and qualifier has to match
12233 12237   * passed sata_scsi configuration info.
12234 12238   * The presence of an attached device is not verified.
12235 12239   *
12236 12240   * Returns 0 when address is valid, -1 otherwise.
12237 12241   */
12238 12242  static int
12239 12243  sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
12240      -        int pmport, int qual)
     12244 +    int pmport, int qual)
12241 12245  {
12242 12246          if (qual == SATA_ADDR_DCPORT && pmport != 0)
12243 12247                  goto invalid_address;
12244 12248          if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12245 12249                  goto invalid_address;
12246 12250          if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
12247 12251              ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
12248 12252              (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
12249 12253              (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
12250 12254                  goto invalid_address;
12251 12255  
12252 12256          return (0);
12253 12257  
12254 12258  invalid_address:
12255 12259          return (-1);
12256 12260  
12257 12261  }
12258 12262  
12259 12263  /*
12260 12264   * Validate scsi address
12261 12265   * SCSI target address is translated into SATA cport/pmport and compared
12262 12266   * with a controller port/device configuration. LUN has to be 0.
  
    | 
      ↓ open down ↓ | 
    12 lines elided | 
    
      ↑ open up ↑ | 
  
12263 12267   * Returns 0 if a scsi target refers to an attached device,
12264 12268   * returns 1 if address is valid but no valid device is attached,
12265 12269   * returns 2 if address is valid but device type is unknown (not valid device),
12266 12270   * returns -1 if bad address or device is of an unsupported type.
12267 12271   * Upon return sata_device argument is set.
12268 12272   *
12269 12273   * Port multiplier is supported now.
12270 12274   */
12271 12275  static int
12272 12276  sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
12273      -        struct scsi_address *ap, sata_device_t *sata_device)
     12277 +    struct scsi_address *ap, sata_device_t *sata_device)
12274 12278  {
12275 12279          int cport, pmport, qual, rval;
12276 12280  
12277 12281          rval = -1;      /* Invalid address */
12278 12282          if (ap->a_lun != 0)
12279 12283                  goto out;
12280 12284  
12281 12285          qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
12282 12286          cport = SCSI_TO_SATA_CPORT(ap->a_target);
12283 12287          pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
12284 12288  
12285 12289          if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
12286 12290                  goto out;
12287 12291  
12288 12292          if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
12289 12293              0) {
12290 12294  
12291 12295                  sata_cport_info_t *cportinfo;
12292 12296                  sata_pmult_info_t *pmultinfo;
12293 12297                  sata_drive_info_t *sdinfo = NULL;
12294 12298  
12295 12299                  sata_device->satadev_addr.qual = qual;
12296 12300                  sata_device->satadev_addr.cport = cport;
12297 12301                  sata_device->satadev_addr.pmport = pmport;
12298 12302                  sata_device->satadev_rev = SATA_DEVICE_REV_1;
12299 12303  
12300 12304                  rval = 1;       /* Valid sata address */
12301 12305  
12302 12306                  cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12303 12307                  if (qual == SATA_ADDR_DCPORT) {
12304 12308                          if (cportinfo == NULL ||
12305 12309                              cportinfo->cport_dev_type == SATA_DTYPE_NONE)
12306 12310                                  goto out;
12307 12311  
12308 12312                          sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12309 12313                          if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
12310 12314                              sdinfo != NULL) {
12311 12315                                  rval = 2;
12312 12316                                  goto out;
12313 12317                          }
12314 12318  
12315 12319                          if ((cportinfo->cport_dev_type &
12316 12320                              SATA_VALID_DEV_TYPE) == 0) {
12317 12321                                  rval = -1;
12318 12322                                  goto out;
12319 12323                          }
12320 12324  
12321 12325                  } else if (qual == SATA_ADDR_DPMPORT) {
12322 12326                          pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12323 12327                          if (pmultinfo == NULL) {
12324 12328                                  rval = -1;
12325 12329                                  goto out;
12326 12330                          }
12327 12331                          if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
12328 12332                              NULL ||
12329 12333                              SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12330 12334                              pmport) == SATA_DTYPE_NONE)
12331 12335                                  goto out;
12332 12336  
12333 12337                          sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
12334 12338                              pmport);
12335 12339                          if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12336 12340                              pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
12337 12341                                  rval = 2;
12338 12342                                  goto out;
12339 12343                          }
12340 12344  
12341 12345                          if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12342 12346                              pmport) & SATA_VALID_DEV_TYPE) == 0) {
12343 12347                                  rval = -1;
12344 12348                                  goto out;
12345 12349                          }
12346 12350  
12347 12351                  } else {
12348 12352                          rval = -1;
12349 12353                          goto out;
12350 12354                  }
12351 12355                  if ((sdinfo == NULL) ||
12352 12356                      (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
12353 12357                          goto out;
12354 12358  
12355 12359                  sata_device->satadev_type = sdinfo->satadrv_type;
12356 12360  
12357 12361                  return (0);
12358 12362          }
12359 12363  out:
12360 12364          if (rval > 0) {
12361 12365                  SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
12362 12366                      "sata_validate_scsi_address: no valid target %x lun %x",
12363 12367                      ap->a_target, ap->a_lun);
12364 12368          }
12365 12369          return (rval);
12366 12370  }
12367 12371  
12368 12372  /*
12369 12373   * Find dip corresponding to passed device number
12370 12374   *
12371 12375   * Returns NULL if invalid device number is passed or device cannot be found,
12372 12376   * Returns dip is device is found.
12373 12377   */
12374 12378  static dev_info_t *
12375 12379  sata_devt_to_devinfo(dev_t dev)
12376 12380  {
12377 12381          dev_info_t *dip;
12378 12382  #ifndef __lock_lint
12379 12383          struct devnames *dnp;
12380 12384          major_t major = getmajor(dev);
12381 12385          int instance = SATA_MINOR2INSTANCE(getminor(dev));
12382 12386  
12383 12387          if (major >= devcnt)
12384 12388                  return (NULL);
12385 12389  
12386 12390          dnp = &devnamesp[major];
12387 12391          LOCK_DEV_OPS(&(dnp->dn_lock));
12388 12392          dip = dnp->dn_head;
12389 12393          while (dip && (ddi_get_instance(dip) != instance)) {
12390 12394                  dip = ddi_get_next(dip);
12391 12395          }
12392 12396          UNLOCK_DEV_OPS(&(dnp->dn_lock));
12393 12397  #endif
12394 12398  
12395 12399          return (dip);
12396 12400  }
12397 12401  
12398 12402  
12399 12403  /*
12400 12404   * Probe device.
12401 12405   * This function issues Identify Device command and initializes local
12402 12406   * sata_drive_info structure if the device can be identified.
12403 12407   * The device type is determined by examining Identify Device
12404 12408   * command response.
12405 12409   * If the sata_hba_inst has linked drive info structure for this
12406 12410   * device address, the Identify Device data is stored into sata_drive_info
12407 12411   * structure linked to the port info structure.
12408 12412   *
12409 12413   * sata_device has to refer to the valid sata port(s) for HBA described
12410 12414   * by sata_hba_inst structure.
12411 12415   *
12412 12416   * Returns:
12413 12417   *      SATA_SUCCESS if device type was successfully probed and port-linked
12414 12418   *              drive info structure was updated;
12415 12419   *      SATA_FAILURE if there is no device, or device was not probed
12416 12420   *              successully;
12417 12421   *      SATA_RETRY if device probe can be retried later.
12418 12422   * If a device cannot be identified, sata_device's dev_state and dev_type
12419 12423   * fields are set to unknown.
12420 12424   * There are no retries in this function. Any retries should be managed by
12421 12425   * the caller.
12422 12426   */
12423 12427  
12424 12428  
12425 12429  static int
12426 12430  sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12427 12431  {
12428 12432          sata_pmport_info_t *pmportinfo;
12429 12433          sata_drive_info_t *sdinfo;
12430 12434          sata_drive_info_t new_sdinfo;   /* local drive info struct */
12431 12435          int rval;
12432 12436  
12433 12437          ASSERT((SATA_CPORT_STATE(sata_hba_inst,
12434 12438              sata_device->satadev_addr.cport) &
12435 12439              (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
12436 12440  
12437 12441          sata_device->satadev_type = SATA_DTYPE_NONE;
12438 12442  
12439 12443          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12440 12444              sata_device->satadev_addr.cport)));
12441 12445  
12442 12446          if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
12443 12447                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
12444 12448                      sata_device->satadev_addr.cport,
12445 12449                      sata_device->satadev_addr.pmport);
12446 12450                  ASSERT(pmportinfo != NULL);
12447 12451          }
12448 12452  
12449 12453          /* Get pointer to port-linked sata device info structure */
12450 12454          sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12451 12455          if (sdinfo != NULL) {
12452 12456                  sdinfo->satadrv_state &=
12453 12457                      ~(SATA_STATE_PROBED | SATA_STATE_READY);
12454 12458                  sdinfo->satadrv_state |= SATA_STATE_PROBING;
12455 12459          } else {
12456 12460                  /* No device to probe */
12457 12461                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12458 12462                      sata_device->satadev_addr.cport)));
12459 12463                  sata_device->satadev_type = SATA_DTYPE_NONE;
12460 12464                  sata_device->satadev_state = SATA_STATE_UNKNOWN;
12461 12465                  return (SATA_FAILURE);
12462 12466          }
12463 12467          /*
12464 12468           * Need to issue both types of identify device command and
12465 12469           * determine device type by examining retreived data/status.
12466 12470           * First, ATA Identify Device.
12467 12471           */
12468 12472          bzero(&new_sdinfo, sizeof (sata_drive_info_t));
12469 12473          new_sdinfo.satadrv_addr = sata_device->satadev_addr;
12470 12474          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12471 12475              sata_device->satadev_addr.cport)));
12472 12476          new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
12473 12477          rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12474 12478          if (rval == SATA_RETRY) {
12475 12479                  /* We may try to check for ATAPI device */
12476 12480                  if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
12477 12481                          /*
12478 12482                           * HBA supports ATAPI - try to issue Identify Packet
12479 12483                           * Device command.
12480 12484                           */
12481 12485                          new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
12482 12486                          rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12483 12487                  }
12484 12488          }
12485 12489          if (rval == SATA_SUCCESS) {
12486 12490                  /*
12487 12491                   * Got something responding positively to ATA Identify Device
12488 12492                   * or to Identify Packet Device cmd.
12489 12493                   * Save last used device type.
12490 12494                   */
12491 12495                  sata_device->satadev_type = new_sdinfo.satadrv_type;
12492 12496  
12493 12497                  /* save device info, if possible */
12494 12498                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12495 12499                      sata_device->satadev_addr.cport)));
12496 12500                  sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12497 12501                  if (sdinfo == NULL) {
12498 12502                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12499 12503                              sata_device->satadev_addr.cport)));
12500 12504                          return (SATA_FAILURE);
12501 12505                  }
12502 12506                  /*
12503 12507                   * Copy drive info into the port-linked drive info structure.
12504 12508                   */
12505 12509                  *sdinfo = new_sdinfo;
12506 12510                  sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12507 12511                  sdinfo->satadrv_state |= SATA_STATE_PROBED;
12508 12512                  if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12509 12513                          SATA_CPORT_DEV_TYPE(sata_hba_inst,
12510 12514                              sata_device->satadev_addr.cport) =
12511 12515                              sdinfo->satadrv_type;
12512 12516                  else { /* SATA_ADDR_DPMPORT */
12513 12517                          mutex_enter(&pmportinfo->pmport_mutex);
12514 12518                          SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12515 12519                              sata_device->satadev_addr.cport,
12516 12520                              sata_device->satadev_addr.pmport) =
12517 12521                              sdinfo->satadrv_type;
12518 12522                          mutex_exit(&pmportinfo->pmport_mutex);
12519 12523                  }
12520 12524                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12521 12525                      sata_device->satadev_addr.cport)));
12522 12526                  return (SATA_SUCCESS);
12523 12527          }
12524 12528  
12525 12529          /*
12526 12530           * It may be SATA_RETRY or SATA_FAILURE return.
12527 12531           * Looks like we cannot determine the device type at this time.
12528 12532           */
12529 12533          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12530 12534              sata_device->satadev_addr.cport)));
12531 12535          sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12532 12536          if (sdinfo != NULL) {
12533 12537                  sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
12534 12538                  sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12535 12539                  sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12536 12540                  sdinfo->satadrv_state |= SATA_STATE_PROBED;
12537 12541                  if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12538 12542                          SATA_CPORT_DEV_TYPE(sata_hba_inst,
12539 12543                              sata_device->satadev_addr.cport) =
12540 12544                              SATA_DTYPE_UNKNOWN;
12541 12545                  else {
12542 12546                          /* SATA_ADDR_DPMPORT */
12543 12547                          mutex_enter(&pmportinfo->pmport_mutex);
12544 12548                          if ((SATA_PMULT_INFO(sata_hba_inst,
12545 12549                              sata_device->satadev_addr.cport) != NULL) &&
12546 12550                              (SATA_PMPORT_INFO(sata_hba_inst,
12547 12551                              sata_device->satadev_addr.cport,
12548 12552                              sata_device->satadev_addr.pmport) != NULL))
12549 12553                                  SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12550 12554                                      sata_device->satadev_addr.cport,
12551 12555                                      sata_device->satadev_addr.pmport) =
12552 12556                                      SATA_DTYPE_UNKNOWN;
12553 12557                          mutex_exit(&pmportinfo->pmport_mutex);
12554 12558                  }
12555 12559          }
12556 12560          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12557 12561              sata_device->satadev_addr.cport)));
12558 12562          return (rval);
12559 12563  }
12560 12564  
12561 12565  
12562 12566  /*
12563 12567   * Get pointer to sata_drive_info structure.
12564 12568   *
12565 12569   * The sata_device has to contain address (cport, pmport and qualifier) for
12566 12570   * specified sata_scsi structure.
12567 12571   *
12568 12572   * Returns NULL if device address is not valid for this HBA configuration.
12569 12573   * Otherwise, returns a pointer to sata_drive_info structure.
12570 12574   *
12571 12575   * This function should be called with a port mutex held.
12572 12576   */
12573 12577  static sata_drive_info_t *
12574 12578  sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
12575 12579      sata_device_t *sata_device)
12576 12580  {
12577 12581          uint8_t cport = sata_device->satadev_addr.cport;
12578 12582          uint8_t pmport = sata_device->satadev_addr.pmport;
12579 12583          uint8_t qual = sata_device->satadev_addr.qual;
12580 12584  
12581 12585          if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12582 12586                  return (NULL);
12583 12587  
12584 12588          if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
12585 12589              (SATA_STATE_PROBED | SATA_STATE_READY)))
12586 12590                  /* Port not probed yet */
12587 12591                  return (NULL);
12588 12592  
12589 12593          if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
12590 12594                  return (NULL);
12591 12595  
12592 12596          if (qual == SATA_ADDR_DCPORT) {
12593 12597                  /* Request for a device on a controller port */
12594 12598                  if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
12595 12599                      SATA_DTYPE_PMULT)
12596 12600                          /* Port multiplier attached */
12597 12601                          return (NULL);
12598 12602                  return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
12599 12603          }
12600 12604          if (qual == SATA_ADDR_DPMPORT) {
12601 12605                  if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
12602 12606                      SATA_DTYPE_PMULT)
12603 12607                          return (NULL);
12604 12608  
12605 12609                  if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
12606 12610                          return (NULL);
12607 12611  
12608 12612                  if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
12609 12613                      (SATA_STATE_PROBED | SATA_STATE_READY)))
12610 12614                          /* Port multiplier port not probed yet */
12611 12615                          return (NULL);
12612 12616  
12613 12617                  return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
12614 12618          }
12615 12619  
12616 12620          /* we should not get here */
12617 12621          return (NULL);
12618 12622  }
12619 12623  
12620 12624  
12621 12625  /*
12622 12626   * sata_identify_device.
12623 12627   * Send Identify Device command to SATA HBA driver.
12624 12628   * If command executes successfully, update sata_drive_info structure pointed
12625 12629   * to by sdinfo argument, including Identify Device data.
12626 12630   * If command fails, invalidate data in sata_drive_info.
12627 12631   *
12628 12632   * Cannot be called from interrupt level.
12629 12633   *
12630 12634   * Returns:
12631 12635   * SATA_SUCCESS if the device was identified as a supported device,
12632 12636   * SATA_RETRY if the device was not identified but could be retried,
12633 12637   * SATA_FAILURE if the device was not identified and identify attempt
12634 12638   *      should not be retried.
12635 12639   */
12636 12640  static int
12637 12641  sata_identify_device(sata_hba_inst_t *sata_hba_inst,
12638 12642      sata_drive_info_t *sdinfo)
12639 12643  {
12640 12644          uint16_t cfg_word;
12641 12645          int rval;
12642 12646  
12643 12647          /* fetch device identify data */
12644 12648          if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
12645 12649              sdinfo)) != SATA_SUCCESS)
12646 12650                  goto fail_unknown;
12647 12651  
12648 12652          cfg_word = sdinfo->satadrv_id.ai_config;
12649 12653  
12650 12654          /* Set the correct device type */
12651 12655          if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
12652 12656                  sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12653 12657          } else if (cfg_word == SATA_CFA_TYPE) {
12654 12658                  /* It's a Compact Flash media via CF-to-SATA HDD adapter */
12655 12659                  sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12656 12660          } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
12657 12661                  switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
12658 12662                  case SATA_ATAPI_CDROM_DEV:
12659 12663                          sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
12660 12664                          break;
12661 12665                  case SATA_ATAPI_SQACC_DEV:
12662 12666                          sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
12663 12667                          break;
12664 12668                  case SATA_ATAPI_DIRACC_DEV:
12665 12669                          sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
12666 12670                          break;
12667 12671                  case SATA_ATAPI_PROC_DEV:
12668 12672                          sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
12669 12673                          break;
12670 12674                  default:
12671 12675                          sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12672 12676                  }
12673 12677          } else {
12674 12678                          sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12675 12679          }
12676 12680  
12677 12681          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12678 12682                  if (sdinfo->satadrv_capacity == 0) {
12679 12683                          /* Non-LBA disk. Too bad... */
12680 12684                          sata_log(sata_hba_inst, CE_WARN,
12681 12685                              "SATA disk device at port %d does not support LBA",
12682 12686                              sdinfo->satadrv_addr.cport);
12683 12687                          rval = SATA_FAILURE;
12684 12688                          goto fail_unknown;
12685 12689                  }
12686 12690          }
12687 12691  #if 0
12688 12692          /* Left for historical reason */
12689 12693          /*
12690 12694           * Some initial version of SATA spec indicated that at least
12691 12695           * UDMA mode 4 has to be supported. It is not metioned in
12692 12696           * SerialATA 2.6, so this restriction is removed.
12693 12697           */
12694 12698          /* Check for Ultra DMA modes 6 through 0 being supported */
12695 12699          for (i = 6; i >= 0; --i) {
12696 12700                  if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
12697 12701                          break;
12698 12702          }
12699 12703  
12700 12704          /*
12701 12705           * At least UDMA 4 mode has to be supported. If mode 4 or
12702 12706           * higher are not supported by the device, fail this
12703 12707           * device.
12704 12708           */
12705 12709          if (i < 4) {
12706 12710                  /* No required Ultra DMA mode supported */
12707 12711                  sata_log(sata_hba_inst, CE_WARN,
12708 12712                      "SATA disk device at port %d does not support UDMA "
12709 12713                      "mode 4 or higher", sdinfo->satadrv_addr.cport);
12710 12714                  SATA_LOG_D((sata_hba_inst, CE_WARN,
12711 12715                      "mode 4 or higher required, %d supported", i));
12712 12716                  rval = SATA_FAILURE;
12713 12717                  goto fail_unknown;
12714 12718          }
12715 12719  #endif
12716 12720  
12717 12721          /*
12718 12722           * For Disk devices, if it doesn't support UDMA mode, we would
12719 12723           * like to return failure directly.
12720 12724           */
12721 12725          if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
12722 12726              !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
12723 12727              (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
12724 12728                  sata_log(sata_hba_inst, CE_WARN,
12725 12729                      "SATA disk device at port %d does not support UDMA",
12726 12730                      sdinfo->satadrv_addr.cport);
12727 12731                  rval = SATA_FAILURE;
12728 12732                  goto fail_unknown;
12729 12733          }
12730 12734  
12731 12735          return (SATA_SUCCESS);
12732 12736  
12733 12737  fail_unknown:
12734 12738          /* Invalidate sata_drive_info ? */
12735 12739          sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12736 12740          sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12737 12741          return (rval);
12738 12742  }
12739 12743  
12740 12744  /*
12741 12745   * Log/display device information
12742 12746   */
12743 12747  static void
12744 12748  sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
12745 12749      sata_drive_info_t *sdinfo)
12746 12750  {
12747 12751          int valid_version;
12748 12752          char msg_buf[MAXPATHLEN];
12749 12753          int i;
12750 12754  
12751 12755          /* Show HBA path */
12752 12756          (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
12753 12757  
12754 12758          cmn_err(CE_CONT, "?%s :\n", msg_buf);
12755 12759  
12756 12760          switch (sdinfo->satadrv_type) {
12757 12761          case SATA_DTYPE_ATADISK:
12758 12762                  (void) sprintf(msg_buf, "SATA disk device at");
12759 12763                  break;
12760 12764  
12761 12765          case SATA_DTYPE_ATAPICD:
12762 12766                  (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
12763 12767                  break;
12764 12768  
12765 12769          case SATA_DTYPE_ATAPITAPE:
12766 12770                  (void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
12767 12771                  break;
12768 12772  
12769 12773          case SATA_DTYPE_ATAPIDISK:
12770 12774                  (void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
12771 12775                  break;
12772 12776  
12773 12777          case SATA_DTYPE_ATAPIPROC:
12774 12778                  (void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
12775 12779                  break;
12776 12780  
12777 12781          case SATA_DTYPE_UNKNOWN:
12778 12782                  (void) sprintf(msg_buf,
12779 12783                      "Unsupported SATA device type (cfg 0x%x) at ",
12780 12784                      sdinfo->satadrv_id.ai_config);
12781 12785                  break;
12782 12786          }
12783 12787  
12784 12788          if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
12785 12789                  cmn_err(CE_CONT, "?\t%s port %d\n",
12786 12790                      msg_buf, sdinfo->satadrv_addr.cport);
12787 12791          else
12788 12792                  cmn_err(CE_CONT, "?\t%s port %d:%d\n",
12789 12793                      msg_buf, sdinfo->satadrv_addr.cport,
12790 12794                      sdinfo->satadrv_addr.pmport);
12791 12795  
12792 12796          bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
12793 12797              sizeof (sdinfo->satadrv_id.ai_model));
12794 12798          swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
12795 12799          msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
12796 12800          cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
12797 12801  
12798 12802          bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
12799 12803              sizeof (sdinfo->satadrv_id.ai_fw));
12800 12804          swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
12801 12805          msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
12802 12806          cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
12803 12807  
12804 12808          bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
12805 12809              sizeof (sdinfo->satadrv_id.ai_drvser));
12806 12810          swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
12807 12811          msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
12808 12812          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12809 12813                  cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12810 12814          } else {
12811 12815                  /*
12812 12816                   * Some drives do not implement serial number and may
12813 12817                   * violate the spec by providing spaces rather than zeros
12814 12818                   * in serial number field. Scan the buffer to detect it.
12815 12819                   */
12816 12820                  for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
12817 12821                          if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
12818 12822                                  break;
12819 12823                  }
12820 12824                  if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
12821 12825                          cmn_err(CE_CONT, "?\tserial number - none\n");
12822 12826                  } else {
12823 12827                          cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12824 12828                  }
12825 12829          }
12826 12830  
12827 12831  #ifdef SATA_DEBUG
12828 12832          if (sdinfo->satadrv_id.ai_majorversion != 0 &&
12829 12833              sdinfo->satadrv_id.ai_majorversion != 0xffff) {
12830 12834                  int i;
12831 12835                  for (i = 14; i >= 2; i--) {
12832 12836                          if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
12833 12837                                  valid_version = i;
12834 12838                                  break;
12835 12839                          }
12836 12840                  }
12837 12841                  cmn_err(CE_CONT,
12838 12842                      "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
12839 12843                      valid_version,
12840 12844                      sdinfo->satadrv_id.ai_majorversion,
12841 12845                      sdinfo->satadrv_id.ai_minorversion);
12842 12846          }
12843 12847  #endif
12844 12848          /* Log some info */
12845 12849          cmn_err(CE_CONT, "?\tsupported features:\n");
12846 12850          msg_buf[0] = '\0';
12847 12851          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12848 12852                  if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
12849 12853                          (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
12850 12854                  else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
12851 12855                          (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
12852 12856          }
12853 12857          if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
12854 12858                  (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
12855 12859          if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
12856 12860                  (void) strlcat(msg_buf, ", Native Command Queueing",
12857 12861                      MAXPATHLEN);
12858 12862          if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
12859 12863                  (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
12860 12864          if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
12861 12865              (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
12862 12866                  (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
12863 12867          if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
12864 12868              (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
12865 12869                  (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
12866 12870          cmn_err(CE_CONT, "?\t %s\n", msg_buf);
12867 12871          if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
12868 12872                  cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
12869 12873          else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
12870 12874                  cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
12871 12875          else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
12872 12876                  cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
12873 12877          if (sdinfo->satadrv_features_support &
12874 12878              (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
12875 12879                  msg_buf[0] = '\0';
12876 12880                  (void) snprintf(msg_buf, MAXPATHLEN,
12877 12881                      "Supported queue depth %d",
12878 12882                      sdinfo->satadrv_queue_depth);
12879 12883                  if (!(sata_func_enable &
12880 12884                      (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
12881 12885                          (void) strlcat(msg_buf,
12882 12886                              " - queueing disabled globally", MAXPATHLEN);
12883 12887                  else if (sdinfo->satadrv_queue_depth >
12884 12888                      sdinfo->satadrv_max_queue_depth) {
12885 12889                          (void) snprintf(&msg_buf[strlen(msg_buf)],
12886 12890                              MAXPATHLEN - strlen(msg_buf), ", limited to %d",
12887 12891                              (int)sdinfo->satadrv_max_queue_depth);
12888 12892                  }
12889 12893                  cmn_err(CE_CONT, "?\t%s\n", msg_buf);
12890 12894          }
12891 12895  
12892 12896          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12893 12897  #ifdef __i386
12894 12898                  (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
12895 12899                      sdinfo->satadrv_capacity);
12896 12900  #else
12897 12901                  (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
12898 12902                      sdinfo->satadrv_capacity);
12899 12903  #endif
12900 12904                  cmn_err(CE_CONT, "?%s", msg_buf);
12901 12905          }
12902 12906  }
12903 12907  
12904 12908  /*
12905 12909   * Log/display port multiplier information
12906 12910   * No Mutex should be hold.
12907 12911   */
12908 12912  static void
12909 12913  sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
12910 12914      sata_device_t *sata_device)
12911 12915  {
12912 12916          _NOTE(ARGUNUSED(sata_hba_inst))
12913 12917  
12914 12918          int cport = sata_device->satadev_addr.cport;
12915 12919          sata_pmult_info_t *pmultinfo;
12916 12920          char msg_buf[MAXPATHLEN];
12917 12921          uint32_t gscr0, gscr1, gscr2, gscr64;
12918 12922  
12919 12923          mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12920 12924          pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12921 12925          if (pmultinfo == NULL) {
12922 12926                  mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12923 12927                  return;
12924 12928          }
12925 12929  
12926 12930          gscr0 = pmultinfo->pmult_gscr.gscr0;
12927 12931          gscr1 = pmultinfo->pmult_gscr.gscr1;
12928 12932          gscr2 = pmultinfo->pmult_gscr.gscr2;
12929 12933          gscr64 = pmultinfo->pmult_gscr.gscr64;
12930 12934          mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12931 12935  
12932 12936          cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
12933 12937              sata_device->satadev_add_info, sata_device->satadev_addr.cport);
12934 12938  
12935 12939          (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
12936 12940              gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
12937 12941          cmn_err(CE_CONT, "?%s", msg_buf);
12938 12942  
12939 12943          (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
12940 12944          if (gscr1 & (1 << 3))
12941 12945                  (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
12942 12946          else if (gscr1 & (1 << 2))
12943 12947                  (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
12944 12948          else if (gscr1 & (1 << 1))
12945 12949                  (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
12946 12950          else
12947 12951                  (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
12948 12952          cmn_err(CE_CONT, "?%s", msg_buf);
12949 12953  
12950 12954          (void) strcpy(msg_buf, "\tSupport ");
12951 12955          if (gscr64 & (1 << 3))
12952 12956                  (void) strlcat(msg_buf, "Asy-Notif, ",
12953 12957                      MAXPATHLEN);
12954 12958          if (gscr64 & (1 << 2))
12955 12959                  (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
12956 12960          if (gscr64 & (1 << 1))
12957 12961                  (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
12958 12962          if (gscr64 & (1 << 0))
12959 12963                  (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
12960 12964          if ((gscr64 & 0xf) == 0)
12961 12965                  (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
12962 12966          cmn_err(CE_CONT, "?%s", msg_buf);
12963 12967  
12964 12968          (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
12965 12969              gscr2 & SATA_PMULT_PORTNUM_MASK);
12966 12970          cmn_err(CE_CONT, "?%s", msg_buf);
12967 12971  }
12968 12972  
12969 12973  /*
12970 12974   * sata_save_drive_settings extracts current setting of the device and stores
12971 12975   * it for future reference, in case the device setup would need to be restored
12972 12976   * after the device reset.
12973 12977   *
12974 12978   * For all devices read ahead and write cache settings are saved, if the
12975 12979   * device supports these features at all.
12976 12980   * For ATAPI devices the Removable Media Status Notification setting is saved.
12977 12981   */
12978 12982  static void
12979 12983  sata_save_drive_settings(sata_drive_info_t *sdinfo)
12980 12984  {
12981 12985          if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
12982 12986              SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
12983 12987  
12984 12988                  /* Current setting of Read Ahead (and Read Cache) */
12985 12989                  if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
12986 12990                          sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12987 12991                  else
12988 12992                          sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
12989 12993  
12990 12994                  /* Current setting of Write Cache */
12991 12995                  if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
12992 12996                          sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12993 12997                  else
12994 12998                          sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12995 12999          }
12996 13000  
12997 13001          if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
12998 13002                  if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
12999 13003                          sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13000 13004                  else
13001 13005                          sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13002 13006          }
13003 13007  }
13004 13008  
13005 13009  
13006 13010  /*
13007 13011   * sata_check_capacity function determines a disk capacity
13008 13012   * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13009 13013   *
13010 13014   * NOTE: CHS mode is not supported! If a device does not support LBA,
13011 13015   * this function is not called.
13012 13016   *
13013 13017   * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13014 13018   */
13015 13019  static uint64_t
13016 13020  sata_check_capacity(sata_drive_info_t *sdinfo)
13017 13021  {
13018 13022          uint64_t capacity = 0;
13019 13023          int i;
13020 13024  
13021 13025          if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13022 13026              !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
13023 13027                  /* Capacity valid only for LBA-addressable disk devices */
13024 13028                  return (0);
13025 13029  
13026 13030          if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13027 13031              (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13028 13032              (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13029 13033                  /* LBA48 mode supported and enabled */
13030 13034                  sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13031 13035                      SATA_DEV_F_LBA28;
13032 13036                  for (i = 3;  i >= 0;  --i) {
13033 13037                          capacity <<= 16;
13034 13038                          capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13035 13039                  }
13036 13040          } else {
13037 13041                  capacity = sdinfo->satadrv_id.ai_addrsec[1];
13038 13042                  capacity <<= 16;
13039 13043                  capacity += sdinfo->satadrv_id.ai_addrsec[0];
13040 13044                  if (capacity >= 0x1000000)
13041 13045                          /* LBA28 mode */
13042 13046                          sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13043 13047          }
13044 13048          return (capacity);
13045 13049  }
13046 13050  
13047 13051  
13048 13052  /*
13049 13053   * Allocate consistent buffer for DMA transfer
13050 13054   *
13051 13055   * Cannot be called from interrupt level or with mutex held - it may sleep.
13052 13056   *
13053 13057   * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13054 13058   */
13055 13059  static struct buf *
13056 13060  sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
13057 13061  {
13058 13062          struct scsi_address ap;
13059 13063          struct buf *bp;
13060 13064          ddi_dma_attr_t  cur_dma_attr;
13061 13065  
13062 13066          ASSERT(spx->txlt_sata_pkt != NULL);
13063 13067          ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13064 13068          ap.a_target = SATA_TO_SCSI_TARGET(
13065 13069              spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
13066 13070              spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
13067 13071              spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
13068 13072          ap.a_lun = 0;
13069 13073  
13070 13074          bp = scsi_alloc_consistent_buf(&ap, NULL, len,
13071 13075              B_READ, SLEEP_FUNC, NULL);
13072 13076  
13073 13077          if (bp != NULL) {
13074 13078                  /* Allocate DMA resources for this buffer */
13075 13079                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
13076 13080                  /*
13077 13081                   * We use a local version of the dma_attr, to account
13078 13082                   * for a device addressing limitations.
13079 13083                   * sata_adjust_dma_attr() will handle sdinfo == NULL which
13080 13084                   * will cause dma attributes to be adjusted to a lowest
13081 13085                   * acceptable level.
13082 13086                   */
13083 13087                  sata_adjust_dma_attr(NULL,
13084 13088                      SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
13085 13089  
13086 13090                  if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
13087 13091                      SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
13088 13092                          scsi_free_consistent_buf(bp);
13089 13093                          spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13090 13094                          bp = NULL;
13091 13095                  }
13092 13096          }
13093 13097          return (bp);
13094 13098  }
13095 13099  
13096 13100  /*
13097 13101   * Release local buffer (consistent buffer for DMA transfer) allocated
13098 13102   * via sata_alloc_local_buffer().
13099 13103   */
13100 13104  static void
13101 13105  sata_free_local_buffer(sata_pkt_txlate_t *spx)
13102 13106  {
13103 13107          ASSERT(spx->txlt_sata_pkt != NULL);
13104 13108          ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
13105 13109  
13106 13110          spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
13107 13111          spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
13108 13112  
13109 13113          sata_common_free_dma_rsrcs(spx);
13110 13114  
13111 13115          /* Free buffer */
13112 13116          scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
13113 13117          spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13114 13118  }
13115 13119  
13116 13120  /*
13117 13121   * Allocate sata_pkt
13118 13122   * Pkt structure version and embedded strcutures version are initialized.
13119 13123   * sata_pkt and sata_pkt_txlate structures are cross-linked.
13120 13124   *
13121 13125   * Since this may be called in interrupt context by sata_scsi_init_pkt,
13122 13126   * callback argument determines if it can sleep or not.
13123 13127   * Hence, it should not be called from interrupt context.
13124 13128   *
13125 13129   * If successful, non-NULL pointer to a sata pkt is returned.
13126 13130   * Upon failure, NULL pointer is returned.
13127 13131   */
13128 13132  static sata_pkt_t *
13129 13133  sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
13130 13134  {
13131 13135          sata_pkt_t *spkt;
13132 13136          int kmsflag;
13133 13137  
13134 13138          kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
13135 13139          spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
13136 13140          if (spkt == NULL) {
13137 13141                  SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13138 13142                      "sata_pkt_alloc: failed"));
13139 13143                  return (NULL);
13140 13144          }
13141 13145          spkt->satapkt_rev = SATA_PKT_REV;
13142 13146          spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
13143 13147          spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
13144 13148          spkt->satapkt_framework_private = spx;
13145 13149          spx->txlt_sata_pkt = spkt;
13146 13150          return (spkt);
13147 13151  }
13148 13152  
13149 13153  /*
13150 13154   * Free sata pkt allocated via sata_pkt_alloc()
13151 13155   */
13152 13156  static void
13153 13157  sata_pkt_free(sata_pkt_txlate_t *spx)
13154 13158  {
13155 13159          ASSERT(spx->txlt_sata_pkt != NULL);
13156 13160          ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
13157 13161          kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
13158 13162          spx->txlt_sata_pkt = NULL;
13159 13163  }
13160 13164  
13161 13165  
13162 13166  /*
13163 13167   * Adjust DMA attributes.
13164 13168   * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
13165 13169   * from 8 bits to 16 bits, depending on a command being used.
13166 13170   * Limiting max block count arbitrarily to 256 for all read/write
13167 13171   * commands may affects performance, so check both the device and
13168 13172   * controller capability before adjusting dma attributes.
13169 13173   */
13170 13174  void
13171 13175  sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
13172 13176      ddi_dma_attr_t *adj_dma_attr)
13173 13177  {
13174 13178          uint32_t count_max;
13175 13179  
13176 13180          /* Copy original attributes */
13177 13181          *adj_dma_attr = *dma_attr;
13178 13182          /*
13179 13183           * Things to consider: device addressing capability,
13180 13184           * "excessive" controller DMA capabilities.
13181 13185           * If a device is being probed/initialized, there are
13182 13186           * no device info - use default limits then.
13183 13187           */
13184 13188          if (sdinfo == NULL) {
13185 13189                  count_max = dma_attr->dma_attr_granular * 0x100;
13186 13190                  if (dma_attr->dma_attr_count_max > count_max)
13187 13191                          adj_dma_attr->dma_attr_count_max = count_max;
13188 13192                  if (dma_attr->dma_attr_maxxfer > count_max)
13189 13193                          adj_dma_attr->dma_attr_maxxfer = count_max;
13190 13194                  return;
13191 13195          }
13192 13196  
13193 13197          if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13194 13198                  if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
13195 13199                          /*
13196 13200                           * 16-bit sector count may be used - we rely on
13197 13201                           * the assumption that only read and write cmds
13198 13202                           * will request more than 256 sectors worth of data
13199 13203                           */
13200 13204                          count_max = adj_dma_attr->dma_attr_granular * 0x10000;
13201 13205                  } else {
13202 13206                          /*
13203 13207                           * 8-bit sector count will be used - default limits
13204 13208                           * for dma attributes
13205 13209                           */
13206 13210                          count_max = adj_dma_attr->dma_attr_granular * 0x100;
13207 13211                  }
13208 13212                  /*
13209 13213                   * Adjust controler dma attributes, if necessary
13210 13214                   */
13211 13215                  if (dma_attr->dma_attr_count_max > count_max)
13212 13216                          adj_dma_attr->dma_attr_count_max = count_max;
13213 13217                  if (dma_attr->dma_attr_maxxfer > count_max)
13214 13218                          adj_dma_attr->dma_attr_maxxfer = count_max;
13215 13219          }
13216 13220  }
13217 13221  
13218 13222  
13219 13223  /*
13220 13224   * Allocate DMA resources for the buffer
13221 13225   * This function handles initial DMA resource allocation as well as
13222 13226   * DMA window shift and may be called repeatedly for the same DMA window
13223 13227   * until all DMA cookies in the DMA window are processed.
13224 13228   * To guarantee that there is always a coherent set of cookies to process
13225 13229   * by SATA HBA driver (observing alignment, device granularity, etc.),
13226 13230   * the number of slots for DMA cookies is equal to lesser of  a number of
13227 13231   * cookies in a DMA window and a max number of scatter/gather entries.
13228 13232   *
13229 13233   * Returns DDI_SUCCESS upon successful operation.
13230 13234   * Return failure code of a failing command or DDI_FAILURE when
13231 13235   * internal cleanup failed.
13232 13236   */
13233 13237  static int
13234 13238  sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
13235 13239      int (*callback)(caddr_t), caddr_t arg,
13236 13240      ddi_dma_attr_t *cur_dma_attr)
13237 13241  {
13238 13242          int     rval;
13239 13243          off_t   offset;
13240 13244          size_t  size;
13241 13245          int     max_sg_len, req_len, i;
13242 13246          uint_t  dma_flags;
13243 13247          struct buf      *bp;
13244 13248          uint64_t        cur_txfer_len;
13245 13249  
13246 13250  
13247 13251          ASSERT(spx->txlt_sata_pkt != NULL);
13248 13252          bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
13249 13253          ASSERT(bp != NULL);
13250 13254  
13251 13255  
13252 13256          if (spx->txlt_buf_dma_handle == NULL) {
13253 13257                  /*
13254 13258                   * No DMA resources allocated so far - this is a first call
13255 13259                   * for this sata pkt.
13256 13260                   */
13257 13261                  rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
13258 13262                      cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
13259 13263  
13260 13264                  if (rval != DDI_SUCCESS) {
13261 13265                          SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13262 13266                              "sata_dma_buf_setup: no buf DMA resources %x",
13263 13267                              rval));
13264 13268                          return (rval);
13265 13269                  }
13266 13270  
13267 13271                  if (bp->b_flags & B_READ)
13268 13272                          dma_flags = DDI_DMA_READ;
13269 13273                  else
13270 13274                          dma_flags = DDI_DMA_WRITE;
13271 13275  
13272 13276                  if (flags & PKT_CONSISTENT)
13273 13277                          dma_flags |= DDI_DMA_CONSISTENT;
13274 13278  
13275 13279                  if (flags & PKT_DMA_PARTIAL)
13276 13280                          dma_flags |= DDI_DMA_PARTIAL;
13277 13281  
13278 13282                  /*
13279 13283                   * Check buffer alignment and size against dma attributes
13280 13284                   * Consider dma_attr_align only. There may be requests
13281 13285                   * with the size lower than device granularity, but they
13282 13286                   * will not read/write from/to the device, so no adjustment
13283 13287                   * is necessary. The dma_attr_minxfer theoretically should
13284 13288                   * be considered, but no HBA driver is checking it.
13285 13289                   */
13286 13290                  if (IS_P2ALIGNED(bp->b_un.b_addr,
13287 13291                      cur_dma_attr->dma_attr_align)) {
13288 13292                          rval = ddi_dma_buf_bind_handle(
13289 13293                              spx->txlt_buf_dma_handle,
13290 13294                              bp, dma_flags, callback, arg,
13291 13295                              &spx->txlt_dma_cookie,
13292 13296                              &spx->txlt_curwin_num_dma_cookies);
13293 13297                  } else { /* Buffer is not aligned */
13294 13298  
13295 13299                          int     (*ddicallback)(caddr_t);
13296 13300                          size_t  bufsz;
13297 13301  
13298 13302                          /* Check id sleeping is allowed */
13299 13303                          ddicallback = (callback == NULL_FUNC) ?
13300 13304                              DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
13301 13305  
13302 13306                          SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13303 13307                              "mis-aligned buffer: addr=0x%p, cnt=%lu",
13304 13308                              (void *)bp->b_un.b_addr, bp->b_bcount);
13305 13309  
13306 13310                          if (bp->b_flags & (B_PAGEIO|B_PHYS))
13307 13311                                  /*
13308 13312                                   * CPU will need to access data in the buffer
13309 13313                                   * (for copying) so map it.
13310 13314                                   */
13311 13315                                  bp_mapin(bp);
13312 13316  
13313 13317                          ASSERT(spx->txlt_tmp_buf == NULL);
13314 13318  
13315 13319                          /* Buffer may be padded by ddi_dma_mem_alloc()! */
13316 13320                          rval = ddi_dma_mem_alloc(
13317 13321                              spx->txlt_buf_dma_handle,
13318 13322                              bp->b_bcount,
13319 13323                              &sata_acc_attr,
13320 13324                              DDI_DMA_STREAMING,
13321 13325                              ddicallback, NULL,
13322 13326                              &spx->txlt_tmp_buf,
13323 13327                              &bufsz,
13324 13328                              &spx->txlt_tmp_buf_handle);
13325 13329  
13326 13330                          if (rval != DDI_SUCCESS) {
13327 13331                                  /* DMA mapping failed */
13328 13332                                  (void) ddi_dma_free_handle(
13329 13333                                      &spx->txlt_buf_dma_handle);
13330 13334                                  spx->txlt_buf_dma_handle = NULL;
13331 13335  #ifdef SATA_DEBUG
13332 13336                                  mbuffail_count++;
13333 13337  #endif
13334 13338                                  SATADBG1(SATA_DBG_DMA_SETUP,
13335 13339                                      spx->txlt_sata_hba_inst,
13336 13340                                      "sata_dma_buf_setup: "
13337 13341                                      "buf dma mem alloc failed %x\n", rval);
13338 13342                                  return (rval);
13339 13343                          }
13340 13344                          ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
13341 13345                              cur_dma_attr->dma_attr_align));
13342 13346  
13343 13347  #ifdef SATA_DEBUG
13344 13348                          mbuf_count++;
13345 13349  
13346 13350                          if (bp->b_bcount != bufsz)
13347 13351                                  /*
13348 13352                                   * This will require special handling, because
13349 13353                                   * DMA cookies will be based on the temporary
13350 13354                                   * buffer size, not the original buffer
13351 13355                                   * b_bcount, so the residue may have to
13352 13356                                   * be counted differently.
13353 13357                                   */
13354 13358                                  SATADBG2(SATA_DBG_DMA_SETUP,
13355 13359                                      spx->txlt_sata_hba_inst,
13356 13360                                      "sata_dma_buf_setup: bp size %x != "
13357 13361                                      "bufsz %x\n", bp->b_bcount, bufsz);
13358 13362  #endif
13359 13363                          if (dma_flags & DDI_DMA_WRITE) {
13360 13364                                  /*
13361 13365                                   * Write operation - copy data into
13362 13366                                   * an aligned temporary buffer. Buffer will be
13363 13367                                   * synced for device by ddi_dma_addr_bind_handle
13364 13368                                   */
13365 13369                                  bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
13366 13370                                      bp->b_bcount);
13367 13371                          }
13368 13372  
13369 13373                          rval = ddi_dma_addr_bind_handle(
13370 13374                              spx->txlt_buf_dma_handle,
13371 13375                              NULL,
13372 13376                              spx->txlt_tmp_buf,
13373 13377                              bufsz, dma_flags, ddicallback, 0,
13374 13378                              &spx->txlt_dma_cookie,
13375 13379                              &spx->txlt_curwin_num_dma_cookies);
13376 13380                  }
13377 13381  
13378 13382                  switch (rval) {
13379 13383                  case DDI_DMA_PARTIAL_MAP:
13380 13384                          SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13381 13385                              "sata_dma_buf_setup: DMA Partial Map\n", NULL);
13382 13386                          /*
13383 13387                           * Partial DMA mapping.
13384 13388                           * Retrieve number of DMA windows for this request.
13385 13389                           */
13386 13390                          if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
13387 13391                              &spx->txlt_num_dma_win) != DDI_SUCCESS) {
13388 13392                                  if (spx->txlt_tmp_buf != NULL) {
13389 13393                                          ddi_dma_mem_free(
13390 13394                                              &spx->txlt_tmp_buf_handle);
13391 13395                                          spx->txlt_tmp_buf = NULL;
13392 13396                                  }
13393 13397                                  (void) ddi_dma_unbind_handle(
13394 13398                                      spx->txlt_buf_dma_handle);
13395 13399                                  (void) ddi_dma_free_handle(
13396 13400                                      &spx->txlt_buf_dma_handle);
13397 13401                                  spx->txlt_buf_dma_handle = NULL;
13398 13402                                  SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13399 13403                                      "sata_dma_buf_setup: numwin failed\n"));
13400 13404                                  return (DDI_FAILURE);
13401 13405                          }
13402 13406                          SATADBG2(SATA_DBG_DMA_SETUP,
13403 13407                              spx->txlt_sata_hba_inst,
13404 13408                              "sata_dma_buf_setup: windows: %d, cookies: %d\n",
13405 13409                              spx->txlt_num_dma_win,
13406 13410                              spx->txlt_curwin_num_dma_cookies);
13407 13411                          spx->txlt_cur_dma_win = 0;
13408 13412                          break;
13409 13413  
13410 13414                  case DDI_DMA_MAPPED:
13411 13415                          /* DMA fully mapped */
13412 13416                          spx->txlt_num_dma_win = 1;
13413 13417                          spx->txlt_cur_dma_win = 0;
13414 13418                          SATADBG1(SATA_DBG_DMA_SETUP,
13415 13419                              spx->txlt_sata_hba_inst,
13416 13420                              "sata_dma_buf_setup: windows: 1 "
13417 13421                              "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
13418 13422                          break;
13419 13423  
13420 13424                  default:
13421 13425                          /* DMA mapping failed */
13422 13426                          if (spx->txlt_tmp_buf != NULL) {
13423 13427                                  ddi_dma_mem_free(
13424 13428                                      &spx->txlt_tmp_buf_handle);
13425 13429                                  spx->txlt_tmp_buf = NULL;
13426 13430                          }
13427 13431                          (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13428 13432                          spx->txlt_buf_dma_handle = NULL;
13429 13433                          SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13430 13434                              "sata_dma_buf_setup: buf dma handle binding "
13431 13435                              "failed %x\n", rval));
13432 13436                          return (rval);
13433 13437                  }
13434 13438                  spx->txlt_curwin_processed_dma_cookies = 0;
13435 13439                  spx->txlt_dma_cookie_list = NULL;
13436 13440          } else {
13437 13441                  /*
13438 13442                   * DMA setup is reused. Check if we need to process more
13439 13443                   * cookies in current window, or to get next window, if any.
13440 13444                   */
13441 13445  
13442 13446                  ASSERT(spx->txlt_curwin_processed_dma_cookies <=
13443 13447                      spx->txlt_curwin_num_dma_cookies);
13444 13448  
13445 13449                  if (spx->txlt_curwin_processed_dma_cookies ==
13446 13450                      spx->txlt_curwin_num_dma_cookies) {
13447 13451                          /*
13448 13452                           * All cookies from current DMA window were processed.
13449 13453                           * Get next DMA window.
13450 13454                           */
13451 13455                          spx->txlt_cur_dma_win++;
13452 13456                          if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
13453 13457                                  (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
13454 13458                                      spx->txlt_cur_dma_win, &offset, &size,
13455 13459                                      &spx->txlt_dma_cookie,
13456 13460                                      &spx->txlt_curwin_num_dma_cookies);
13457 13461                                  spx->txlt_curwin_processed_dma_cookies = 0;
13458 13462                          } else {
13459 13463                                  /* No more windows! End of request! */
13460 13464                                  /* What to do? - panic for now */
13461 13465                                  ASSERT(spx->txlt_cur_dma_win >=
13462 13466                                      spx->txlt_num_dma_win);
13463 13467  
13464 13468                                  spx->txlt_curwin_num_dma_cookies = 0;
13465 13469                                  spx->txlt_curwin_processed_dma_cookies = 0;
13466 13470                                  spx->txlt_sata_pkt->
13467 13471                                      satapkt_cmd.satacmd_num_dma_cookies = 0;
13468 13472                                  return (DDI_SUCCESS);
13469 13473                          }
13470 13474                  }
13471 13475          }
13472 13476          /* There better be at least one DMA cookie outstanding */
13473 13477          ASSERT((spx->txlt_curwin_num_dma_cookies -
13474 13478              spx->txlt_curwin_processed_dma_cookies) > 0);
13475 13479  
13476 13480          if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
13477 13481                  /* The default cookie slot was used in previous run */
13478 13482                  ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
13479 13483                  spx->txlt_dma_cookie_list = NULL;
13480 13484                  spx->txlt_dma_cookie_list_len = 0;
13481 13485          }
13482 13486          if (spx->txlt_curwin_processed_dma_cookies == 0) {
13483 13487                  /*
13484 13488                   * Processing a new DMA window - set-up dma cookies list.
13485 13489                   * We may reuse previously allocated cookie array if it is
13486 13490                   * possible.
13487 13491                   */
13488 13492                  if (spx->txlt_dma_cookie_list != NULL &&
13489 13493                      spx->txlt_dma_cookie_list_len <
13490 13494                      spx->txlt_curwin_num_dma_cookies) {
13491 13495                          /*
13492 13496                           * New DMA window contains more cookies than
13493 13497                           * the previous one. We need larger cookie list - free
13494 13498                           * the old one.
13495 13499                           */
13496 13500                          (void) kmem_free(spx->txlt_dma_cookie_list,
13497 13501                              spx->txlt_dma_cookie_list_len *
13498 13502                              sizeof (ddi_dma_cookie_t));
13499 13503                          spx->txlt_dma_cookie_list = NULL;
13500 13504                          spx->txlt_dma_cookie_list_len = 0;
13501 13505                  }
13502 13506                  if (spx->txlt_dma_cookie_list == NULL) {
13503 13507                          /*
13504 13508                           * Calculate lesser of number of cookies in this
13505 13509                           * DMA window and number of s/g entries.
13506 13510                           */
13507 13511                          max_sg_len = cur_dma_attr->dma_attr_sgllen;
13508 13512                          req_len = MIN(max_sg_len,
13509 13513                              spx->txlt_curwin_num_dma_cookies);
13510 13514  
13511 13515                          /* Allocate new dma cookie array if necessary */
13512 13516                          if (req_len == 1) {
13513 13517                                  /* Only one cookie - no need for a list */
13514 13518                                  spx->txlt_dma_cookie_list =
13515 13519                                      &spx->txlt_dma_cookie;
13516 13520                                  spx->txlt_dma_cookie_list_len = 1;
13517 13521                          } else {
13518 13522                                  /*
13519 13523                                   * More than one cookie - try to allocate space.
13520 13524                                   */
13521 13525                                  spx->txlt_dma_cookie_list = kmem_zalloc(
13522 13526                                      sizeof (ddi_dma_cookie_t) * req_len,
13523 13527                                      callback == NULL_FUNC ? KM_NOSLEEP :
13524 13528                                      KM_SLEEP);
13525 13529                                  if (spx->txlt_dma_cookie_list == NULL) {
13526 13530                                          SATADBG1(SATA_DBG_DMA_SETUP,
13527 13531                                              spx->txlt_sata_hba_inst,
13528 13532                                              "sata_dma_buf_setup: cookie list "
13529 13533                                              "allocation failed\n", NULL);
13530 13534                                          /*
13531 13535                                           * We could not allocate space for
13532 13536                                           * neccessary number of dma cookies in
13533 13537                                           * this window, so we fail this request.
13534 13538                                           * Next invocation would try again to
13535 13539                                           * allocate space for cookie list.
13536 13540                                           * Note:Packet residue was not modified.
13537 13541                                           */
13538 13542                                          return (DDI_DMA_NORESOURCES);
13539 13543                                  } else {
13540 13544                                          spx->txlt_dma_cookie_list_len = req_len;
13541 13545                                  }
13542 13546                          }
13543 13547                  }
13544 13548                  /*
13545 13549                   * Fetch DMA cookies into cookie list in sata_pkt_txlate.
13546 13550                   * First cookie was already fetched.
13547 13551                   */
13548 13552                  *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
13549 13553                  cur_txfer_len =
13550 13554                      (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
13551 13555                  spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
13552 13556                  spx->txlt_curwin_processed_dma_cookies++;
13553 13557                  for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
13554 13558                      (i < spx->txlt_curwin_num_dma_cookies); i++) {
13555 13559                          ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13556 13560                              &spx->txlt_dma_cookie_list[i]);
13557 13561                          cur_txfer_len +=
13558 13562                              (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13559 13563                          spx->txlt_curwin_processed_dma_cookies++;
13560 13564                          spx->txlt_sata_pkt->
13561 13565                              satapkt_cmd.satacmd_num_dma_cookies += 1;
13562 13566                  }
13563 13567          } else {
13564 13568                  SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13565 13569                      "sata_dma_buf_setup: sliding within DMA window, "
13566 13570                      "cur cookie %d, total cookies %d\n",
13567 13571                      spx->txlt_curwin_processed_dma_cookies,
13568 13572                      spx->txlt_curwin_num_dma_cookies);
13569 13573  
13570 13574                  /*
13571 13575                   * Not all cookies from the current dma window were used because
13572 13576                   * of s/g limitation.
13573 13577                   * There is no need to re-size the list - it was set at
13574 13578                   * optimal size, or only default entry is used (s/g = 1).
13575 13579                   */
13576 13580                  if (spx->txlt_dma_cookie_list == NULL) {
13577 13581                          spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
13578 13582                          spx->txlt_dma_cookie_list_len = 1;
13579 13583                  }
13580 13584                  /*
13581 13585                   * Since we are processing remaining cookies in a DMA window,
13582 13586                   * there may be less of them than the number of entries in the
13583 13587                   * current dma cookie list.
13584 13588                   */
13585 13589                  req_len = MIN(spx->txlt_dma_cookie_list_len,
13586 13590                      (spx->txlt_curwin_num_dma_cookies -
13587 13591                      spx->txlt_curwin_processed_dma_cookies));
13588 13592  
13589 13593                  /* Fetch the next batch of cookies */
13590 13594                  for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
13591 13595                          ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13592 13596                              &spx->txlt_dma_cookie_list[i]);
13593 13597                          cur_txfer_len +=
13594 13598                              (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13595 13599                          spx->txlt_sata_pkt->
13596 13600                              satapkt_cmd.satacmd_num_dma_cookies++;
13597 13601                          spx->txlt_curwin_processed_dma_cookies++;
13598 13602                  }
13599 13603          }
13600 13604  
13601 13605          ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
13602 13606  
13603 13607          /* Point sata_cmd to the cookie list */
13604 13608          spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
13605 13609              &spx->txlt_dma_cookie_list[0];
13606 13610  
13607 13611          /* Remember number of DMA cookies passed in sata packet */
13608 13612          spx->txlt_num_dma_cookies =
13609 13613              spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
13610 13614  
13611 13615          ASSERT(cur_txfer_len != 0);
13612 13616          if (cur_txfer_len <= bp->b_bcount)
13613 13617                  spx->txlt_total_residue -= cur_txfer_len;
13614 13618          else {
13615 13619                  /*
13616 13620                   * Temporary DMA buffer has been padded by
13617 13621                   * ddi_dma_mem_alloc()!
13618 13622                   * This requires special handling, because DMA cookies are
13619 13623                   * based on the temporary buffer size, not the b_bcount,
13620 13624                   * and we have extra bytes to transfer - but the packet
13621 13625                   * residue has to stay correct because we will copy only
13622 13626                   * the requested number of bytes.
13623 13627                   */
13624 13628                  spx->txlt_total_residue -= bp->b_bcount;
13625 13629          }
13626 13630  
13627 13631          return (DDI_SUCCESS);
13628 13632  }
13629 13633  
13630 13634  /*
13631 13635   * Common routine for releasing DMA resources
13632 13636   */
13633 13637  static void
13634 13638  sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
13635 13639  {
13636 13640          if (spx->txlt_buf_dma_handle != NULL) {
13637 13641                  if (spx->txlt_tmp_buf != NULL)  {
13638 13642                          /*
13639 13643                           * Intermediate DMA buffer was allocated.
13640 13644                           * Free allocated buffer and associated access handle.
13641 13645                           */
13642 13646                          ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
13643 13647                          spx->txlt_tmp_buf = NULL;
13644 13648                  }
13645 13649                  /*
13646 13650                   * Free DMA resources - cookies and handles
13647 13651                   */
13648 13652                  /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
13649 13653                  if (spx->txlt_dma_cookie_list != NULL) {
13650 13654                          if (spx->txlt_dma_cookie_list !=
13651 13655                              &spx->txlt_dma_cookie) {
13652 13656                                  (void) kmem_free(spx->txlt_dma_cookie_list,
13653 13657                                      spx->txlt_dma_cookie_list_len *
13654 13658                                      sizeof (ddi_dma_cookie_t));
13655 13659                                  spx->txlt_dma_cookie_list = NULL;
13656 13660                          }
13657 13661                  }
13658 13662                  (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
13659 13663                  (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13660 13664                  spx->txlt_buf_dma_handle = NULL;
13661 13665          }
13662 13666  }
13663 13667  
13664 13668  /*
13665 13669   * Free DMA resources
13666 13670   * Used by the HBA driver to release DMA resources that it does not use.
13667 13671   *
13668 13672   * Returns Void
13669 13673   */
13670 13674  void
13671 13675  sata_free_dma_resources(sata_pkt_t *sata_pkt)
13672 13676  {
13673 13677          sata_pkt_txlate_t *spx;
13674 13678  
13675 13679          if (sata_pkt == NULL)
13676 13680                  return;
13677 13681  
13678 13682          spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
13679 13683  
13680 13684          sata_common_free_dma_rsrcs(spx);
13681 13685  }
13682 13686  
13683 13687  /*
13684 13688   * Fetch Device Identify data.
13685 13689   * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
13686 13690   * command to a device and get the device identify data.
13687 13691   * The device_info structure has to be set to device type (for selecting proper
13688 13692   * device identify command).
13689 13693   *
13690 13694   * Returns:
13691 13695   * SATA_SUCCESS if cmd succeeded
13692 13696   * SATA_RETRY if cmd was rejected and could be retried,
13693 13697   * SATA_FAILURE if cmd failed and should not be retried (port error)
13694 13698   *
13695 13699   * Cannot be called in an interrupt context.
13696 13700   */
13697 13701  
13698 13702  static int
13699 13703  sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
13700 13704      sata_drive_info_t *sdinfo)
13701 13705  {
13702 13706          struct buf *bp;
13703 13707          sata_pkt_t *spkt;
13704 13708          sata_cmd_t *scmd;
13705 13709          sata_pkt_txlate_t *spx;
13706 13710          int rval;
13707 13711          dev_info_t *dip = SATA_DIP(sata_hba_inst);
13708 13712  
13709 13713          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
13710 13714          spx->txlt_sata_hba_inst = sata_hba_inst;
13711 13715          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
13712 13716          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
13713 13717          if (spkt == NULL) {
13714 13718                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
13715 13719                  return (SATA_RETRY); /* may retry later */
13716 13720          }
13717 13721          /* address is needed now */
13718 13722          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13719 13723  
13720 13724          /*
13721 13725           * Allocate buffer for Identify Data return data
13722 13726           */
13723 13727          bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
13724 13728          if (bp == NULL) {
13725 13729                  sata_pkt_free(spx);
13726 13730                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
13727 13731                  SATA_LOG_D((sata_hba_inst, CE_WARN,
13728 13732                      "sata_fetch_device_identify_data: "
13729 13733                      "cannot allocate buffer for ID"));
13730 13734                  return (SATA_RETRY); /* may retry later */
13731 13735          }
13732 13736  
13733 13737          /* Fill sata_pkt */
13734 13738          sdinfo->satadrv_state = SATA_STATE_PROBING;
13735 13739          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13736 13740          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
13737 13741          /* Synchronous mode, no callback */
13738 13742          spkt->satapkt_comp = NULL;
13739 13743          /* Timeout 30s */
13740 13744          spkt->satapkt_time = sata_default_pkt_time;
13741 13745  
13742 13746          scmd = &spkt->satapkt_cmd;
13743 13747          scmd->satacmd_bp = bp;
13744 13748          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
13745 13749          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
13746 13750  
13747 13751          /* Build Identify Device cmd in the sata_pkt */
13748 13752          scmd->satacmd_addr_type = 0;            /* N/A */
13749 13753          scmd->satacmd_sec_count_lsb = 0;        /* N/A */
13750 13754          scmd->satacmd_lba_low_lsb = 0;          /* N/A */
13751 13755          scmd->satacmd_lba_mid_lsb = 0;          /* N/A */
13752 13756          scmd->satacmd_lba_high_lsb = 0;         /* N/A */
13753 13757          scmd->satacmd_features_reg = 0;         /* N/A */
13754 13758          scmd->satacmd_device_reg = 0;           /* Always device 0 */
13755 13759          if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
13756 13760                  /* Identify Packet Device cmd */
13757 13761                  scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
13758 13762          } else {
13759 13763                  /* Identify Device cmd - mandatory for all other devices */
13760 13764                  scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
13761 13765          }
13762 13766  
13763 13767          /* Send pkt to SATA HBA driver */
13764 13768          rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
13765 13769  
13766 13770  #ifdef SATA_INJECT_FAULTS
13767 13771          sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
13768 13772  #endif
13769 13773  
13770 13774          if (rval == SATA_TRAN_ACCEPTED &&
13771 13775              spkt->satapkt_reason == SATA_PKT_COMPLETED) {
13772 13776                  if (spx->txlt_buf_dma_handle != NULL) {
13773 13777                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
13774 13778                              DDI_DMA_SYNC_FORKERNEL);
13775 13779                          ASSERT(rval == DDI_SUCCESS);
13776 13780                          if (sata_check_for_dma_error(dip, spx)) {
13777 13781                                  ddi_fm_service_impact(dip,
13778 13782                                      DDI_SERVICE_UNAFFECTED);
13779 13783                                  rval = SATA_RETRY;
13780 13784                                  goto fail;
13781 13785                          }
13782 13786  
13783 13787                  }
13784 13788                  if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
13785 13789                      SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
13786 13790                          SATA_LOG_D((sata_hba_inst, CE_WARN,
13787 13791                              "SATA disk device at port %d - "
13788 13792                              "partial Identify Data",
13789 13793                              sdinfo->satadrv_addr.cport));
13790 13794                          rval = SATA_RETRY; /* may retry later */
13791 13795                          goto fail;
13792 13796                  }
13793 13797                  /* Update sata_drive_info */
13794 13798                  bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
13795 13799                      sizeof (sata_id_t));
13796 13800  
13797 13801                  sdinfo->satadrv_features_support = 0;
13798 13802                  if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13799 13803                          /*
13800 13804                           * Retrieve capacity (disks only) and addressing mode
13801 13805                           */
13802 13806                          sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
13803 13807                  } else {
13804 13808                          /*
13805 13809                           * For ATAPI devices one would have to issue
13806 13810                           * Get Capacity cmd for media capacity. Not here.
13807 13811                           */
13808 13812                          sdinfo->satadrv_capacity = 0;
13809 13813                          /*
13810 13814                           * Check what cdb length is supported
13811 13815                           */
13812 13816                          if ((sdinfo->satadrv_id.ai_config &
13813 13817                              SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
13814 13818                                  sdinfo->satadrv_atapi_cdb_len = 16;
13815 13819                          else
13816 13820                                  sdinfo->satadrv_atapi_cdb_len = 12;
13817 13821                  }
13818 13822                  /* Setup supported features flags */
13819 13823                  if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
13820 13824                          sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
13821 13825  
13822 13826                  /* Check for SATA GEN and NCQ support */
13823 13827                  if (sdinfo->satadrv_id.ai_satacap != 0 &&
13824 13828                      sdinfo->satadrv_id.ai_satacap != 0xffff) {
13825 13829                          /* SATA compliance */
13826 13830                          if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
13827 13831                                  sdinfo->satadrv_features_support |=
13828 13832                                      SATA_DEV_F_NCQ;
13829 13833                          if (sdinfo->satadrv_id.ai_satacap &
13830 13834                              (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
13831 13835                                  if (sdinfo->satadrv_id.ai_satacap &
13832 13836                                      SATA_3_SPEED)
13833 13837                                          sdinfo->satadrv_features_support |=
13834 13838                                              SATA_DEV_F_SATA3;
13835 13839                                  if (sdinfo->satadrv_id.ai_satacap &
13836 13840                                      SATA_2_SPEED)
13837 13841                                          sdinfo->satadrv_features_support |=
13838 13842                                              SATA_DEV_F_SATA2;
13839 13843                                  if (sdinfo->satadrv_id.ai_satacap &
13840 13844                                      SATA_1_SPEED)
13841 13845                                          sdinfo->satadrv_features_support |=
13842 13846                                              SATA_DEV_F_SATA1;
13843 13847                          } else {
13844 13848                                  sdinfo->satadrv_features_support |=
13845 13849                                      SATA_DEV_F_SATA1;
13846 13850                          }
13847 13851                  }
13848 13852                  if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
13849 13853                      (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
13850 13854                          sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
13851 13855  
13852 13856                  sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
13853 13857                  if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
13854 13858                      (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
13855 13859                          ++sdinfo->satadrv_queue_depth;
13856 13860                          /* Adjust according to controller capabilities */
13857 13861                          sdinfo->satadrv_max_queue_depth = MIN(
13858 13862                              sdinfo->satadrv_queue_depth,
13859 13863                              SATA_QDEPTH(sata_hba_inst));
13860 13864                          /* Adjust according to global queue depth limit */
13861 13865                          sdinfo->satadrv_max_queue_depth = MIN(
13862 13866                              sdinfo->satadrv_max_queue_depth,
13863 13867                              sata_current_max_qdepth);
13864 13868                          if (sdinfo->satadrv_max_queue_depth == 0)
13865 13869                                  sdinfo->satadrv_max_queue_depth = 1;
13866 13870                  } else
13867 13871                          sdinfo->satadrv_max_queue_depth = 1;
13868 13872  
13869 13873                  rval = SATA_SUCCESS;
13870 13874          } else {
13871 13875                  /*
13872 13876                   * Woops, no Identify Data.
13873 13877                   */
13874 13878                  if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
13875 13879                          rval = SATA_RETRY; /* may retry later */
13876 13880                  } else if (rval == SATA_TRAN_ACCEPTED) {
13877 13881                          if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
13878 13882                              spkt->satapkt_reason == SATA_PKT_ABORTED ||
13879 13883                              spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
13880 13884                              spkt->satapkt_reason == SATA_PKT_RESET)
13881 13885                                  rval = SATA_RETRY; /* may retry later */
13882 13886                          else
13883 13887                                  rval = SATA_FAILURE;
13884 13888                  } else {
13885 13889                          rval = SATA_FAILURE;
13886 13890                  }
13887 13891          }
13888 13892  fail:
13889 13893          /* Free allocated resources */
13890 13894          sata_free_local_buffer(spx);
13891 13895          sata_pkt_free(spx);
13892 13896          kmem_free(spx, sizeof (sata_pkt_txlate_t));
13893 13897  
13894 13898          return (rval);
13895 13899  }
13896 13900  
13897 13901  
13898 13902  /*
13899 13903   * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
13900 13904   * UDMA mode is checked first, followed by MWDMA mode.
13901 13905   * set correctly, so this function is setting it to the highest supported level.
13902 13906   * Older SATA spec required that the device supports at least DMA 4 mode and
13903 13907   * UDMA mode is selected.  It is not mentioned in SerialATA 2.6, so this
13904 13908   * restriction has been removed.
13905 13909   *
13906 13910   * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
13907 13911   * Returns SATA_FAILURE if proper DMA mode could not be selected.
13908 13912   *
13909 13913   * NOTE: This function should be called only if DMA mode is supported.
13910 13914   */
13911 13915  static int
13912 13916  sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
13913 13917  {
13914 13918          sata_pkt_t *spkt;
13915 13919          sata_cmd_t *scmd;
13916 13920          sata_pkt_txlate_t *spx;
13917 13921          int i, mode;
13918 13922          uint8_t subcmd;
13919 13923          int rval = SATA_SUCCESS;
13920 13924  
13921 13925          ASSERT(sdinfo != NULL);
13922 13926          ASSERT(sata_hba_inst != NULL);
13923 13927  
13924 13928          if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13925 13929              (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
13926 13930                  /* Find highest Ultra DMA mode supported */
13927 13931                  for (mode = 6; mode >= 0; --mode) {
13928 13932                          if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
13929 13933                                  break;
13930 13934                  }
13931 13935  #if 0
13932 13936                  /* Left for historical reasons */
13933 13937                  /*
13934 13938                   * Some initial version of SATA spec indicated that at least
13935 13939                   * UDMA mode 4 has to be supported. It is not mentioned in
13936 13940                   * SerialATA 2.6, so this restriction is removed.
13937 13941                   */
13938 13942                  if (mode < 4)
13939 13943                          return (SATA_FAILURE);
13940 13944  #endif
13941 13945  
13942 13946                  /*
13943 13947                   * For disk, we're still going to set DMA mode whatever is
13944 13948                   * selected by default
13945 13949                   *
13946 13950                   * We saw an old maxtor sata drive will select Ultra DMA and
13947 13951                   * Multi-Word DMA simultaneouly by default, which is going
13948 13952                   * to cause DMA command timed out, so we need to select DMA
13949 13953                   * mode even when it's already done by default
13950 13954                   */
13951 13955                  if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13952 13956  
13953 13957                          /* Find UDMA mode currently selected */
13954 13958                          for (i = 6; i >= 0; --i) {
13955 13959                                  if (sdinfo->satadrv_id.ai_ultradma &
13956 13960                                      (1 << (i + 8)))
13957 13961                                          break;
13958 13962                          }
13959 13963                          if (i >= mode)
13960 13964                                  /* Nothing to do */
13961 13965                                  return (SATA_SUCCESS);
13962 13966                  }
13963 13967  
13964 13968                  subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
13965 13969  
13966 13970          } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
13967 13971                  /* Find highest MultiWord DMA mode supported */
13968 13972                  for (mode = 2; mode >= 0; --mode) {
13969 13973                          if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
13970 13974                                  break;
13971 13975                  }
13972 13976  
13973 13977                  /*
13974 13978                   * For disk, We're still going to set DMA mode whatever is
13975 13979                   * selected by default
13976 13980                   *
13977 13981                   * We saw an old maxtor sata drive will select Ultra DMA and
13978 13982                   * Multi-Word DMA simultaneouly by default, which is going
13979 13983                   * to cause DMA command timed out, so we need to select DMA
13980 13984                   * mode even when it's already done by default
13981 13985                   */
13982 13986                  if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13983 13987  
13984 13988                          /* Find highest MultiWord DMA mode selected */
13985 13989                          for (i = 2; i >= 0; --i) {
13986 13990                                  if (sdinfo->satadrv_id.ai_dworddma &
13987 13991                                      (1 << (i + 8)))
13988 13992                                          break;
13989 13993                          }
13990 13994                          if (i >= mode)
13991 13995                                  /* Nothing to do */
13992 13996                                  return (SATA_SUCCESS);
13993 13997                  }
13994 13998  
13995 13999                  subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
13996 14000          } else
13997 14001                  return (SATA_SUCCESS);
13998 14002  
13999 14003          /*
14000 14004           * Set DMA mode via SET FEATURES COMMAND.
14001 14005           * Prepare packet for SET FEATURES COMMAND.
14002 14006           */
14003 14007          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14004 14008          spx->txlt_sata_hba_inst = sata_hba_inst;
14005 14009          spx->txlt_scsi_pkt = NULL;      /* No scsi pkt involved */
14006 14010          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14007 14011          if (spkt == NULL) {
14008 14012                  SATA_LOG_D((sata_hba_inst, CE_WARN,
14009 14013                      "sata_set_dma_mode: could not set DMA mode %d", mode));
14010 14014                  rval = SATA_FAILURE;
14011 14015                  goto done;
14012 14016          }
14013 14017          /* Fill sata_pkt */
14014 14018          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14015 14019          /* Timeout 30s */
14016 14020          spkt->satapkt_time = sata_default_pkt_time;
14017 14021          /* Synchronous mode, no callback, interrupts */
14018 14022          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14019 14023          spkt->satapkt_comp = NULL;
14020 14024          scmd = &spkt->satapkt_cmd;
14021 14025          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14022 14026          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14023 14027          scmd->satacmd_addr_type = 0;
14024 14028          scmd->satacmd_device_reg = 0;
14025 14029          scmd->satacmd_status_reg = 0;
14026 14030          scmd->satacmd_error_reg = 0;
14027 14031          scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14028 14032          scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14029 14033          scmd->satacmd_sec_count_lsb = subcmd | mode;
14030 14034  
14031 14035          /* Transfer command to HBA */
14032 14036          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14033 14037              spkt) != SATA_TRAN_ACCEPTED ||
14034 14038              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14035 14039                  /* Pkt execution failed */
14036 14040                  rval = SATA_FAILURE;
14037 14041          }
14038 14042  done:
14039 14043  
14040 14044          /* Free allocated resources */
14041 14045          if (spkt != NULL)
14042 14046                  sata_pkt_free(spx);
14043 14047          (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14044 14048  
14045 14049          return (rval);
14046 14050  }
14047 14051  
14048 14052  
14049 14053  /*
14050 14054   * Set device caching mode.
14051 14055   * One of the following operations should be specified:
14052 14056   * SATAC_SF_ENABLE_READ_AHEAD
14053 14057   * SATAC_SF_DISABLE_READ_AHEAD
14054 14058   * SATAC_SF_ENABLE_WRITE_CACHE
14055 14059   * SATAC_SF_DISABLE_WRITE_CACHE
14056 14060   *
14057 14061   * If operation fails, system log messgage is emitted.
14058 14062   * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14059 14063   * command was sent but did not succeed, and SATA_FAILURE otherwise.
14060 14064   */
14061 14065  
14062 14066  static int
14063 14067  sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14064 14068      int cache_op)
14065 14069  {
14066 14070          sata_pkt_t *spkt;
14067 14071          sata_cmd_t *scmd;
14068 14072          sata_pkt_txlate_t *spx;
14069 14073          int rval = SATA_SUCCESS;
14070 14074          int hba_rval;
14071 14075          char *infop;
14072 14076  
14073 14077          ASSERT(sdinfo != NULL);
14074 14078          ASSERT(sata_hba_inst != NULL);
14075 14079          ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
14076 14080              cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
14077 14081              cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
14078 14082              cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
14079 14083  
14080 14084  
14081 14085          /* Prepare packet for SET FEATURES COMMAND */
14082 14086          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14083 14087          spx->txlt_sata_hba_inst = sata_hba_inst;
14084 14088          spx->txlt_scsi_pkt = NULL;      /* No scsi pkt involved */
14085 14089          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14086 14090          if (spkt == NULL) {
14087 14091                  rval = SATA_FAILURE;
14088 14092                  goto failure;
14089 14093          }
14090 14094          /* Fill sata_pkt */
14091 14095          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14092 14096          /* Timeout 30s */
14093 14097          spkt->satapkt_time = sata_default_pkt_time;
14094 14098          /* Synchronous mode, no callback, interrupts */
14095 14099          spkt->satapkt_op_mode =
14096 14100              SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14097 14101          spkt->satapkt_comp = NULL;
14098 14102          scmd = &spkt->satapkt_cmd;
14099 14103          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14100 14104          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14101 14105          scmd->satacmd_addr_type = 0;
14102 14106          scmd->satacmd_device_reg = 0;
14103 14107          scmd->satacmd_status_reg = 0;
14104 14108          scmd->satacmd_error_reg = 0;
14105 14109          scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14106 14110          scmd->satacmd_features_reg = cache_op;
14107 14111  
14108 14112          /* Transfer command to HBA */
14109 14113          hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
14110 14114              SATA_DIP(sata_hba_inst), spkt);
14111 14115  
14112 14116  #ifdef SATA_INJECT_FAULTS
14113 14117          sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14114 14118  #endif
14115 14119  
14116 14120          if ((hba_rval != SATA_TRAN_ACCEPTED) ||
14117 14121              (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14118 14122                  /* Pkt execution failed */
14119 14123                  switch (cache_op) {
14120 14124                  case SATAC_SF_ENABLE_READ_AHEAD:
14121 14125                          infop = "enabling read ahead failed";
14122 14126                          break;
14123 14127                  case SATAC_SF_DISABLE_READ_AHEAD:
14124 14128                          infop = "disabling read ahead failed";
14125 14129                          break;
14126 14130                  case SATAC_SF_ENABLE_WRITE_CACHE:
14127 14131                          infop = "enabling write cache failed";
14128 14132                          break;
14129 14133                  case SATAC_SF_DISABLE_WRITE_CACHE:
14130 14134                          infop = "disabling write cache failed";
14131 14135                          break;
14132 14136                  }
14133 14137                  SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14134 14138                  rval = SATA_RETRY;
14135 14139          }
14136 14140  failure:
14137 14141          /* Free allocated resources */
14138 14142          if (spkt != NULL)
14139 14143                  sata_pkt_free(spx);
14140 14144          (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14141 14145          return (rval);
14142 14146  }
14143 14147  
14144 14148  /*
14145 14149   * Set Removable Media Status Notification (enable/disable)
14146 14150   * state == 0 , disable
14147 14151   * state != 0 , enable
14148 14152   *
14149 14153   * If operation fails, system log messgage is emitted.
14150 14154   * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
14151 14155   */
14152 14156  
14153 14157  static int
14154 14158  sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14155 14159      int state)
14156 14160  {
14157 14161          sata_pkt_t *spkt;
14158 14162          sata_cmd_t *scmd;
14159 14163          sata_pkt_txlate_t *spx;
14160 14164          int rval = SATA_SUCCESS;
14161 14165          char *infop;
14162 14166  
14163 14167          ASSERT(sdinfo != NULL);
14164 14168          ASSERT(sata_hba_inst != NULL);
14165 14169  
14166 14170          /* Prepare packet for SET FEATURES COMMAND */
14167 14171          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14168 14172          spx->txlt_sata_hba_inst = sata_hba_inst;
14169 14173          spx->txlt_scsi_pkt = NULL;      /* No scsi pkt involved */
14170 14174          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14171 14175          if (spkt == NULL) {
14172 14176                  rval = SATA_FAILURE;
14173 14177                  goto failure;
14174 14178          }
14175 14179          /* Fill sata_pkt */
14176 14180          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14177 14181          /* Timeout 30s */
14178 14182          spkt->satapkt_time = sata_default_pkt_time;
14179 14183          /* Synchronous mode, no callback, interrupts */
14180 14184          spkt->satapkt_op_mode =
14181 14185              SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14182 14186          spkt->satapkt_comp = NULL;
14183 14187          scmd = &spkt->satapkt_cmd;
14184 14188          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14185 14189          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14186 14190          scmd->satacmd_addr_type = 0;
14187 14191          scmd->satacmd_device_reg = 0;
14188 14192          scmd->satacmd_status_reg = 0;
14189 14193          scmd->satacmd_error_reg = 0;
14190 14194          scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14191 14195          if (state == 0)
14192 14196                  scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
14193 14197          else
14194 14198                  scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
14195 14199  
14196 14200          /* Transfer command to HBA */
14197 14201          if (((*SATA_START_FUNC(sata_hba_inst))(
14198 14202              SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
14199 14203              (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14200 14204                  /* Pkt execution failed */
14201 14205                  if (state == 0)
14202 14206                          infop = "disabling Removable Media Status "
14203 14207                              "Notification failed";
14204 14208                  else
14205 14209                          infop = "enabling Removable Media Status "
14206 14210                              "Notification failed";
14207 14211  
14208 14212                  SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14209 14213                  rval = SATA_FAILURE;
14210 14214          }
14211 14215  failure:
14212 14216          /* Free allocated resources */
14213 14217          if (spkt != NULL)
14214 14218                  sata_pkt_free(spx);
14215 14219          (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14216 14220          return (rval);
14217 14221  }
14218 14222  
14219 14223  
14220 14224  /*
14221 14225   * Update state and copy port ss* values from passed sata_device structure.
14222 14226   * sata_address is validated - if not valid, nothing is changed in sata_scsi
14223 14227   * configuration struct.
14224 14228   *
14225 14229   * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
14226 14230   * regardless of the state in device argument.
14227 14231   *
14228 14232   * Port mutex should be held while calling this function.
14229 14233   */
14230 14234  static void
14231 14235  sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
14232 14236      sata_device_t *sata_device)
14233 14237  {
14234 14238          sata_cport_info_t *cportinfo;
14235 14239  
14236 14240          if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
14237 14241              sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
14238 14242                  if (SATA_NUM_CPORTS(sata_hba_inst) <=
14239 14243                      sata_device->satadev_addr.cport)
14240 14244                          return;
14241 14245  
14242 14246                  cportinfo = SATA_CPORT_INFO(sata_hba_inst,
14243 14247                      sata_device->satadev_addr.cport);
14244 14248  
14245 14249                  ASSERT(mutex_owned(&cportinfo->cport_mutex));
14246 14250                  cportinfo->cport_scr = sata_device->satadev_scr;
14247 14251  
14248 14252                  /* Preserve SATA_PSTATE_SHUTDOWN flag */
14249 14253                  cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
14250 14254                      SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14251 14255                  cportinfo->cport_state |=
14252 14256                      sata_device->satadev_state & SATA_PSTATE_VALID;
14253 14257          }
14254 14258  }
14255 14259  
14256 14260  void
14257 14261  sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
14258 14262      sata_device_t *sata_device)
14259 14263  {
14260 14264          sata_pmport_info_t *pmportinfo;
14261 14265  
14262 14266          if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
14263 14267              sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
14264 14268              SATA_NUM_PMPORTS(sata_hba_inst,
14265 14269              sata_device->satadev_addr.cport) <
14266 14270              sata_device->satadev_addr.pmport) {
14267 14271                  SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
14268 14272                      "sata_update_port_info: error address %p.",
14269 14273                      &sata_device->satadev_addr);
14270 14274                  return;
14271 14275          }
14272 14276  
14273 14277          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
14274 14278              sata_device->satadev_addr.cport,
14275 14279              sata_device->satadev_addr.pmport);
14276 14280  
14277 14281          ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
14278 14282          pmportinfo->pmport_scr = sata_device->satadev_scr;
14279 14283  
14280 14284          /* Preserve SATA_PSTATE_SHUTDOWN flag */
14281 14285          pmportinfo->pmport_state &=
14282 14286              ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14283 14287          pmportinfo->pmport_state |=
14284 14288              sata_device->satadev_state & SATA_PSTATE_VALID;
14285 14289  }
14286 14290  
14287 14291  /*
14288 14292   * Extract SATA port specification from an IOCTL argument.
14289 14293   *
14290 14294   * This function return the port the user land send us as is, unless it
14291 14295   * cannot retrieve port spec, then -1 is returned.
14292 14296   *
14293 14297   * Support port multiplier.
14294 14298   */
14295 14299  static int32_t
14296 14300  sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
14297 14301  {
14298 14302          int32_t port;
14299 14303  
14300 14304          /* Extract port number from nvpair in dca structure  */
14301 14305          if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
14302 14306                  SATA_LOG_D((sata_hba_inst, CE_NOTE,
14303 14307                      "sata_get_port_num: invalid port spec 0x%x in ioctl",
14304 14308                      port));
14305 14309                  port = -1;
14306 14310          }
14307 14311  
14308 14312          return (port);
14309 14313  }
14310 14314  
14311 14315  /*
14312 14316   * Get dev_info_t pointer to the device node pointed to by port argument.
14313 14317   * NOTE: target argument is a value used in ioctls to identify
14314 14318   * the AP - it is not a sata_address.
14315 14319   * It is a combination of cport, pmport and address qualifier, encodded same
14316 14320   * way as a scsi target number.
14317 14321   * At this moment it carries only cport number.
14318 14322   *
14319 14323   * PMult hotplug is supported now.
14320 14324   *
14321 14325   * Returns dev_info_t pointer if target device was found, NULL otherwise.
14322 14326   */
14323 14327  
14324 14328  static dev_info_t *
14325 14329  sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
14326 14330  {
14327 14331          dev_info_t      *cdip = NULL;
14328 14332          int             target, tgt;
14329 14333          int             circ;
14330 14334          uint8_t         qual;
14331 14335  
14332 14336          sata_hba_inst_t *sata_hba_inst;
14333 14337          scsi_hba_tran_t *scsi_hba_tran;
14334 14338  
14335 14339          /* Get target id */
14336 14340          scsi_hba_tran = ddi_get_driver_private(dip);
14337 14341          if (scsi_hba_tran == NULL)
14338 14342                  return (NULL);
14339 14343  
14340 14344          sata_hba_inst = scsi_hba_tran->tran_hba_private;
14341 14345  
14342 14346          if (sata_hba_inst == NULL)
14343 14347                  return (NULL);
14344 14348  
14345 14349          /* Identify a port-mult by cport_info.cport_dev_type */
14346 14350          if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
14347 14351                  qual = SATA_ADDR_DPMPORT;
14348 14352          else
14349 14353                  qual = SATA_ADDR_DCPORT;
14350 14354  
14351 14355          target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
14352 14356  
14353 14357          /* Retrieve target dip */
14354 14358          ndi_devi_enter(dip, &circ);
14355 14359          for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14356 14360                  dev_info_t *next = ddi_get_next_sibling(cdip);
14357 14361  
14358 14362                  tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14359 14363                      DDI_PROP_DONTPASS, "target", -1);
14360 14364                  if (tgt == -1) {
14361 14365                          /*
14362 14366                           * This is actually an error condition, but not
14363 14367                           * a fatal one. Just continue the search.
14364 14368                           */
14365 14369                          cdip = next;
14366 14370                          continue;
14367 14371                  }
14368 14372  
14369 14373                  if (tgt == target)
14370 14374                          break;
14371 14375  
14372 14376                  cdip = next;
14373 14377          }
14374 14378          ndi_devi_exit(dip, circ);
14375 14379  
14376 14380          return (cdip);
14377 14381  }
14378 14382  
14379 14383  /*
14380 14384   * Get dev_info_t pointer to the device node pointed to by port argument.
14381 14385   * NOTE: target argument is a value used in ioctls to identify
14382 14386   * the AP - it is not a sata_address.
14383 14387   * It is a combination of cport, pmport and address qualifier, encoded same
14384 14388   * way as a scsi target number.
14385 14389   *
14386 14390   * Returns dev_info_t pointer if target device was found, NULL otherwise.
14387 14391   */
14388 14392  
14389 14393  static dev_info_t *
14390 14394  sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
14391 14395  {
14392 14396          dev_info_t      *cdip = NULL;
14393 14397          int             target, tgt;
14394 14398          int             circ;
14395 14399  
14396 14400          target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
14397 14401  
14398 14402          ndi_devi_enter(dip, &circ);
14399 14403          for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14400 14404                  dev_info_t *next = ddi_get_next_sibling(cdip);
14401 14405  
14402 14406                  tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14403 14407                      DDI_PROP_DONTPASS, "target", -1);
14404 14408                  if (tgt == -1) {
14405 14409                          /*
14406 14410                           * This is actually an error condition, but not
14407 14411                           * a fatal one. Just continue the search.
14408 14412                           */
14409 14413                          cdip = next;
14410 14414                          continue;
14411 14415                  }
14412 14416  
14413 14417                  if (tgt == target)
14414 14418                          break;
14415 14419  
14416 14420                  cdip = next;
14417 14421          }
14418 14422          ndi_devi_exit(dip, circ);
14419 14423  
14420 14424          return (cdip);
14421 14425  }
14422 14426  
14423 14427  /*
14424 14428   * Process sata port disconnect request.
14425 14429   * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
14426 14430   * before this request. Nevertheless, if a device is still configured,
14427 14431   * we need to attempt to offline and unconfigure device.
14428 14432   * Regardless of the unconfigure operation results the port is marked as
14429 14433   * deactivated and no access to the attached device is possible.
14430 14434   * If the target node remains because unconfigure operation failed, its state
14431 14435   * will be set to DEVICE_REMOVED, preventing it to be used again when a device
14432 14436   * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
14433 14437   * the device and remove old target node.
14434 14438   *
14435 14439   * This function invokes sata_hba_inst->satahba_tran->
14436 14440   * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14437 14441   * If successful, the device structure (if any) attached to the specified port
14438 14442   * is removed and state of the port marked appropriately.
14439 14443   * Failure of the port_deactivate may keep port in the physically active state,
14440 14444   * or may fail the port.
14441 14445   *
14442 14446   * NOTE: Port multiplier is supported.
14443 14447   */
14444 14448  
14445 14449  static int
14446 14450  sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
14447 14451      sata_device_t *sata_device)
14448 14452  {
14449 14453          sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
14450 14454          sata_cport_info_t *cportinfo = NULL;
14451 14455          sata_pmport_info_t *pmportinfo = NULL;
14452 14456          sata_pmult_info_t *pmultinfo = NULL;
14453 14457          sata_device_t subsdevice;
14454 14458          int cport, pmport, qual;
14455 14459          int rval = SATA_SUCCESS;
14456 14460          int npmport = 0;
14457 14461          int rv = 0;
14458 14462  
14459 14463          cport = sata_device->satadev_addr.cport;
14460 14464          pmport = sata_device->satadev_addr.pmport;
14461 14465          qual = sata_device->satadev_addr.qual;
14462 14466  
14463 14467          ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14464 14468          if (qual == SATA_ADDR_DCPORT)
14465 14469                  qual = SATA_ADDR_CPORT;
14466 14470          else
14467 14471                  qual = SATA_ADDR_PMPORT;
14468 14472  
14469 14473          /*
14470 14474           * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
14471 14475           * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14472 14476           * Do the sanity check.
14473 14477           */
14474 14478          if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
14475 14479                  /* No physical port deactivation supported. */
14476 14480                  return (EINVAL);
14477 14481          }
14478 14482  
14479 14483          /* Check the current state of the port */
14480 14484          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14481 14485              (SATA_DIP(sata_hba_inst), sata_device);
14482 14486  
14483 14487          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14484 14488  
14485 14489          /*
14486 14490           * Processing port mulitiplier
14487 14491           */
14488 14492          if (qual == SATA_ADDR_CPORT &&
14489 14493              SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
14490 14494                  mutex_enter(&cportinfo->cport_mutex);
14491 14495  
14492 14496                  /* Check controller port status */
14493 14497                  sata_update_port_info(sata_hba_inst, sata_device);
14494 14498                  if (rval != SATA_SUCCESS ||
14495 14499                      (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14496 14500                          /*
14497 14501                           * Device port status is unknown or it is in failed
14498 14502                           * state
14499 14503                           */
14500 14504                          SATA_CPORT_STATE(sata_hba_inst, cport) =
14501 14505                              SATA_PSTATE_FAILED;
14502 14506                          SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14503 14507                              "sata_hba_ioctl: connect: failed to deactivate "
14504 14508                              "SATA port %d", cport);
14505 14509                          mutex_exit(&cportinfo->cport_mutex);
14506 14510                          return (EIO);
14507 14511                  }
14508 14512  
14509 14513                  /* Disconnect all sub-devices. */
14510 14514                  pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14511 14515                  if (pmultinfo != NULL) {
14512 14516  
14513 14517                          for (npmport = 0; npmport < SATA_NUM_PMPORTS(
14514 14518                              sata_hba_inst, cport); npmport ++) {
14515 14519                                  subsdinfo = SATA_PMPORT_DRV_INFO(
14516 14520                                      sata_hba_inst, cport, npmport);
14517 14521                                  if (subsdinfo == NULL)
14518 14522                                          continue;
14519 14523  
14520 14524                                  subsdevice.satadev_addr = subsdinfo->
14521 14525                                      satadrv_addr;
14522 14526  
14523 14527                                  mutex_exit(&cportinfo->cport_mutex);
14524 14528                                  if (sata_ioctl_disconnect(sata_hba_inst,
14525 14529                                      &subsdevice) == SATA_SUCCESS) {
14526 14530                                          SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
14527 14531                                          "[Remove] device at port %d:%d "
14528 14532                                          "successfully.", cport, npmport);
14529 14533                                  }
14530 14534                                  mutex_enter(&cportinfo->cport_mutex);
14531 14535                          }
14532 14536                  }
14533 14537  
14534 14538                  /* Disconnect the port multiplier */
14535 14539                  cportinfo->cport_state &= ~SATA_STATE_READY;
14536 14540                  mutex_exit(&cportinfo->cport_mutex);
14537 14541  
14538 14542                  sata_device->satadev_addr.qual = qual;
14539 14543                  rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14540 14544                      (SATA_DIP(sata_hba_inst), sata_device);
14541 14545  
14542 14546                  sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14543 14547                      SE_NO_HINT);
14544 14548  
14545 14549                  mutex_enter(&cportinfo->cport_mutex);
14546 14550                  sata_update_port_info(sata_hba_inst, sata_device);
14547 14551                  if (rval != SATA_SUCCESS &&
14548 14552                      sata_device->satadev_state & SATA_PSTATE_FAILED) {
14549 14553                          cportinfo->cport_state = SATA_PSTATE_FAILED;
14550 14554                          rv = EIO;
14551 14555                  } else {
14552 14556                          cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14553 14557                  }
14554 14558                  mutex_exit(&cportinfo->cport_mutex);
14555 14559  
14556 14560                  return (rv);
14557 14561          }
14558 14562  
14559 14563          /*
14560 14564           * Process non-port-multiplier device - it could be a drive connected
14561 14565           * to a port multiplier port or a controller port.
14562 14566           */
14563 14567          if (qual == SATA_ADDR_PMPORT) {
14564 14568                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14565 14569                  mutex_enter(&pmportinfo->pmport_mutex);
14566 14570                  sata_update_pmport_info(sata_hba_inst, sata_device);
14567 14571                  if (rval != SATA_SUCCESS ||
14568 14572                      (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14569 14573                          SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
14570 14574                              SATA_PSTATE_FAILED;
14571 14575                          SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14572 14576                              "sata_hba_ioctl: connect: failed to deactivate "
14573 14577                              "SATA port %d:%d", cport, pmport);
14574 14578                          mutex_exit(&pmportinfo->pmport_mutex);
14575 14579                          return (EIO);
14576 14580                  }
14577 14581  
14578 14582                  if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
14579 14583                          sdinfo = pmportinfo->pmport_sata_drive;
14580 14584                          ASSERT(sdinfo != NULL);
14581 14585                  }
14582 14586  
14583 14587                  /*
14584 14588                   * Set port's dev_state to not ready - this will disable
14585 14589                   * an access to a potentially attached device.
14586 14590                   */
14587 14591                  pmportinfo->pmport_state &= ~SATA_STATE_READY;
14588 14592  
14589 14593                  /* Remove and release sata_drive info structure. */
14590 14594                  if (sdinfo != NULL) {
14591 14595                          if ((sdinfo->satadrv_type &
14592 14596                              SATA_VALID_DEV_TYPE) != 0) {
14593 14597                                  /*
14594 14598                                   * If a target node exists, try to offline
14595 14599                                   * a device and remove target node.
14596 14600                                   */
14597 14601                                  mutex_exit(&pmportinfo->pmport_mutex);
14598 14602                                  (void) sata_offline_device(sata_hba_inst,
14599 14603                                      sata_device, sdinfo);
14600 14604                                  mutex_enter(&pmportinfo->pmport_mutex);
14601 14605                          }
14602 14606  
14603 14607                          SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
14604 14608                          pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
14605 14609                          (void) kmem_free((void *)sdinfo,
14606 14610                              sizeof (sata_drive_info_t));
14607 14611                  }
14608 14612                  mutex_exit(&pmportinfo->pmport_mutex);
14609 14613  
14610 14614          } else if (qual == SATA_ADDR_CPORT) {
14611 14615                  mutex_enter(&cportinfo->cport_mutex);
14612 14616                  sata_update_port_info(sata_hba_inst, sata_device);
14613 14617                  if (rval != SATA_SUCCESS ||
14614 14618                      (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14615 14619                          /*
14616 14620                           * Device port status is unknown or it is in failed
14617 14621                           * state
14618 14622                           */
14619 14623                          SATA_CPORT_STATE(sata_hba_inst, cport) =
14620 14624                              SATA_PSTATE_FAILED;
14621 14625                          SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14622 14626                              "sata_hba_ioctl: connect: failed to deactivate "
14623 14627                              "SATA port %d", cport);
14624 14628                          mutex_exit(&cportinfo->cport_mutex);
14625 14629                          return (EIO);
14626 14630                  }
14627 14631  
14628 14632                  if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
14629 14633                          pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14630 14634                          ASSERT(pmultinfo != NULL);
14631 14635                  } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
14632 14636                          sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
14633 14637                          ASSERT(sdinfo != NULL);
14634 14638                  }
14635 14639                  cportinfo->cport_state &= ~SATA_STATE_READY;
14636 14640  
14637 14641                  if (sdinfo != NULL) {
14638 14642                          if ((sdinfo->satadrv_type &
14639 14643                              SATA_VALID_DEV_TYPE) != 0) {
14640 14644                                  /*
14641 14645                                   * If a target node exists, try to offline
14642 14646                                   * a device and remove target node.
14643 14647                                   */
14644 14648                                  mutex_exit(&cportinfo->cport_mutex);
14645 14649                                  (void) sata_offline_device(sata_hba_inst,
14646 14650                                      sata_device, sdinfo);
14647 14651                                  mutex_enter(&cportinfo->cport_mutex);
14648 14652                          }
14649 14653  
14650 14654                          SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
14651 14655                          cportinfo->cport_dev_type = SATA_DTYPE_NONE;
14652 14656                          (void) kmem_free((void *)sdinfo,
14653 14657                              sizeof (sata_drive_info_t));
14654 14658                  }
14655 14659                  mutex_exit(&cportinfo->cport_mutex);
14656 14660          }
14657 14661  
14658 14662          /* Just ask HBA driver to deactivate port */
14659 14663          sata_device->satadev_addr.qual = qual;
14660 14664  
14661 14665          rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14662 14666              (SATA_DIP(sata_hba_inst), sata_device);
14663 14667  
14664 14668          /*
14665 14669           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14666 14670           * without the hint (to force listener to investivate the state).
14667 14671           */
14668 14672          sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14669 14673              SE_NO_HINT);
14670 14674  
14671 14675          if (qual == SATA_ADDR_PMPORT) {
14672 14676                  mutex_enter(&pmportinfo->pmport_mutex);
14673 14677                  sata_update_pmport_info(sata_hba_inst, sata_device);
14674 14678  
14675 14679                  if (rval != SATA_SUCCESS &&
14676 14680                      sata_device->satadev_state & SATA_PSTATE_FAILED) {
14677 14681                          /*
14678 14682                           * Port deactivation failure - do not change port
14679 14683                           * state unless the state returned by HBA indicates a
14680 14684                           * port failure.
14681 14685                           *
14682 14686                           * NOTE: device structures were released, so devices
14683 14687                           * now are invisible! Port reset is needed to
14684 14688                           * re-enumerate devices.
14685 14689                           */
14686 14690                          pmportinfo->pmport_state = SATA_PSTATE_FAILED;
14687 14691                          rv = EIO;
14688 14692                  } else {
14689 14693                          /*
14690 14694                           * Deactivation succeded. From now on the sata framework
14691 14695                           * will not care what is happening to the device, until
14692 14696                           * the port is activated again.
14693 14697                           */
14694 14698                          pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
14695 14699                  }
14696 14700                  mutex_exit(&pmportinfo->pmport_mutex);
14697 14701          } else if (qual == SATA_ADDR_CPORT) {
14698 14702                  mutex_enter(&cportinfo->cport_mutex);
14699 14703                  sata_update_port_info(sata_hba_inst, sata_device);
14700 14704  
14701 14705                  if (rval != SATA_SUCCESS &&
14702 14706                      sata_device->satadev_state & SATA_PSTATE_FAILED) {
14703 14707                          cportinfo->cport_state = SATA_PSTATE_FAILED;
14704 14708                          rv = EIO;
14705 14709                  } else {
14706 14710                          cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14707 14711                  }
14708 14712                  mutex_exit(&cportinfo->cport_mutex);
14709 14713          }
14710 14714  
14711 14715          return (rv);
14712 14716  }
14713 14717  
14714 14718  
14715 14719  
14716 14720  /*
14717 14721   * Process sata port connect request
14718 14722   * The sata cfgadm pluging will invoke this operation only if port was found
14719 14723   * in the disconnect state (failed state is also treated as the disconnected
14720 14724   * state).
14721 14725   * DEVCTL_AP_CONNECT would invoke  sata_hba_inst->satahba_tran->
14722 14726   * sata_tran_hotplug_ops->sata_tran_port_activate().
14723 14727   * If successful and a device is found attached to the port,
14724 14728   * the initialization sequence is executed to attach a device structure to
14725 14729   * a port structure. The state of the port and a device would be set
14726 14730   * appropriately.
14727 14731   * The device is not set in configured state (system-wise) by this operation.
14728 14732   *
14729 14733   * Note, that activating the port may generate link events,
14730 14734   * so it is important that following processing and the
14731 14735   * event processing does not interfere with each other!
14732 14736   *
14733 14737   * This operation may remove port failed state and will
14734 14738   * try to make port active and in good standing.
14735 14739   *
14736 14740   * NOTE: Port multiplier is supported.
14737 14741   */
14738 14742  
14739 14743  static int
14740 14744  sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
14741 14745      sata_device_t *sata_device)
14742 14746  {
14743 14747          sata_pmport_info_t      *pmportinfo = NULL;
14744 14748          uint8_t cport, pmport, qual;
14745 14749          int rv = 0;
14746 14750  
14747 14751          cport = sata_device->satadev_addr.cport;
14748 14752          pmport = sata_device->satadev_addr.pmport;
14749 14753          qual = sata_device->satadev_addr.qual;
14750 14754  
14751 14755          ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14752 14756          if (qual == SATA_ADDR_DCPORT)
14753 14757                  qual = SATA_ADDR_CPORT;
14754 14758          else
14755 14759                  qual = SATA_ADDR_PMPORT;
14756 14760  
14757 14761          if (qual == SATA_ADDR_PMPORT)
14758 14762                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14759 14763  
14760 14764          /*
14761 14765           * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
14762 14766           * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
14763 14767           * Perform sanity check now.
14764 14768           */
14765 14769          if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
14766 14770                  /* No physical port activation supported. */
14767 14771                  return (EINVAL);
14768 14772          }
14769 14773  
14770 14774          /* Just ask HBA driver to activate port */
14771 14775          if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
14772 14776              (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
14773 14777                  /*
14774 14778                   * Port activation failure.
14775 14779                   */
14776 14780                  if (qual == SATA_ADDR_CPORT) {
14777 14781                          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14778 14782                              cport)->cport_mutex);
14779 14783                          sata_update_port_info(sata_hba_inst, sata_device);
14780 14784                          if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14781 14785                                  SATA_CPORT_STATE(sata_hba_inst, cport) =
14782 14786                                      SATA_PSTATE_FAILED;
14783 14787                                  SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14784 14788                                      "sata_hba_ioctl: connect: failed to "
14785 14789                                      "activate SATA port %d", cport);
14786 14790                          }
14787 14791                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14788 14792                              cport)->cport_mutex);
14789 14793                  } else { /* port multiplier device port */
14790 14794                          mutex_enter(&pmportinfo->pmport_mutex);
14791 14795                          sata_update_pmport_info(sata_hba_inst, sata_device);
14792 14796                          if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14793 14797                                  SATA_PMPORT_STATE(sata_hba_inst, cport,
14794 14798                                      pmport) = SATA_PSTATE_FAILED;
14795 14799                                  SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14796 14800                                      "sata_hba_ioctl: connect: failed to "
14797 14801                                      "activate SATA port %d:%d", cport, pmport);
14798 14802                          }
14799 14803                          mutex_exit(&pmportinfo->pmport_mutex);
14800 14804                  }
14801 14805                  return (EIO);
14802 14806          }
14803 14807  
14804 14808          /* Virgin port state - will be updated by the port re-probe. */
14805 14809          if (qual == SATA_ADDR_CPORT) {
14806 14810                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14807 14811                      cport)->cport_mutex);
14808 14812                  SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
14809 14813                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14810 14814                      cport)->cport_mutex);
14811 14815          } else { /* port multiplier device port */
14812 14816                  mutex_enter(&pmportinfo->pmport_mutex);
14813 14817                  SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
14814 14818                  mutex_exit(&pmportinfo->pmport_mutex);
14815 14819          }
14816 14820  
14817 14821          /*
14818 14822           * Probe the port to find its state and attached device.
14819 14823           */
14820 14824          if (sata_reprobe_port(sata_hba_inst, sata_device,
14821 14825              SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
14822 14826                  rv = EIO;
14823 14827  
14824 14828          /*
14825 14829           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14826 14830           * without the hint
14827 14831           */
14828 14832          sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14829 14833              SE_NO_HINT);
14830 14834  
14831 14835          /*
14832 14836           * If there is a device attached to the port, emit
14833 14837           * a message.
14834 14838           */
14835 14839          if (sata_device->satadev_type != SATA_DTYPE_NONE) {
14836 14840  
14837 14841                  if (qual == SATA_ADDR_CPORT) {
14838 14842                          if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
14839 14843                                  sata_log(sata_hba_inst, CE_WARN,
14840 14844                                      "SATA port multiplier detected "
14841 14845                                      "at port %d", cport);
14842 14846                          } else {
14843 14847                                  sata_log(sata_hba_inst, CE_WARN,
14844 14848                                      "SATA device detected at port %d", cport);
14845 14849                                  if (sata_device->satadev_type ==
14846 14850                                      SATA_DTYPE_UNKNOWN) {
14847 14851                                  /*
14848 14852                                   * A device was not successfully identified
14849 14853                                   */
14850 14854                                  sata_log(sata_hba_inst, CE_WARN,
14851 14855                                      "Could not identify SATA "
14852 14856                                      "device at port %d", cport);
14853 14857                                  }
14854 14858                          }
14855 14859                  } else { /* port multiplier device port */
14856 14860                          sata_log(sata_hba_inst, CE_WARN,
14857 14861                              "SATA device detected at port %d:%d",
14858 14862                              cport, pmport);
14859 14863                          if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
14860 14864                                  /*
14861 14865                                   * A device was not successfully identified
14862 14866                                   */
14863 14867                                  sata_log(sata_hba_inst, CE_WARN,
14864 14868                                      "Could not identify SATA "
14865 14869                                      "device at port %d:%d", cport, pmport);
14866 14870                          }
14867 14871                  }
14868 14872          }
14869 14873  
14870 14874          return (rv);
14871 14875  }
14872 14876  
14873 14877  
14874 14878  /*
14875 14879   * Process sata device unconfigure request.
14876 14880   * The unconfigure operation uses generic nexus operation to
14877 14881   * offline a device. It leaves a target device node attached.
14878 14882   * and obviously sata_drive_info attached as well, because
14879 14883   * from the hardware point of view nothing has changed.
14880 14884   */
14881 14885  static int
14882 14886  sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
14883 14887      sata_device_t *sata_device)
14884 14888  {
14885 14889          int rv = 0;
14886 14890          dev_info_t *tdip;
14887 14891  
14888 14892          /* We are addressing attached device, not a port */
14889 14893          if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
14890 14894                  sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
14891 14895          else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
14892 14896                  sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
14893 14897  
14894 14898          if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
14895 14899              &sata_device->satadev_addr)) != NULL) {
14896 14900  
14897 14901                  if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
14898 14902                          SATA_LOG_D((sata_hba_inst, CE_WARN,
14899 14903                              "sata_hba_ioctl: unconfigure: "
14900 14904                              "failed to unconfigure device at SATA port %d:%d",
14901 14905                              sata_device->satadev_addr.cport,
14902 14906                              sata_device->satadev_addr.pmport));
14903 14907                          rv = EIO;
14904 14908                  }
14905 14909                  /*
14906 14910                   * The target node devi_state should be marked with
14907 14911                   * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
14908 14912                   * This would be the indication for cfgadm that
14909 14913                   * the AP node occupant state is 'unconfigured'.
14910 14914                   */
14911 14915  
14912 14916          } else {
14913 14917                  /*
14914 14918                   * This would indicate a failure on the part of cfgadm
14915 14919                   * to detect correct state of the node prior to this
14916 14920                   * call - one cannot unconfigure non-existing device.
14917 14921                   */
14918 14922                  SATA_LOG_D((sata_hba_inst, CE_WARN,
14919 14923                      "sata_hba_ioctl: unconfigure: "
14920 14924                      "attempt to unconfigure non-existing device "
14921 14925                      "at SATA port %d:%d",
14922 14926                      sata_device->satadev_addr.cport,
14923 14927                      sata_device->satadev_addr.pmport));
14924 14928                  rv = ENXIO;
14925 14929          }
14926 14930          return (rv);
14927 14931  }
14928 14932  
14929 14933  /*
14930 14934   * Process sata device configure request
14931 14935   * If port is in a failed state, operation is aborted - one has to use
14932 14936   * an explicit connect or port activate request to try to get a port into
14933 14937   * non-failed mode. Port reset wil also work in such situation.
14934 14938   * If the port is in disconnected (shutdown) state, the connect operation is
14935 14939   * attempted prior to any other action.
14936 14940   * When port is in the active state, there is a device attached and the target
14937 14941   * node exists, a device was most likely offlined.
14938 14942   * If target node does not exist, a new target node is created. In both cases
14939 14943   * an attempt is made to online (configure) the device.
14940 14944   *
14941 14945   * NOTE: Port multiplier is supported.
14942 14946   */
14943 14947  static int
14944 14948  sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
14945 14949      sata_device_t *sata_device)
14946 14950  {
14947 14951          int cport, pmport, qual;
14948 14952          int rval;
14949 14953          boolean_t target = B_TRUE;
14950 14954          sata_cport_info_t *cportinfo;
14951 14955          sata_pmport_info_t *pmportinfo = NULL;
14952 14956          dev_info_t *tdip;
14953 14957          sata_drive_info_t *sdinfo;
14954 14958  
14955 14959          cport = sata_device->satadev_addr.cport;
14956 14960          pmport = sata_device->satadev_addr.pmport;
14957 14961          qual = sata_device->satadev_addr.qual;
14958 14962  
14959 14963          /* Get current port state */
14960 14964          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14961 14965              (SATA_DIP(sata_hba_inst), sata_device);
14962 14966  
14963 14967          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14964 14968          if (qual == SATA_ADDR_DPMPORT) {
14965 14969                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14966 14970                  mutex_enter(&pmportinfo->pmport_mutex);
14967 14971                  sata_update_pmport_info(sata_hba_inst, sata_device);
14968 14972                  if (rval != SATA_SUCCESS ||
14969 14973                      (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14970 14974                          /*
14971 14975                           * Obviously, device on a failed port is not visible
14972 14976                           */
14973 14977                          mutex_exit(&pmportinfo->pmport_mutex);
14974 14978                          return (ENXIO);
14975 14979                  }
14976 14980                  mutex_exit(&pmportinfo->pmport_mutex);
14977 14981          } else {
14978 14982                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14979 14983                      cport)->cport_mutex);
14980 14984                  sata_update_port_info(sata_hba_inst, sata_device);
14981 14985                  if (rval != SATA_SUCCESS ||
14982 14986                      (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14983 14987                          /*
14984 14988                           * Obviously, device on a failed port is not visible
14985 14989                           */
14986 14990                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14987 14991                              cport)->cport_mutex);
14988 14992                          return (ENXIO);
14989 14993                  }
14990 14994                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14991 14995                      cport)->cport_mutex);
14992 14996          }
14993 14997  
14994 14998          if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
14995 14999                  /* need to activate port */
14996 15000                  target = B_FALSE;
14997 15001  
14998 15002                  /* Sanity check */
14999 15003                  if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15000 15004                          return (ENXIO);
15001 15005  
15002 15006                  /* Just let HBA driver to activate port */
15003 15007                  if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15004 15008                      (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15005 15009                          /*
15006 15010                           * Port activation failure - do not change port state
15007 15011                           * unless the state returned by HBA indicates a port
15008 15012                           * failure.
15009 15013                           */
15010 15014                          if (qual == SATA_ADDR_DPMPORT) {
15011 15015                                  mutex_enter(&pmportinfo->pmport_mutex);
15012 15016                                  sata_update_pmport_info(sata_hba_inst,
15013 15017                                      sata_device);
15014 15018                                  if (sata_device->satadev_state &
15015 15019                                      SATA_PSTATE_FAILED)
15016 15020                                          pmportinfo->pmport_state =
15017 15021                                              SATA_PSTATE_FAILED;
15018 15022                                  mutex_exit(&pmportinfo->pmport_mutex);
15019 15023                          } else {
15020 15024                                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15021 15025                                      cport)->cport_mutex);
15022 15026                                  sata_update_port_info(sata_hba_inst,
15023 15027                                      sata_device);
15024 15028                                  if (sata_device->satadev_state &
15025 15029                                      SATA_PSTATE_FAILED)
15026 15030                                          cportinfo->cport_state =
15027 15031                                              SATA_PSTATE_FAILED;
15028 15032                                  mutex_exit(&SATA_CPORT_INFO(
15029 15033                                      sata_hba_inst, cport)->cport_mutex);
15030 15034                          }
15031 15035                  }
15032 15036                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15033 15037                      "sata_hba_ioctl: configure: "
15034 15038                      "failed to activate SATA port %d:%d",
15035 15039                      cport, pmport));
15036 15040                  return (EIO);
15037 15041          }
15038 15042          /*
15039 15043           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15040 15044           * without the hint.
15041 15045           */
15042 15046          sata_gen_sysevent(sata_hba_inst,
15043 15047              &sata_device->satadev_addr, SE_NO_HINT);
15044 15048  
15045 15049          /* Virgin port state */
15046 15050          if (qual == SATA_ADDR_DPMPORT) {
15047 15051                  mutex_enter(&pmportinfo->pmport_mutex);
15048 15052                  pmportinfo->pmport_state = 0;
15049 15053                  mutex_exit(&pmportinfo->pmport_mutex);
15050 15054          } else {
15051 15055                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15052 15056                      cport)-> cport_mutex);
15053 15057                  cportinfo->cport_state = 0;
15054 15058                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15055 15059                      cport)->cport_mutex);
15056 15060          }
15057 15061          /*
15058 15062           * Always reprobe port, to get current device info.
15059 15063           */
15060 15064          if (sata_reprobe_port(sata_hba_inst, sata_device,
15061 15065              SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15062 15066                  return (EIO);
15063 15067  
15064 15068          if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15065 15069                  if (qual == SATA_ADDR_DPMPORT) {
15066 15070                          /*
15067 15071                           * That's the transition from "inactive" port
15068 15072                           * to active one with device attached.
15069 15073                           */
15070 15074                          sata_log(sata_hba_inst, CE_WARN,
15071 15075                              "SATA device detected at port %d:%d",
15072 15076                              cport, pmport);
15073 15077                  } else {
15074 15078                          /*
15075 15079                           * When PM is attached to the cport and cport is
15076 15080                           * activated, every PM device port needs to be reprobed.
15077 15081                           * We need to emit message for all devices detected
15078 15082                           * at port multiplier's device ports.
15079 15083                           * Add such code here.
15080 15084                           * For now, just inform about device attached to
15081 15085                           * cport.
15082 15086                           */
15083 15087                          sata_log(sata_hba_inst, CE_WARN,
15084 15088                              "SATA device detected at port %d", cport);
15085 15089                  }
15086 15090          }
15087 15091  
15088 15092          /*
15089 15093           * This is where real configuration operation starts.
15090 15094           *
15091 15095           * When PM is attached to the cport and cport is activated,
15092 15096           * devices attached PM device ports may have to be configured
15093 15097           * explicitly. This may change when port multiplier is supported.
15094 15098           * For now, configure only disks and other valid target devices.
15095 15099           */
15096 15100          if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
15097 15101                  if (qual == SATA_ADDR_DCPORT) {
15098 15102                          if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15099 15103                                  /*
15100 15104                                   * A device was not successfully identified
15101 15105                                   */
15102 15106                                  sata_log(sata_hba_inst, CE_WARN,
15103 15107                                      "Could not identify SATA "
15104 15108                                      "device at port %d", cport);
15105 15109                          }
15106 15110                  } else { /* port multiplier device port */
15107 15111                          if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15108 15112                                  /*
15109 15113                                   * A device was not successfully identified
15110 15114                                   */
15111 15115                                  sata_log(sata_hba_inst, CE_WARN,
15112 15116                                      "Could not identify SATA "
15113 15117                                      "device at port %d:%d", cport, pmport);
15114 15118                          }
15115 15119                  }
15116 15120                  return (ENXIO);         /* No device to configure */
15117 15121          }
15118 15122  
15119 15123          /*
15120 15124           * Here we may have a device in reset condition,
15121 15125           * but because we are just configuring it, there is
15122 15126           * no need to process the reset other than just
15123 15127           * to clear device reset condition in the HBA driver.
15124 15128           * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
15125 15129           * cause a first command sent the HBA driver with the request
15126 15130           * to clear device reset condition.
15127 15131           */
15128 15132          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15129 15133          if (qual == SATA_ADDR_DPMPORT)
15130 15134                  sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15131 15135          else
15132 15136                  sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15133 15137          sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
15134 15138          if (sdinfo == NULL) {
15135 15139                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15136 15140                  return (ENXIO);
15137 15141          }
15138 15142          if (sdinfo->satadrv_event_flags &
15139 15143              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
15140 15144                  sdinfo->satadrv_event_flags = 0;
15141 15145          }
15142 15146          sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
15143 15147          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15144 15148  
15145 15149          if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15146 15150              &sata_device->satadev_addr)) != NULL) {
15147 15151                  /*
15148 15152                   * Target node exists. Verify, that it belongs
15149 15153                   * to existing, attached device and not to
15150 15154                   * a removed device.
15151 15155                   */
15152 15156                  if (sata_check_device_removed(tdip) == B_TRUE) {
15153 15157                          if (qual == SATA_ADDR_DPMPORT)
15154 15158                                  sata_log(sata_hba_inst, CE_WARN,
15155 15159                                      "SATA device at port %d cannot be "
15156 15160                                      "configured. "
15157 15161                                      "Application(s) accessing "
15158 15162                                      "previously attached device "
15159 15163                                      "have to release it before newly "
15160 15164                                      "inserted device can be made accessible.",
15161 15165                                      cport);
15162 15166                          else
15163 15167                                  sata_log(sata_hba_inst, CE_WARN,
15164 15168                                      "SATA device at port %d:%d cannot be"
15165 15169                                      "configured. "
15166 15170                                      "Application(s) accessing "
15167 15171                                      "previously attached device "
15168 15172                                      "have to release it before newly "
15169 15173                                      "inserted device can be made accessible.",
15170 15174                                      cport, pmport);
15171 15175                          return (EIO);
15172 15176                  }
15173 15177                  /*
15174 15178                   * Device was not removed and re-inserted.
15175 15179                   * Try to online it.
15176 15180                   */
15177 15181                  if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
15178 15182                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15179 15183                              "sata_hba_ioctl: configure: "
15180 15184                              "onlining device at SATA port "
15181 15185                              "%d:%d failed", cport, pmport));
15182 15186                          return (EIO);
15183 15187                  }
15184 15188  
15185 15189                  if (qual == SATA_ADDR_DPMPORT) {
15186 15190                          mutex_enter(&pmportinfo->pmport_mutex);
15187 15191                          pmportinfo->pmport_tgtnode_clean = B_TRUE;
15188 15192                          mutex_exit(&pmportinfo->pmport_mutex);
15189 15193                  } else {
15190 15194                          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15191 15195                              cport)->cport_mutex);
15192 15196                          cportinfo-> cport_tgtnode_clean = B_TRUE;
15193 15197                          mutex_exit(&SATA_CPORT_INFO(
15194 15198                              sata_hba_inst, cport)->cport_mutex);
15195 15199                  }
15196 15200          } else {
15197 15201                  /*
15198 15202                   * No target node - need to create a new target node.
15199 15203                   */
15200 15204                  if (qual == SATA_ADDR_DPMPORT) {
15201 15205                          mutex_enter(&pmportinfo->pmport_mutex);
15202 15206                          pmportinfo->pmport_tgtnode_clean = B_TRUE;
15203 15207                          mutex_exit(&pmportinfo->pmport_mutex);
15204 15208                  } else {
15205 15209                          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15206 15210                              cport_mutex);
15207 15211                          cportinfo-> cport_tgtnode_clean = B_TRUE;
15208 15212                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15209 15213                              cport_mutex);
15210 15214                  }
15211 15215  
15212 15216                  tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
15213 15217                      sata_hba_inst, &sata_device->satadev_addr);
15214 15218                  if (tdip == NULL) {
15215 15219                          /* Configure operation failed */
15216 15220                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15217 15221                              "sata_hba_ioctl: configure: "
15218 15222                              "configuring SATA device at port %d:%d "
15219 15223                              "failed", cport, pmport));
15220 15224                          return (EIO);
15221 15225                  }
15222 15226          }
15223 15227          return (0);
15224 15228  }
15225 15229  
15226 15230  
15227 15231  /*
15228 15232   * Process ioctl deactivate port request.
15229 15233   * Arbitrarily unconfigure attached device, if any.
15230 15234   * Even if the unconfigure fails, proceed with the
15231 15235   * port deactivation.
15232 15236   *
15233 15237   * NOTE: Port Multiplier is supported now.
15234 15238   */
15235 15239  
15236 15240  static int
15237 15241  sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
15238 15242      sata_device_t *sata_device)
15239 15243  {
15240 15244          int cport, pmport, qual;
15241 15245          int rval, rv = 0;
15242 15246          int npmport;
15243 15247          sata_cport_info_t *cportinfo;
15244 15248          sata_pmport_info_t *pmportinfo;
15245 15249          sata_pmult_info_t *pmultinfo;
15246 15250          dev_info_t *tdip;
15247 15251          sata_drive_info_t *sdinfo = NULL;
15248 15252          sata_device_t subsdevice;
15249 15253  
15250 15254          /* Sanity check */
15251 15255          if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
15252 15256                  return (ENOTSUP);
15253 15257  
15254 15258          cport = sata_device->satadev_addr.cport;
15255 15259          pmport = sata_device->satadev_addr.pmport;
15256 15260          qual = sata_device->satadev_addr.qual;
15257 15261  
15258 15262          /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
15259 15263          ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15260 15264          if (qual == SATA_ADDR_DCPORT)
15261 15265                  qual = SATA_ADDR_CPORT;
15262 15266          else
15263 15267                  qual = SATA_ADDR_PMPORT;
15264 15268  
15265 15269          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15266 15270          if (qual == SATA_ADDR_PMPORT)
15267 15271                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15268 15272  
15269 15273          /*
15270 15274           * Processing port multiplier
15271 15275           */
15272 15276          if (qual == SATA_ADDR_CPORT &&
15273 15277              SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15274 15278                  mutex_enter(&cportinfo->cport_mutex);
15275 15279  
15276 15280                  /* Deactivate all sub-deices */
15277 15281                  pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15278 15282                  if (pmultinfo != NULL) {
15279 15283                          for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15280 15284                              sata_hba_inst, cport); npmport++) {
15281 15285  
15282 15286                                  subsdevice.satadev_addr.cport = cport;
15283 15287                                  subsdevice.satadev_addr.pmport =
15284 15288                                      (uint8_t)npmport;
15285 15289                                  subsdevice.satadev_addr.qual =
15286 15290                                      SATA_ADDR_DPMPORT;
15287 15291  
15288 15292                                  SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15289 15293                                      "sata_hba_ioctl: deactivate: trying to "
15290 15294                                      "deactivate SATA port %d:%d",
15291 15295                                      cport, npmport);
15292 15296  
15293 15297                                  mutex_exit(&cportinfo->cport_mutex);
15294 15298                                  if (sata_ioctl_deactivate(sata_hba_inst,
15295 15299                                      &subsdevice) == SATA_SUCCESS) {
15296 15300                                          SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15297 15301                                              "[Deactivate] device at port %d:%d "
15298 15302                                              "successfully.", cport, npmport);
15299 15303                                  }
15300 15304                                  mutex_enter(&cportinfo->cport_mutex);
15301 15305                          }
15302 15306                  }
15303 15307  
15304 15308                  /* Deactivate the port multiplier now. */
15305 15309                  cportinfo->cport_state &= ~SATA_STATE_READY;
15306 15310                  mutex_exit(&cportinfo->cport_mutex);
15307 15311  
15308 15312                  sata_device->satadev_addr.qual = qual;
15309 15313                  rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15310 15314                      (SATA_DIP(sata_hba_inst), sata_device);
15311 15315  
15312 15316                  sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15313 15317                      SE_NO_HINT);
15314 15318  
15315 15319                  mutex_enter(&cportinfo->cport_mutex);
15316 15320                  sata_update_port_info(sata_hba_inst, sata_device);
15317 15321                  if (rval != SATA_SUCCESS) {
15318 15322                          if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15319 15323                                  cportinfo->cport_state = SATA_PSTATE_FAILED;
15320 15324                          }
15321 15325                          rv = EIO;
15322 15326                  } else {
15323 15327                          cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15324 15328                  }
15325 15329                  mutex_exit(&cportinfo->cport_mutex);
15326 15330  
15327 15331                  return (rv);
15328 15332          }
15329 15333  
15330 15334          /*
15331 15335           * Process non-port-multiplier device - it could be a drive connected
15332 15336           * to a port multiplier port or a controller port.
15333 15337           */
15334 15338          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15335 15339          if (qual == SATA_ADDR_CPORT) {
15336 15340                  sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15337 15341                  if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15338 15342                          /* deal only with valid devices */
15339 15343                          if ((cportinfo->cport_dev_type &
15340 15344                              SATA_VALID_DEV_TYPE) != 0)
15341 15345                                  sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15342 15346                  }
15343 15347                  cportinfo->cport_state &= ~SATA_STATE_READY;
15344 15348          } else {
15345 15349                  /* Port multiplier device port */
15346 15350                  mutex_enter(&pmportinfo->pmport_mutex);
15347 15351                  sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15348 15352                  if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
15349 15353                      (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
15350 15354                          sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
15351 15355                  pmportinfo->pmport_state &= ~SATA_STATE_READY;
15352 15356                  mutex_exit(&pmportinfo->pmport_mutex);
15353 15357          }
15354 15358  
15355 15359          if (sdinfo != NULL) {
15356 15360                  /*
15357 15361                   * If a target node exists, try to offline a device and
15358 15362                   * to remove a target node.
15359 15363                   */
15360 15364                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15361 15365                      cport_mutex);
15362 15366                  tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15363 15367                      &sata_device->satadev_addr);
15364 15368                  if (tdip != NULL) {
15365 15369                          /* target node exist */
15366 15370                          SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15367 15371                              "sata_hba_ioctl: port deactivate: "
15368 15372                              "target node exists.", NULL);
15369 15373  
15370 15374                          if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
15371 15375                              NDI_SUCCESS) {
15372 15376                                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15373 15377                                      "sata_hba_ioctl: port deactivate: "
15374 15378                                      "failed to unconfigure device at port "
15375 15379                                      "%d:%d before deactivating the port",
15376 15380                                      cport, pmport));
15377 15381                                  /*
15378 15382                                   * Set DEVICE REMOVED state in the target
15379 15383                                   * node. It will prevent an access to
15380 15384                                   * the device even when a new device is
15381 15385                                   * attached, until the old target node is
15382 15386                                   * released, removed and recreated for a new
15383 15387                                   * device.
15384 15388                                   */
15385 15389                                  sata_set_device_removed(tdip);
15386 15390  
15387 15391                                  /*
15388 15392                                   * Instruct the event daemon to try the
15389 15393                                   * target node cleanup later.
15390 15394                                   */
15391 15395                                  sata_set_target_node_cleanup(sata_hba_inst,
15392 15396                                      &sata_device->satadev_addr);
15393 15397                          }
15394 15398                  }
15395 15399                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15396 15400                      cport_mutex);
15397 15401                  /*
15398 15402                   * In any case, remove and release sata_drive_info
15399 15403                   * structure.
15400 15404                   */
15401 15405                  if (qual == SATA_ADDR_CPORT) {
15402 15406                          SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15403 15407                          cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15404 15408                  } else { /* port multiplier device port */
15405 15409                          mutex_enter(&pmportinfo->pmport_mutex);
15406 15410                          SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15407 15411                          pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15408 15412                          mutex_exit(&pmportinfo->pmport_mutex);
15409 15413                  }
15410 15414                  (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
15411 15415          }
15412 15416  
15413 15417          if (qual == SATA_ADDR_CPORT) {
15414 15418                  cportinfo->cport_state &= ~(SATA_STATE_PROBED |
15415 15419                      SATA_STATE_PROBING);
15416 15420          } else if (qual == SATA_ADDR_PMPORT) {
15417 15421                  mutex_enter(&pmportinfo->pmport_mutex);
15418 15422                  pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
15419 15423                      SATA_STATE_PROBING);
15420 15424                  mutex_exit(&pmportinfo->pmport_mutex);
15421 15425          }
15422 15426          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15423 15427  
15424 15428          /* Just let HBA driver to deactivate port */
15425 15429          sata_device->satadev_addr.qual = qual;
15426 15430          rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15427 15431              (SATA_DIP(sata_hba_inst), sata_device);
15428 15432  
15429 15433          /*
15430 15434           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15431 15435           * without the hint
15432 15436           */
15433 15437          sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15434 15438              SE_NO_HINT);
15435 15439  
15436 15440          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15437 15441          sata_update_port_info(sata_hba_inst, sata_device);
15438 15442          if (qual == SATA_ADDR_CPORT) {
15439 15443                  if (rval != SATA_SUCCESS) {
15440 15444                          /*
15441 15445                           * Port deactivation failure - do not change port state
15442 15446                           * unless the state returned by HBA indicates a port
15443 15447                           * failure.
15444 15448                           */
15445 15449                          if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15446 15450                                  SATA_CPORT_STATE(sata_hba_inst, cport) =
15447 15451                                      SATA_PSTATE_FAILED;
15448 15452                          }
15449 15453                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15450 15454                              "sata_hba_ioctl: port deactivate: "
15451 15455                              "cannot deactivate SATA port %d", cport));
15452 15456                          rv = EIO;
15453 15457                  } else {
15454 15458                          cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15455 15459                  }
15456 15460          } else {
15457 15461                  mutex_enter(&pmportinfo->pmport_mutex);
15458 15462                  if (rval != SATA_SUCCESS) {
15459 15463                          if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15460 15464                                  SATA_PMPORT_STATE(sata_hba_inst, cport,
15461 15465                                      pmport) = SATA_PSTATE_FAILED;
15462 15466                          }
15463 15467                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15464 15468                              "sata_hba_ioctl: port deactivate: "
15465 15469                              "cannot deactivate SATA port %d:%d",
15466 15470                              cport, pmport));
15467 15471                          rv = EIO;
15468 15472                  } else {
15469 15473                          pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15470 15474                  }
15471 15475                  mutex_exit(&pmportinfo->pmport_mutex);
15472 15476          }
15473 15477  
15474 15478          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15475 15479  
15476 15480          return (rv);
15477 15481  }
15478 15482  
15479 15483  /*
15480 15484   * Process ioctl port activate request.
15481 15485   *
15482 15486   * NOTE: Port multiplier is supported now.
15483 15487   */
15484 15488  static int
15485 15489  sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
15486 15490      sata_device_t *sata_device)
15487 15491  {
15488 15492          int cport, pmport, qual;
15489 15493          sata_cport_info_t *cportinfo;
15490 15494          sata_pmport_info_t *pmportinfo = NULL;
15491 15495          boolean_t dev_existed = B_TRUE;
15492 15496  
15493 15497          /* Sanity check */
15494 15498          if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15495 15499                  return (ENOTSUP);
15496 15500  
15497 15501          cport = sata_device->satadev_addr.cport;
15498 15502          pmport = sata_device->satadev_addr.pmport;
15499 15503          qual = sata_device->satadev_addr.qual;
15500 15504  
15501 15505          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15502 15506  
15503 15507          /*
15504 15508           * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15505 15509           * is a device. But what we are dealing with is port/pmport.
15506 15510           */
15507 15511          ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15508 15512          if (qual == SATA_ADDR_DCPORT)
15509 15513                  sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15510 15514          else
15511 15515                  sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15512 15516  
15513 15517          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15514 15518          if (qual == SATA_ADDR_PMPORT) {
15515 15519                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15516 15520                  if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
15517 15521                      pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
15518 15522                          dev_existed = B_FALSE;
15519 15523          } else { /* cport */
15520 15524                  if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
15521 15525                      cportinfo->cport_dev_type == SATA_DTYPE_NONE)
15522 15526                          dev_existed = B_FALSE;
15523 15527          }
15524 15528          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15525 15529  
15526 15530          /* Just let HBA driver to activate port, if necessary */
15527 15531          if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15528 15532              (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15529 15533                  /*
15530 15534                   * Port activation failure - do not change port state unless
15531 15535                   * the state returned by HBA indicates a port failure.
15532 15536                   */
15533 15537                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15534 15538                      cport)->cport_mutex);
15535 15539                  sata_update_port_info(sata_hba_inst, sata_device);
15536 15540                  if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15537 15541                          if (qual == SATA_ADDR_PMPORT) {
15538 15542                                  mutex_enter(&pmportinfo->pmport_mutex);
15539 15543                                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15540 15544                                  mutex_exit(&pmportinfo->pmport_mutex);
15541 15545                          } else
15542 15546                                  cportinfo->cport_state = SATA_PSTATE_FAILED;
15543 15547  
15544 15548                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15545 15549                              cport)->cport_mutex);
15546 15550                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15547 15551                              "sata_hba_ioctl: port activate: cannot activate "
15548 15552                              "SATA port %d:%d", cport, pmport));
15549 15553                          return (EIO);
15550 15554                  }
15551 15555                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15552 15556          }
15553 15557          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15554 15558          if (qual == SATA_ADDR_PMPORT) {
15555 15559                  mutex_enter(&pmportinfo->pmport_mutex);
15556 15560                  pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
15557 15561                  mutex_exit(&pmportinfo->pmport_mutex);
15558 15562          } else
15559 15563                  cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
15560 15564          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15561 15565  
15562 15566          /*
15563 15567           * Re-probe port to find its current state and possibly attached device.
15564 15568           * Port re-probing may change the cportinfo device type if device is
15565 15569           * found attached.
15566 15570           * If port probing failed, the device type would be set to
15567 15571           * SATA_DTYPE_NONE.
15568 15572           */
15569 15573          (void) sata_reprobe_port(sata_hba_inst, sata_device,
15570 15574              SATA_DEV_IDENTIFY_RETRY);
15571 15575  
15572 15576          /*
15573 15577           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15574 15578           * without the hint.
15575 15579           */
15576 15580          sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15577 15581              SE_NO_HINT);
15578 15582  
15579 15583          if (dev_existed == B_FALSE) {
15580 15584                  if (qual == SATA_ADDR_PMPORT &&
15581 15585                      pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15582 15586                          /*
15583 15587                           * That's the transition from the "inactive" port state
15584 15588                           * or the active port without a device attached to the
15585 15589                           * active port state with a device attached.
15586 15590                           */
15587 15591                          sata_log(sata_hba_inst, CE_WARN,
15588 15592                              "SATA device detected at port %d:%d",
15589 15593                              cport, pmport);
15590 15594                  } else if (qual == SATA_ADDR_CPORT &&
15591 15595                      cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15592 15596                          /*
15593 15597                           * That's the transition from the "inactive" port state
15594 15598                           * or the active port without a device attached to the
15595 15599                           * active port state with a device attached.
15596 15600                           */
15597 15601                          if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
15598 15602                                  sata_log(sata_hba_inst, CE_WARN,
15599 15603                                      "SATA device detected at port %d", cport);
15600 15604                          } else {
15601 15605                                  sata_log(sata_hba_inst, CE_WARN,
15602 15606                                      "SATA port multiplier detected at port %d",
15603 15607                                      cport);
15604 15608                          }
15605 15609                  }
15606 15610          }
15607 15611          return (0);
15608 15612  }
15609 15613  
15610 15614  
15611 15615  
15612 15616  /*
15613 15617   * Process ioctl reset port request.
15614 15618   *
15615 15619   * NOTE: Port-Multiplier is supported.
15616 15620   */
15617 15621  static int
15618 15622  sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
15619 15623      sata_device_t *sata_device)
15620 15624  {
15621 15625          int cport, pmport, qual;
15622 15626          int rv = 0;
15623 15627  
15624 15628          cport = sata_device->satadev_addr.cport;
15625 15629          pmport = sata_device->satadev_addr.pmport;
15626 15630          qual = sata_device->satadev_addr.qual;
15627 15631  
15628 15632          /*
15629 15633           * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15630 15634           * is a device. But what we are dealing with is port/pmport.
15631 15635           */
15632 15636          if (qual == SATA_ADDR_DCPORT)
15633 15637                  sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15634 15638          else
15635 15639                  sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15636 15640          ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
15637 15641  
15638 15642          /* Sanity check */
15639 15643          if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15640 15644                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15641 15645                      "sata_hba_ioctl: sata_hba_tran missing required "
15642 15646                      "function sata_tran_reset_dport"));
15643 15647                  return (ENOTSUP);
15644 15648          }
15645 15649  
15646 15650          /* Ask HBA to reset port */
15647 15651          if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
15648 15652              sata_device) != SATA_SUCCESS) {
15649 15653                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15650 15654                      "sata_hba_ioctl: reset port: failed %d:%d",
15651 15655                      cport, pmport));
15652 15656                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15653 15657                      cport_mutex);
15654 15658                  sata_update_port_info(sata_hba_inst, sata_device);
15655 15659                  if (qual == SATA_ADDR_CPORT)
15656 15660                          SATA_CPORT_STATE(sata_hba_inst, cport) =
15657 15661                              SATA_PSTATE_FAILED;
15658 15662                  else {
15659 15663                          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15660 15664                              pmport));
15661 15665                          SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15662 15666                              SATA_PSTATE_FAILED;
15663 15667                          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15664 15668                              pmport));
15665 15669                  }
15666 15670                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15667 15671                      cport_mutex);
15668 15672                  rv = EIO;
15669 15673          }
15670 15674  
15671 15675          return (rv);
15672 15676  }
15673 15677  
15674 15678  /*
15675 15679   * Process ioctl reset device request.
15676 15680   *
15677 15681   * NOTE: Port multiplier is supported.
15678 15682   */
15679 15683  static int
15680 15684  sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
15681 15685      sata_device_t *sata_device)
15682 15686  {
15683 15687          sata_drive_info_t *sdinfo = NULL;
15684 15688          sata_pmult_info_t *pmultinfo = NULL;
15685 15689          int cport, pmport;
15686 15690          int rv = 0;
15687 15691  
15688 15692          /* Sanity check */
15689 15693          if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15690 15694                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15691 15695                      "sata_hba_ioctl: sata_hba_tran missing required "
15692 15696                      "function sata_tran_reset_dport"));
15693 15697                  return (ENOTSUP);
15694 15698          }
15695 15699  
15696 15700          cport = sata_device->satadev_addr.cport;
15697 15701          pmport = sata_device->satadev_addr.pmport;
15698 15702  
15699 15703          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15700 15704          if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
15701 15705                  if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
15702 15706                      SATA_DTYPE_PMULT)
15703 15707                          pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
15704 15708                              cport_devp.cport_sata_pmult;
15705 15709                  else
15706 15710                          sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
15707 15711                              sata_device->satadev_addr.cport);
15708 15712          } else { /* port multiplier */
15709 15713                  sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15710 15714                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
15711 15715                      sata_device->satadev_addr.cport,
15712 15716                      sata_device->satadev_addr.pmport);
15713 15717          }
15714 15718          if (sdinfo == NULL && pmultinfo == NULL) {
15715 15719                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15716 15720                  return (EINVAL);
15717 15721          }
15718 15722          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15719 15723  
15720 15724          /* Ask HBA to reset device */
15721 15725          if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15722 15726              (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15723 15727                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15724 15728                      "sata_hba_ioctl: reset device: failed at port %d:%d",
15725 15729                      cport, pmport));
15726 15730                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15727 15731                      cport_mutex);
15728 15732                  sata_update_port_info(sata_hba_inst, sata_device);
15729 15733                  /*
15730 15734                   * Device info structure remains attached. Another device reset
15731 15735                   * or port disconnect/connect and re-probing is
15732 15736                   * needed to change it's state
15733 15737                   */
15734 15738                  if (sdinfo != NULL) {
15735 15739                          sdinfo->satadrv_state &= ~SATA_STATE_READY;
15736 15740                          sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
15737 15741                  } else if (pmultinfo != NULL) {
15738 15742                          pmultinfo->pmult_state &= ~SATA_STATE_READY;
15739 15743                          pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
15740 15744                  }
15741 15745  
15742 15746                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15743 15747                  rv = EIO;
15744 15748          }
15745 15749          /*
15746 15750           * If attached device was a port multiplier, some extra processing
15747 15751           * may be needed to bring it back. SATA specification requies a
15748 15752           * mandatory software reset on host port to reliably enumerate a port
15749 15753           * multiplier, the HBA driver should handle that after reset
15750 15754           * operation.
15751 15755           */
15752 15756          return (rv);
15753 15757  }
15754 15758  
15755 15759  
15756 15760  /*
15757 15761   * Process ioctl reset all request.
15758 15762   */
15759 15763  static int
15760 15764  sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
15761 15765  {
15762 15766          sata_device_t sata_device;
15763 15767          int rv = 0;
15764 15768          int tcport;
15765 15769  
15766 15770          sata_device.satadev_rev = SATA_DEVICE_REV;
15767 15771  
15768 15772          /*
15769 15773           * There is no protection here for configured devices.
15770 15774           */
15771 15775          /* Sanity check */
15772 15776          if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15773 15777                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15774 15778                      "sata_hba_ioctl: sata_hba_tran missing required "
15775 15779                      "function sata_tran_reset_dport"));
15776 15780                  return (ENOTSUP);
15777 15781          }
15778 15782  
15779 15783          /*
15780 15784           * Need to lock all ports, not just one.
15781 15785           * If any port is locked by event processing, fail the whole operation.
15782 15786           * One port is already locked, but for simplicity lock it again.
15783 15787           */
15784 15788          for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15785 15789                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15786 15790                      cport_mutex);
15787 15791                  if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
15788 15792                      cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
15789 15793                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15790 15794                              cport_mutex);
15791 15795                          rv = EBUSY;
15792 15796                          break;
15793 15797                  } else {
15794 15798                          /*
15795 15799                           * It is enough to lock cport in command-based
15796 15800                           * switching mode.
15797 15801                           */
15798 15802                          SATA_CPORT_INFO(sata_hba_inst, tcport)->
15799 15803                              cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
15800 15804                  }
15801 15805                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15802 15806                      cport_mutex);
15803 15807          }
15804 15808  
15805 15809          if (rv == 0) {
15806 15810                  /*
15807 15811                   * All cports were successfully locked.
15808 15812                   * Reset main SATA controller.
15809 15813                   * Set the device address to port 0, to have a valid device
15810 15814                   * address.
15811 15815                   */
15812 15816                  sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
15813 15817                  sata_device.satadev_addr.cport = 0;
15814 15818                  sata_device.satadev_addr.pmport = 0;
15815 15819  
15816 15820                  if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15817 15821                      (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
15818 15822                          SATA_LOG_D((sata_hba_inst, CE_WARN,
15819 15823                              "sata_hba_ioctl: reset controller failed"));
15820 15824                          return (EIO);
15821 15825                  }
15822 15826          }
15823 15827          /*
15824 15828           * Unlock all ports
15825 15829           */
15826 15830          for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15827 15831                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15828 15832                      cport_mutex);
15829 15833                  SATA_CPORT_INFO(sata_hba_inst, tcport)->
15830 15834                      cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
15831 15835                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15832 15836                      cport_mutex);
15833 15837          }
15834 15838  
15835 15839          /*
15836 15840           * This operation returns EFAULT if either reset
15837 15841           * controller failed or a re-probing of any port failed.
15838 15842           */
15839 15843          return (rv);
15840 15844  }
15841 15845  
15842 15846  
15843 15847  /*
15844 15848   * Process ioctl port self test request.
15845 15849   *
15846 15850   * NOTE: Port multiplier code is not completed nor tested.
15847 15851   */
15848 15852  static int
15849 15853  sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
15850 15854      sata_device_t *sata_device)
15851 15855  {
15852 15856          int cport, pmport, qual;
15853 15857          int rv = 0;
15854 15858  
15855 15859          /* Sanity check */
15856 15860          if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
15857 15861                  return (ENOTSUP);
15858 15862  
15859 15863          cport = sata_device->satadev_addr.cport;
15860 15864          pmport = sata_device->satadev_addr.pmport;
15861 15865          qual = sata_device->satadev_addr.qual;
15862 15866  
15863 15867          /*
15864 15868           * There is no protection here for a configured
15865 15869           * device attached to this port.
15866 15870           */
15867 15871  
15868 15872          if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
15869 15873              (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15870 15874                  SATA_LOG_D((sata_hba_inst, CE_WARN,
15871 15875                      "sata_hba_ioctl: port selftest: "
15872 15876                      "failed port %d:%d", cport, pmport));
15873 15877                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15874 15878                      cport_mutex);
15875 15879                  sata_update_port_info(sata_hba_inst, sata_device);
15876 15880                  if (qual == SATA_ADDR_CPORT)
15877 15881                          SATA_CPORT_STATE(sata_hba_inst, cport) =
15878 15882                              SATA_PSTATE_FAILED;
15879 15883                  else { /* port multiplier device port */
15880 15884                          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
15881 15885                              cport, pmport));
15882 15886                          SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15883 15887                              SATA_PSTATE_FAILED;
15884 15888                          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
15885 15889                              cport, pmport));
15886 15890                  }
15887 15891  
15888 15892                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15889 15893                      cport_mutex);
15890 15894                  return (EIO);
15891 15895          }
15892 15896          /*
15893 15897           * Beacuse the port was reset in the course of testing, it should be
15894 15898           * re-probed and attached device state should be restored. At this
15895 15899           * point the port state is unknown - it's state is HBA-specific.
15896 15900           * Force port re-probing to get it into a known state.
15897 15901           */
15898 15902          if (sata_reprobe_port(sata_hba_inst, sata_device,
15899 15903              SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15900 15904                  rv = EIO;
15901 15905          return (rv);
15902 15906  }
15903 15907  
15904 15908  
15905 15909  /*
15906 15910   * sata_cfgadm_state:
15907 15911   * Use the sata port state and state of the target node to figure out
15908 15912   * the cfgadm_state.
15909 15913   *
15910 15914   * The port argument is a value with encoded cport,
15911 15915   * pmport and address qualifier, in the same manner as a scsi target number.
15912 15916   * SCSI_TO_SATA_CPORT macro extracts cport number,
15913 15917   * SCSI_TO_SATA_PMPORT extracts pmport number and
15914 15918   * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
15915 15919   *
15916 15920   * Port multiplier is supported.
15917 15921   */
15918 15922  
15919 15923  static void
15920 15924  sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
15921 15925      devctl_ap_state_t *ap_state)
15922 15926  {
15923 15927          uint8_t         cport, pmport, qual;
15924 15928          uint32_t        port_state, pmult_state;
15925 15929          uint32_t        dev_type;
15926 15930          sata_drive_info_t *sdinfo;
15927 15931  
15928 15932          cport = SCSI_TO_SATA_CPORT(port);
15929 15933          pmport = SCSI_TO_SATA_PMPORT(port);
15930 15934          qual = SCSI_TO_SATA_ADDR_QUAL(port);
15931 15935  
15932 15936          /* Check cport state */
15933 15937          port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
15934 15938          if (port_state & SATA_PSTATE_SHUTDOWN ||
15935 15939              port_state & SATA_PSTATE_FAILED) {
15936 15940                  ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15937 15941                  ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15938 15942                  if (port_state & SATA_PSTATE_FAILED)
15939 15943                          ap_state->ap_condition = AP_COND_FAILED;
15940 15944                  else
15941 15945                          ap_state->ap_condition = AP_COND_UNKNOWN;
15942 15946  
15943 15947                  return;
15944 15948          }
15945 15949  
15946 15950          /* cport state is okay. Now check pmport state */
15947 15951          if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
15948 15952                  /* Sanity check */
15949 15953                  if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
15950 15954                      SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
15951 15955                      cport, pmport) == NULL)
15952 15956                          return;
15953 15957                  port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
15954 15958                  if (port_state & SATA_PSTATE_SHUTDOWN ||
15955 15959                      port_state & SATA_PSTATE_FAILED) {
15956 15960                          ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15957 15961                          ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15958 15962                          if (port_state & SATA_PSTATE_FAILED)
15959 15963                                  ap_state->ap_condition = AP_COND_FAILED;
15960 15964                          else
15961 15965                                  ap_state->ap_condition = AP_COND_UNKNOWN;
15962 15966  
15963 15967                          return;
15964 15968                  }
15965 15969          }
15966 15970  
15967 15971          /* Port is enabled and ready */
15968 15972          if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
15969 15973                  dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
15970 15974          else
15971 15975                  dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
15972 15976  
15973 15977          switch (dev_type) {
15974 15978          case SATA_DTYPE_NONE:
15975 15979          {
15976 15980                  ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15977 15981                  ap_state->ap_condition = AP_COND_OK;
15978 15982                  /* No device attached */
15979 15983                  ap_state->ap_rstate = AP_RSTATE_EMPTY;
15980 15984                  break;
15981 15985          }
15982 15986          case SATA_DTYPE_PMULT:
15983 15987          {
15984 15988                  /* Need to check port multiplier state */
15985 15989                  ASSERT(qual == SATA_ADDR_DCPORT);
15986 15990                  pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
15987 15991                      pmult_state;
15988 15992                  if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
15989 15993                          ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15990 15994                          ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15991 15995                          if (pmult_state & SATA_PSTATE_FAILED)
15992 15996                                  ap_state->ap_condition = AP_COND_FAILED;
15993 15997                          else
15994 15998                                  ap_state->ap_condition = AP_COND_UNKNOWN;
15995 15999  
15996 16000                          return;
15997 16001                  }
15998 16002  
15999 16003                  /* Port multiplier is not configurable */
16000 16004                  ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16001 16005                  ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16002 16006                  ap_state->ap_condition = AP_COND_OK;
16003 16007                  break;
16004 16008          }
16005 16009  
16006 16010          case SATA_DTYPE_ATADISK:
16007 16011          case SATA_DTYPE_ATAPICD:
16008 16012          case SATA_DTYPE_ATAPITAPE:
16009 16013          case SATA_DTYPE_ATAPIDISK:
16010 16014          {
16011 16015                  dev_info_t *tdip = NULL;
16012 16016                  dev_info_t *dip = NULL;
16013 16017                  int circ;
16014 16018  
16015 16019                  dip = SATA_DIP(sata_hba_inst);
16016 16020                  tdip = sata_get_target_dip(dip, cport, pmport);
16017 16021                  ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16018 16022                  if (tdip != NULL) {
16019 16023                          ndi_devi_enter(dip, &circ);
16020 16024                          mutex_enter(&(DEVI(tdip)->devi_lock));
16021 16025                          if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16022 16026                                  /*
16023 16027                                   * There could be the case where previously
16024 16028                                   * configured and opened device was removed
16025 16029                                   * and unknown device was plugged.
16026 16030                                   * In such case we want to show a device, and
16027 16031                                   * its configured or unconfigured state but
16028 16032                                   * indicate unusable condition untill the
16029 16033                                   * old target node is released and removed.
16030 16034                                   */
16031 16035                                  ap_state->ap_condition = AP_COND_UNUSABLE;
16032 16036                          } else {
16033 16037                                  mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16034 16038                                      cport));
16035 16039                                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16036 16040                                      cport);
16037 16041                                  if (sdinfo != NULL) {
16038 16042                                          if ((sdinfo->satadrv_state &
16039 16043                                              SATA_DSTATE_FAILED) != 0)
16040 16044                                                  ap_state->ap_condition =
16041 16045                                                      AP_COND_FAILED;
16042 16046                                          else
16043 16047                                                  ap_state->ap_condition =
16044 16048                                                      AP_COND_OK;
16045 16049                                  } else {
16046 16050                                          ap_state->ap_condition =
16047 16051                                              AP_COND_UNKNOWN;
16048 16052                                  }
16049 16053                                  mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16050 16054                                      cport));
16051 16055                          }
16052 16056                          if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16053 16057                              (DEVI_IS_DEVICE_DOWN(tdip))) {
16054 16058                                  ap_state->ap_ostate =
16055 16059                                      AP_OSTATE_UNCONFIGURED;
16056 16060                          } else {
16057 16061                                  ap_state->ap_ostate =
16058 16062                                      AP_OSTATE_CONFIGURED;
16059 16063                          }
16060 16064                          mutex_exit(&(DEVI(tdip)->devi_lock));
16061 16065                          ndi_devi_exit(dip, circ);
16062 16066                  } else {
16063 16067                          ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16064 16068                          ap_state->ap_condition = AP_COND_UNKNOWN;
16065 16069                  }
16066 16070                  break;
16067 16071          }
16068 16072          case SATA_DTYPE_ATAPIPROC:
16069 16073                  ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16070 16074                  ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16071 16075                  ap_state->ap_condition = AP_COND_OK;
16072 16076                  break;
16073 16077          default:
16074 16078                  ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16075 16079                  ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16076 16080                  ap_state->ap_condition = AP_COND_UNKNOWN;
16077 16081                  /*
16078 16082                   * This is actually internal error condition (non fatal),
16079 16083                   * because we have already checked all defined device types.
16080 16084                   */
16081 16085                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16082 16086                      "sata_cfgadm_state: Internal error: "
16083 16087                      "unknown device type"));
16084 16088                  break;
16085 16089          }
16086 16090  }
16087 16091  
16088 16092  
16089 16093  /*
16090 16094   * Process ioctl get device path request.
16091 16095   *
16092 16096   * NOTE: Port multiplier has no target dip. Devices connected to port
16093 16097   * multiplier have target node attached to the HBA node. The only difference
16094 16098   * between them and the directly-attached device node is a target address.
16095 16099   */
16096 16100  static int
16097 16101  sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
16098 16102      sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16099 16103  {
16100 16104          char path[MAXPATHLEN];
16101 16105          uint32_t size;
16102 16106          dev_info_t *tdip;
16103 16107  
16104 16108          (void) strcpy(path, "/devices");
16105 16109          if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16106 16110              &sata_device->satadev_addr)) == NULL) {
16107 16111                  /*
16108 16112                   * No such device. If this is a request for a size, do not
16109 16113                   * return EINVAL for non-existing target, because cfgadm
16110 16114                   * will then indicate a meaningless ioctl failure.
16111 16115                   * If this is a request for a path, indicate invalid
16112 16116                   * argument.
16113 16117                   */
16114 16118                  if (ioc->get_size == 0)
16115 16119                          return (EINVAL);
16116 16120          } else {
16117 16121                  (void) ddi_pathname(tdip, path + strlen(path));
16118 16122          }
16119 16123          size = strlen(path) + 1;
16120 16124  
16121 16125          if (ioc->get_size != 0) {
16122 16126                  if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
16123 16127                      mode) != 0)
16124 16128                          return (EFAULT);
16125 16129          } else {
16126 16130                  if (ioc->bufsiz != size)
16127 16131                          return (EINVAL);
16128 16132  
16129 16133                  else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
16130 16134                      mode) != 0)
16131 16135                          return (EFAULT);
16132 16136          }
16133 16137          return (0);
16134 16138  }
16135 16139  
16136 16140  /*
16137 16141   * Process ioctl get attachment point type request.
16138 16142   *
16139 16143   * NOTE: Port multiplier is supported.
16140 16144   */
16141 16145  static  int
16142 16146  sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
16143 16147      sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16144 16148  {
16145 16149          uint32_t        type_len;
16146 16150          const char      *ap_type;
16147 16151          int             dev_type;
16148 16152  
16149 16153          if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16150 16154                  dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
16151 16155                      sata_device->satadev_addr.cport);
16152 16156          else /* pmport */
16153 16157                  dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
16154 16158                      sata_device->satadev_addr.cport,
16155 16159                      sata_device->satadev_addr.pmport);
16156 16160  
16157 16161          switch (dev_type) {
16158 16162          case SATA_DTYPE_NONE:
16159 16163                  ap_type = "port";
16160 16164                  break;
16161 16165  
16162 16166          case SATA_DTYPE_ATADISK:
16163 16167          case SATA_DTYPE_ATAPIDISK:
16164 16168                  ap_type = "disk";
16165 16169                  break;
16166 16170  
16167 16171          case SATA_DTYPE_ATAPICD:
16168 16172                  ap_type = "cd/dvd";
16169 16173                  break;
16170 16174  
16171 16175          case SATA_DTYPE_ATAPITAPE:
16172 16176                  ap_type = "tape";
16173 16177                  break;
16174 16178  
16175 16179          case SATA_DTYPE_ATAPIPROC:
16176 16180                  ap_type = "processor";
16177 16181                  break;
16178 16182  
16179 16183          case SATA_DTYPE_PMULT:
16180 16184                  ap_type = "sata-pmult";
16181 16185                  break;
16182 16186  
16183 16187          case SATA_DTYPE_UNKNOWN:
16184 16188                  ap_type = "unknown";
16185 16189                  break;
16186 16190  
16187 16191          default:
16188 16192                  ap_type = "unsupported";
16189 16193                  break;
16190 16194  
16191 16195          } /* end of dev_type switch */
16192 16196  
16193 16197          type_len = strlen(ap_type) + 1;
16194 16198  
16195 16199          if (ioc->get_size) {
16196 16200                  if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
16197 16201                      mode) != 0)
16198 16202                          return (EFAULT);
16199 16203          } else {
16200 16204                  if (ioc->bufsiz != type_len)
16201 16205                          return (EINVAL);
16202 16206  
16203 16207                  if (ddi_copyout((void *)ap_type, ioc->buf,
16204 16208                      ioc->bufsiz, mode) != 0)
16205 16209                          return (EFAULT);
16206 16210          }
16207 16211          return (0);
16208 16212  
16209 16213  }
16210 16214  
16211 16215  /*
16212 16216   * Process ioctl get device model info request.
16213 16217   * This operation should return to cfgadm the device model
16214 16218   * information string
16215 16219   *
16216 16220   * NOTE: Port multiplier is supported.
16217 16221   */
16218 16222  static  int
16219 16223  sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
16220 16224      sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16221 16225  {
16222 16226          sata_drive_info_t *sdinfo;
16223 16227          uint32_t info_len;
16224 16228          char ap_info[SATA_ID_MODEL_LEN + 1];
16225 16229  
16226 16230          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16227 16231              sata_device->satadev_addr.cport)->cport_mutex);
16228 16232          if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16229 16233                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16230 16234                      sata_device->satadev_addr.cport);
16231 16235          else /* port multiplier */
16232 16236                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16233 16237                      sata_device->satadev_addr.cport,
16234 16238                      sata_device->satadev_addr.pmport);
16235 16239          if (sdinfo == NULL) {
16236 16240                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16237 16241                      sata_device->satadev_addr.cport)->cport_mutex);
16238 16242                  return (EINVAL);
16239 16243          }
16240 16244  
16241 16245  #ifdef  _LITTLE_ENDIAN
16242 16246          swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16243 16247  #else   /* _LITTLE_ENDIAN */
16244 16248          bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16245 16249  #endif  /* _LITTLE_ENDIAN */
16246 16250  
16247 16251          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16248 16252              sata_device->satadev_addr.cport)->cport_mutex);
16249 16253  
16250 16254          ap_info[SATA_ID_MODEL_LEN] = '\0';
16251 16255  
16252 16256          info_len = strlen(ap_info) + 1;
16253 16257  
16254 16258          if (ioc->get_size) {
16255 16259                  if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16256 16260                      mode) != 0)
16257 16261                          return (EFAULT);
16258 16262          } else {
16259 16263                  if (ioc->bufsiz < info_len)
16260 16264                          return (EINVAL);
16261 16265                  if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16262 16266                      mode) != 0)
16263 16267                          return (EFAULT);
16264 16268          }
16265 16269          return (0);
16266 16270  }
16267 16271  
16268 16272  
16269 16273  /*
16270 16274   * Process ioctl get device firmware revision info request.
16271 16275   * This operation should return to cfgadm the device firmware revision
16272 16276   * information string
16273 16277   *
16274 16278   * Port multiplier is supported.
16275 16279   */
16276 16280  static  int
16277 16281  sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
16278 16282      sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16279 16283  {
16280 16284          sata_drive_info_t *sdinfo;
16281 16285          uint32_t info_len;
16282 16286          char ap_info[SATA_ID_FW_LEN + 1];
16283 16287  
16284 16288          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16285 16289              sata_device->satadev_addr.cport)->cport_mutex);
16286 16290          if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16287 16291                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16288 16292                      sata_device->satadev_addr.cport);
16289 16293          else /* port multiplier */
16290 16294                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16291 16295                      sata_device->satadev_addr.cport,
16292 16296                      sata_device->satadev_addr.pmport);
16293 16297          if (sdinfo == NULL) {
16294 16298                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16295 16299                      sata_device->satadev_addr.cport)->cport_mutex);
16296 16300                  return (EINVAL);
16297 16301          }
16298 16302  
16299 16303  #ifdef  _LITTLE_ENDIAN
16300 16304          swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16301 16305  #else   /* _LITTLE_ENDIAN */
16302 16306          bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16303 16307  #endif  /* _LITTLE_ENDIAN */
16304 16308  
16305 16309          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16306 16310              sata_device->satadev_addr.cport)->cport_mutex);
16307 16311  
16308 16312          ap_info[SATA_ID_FW_LEN] = '\0';
16309 16313  
16310 16314          info_len = strlen(ap_info) + 1;
16311 16315  
16312 16316          if (ioc->get_size) {
16313 16317                  if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16314 16318                      mode) != 0)
16315 16319                          return (EFAULT);
16316 16320          } else {
16317 16321                  if (ioc->bufsiz < info_len)
16318 16322                          return (EINVAL);
16319 16323                  if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16320 16324                      mode) != 0)
16321 16325                          return (EFAULT);
16322 16326          }
16323 16327          return (0);
16324 16328  }
16325 16329  
16326 16330  
16327 16331  /*
16328 16332   * Process ioctl get device serial number info request.
16329 16333   * This operation should return to cfgadm the device serial number string.
16330 16334   *
16331 16335   * NOTE: Port multiplier is supported.
16332 16336   */
16333 16337  static  int
16334 16338  sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
16335 16339      sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16336 16340  {
16337 16341          sata_drive_info_t *sdinfo;
16338 16342          uint32_t info_len;
16339 16343          char ap_info[SATA_ID_SERIAL_LEN + 1];
16340 16344  
16341 16345          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16342 16346              sata_device->satadev_addr.cport)->cport_mutex);
16343 16347          if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16344 16348                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16345 16349                      sata_device->satadev_addr.cport);
16346 16350          else /* port multiplier */
16347 16351                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16348 16352                      sata_device->satadev_addr.cport,
16349 16353                      sata_device->satadev_addr.pmport);
16350 16354          if (sdinfo == NULL) {
16351 16355                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16352 16356                      sata_device->satadev_addr.cport)->cport_mutex);
16353 16357                  return (EINVAL);
16354 16358          }
16355 16359  
16356 16360  #ifdef  _LITTLE_ENDIAN
16357 16361          swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16358 16362  #else   /* _LITTLE_ENDIAN */
16359 16363          bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16360 16364  #endif  /* _LITTLE_ENDIAN */
16361 16365  
16362 16366          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16363 16367              sata_device->satadev_addr.cport)->cport_mutex);
16364 16368  
16365 16369          ap_info[SATA_ID_SERIAL_LEN] = '\0';
16366 16370  
16367 16371          info_len = strlen(ap_info) + 1;
16368 16372  
16369 16373          if (ioc->get_size) {
16370 16374                  if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16371 16375                      mode) != 0)
16372 16376                          return (EFAULT);
16373 16377          } else {
16374 16378                  if (ioc->bufsiz < info_len)
16375 16379                          return (EINVAL);
16376 16380                  if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16377 16381                      mode) != 0)
16378 16382                          return (EFAULT);
16379 16383          }
16380 16384          return (0);
16381 16385  }
16382 16386  
16383 16387  
16384 16388  /*
16385 16389   * Preset scsi extended sense data (to NO SENSE)
16386 16390   * First 18 bytes of the sense data are preset to current valid sense
16387 16391   * with a key NO SENSE data.
16388 16392   *
16389 16393   * Returns void
16390 16394   */
16391 16395  static void
16392 16396  sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
16393 16397  {
16394 16398          sense->es_valid = 1;            /* Valid sense */
16395 16399          sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
16396 16400          sense->es_key = KEY_NO_SENSE;
16397 16401          sense->es_info_1 = 0;
16398 16402          sense->es_info_2 = 0;
16399 16403          sense->es_info_3 = 0;
16400 16404          sense->es_info_4 = 0;
16401 16405          sense->es_add_len = 10; /* Additional length - replace with a def */
16402 16406          sense->es_cmd_info[0] = 0;
16403 16407          sense->es_cmd_info[1] = 0;
16404 16408          sense->es_cmd_info[2] = 0;
16405 16409          sense->es_cmd_info[3] = 0;
16406 16410          sense->es_add_code = 0;
16407 16411          sense->es_qual_code = 0;
16408 16412  }
16409 16413  
16410 16414  /*
16411 16415   * Register a legacy cmdk-style devid for the target (disk) device.
16412 16416   *
16413 16417   * Note: This function is called only when the HBA devinfo node has the
16414 16418   * property "use-cmdk-devid-format" set. This property indicates that
16415 16419   * devid compatible with old cmdk (target) driver is to be generated
16416 16420   * for any target device attached to this controller. This will take
16417 16421   * precedence over the devid generated by sd (target) driver.
16418 16422   * This function is derived from cmdk_devid_setup() function in cmdk.c.
16419 16423   */
16420 16424  static void
16421 16425  sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
16422 16426  {
16423 16427          char    *hwid;
16424 16428          int     modlen;
16425 16429          int     serlen;
16426 16430          int     rval;
16427 16431          ddi_devid_t     devid;
16428 16432  
16429 16433          /*
16430 16434           * device ID is a concatanation of model number, "=", serial number.
16431 16435           */
16432 16436          hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
16433 16437          bcopy(&sdinfo->satadrv_id.ai_model, hwid,
16434 16438              sizeof (sdinfo->satadrv_id.ai_model));
16435 16439          swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
16436 16440          modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
16437 16441          if (modlen == 0)
16438 16442                  goto err;
16439 16443          hwid[modlen++] = '=';
16440 16444          bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
16441 16445              sizeof (sdinfo->satadrv_id.ai_drvser));
16442 16446          swab(&hwid[modlen], &hwid[modlen],
16443 16447              sizeof (sdinfo->satadrv_id.ai_drvser));
16444 16448          serlen = sata_check_modser(&hwid[modlen],
16445 16449              sizeof (sdinfo->satadrv_id.ai_drvser));
16446 16450          if (serlen == 0)
16447 16451                  goto err;
16448 16452          hwid[modlen + serlen] = 0; /* terminate the hwid string */
16449 16453  
16450 16454          /* initialize/register devid */
16451 16455          if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
16452 16456              (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
16453 16457                  rval = ddi_devid_register(dip, devid);
16454 16458                  /*
16455 16459                   * Free up the allocated devid buffer.
16456 16460                   * NOTE: This doesn't mean unregistering devid.
16457 16461                   */
16458 16462                  ddi_devid_free(devid);
16459 16463          }
16460 16464  
16461 16465          if (rval != DDI_SUCCESS)
16462 16466                  cmn_err(CE_WARN, "sata: failed to create devid for the disk"
16463 16467                      " on port %d", sdinfo->satadrv_addr.cport);
16464 16468  err:
16465 16469          kmem_free(hwid, LEGACY_HWID_LEN);
16466 16470  }
16467 16471  
16468 16472  /*
16469 16473   * valid model/serial string must contain a non-zero non-space characters.
16470 16474   * trim trailing spaces/NULLs.
16471 16475   */
16472 16476  static int
16473 16477  sata_check_modser(char *buf, int buf_len)
16474 16478  {
16475 16479          boolean_t ret;
16476 16480          char *s;
16477 16481          int i;
16478 16482          int tb;
16479 16483          char ch;
16480 16484  
16481 16485          ret = B_FALSE;
16482 16486          s = buf;
16483 16487          for (i = 0; i < buf_len; i++) {
16484 16488                  ch = *s++;
16485 16489                  if (ch != ' ' && ch != '\0')
16486 16490                          tb = i + 1;
16487 16491                  if (ch != ' ' && ch != '\0' && ch != '0')
16488 16492                          ret = B_TRUE;
16489 16493          }
16490 16494  
16491 16495          if (ret == B_FALSE)
16492 16496                  return (0); /* invalid string */
16493 16497  
16494 16498          return (tb); /* return length */
16495 16499  }
16496 16500  
16497 16501  /*
16498 16502   * sata_set_drive_features function compares current device features setting
16499 16503   * with the saved device features settings and, if there is a difference,
16500 16504   * it restores device features setting to the previously saved state.
16501 16505   * It also arbitrarily tries to select the highest supported DMA mode.
16502 16506   * Device Identify or Identify Packet Device data has to be current.
16503 16507   * At the moment read ahead and write cache are considered for all devices.
16504 16508   * For atapi devices, Removable Media Status Notification is set in addition
16505 16509   * to common features.
16506 16510   *
16507 16511   * This function cannot be called in the interrupt context (it may sleep).
16508 16512   *
16509 16513   * The input argument sdinfo should point to the drive info structure
16510 16514   * to be updated after features are set. Note, that only
16511 16515   * device (packet) identify data is updated, not the flags indicating the
16512 16516   * supported features.
16513 16517   *
16514 16518   * Returns SATA_SUCCESS if successful or there was nothing to do.
16515 16519   * Device Identify data in the drive info structure pointed to by the sdinfo
16516 16520   * arguments is updated even when no features were set or changed.
16517 16521   *
16518 16522   * Returns SATA_FAILURE if device features could not be set or DMA mode
16519 16523   * for a disk cannot be set and device identify data cannot be fetched.
16520 16524   *
16521 16525   * Returns SATA_RETRY if device features could not be set (other than disk
16522 16526   * DMA mode) but the device identify data was fetched successfully.
16523 16527   *
16524 16528   * Note: This function may fail the port, making it inaccessible.
16525 16529   * In such case the explicit port disconnect/connect or physical device
16526 16530   * detach/attach is required to re-evaluate port state again.
16527 16531   */
16528 16532  
16529 16533  static int
16530 16534  sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
16531 16535      sata_drive_info_t *sdinfo, int restore)
16532 16536  {
16533 16537          int rval = SATA_SUCCESS;
16534 16538          int rval_set;
16535 16539          sata_drive_info_t new_sdinfo;
16536 16540          char *finfo = "sata_set_drive_features: cannot";
16537 16541          char *finfox;
16538 16542          int cache_op;
16539 16543  
16540 16544          bzero(&new_sdinfo, sizeof (sata_drive_info_t));
16541 16545          new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
16542 16546          new_sdinfo.satadrv_type = sdinfo->satadrv_type;
16543 16547          if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16544 16548                  /*
16545 16549                   * Cannot get device identification - caller may retry later
16546 16550                   */
16547 16551                  SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16548 16552                      "%s fetch device identify data\n", finfo);
16549 16553                  return (SATA_FAILURE);
16550 16554          }
16551 16555          finfox = (restore != 0) ? " restore device features" :
16552 16556              " initialize device features\n";
16553 16557  
16554 16558          switch (sdinfo->satadrv_type) {
16555 16559          case SATA_DTYPE_ATADISK:
16556 16560                  /* Arbitrarily set UDMA mode */
16557 16561                  if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16558 16562                      SATA_SUCCESS) {
16559 16563                          SATA_LOG_D((sata_hba_inst, CE_WARN,
16560 16564                              "%s set UDMA mode\n", finfo));
16561 16565                          return (SATA_FAILURE);
16562 16566                  }
16563 16567                  break;
16564 16568          case SATA_DTYPE_ATAPICD:
16565 16569          case SATA_DTYPE_ATAPITAPE:
16566 16570          case SATA_DTYPE_ATAPIDISK:
16567 16571                  /*  Set Removable Media Status Notification, if necessary */
16568 16572                  if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
16569 16573                      restore != 0) {
16570 16574                          if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
16571 16575                              (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
16572 16576                              ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
16573 16577                              SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
16574 16578                                  /* Current setting does not match saved one */
16575 16579                                  if (sata_set_rmsn(sata_hba_inst, sdinfo,
16576 16580                                      sdinfo->satadrv_settings &
16577 16581                                      SATA_DEV_RMSN) != SATA_SUCCESS)
16578 16582                                          rval = SATA_FAILURE;
16579 16583                          }
16580 16584                  }
16581 16585                  /*
16582 16586                   * We have to set Multiword DMA or UDMA, if it is supported, as
16583 16587                   * we want to use DMA transfer mode whenever possible.
16584 16588                   * Some devices require explicit setting of the DMA mode.
16585 16589                   */
16586 16590                  if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
16587 16591                          /* Set highest supported DMA mode */
16588 16592                          if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16589 16593                              SATA_SUCCESS) {
16590 16594                                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16591 16595                                      "%s set UDMA mode\n", finfo));
16592 16596                                  rval = SATA_FAILURE;
16593 16597                          }
16594 16598                  }
16595 16599                  break;
16596 16600          }
16597 16601  
16598 16602          if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
16599 16603              !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16600 16604                  /*
16601 16605                   * neither READ AHEAD nor WRITE CACHE is supported
16602 16606                   * - do nothing
16603 16607                   */
16604 16608                  SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16605 16609                      "settable features not supported\n", NULL);
16606 16610                  goto update_sdinfo;
16607 16611          }
16608 16612  
16609 16613          if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
16610 16614              (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
16611 16615              (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
16612 16616              (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
16613 16617                  /*
16614 16618                   * both READ AHEAD and WRITE CACHE are enabled
16615 16619                   * - Nothing to do
16616 16620                   */
16617 16621                  SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16618 16622                      "no device features to set\n", NULL);
16619 16623                  goto update_sdinfo;
16620 16624          }
16621 16625  
16622 16626          cache_op = 0;
16623 16627  
16624 16628          if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
16625 16629                  if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16626 16630                      !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16627 16631                          /* Enable read ahead / read cache */
16628 16632                          cache_op = SATAC_SF_ENABLE_READ_AHEAD;
16629 16633                          SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16630 16634                              "enabling read cache\n", NULL);
16631 16635                  } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16632 16636                      SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16633 16637                          /* Disable read ahead  / read cache */
16634 16638                          cache_op = SATAC_SF_DISABLE_READ_AHEAD;
16635 16639                          SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16636 16640                              "disabling read cache\n", NULL);
16637 16641                  }
16638 16642  
16639 16643                  if (cache_op != 0) {
16640 16644                          /* Try to set read cache mode */
16641 16645                          rval_set = sata_set_cache_mode(sata_hba_inst,
16642 16646                              &new_sdinfo, cache_op);
16643 16647                          if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16644 16648                                  rval = rval_set;
16645 16649                  }
16646 16650          }
16647 16651  
16648 16652          cache_op = 0;
16649 16653  
16650 16654          if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16651 16655                  if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16652 16656                      !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16653 16657                          /* Enable write cache */
16654 16658                          cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
16655 16659                          SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16656 16660                              "enabling write cache\n", NULL);
16657 16661                  } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16658 16662                      SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16659 16663                          /* Disable write cache */
16660 16664                          cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
16661 16665                          SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16662 16666                              "disabling write cache\n", NULL);
16663 16667                  }
16664 16668  
16665 16669                  if (cache_op != 0) {
16666 16670                          /* Try to set write cache mode */
16667 16671                          rval_set = sata_set_cache_mode(sata_hba_inst,
16668 16672                              &new_sdinfo, cache_op);
16669 16673                          if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16670 16674                                  rval = rval_set;
16671 16675                  }
16672 16676          }
16673 16677          if (rval != SATA_SUCCESS)
16674 16678                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16675 16679                      "%s %s", finfo, finfox));
16676 16680  
16677 16681  update_sdinfo:
16678 16682          /*
16679 16683           * We need to fetch Device Identify data again
16680 16684           */
16681 16685          if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16682 16686                  /*
16683 16687                   * Cannot get device identification - retry later
16684 16688                   */
16685 16689                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16686 16690                      "%s re-fetch device identify data\n", finfo));
16687 16691                  rval = SATA_FAILURE;
16688 16692          }
16689 16693          /* Copy device sata info. */
16690 16694          sdinfo->satadrv_id = new_sdinfo.satadrv_id;
16691 16695  
16692 16696          return (rval);
16693 16697  }
16694 16698  
16695 16699  
16696 16700  /*
16697 16701   *
16698 16702   * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
16699 16703   * unable to determine.
16700 16704   *
16701 16705   * Cannot be called in an interrupt context.
16702 16706   *
16703 16707   * Called by sata_build_lsense_page_2f()
16704 16708   */
16705 16709  
16706 16710  static int
16707 16711  sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
16708 16712      sata_drive_info_t *sdinfo)
16709 16713  {
16710 16714          sata_pkt_t *spkt;
16711 16715          sata_cmd_t *scmd;
16712 16716          sata_pkt_txlate_t *spx;
16713 16717          int rval;
16714 16718  
16715 16719          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16716 16720          spx->txlt_sata_hba_inst = sata_hba_inst;
16717 16721          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
16718 16722          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16719 16723          if (spkt == NULL) {
16720 16724                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
16721 16725                  return (-1);
16722 16726          }
16723 16727          /* address is needed now */
16724 16728          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16725 16729  
16726 16730  
16727 16731          /* Fill sata_pkt */
16728 16732          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16729 16733          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16730 16734          /* Synchronous mode, no callback */
16731 16735          spkt->satapkt_comp = NULL;
16732 16736          /* Timeout 30s */
16733 16737          spkt->satapkt_time = sata_default_pkt_time;
16734 16738  
16735 16739          scmd = &spkt->satapkt_cmd;
16736 16740          scmd->satacmd_flags.sata_special_regs = B_TRUE;
16737 16741          scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
16738 16742  
16739 16743          /* Set up which registers need to be returned */
16740 16744          scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
16741 16745          scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
16742 16746  
16743 16747          /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
16744 16748          scmd->satacmd_addr_type = 0;            /* N/A */
16745 16749          scmd->satacmd_sec_count_lsb = 0;        /* N/A */
16746 16750          scmd->satacmd_lba_low_lsb = 0;          /* N/A */
16747 16751          scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16748 16752          scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16749 16753          scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
16750 16754          scmd->satacmd_device_reg = 0;           /* Always device 0 */
16751 16755          scmd->satacmd_cmd_reg = SATAC_SMART;
16752 16756          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16753 16757              sdinfo->satadrv_addr.cport)));
16754 16758  
16755 16759  
16756 16760          /* Send pkt to SATA HBA driver */
16757 16761          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16758 16762              SATA_TRAN_ACCEPTED ||
16759 16763              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16760 16764                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16761 16765                      sdinfo->satadrv_addr.cport)));
16762 16766                  /*
16763 16767                   * Whoops, no SMART RETURN STATUS
16764 16768                   */
16765 16769                  rval = -1;
16766 16770          } else {
16767 16771                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16768 16772                      sdinfo->satadrv_addr.cport)));
16769 16773                  if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
16770 16774                          rval = -1;
16771 16775                          goto fail;
16772 16776                  }
16773 16777                  if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
16774 16778                          rval = -1;
16775 16779                          goto fail;
16776 16780                  }
16777 16781                  if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
16778 16782                      (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
16779 16783                          rval = 0;
16780 16784                  else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
16781 16785                      (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
16782 16786                          rval = 1;
16783 16787                  else {
16784 16788                          rval = -1;
16785 16789                          goto fail;
16786 16790                  }
16787 16791          }
16788 16792  fail:
16789 16793          /* Free allocated resources */
16790 16794          sata_pkt_free(spx);
16791 16795          kmem_free(spx, sizeof (sata_pkt_txlate_t));
16792 16796  
16793 16797          return (rval);
16794 16798  }
16795 16799  
16796 16800  /*
16797 16801   *
16798 16802   * Returns 0 if succeeded, -1 otherwise
16799 16803   *
16800 16804   * Cannot be called in an interrupt context.
16801 16805   *
16802 16806   */
16803 16807  static int
16804 16808  sata_fetch_smart_data(
16805 16809          sata_hba_inst_t *sata_hba_inst,
16806 16810          sata_drive_info_t *sdinfo,
16807 16811          struct smart_data *smart_data)
16808 16812  {
16809 16813          sata_pkt_t *spkt;
16810 16814          sata_cmd_t *scmd;
16811 16815          sata_pkt_txlate_t *spx;
16812 16816          int rval;
16813 16817          dev_info_t *dip = SATA_DIP(sata_hba_inst);
16814 16818  
16815 16819  #if ! defined(lint)
16816 16820          ASSERT(sizeof (struct smart_data) == 512);
16817 16821  #endif
16818 16822  
16819 16823          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16820 16824          spx->txlt_sata_hba_inst = sata_hba_inst;
16821 16825          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
16822 16826          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16823 16827          if (spkt == NULL) {
16824 16828                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
16825 16829                  return (-1);
16826 16830          }
16827 16831          /* address is needed now */
16828 16832          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16829 16833  
16830 16834  
16831 16835          /* Fill sata_pkt */
16832 16836          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16833 16837          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16834 16838          /* Synchronous mode, no callback */
16835 16839          spkt->satapkt_comp = NULL;
16836 16840          /* Timeout 30s */
16837 16841          spkt->satapkt_time = sata_default_pkt_time;
16838 16842  
16839 16843          scmd = &spkt->satapkt_cmd;
16840 16844          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16841 16845  
16842 16846          /*
16843 16847           * Allocate buffer for SMART data
16844 16848           */
16845 16849          scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16846 16850              sizeof (struct smart_data));
16847 16851          if (scmd->satacmd_bp == NULL) {
16848 16852                  sata_pkt_free(spx);
16849 16853                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
16850 16854                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16851 16855                      "sata_fetch_smart_data: "
16852 16856                      "cannot allocate buffer"));
16853 16857                  return (-1);
16854 16858          }
16855 16859  
16856 16860  
16857 16861          /* Build SMART_READ_DATA cmd in the sata_pkt */
16858 16862          scmd->satacmd_addr_type = 0;            /* N/A */
16859 16863          scmd->satacmd_sec_count_lsb = 0;        /* N/A */
16860 16864          scmd->satacmd_lba_low_lsb = 0;          /* N/A */
16861 16865          scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16862 16866          scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16863 16867          scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
16864 16868          scmd->satacmd_device_reg = 0;           /* Always device 0 */
16865 16869          scmd->satacmd_cmd_reg = SATAC_SMART;
16866 16870          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16867 16871              sdinfo->satadrv_addr.cport)));
16868 16872  
16869 16873          /* Send pkt to SATA HBA driver */
16870 16874          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16871 16875              SATA_TRAN_ACCEPTED ||
16872 16876              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16873 16877                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16874 16878                      sdinfo->satadrv_addr.cport)));
16875 16879                  /*
16876 16880                   * Whoops, no SMART DATA available
16877 16881                   */
16878 16882                  rval = -1;
16879 16883                  goto fail;
16880 16884          } else {
16881 16885                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16882 16886                      sdinfo->satadrv_addr.cport)));
16883 16887                  if (spx->txlt_buf_dma_handle != NULL) {
16884 16888                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
16885 16889                              DDI_DMA_SYNC_FORKERNEL);
16886 16890                          ASSERT(rval == DDI_SUCCESS);
16887 16891                          if (sata_check_for_dma_error(dip, spx)) {
16888 16892                                  ddi_fm_service_impact(dip,
16889 16893                                      DDI_SERVICE_UNAFFECTED);
16890 16894                                  rval = -1;
16891 16895                                  goto fail;
16892 16896                          }
16893 16897                  }
16894 16898                  bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
16895 16899                      sizeof (struct smart_data));
16896 16900          }
16897 16901  
16898 16902  fail:
16899 16903          /* Free allocated resources */
16900 16904          sata_free_local_buffer(spx);
16901 16905          sata_pkt_free(spx);
16902 16906          kmem_free(spx, sizeof (sata_pkt_txlate_t));
16903 16907  
16904 16908          return (rval);
16905 16909  }
16906 16910  
16907 16911  /*
16908 16912   * Used by LOG SENSE page 0x10
16909 16913   * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
16910 16914   * Note: cannot be called in the interrupt context.
16911 16915   *
16912 16916   * return 0 for success, -1 otherwise
16913 16917   *
16914 16918   */
16915 16919  static int
16916 16920  sata_ext_smart_selftest_read_log(
16917 16921          sata_hba_inst_t *sata_hba_inst,
16918 16922          sata_drive_info_t *sdinfo,
16919 16923          struct smart_ext_selftest_log *ext_selftest_log,
16920 16924          uint16_t block_num)
16921 16925  {
16922 16926          sata_pkt_txlate_t *spx;
16923 16927          sata_pkt_t *spkt;
16924 16928          sata_cmd_t *scmd;
16925 16929          int rval;
16926 16930          dev_info_t *dip = SATA_DIP(sata_hba_inst);
16927 16931  
16928 16932  #if ! defined(lint)
16929 16933          ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
16930 16934  #endif
16931 16935  
16932 16936          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16933 16937          spx->txlt_sata_hba_inst = sata_hba_inst;
16934 16938          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
16935 16939          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16936 16940          if (spkt == NULL) {
16937 16941                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
16938 16942                  return (-1);
16939 16943          }
16940 16944          /* address is needed now */
16941 16945          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16942 16946  
16943 16947  
16944 16948          /* Fill sata_pkt */
16945 16949          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16946 16950          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16947 16951          /* Synchronous mode, no callback */
16948 16952          spkt->satapkt_comp = NULL;
16949 16953          /* Timeout 30s */
16950 16954          spkt->satapkt_time = sata_default_pkt_time;
16951 16955  
16952 16956          scmd = &spkt->satapkt_cmd;
16953 16957          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16954 16958  
16955 16959          /*
16956 16960           * Allocate buffer for SMART extended self-test log
16957 16961           */
16958 16962          scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16959 16963              sizeof (struct smart_ext_selftest_log));
16960 16964          if (scmd->satacmd_bp == NULL) {
16961 16965                  sata_pkt_free(spx);
16962 16966                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
16963 16967                  SATA_LOG_D((sata_hba_inst, CE_WARN,
16964 16968                      "sata_ext_smart_selftest_log: "
16965 16969                      "cannot allocate buffer"));
16966 16970                  return (-1);
16967 16971          }
16968 16972  
16969 16973          /* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
16970 16974          scmd->satacmd_addr_type = ATA_ADDR_LBA48;
16971 16975          scmd->satacmd_sec_count_lsb = 1;        /* One sector of selftest log */
16972 16976          scmd->satacmd_sec_count_msb = 0;        /* One sector of selftest log */
16973 16977          scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
16974 16978          scmd->satacmd_lba_low_msb = 0;
16975 16979          scmd->satacmd_lba_mid_lsb = block_num & 0xff;
16976 16980          scmd->satacmd_lba_mid_msb = block_num >> 8;
16977 16981          scmd->satacmd_device_reg = 0;           /* Always device 0 */
16978 16982          scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
16979 16983  
16980 16984          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16981 16985              sdinfo->satadrv_addr.cport)));
16982 16986  
16983 16987          /* Send pkt to SATA HBA driver */
16984 16988          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16985 16989              SATA_TRAN_ACCEPTED ||
16986 16990              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16987 16991                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16988 16992                      sdinfo->satadrv_addr.cport)));
16989 16993  
16990 16994                  /*
16991 16995                   * Whoops, no SMART selftest log info available
16992 16996                   */
16993 16997                  rval = -1;
16994 16998                  goto fail;
16995 16999          } else {
16996 17000                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16997 17001                      sdinfo->satadrv_addr.cport)));
16998 17002  
16999 17003                  if (spx->txlt_buf_dma_handle != NULL) {
17000 17004                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17001 17005                              DDI_DMA_SYNC_FORKERNEL);
17002 17006                          ASSERT(rval == DDI_SUCCESS);
17003 17007                          if (sata_check_for_dma_error(dip, spx)) {
17004 17008                                  ddi_fm_service_impact(dip,
17005 17009                                      DDI_SERVICE_UNAFFECTED);
17006 17010                                  rval = -1;
17007 17011                                  goto fail;
17008 17012                          }
17009 17013                  }
17010 17014                  bcopy(scmd->satacmd_bp->b_un.b_addr,
17011 17015                      (uint8_t *)ext_selftest_log,
17012 17016                      sizeof (struct smart_ext_selftest_log));
17013 17017                  rval = 0;
17014 17018          }
17015 17019  
17016 17020  fail:
17017 17021          /* Free allocated resources */
17018 17022          sata_free_local_buffer(spx);
17019 17023          sata_pkt_free(spx);
17020 17024          kmem_free(spx, sizeof (sata_pkt_txlate_t));
17021 17025  
17022 17026          return (rval);
17023 17027  }
17024 17028  
17025 17029  /*
17026 17030   * Returns 0 for success, -1 otherwise
17027 17031   *
17028 17032   * SMART self-test log data is returned in buffer pointed to by selftest_log
17029 17033   */
17030 17034  static int
17031 17035  sata_smart_selftest_log(
17032 17036          sata_hba_inst_t *sata_hba_inst,
17033 17037          sata_drive_info_t *sdinfo,
17034 17038          struct smart_selftest_log *selftest_log)
17035 17039  {
17036 17040          sata_pkt_t *spkt;
17037 17041          sata_cmd_t *scmd;
17038 17042          sata_pkt_txlate_t *spx;
17039 17043          int rval;
17040 17044          dev_info_t *dip = SATA_DIP(sata_hba_inst);
17041 17045  
17042 17046  #if ! defined(lint)
17043 17047          ASSERT(sizeof (struct smart_selftest_log) == 512);
17044 17048  #endif
17045 17049  
17046 17050          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17047 17051          spx->txlt_sata_hba_inst = sata_hba_inst;
17048 17052          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
17049 17053          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17050 17054          if (spkt == NULL) {
17051 17055                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17052 17056                  return (-1);
17053 17057          }
17054 17058          /* address is needed now */
17055 17059          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17056 17060  
17057 17061  
17058 17062          /* Fill sata_pkt */
17059 17063          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17060 17064          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17061 17065          /* Synchronous mode, no callback */
17062 17066          spkt->satapkt_comp = NULL;
17063 17067          /* Timeout 30s */
17064 17068          spkt->satapkt_time = sata_default_pkt_time;
17065 17069  
17066 17070          scmd = &spkt->satapkt_cmd;
17067 17071          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17068 17072  
17069 17073          /*
17070 17074           * Allocate buffer for SMART SELFTEST LOG
17071 17075           */
17072 17076          scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17073 17077              sizeof (struct smart_selftest_log));
17074 17078          if (scmd->satacmd_bp == NULL) {
17075 17079                  sata_pkt_free(spx);
17076 17080                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17077 17081                  SATA_LOG_D((sata_hba_inst, CE_WARN,
17078 17082                      "sata_smart_selftest_log: "
17079 17083                      "cannot allocate buffer"));
17080 17084                  return (-1);
17081 17085          }
17082 17086  
17083 17087          /* Build SMART_READ_LOG cmd in the sata_pkt */
17084 17088          scmd->satacmd_addr_type = 0;            /* N/A */
17085 17089          scmd->satacmd_sec_count_lsb = 1;        /* One sector of SMART log */
17086 17090          scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
17087 17091          scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17088 17092          scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17089 17093          scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17090 17094          scmd->satacmd_device_reg = 0;           /* Always device 0 */
17091 17095          scmd->satacmd_cmd_reg = SATAC_SMART;
17092 17096          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17093 17097              sdinfo->satadrv_addr.cport)));
17094 17098  
17095 17099          /* Send pkt to SATA HBA driver */
17096 17100          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17097 17101              SATA_TRAN_ACCEPTED ||
17098 17102              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17099 17103                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17100 17104                      sdinfo->satadrv_addr.cport)));
17101 17105                  /*
17102 17106                   * Whoops, no SMART DATA available
17103 17107                   */
17104 17108                  rval = -1;
17105 17109                  goto fail;
17106 17110          } else {
17107 17111                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17108 17112                      sdinfo->satadrv_addr.cport)));
17109 17113                  if (spx->txlt_buf_dma_handle != NULL) {
17110 17114                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17111 17115                              DDI_DMA_SYNC_FORKERNEL);
17112 17116                          ASSERT(rval == DDI_SUCCESS);
17113 17117                          if (sata_check_for_dma_error(dip, spx)) {
17114 17118                                  ddi_fm_service_impact(dip,
17115 17119                                      DDI_SERVICE_UNAFFECTED);
17116 17120                                  rval = -1;
17117 17121                                  goto fail;
17118 17122                          }
17119 17123                  }
17120 17124                  bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
17121 17125                      sizeof (struct smart_selftest_log));
17122 17126                  rval = 0;
17123 17127          }
17124 17128  
17125 17129  fail:
17126 17130          /* Free allocated resources */
17127 17131          sata_free_local_buffer(spx);
17128 17132          sata_pkt_free(spx);
17129 17133          kmem_free(spx, sizeof (sata_pkt_txlate_t));
17130 17134  
17131 17135          return (rval);
17132 17136  }
17133 17137  
17134 17138  
17135 17139  /*
17136 17140   * Returns 0 for success, -1 otherwise
17137 17141   *
17138 17142   * SMART READ LOG data is returned in buffer pointed to by smart_log
17139 17143   */
17140 17144  static int
17141 17145  sata_smart_read_log(
17142 17146          sata_hba_inst_t *sata_hba_inst,
17143 17147          sata_drive_info_t *sdinfo,
17144 17148          uint8_t *smart_log,             /* where the data should be returned */
17145 17149          uint8_t which_log,              /* which log should be returned */
17146 17150          uint8_t log_size)               /* # of 512 bytes in log */
17147 17151  {
17148 17152          sata_pkt_t *spkt;
17149 17153          sata_cmd_t *scmd;
17150 17154          sata_pkt_txlate_t *spx;
17151 17155          int rval;
17152 17156          dev_info_t *dip = SATA_DIP(sata_hba_inst);
17153 17157  
17154 17158          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17155 17159          spx->txlt_sata_hba_inst = sata_hba_inst;
17156 17160          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
17157 17161          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17158 17162          if (spkt == NULL) {
17159 17163                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17160 17164                  return (-1);
17161 17165          }
17162 17166          /* address is needed now */
17163 17167          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17164 17168  
17165 17169  
17166 17170          /* Fill sata_pkt */
17167 17171          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17168 17172          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17169 17173          /* Synchronous mode, no callback */
17170 17174          spkt->satapkt_comp = NULL;
17171 17175          /* Timeout 30s */
17172 17176          spkt->satapkt_time = sata_default_pkt_time;
17173 17177  
17174 17178          scmd = &spkt->satapkt_cmd;
17175 17179          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17176 17180  
17177 17181          /*
17178 17182           * Allocate buffer for SMART READ LOG
17179 17183           */
17180 17184          scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
17181 17185          if (scmd->satacmd_bp == NULL) {
17182 17186                  sata_pkt_free(spx);
17183 17187                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17184 17188                  SATA_LOG_D((sata_hba_inst, CE_WARN,
17185 17189                      "sata_smart_read_log: " "cannot allocate buffer"));
17186 17190                  return (-1);
17187 17191          }
17188 17192  
17189 17193          /* Build SMART_READ_LOG cmd in the sata_pkt */
17190 17194          scmd->satacmd_addr_type = 0;            /* N/A */
17191 17195          scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
17192 17196          scmd->satacmd_lba_low_lsb = which_log;  /* which log page */
17193 17197          scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17194 17198          scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17195 17199          scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17196 17200          scmd->satacmd_device_reg = 0;           /* Always device 0 */
17197 17201          scmd->satacmd_cmd_reg = SATAC_SMART;
17198 17202  
17199 17203          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17200 17204              sdinfo->satadrv_addr.cport)));
17201 17205  
17202 17206          /* Send pkt to SATA HBA driver */
17203 17207          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17204 17208              SATA_TRAN_ACCEPTED ||
17205 17209              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17206 17210                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17207 17211                      sdinfo->satadrv_addr.cport)));
17208 17212  
17209 17213                  /*
17210 17214                   * Whoops, no SMART DATA available
17211 17215                   */
17212 17216                  rval = -1;
17213 17217                  goto fail;
17214 17218          } else {
17215 17219                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17216 17220                      sdinfo->satadrv_addr.cport)));
17217 17221  
17218 17222                  if (spx->txlt_buf_dma_handle != NULL) {
17219 17223                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17220 17224                              DDI_DMA_SYNC_FORKERNEL);
17221 17225                          ASSERT(rval == DDI_SUCCESS);
17222 17226                          if (sata_check_for_dma_error(dip, spx)) {
17223 17227                                  ddi_fm_service_impact(dip,
17224 17228                                      DDI_SERVICE_UNAFFECTED);
17225 17229                                  rval = -1;
17226 17230                                  goto fail;
17227 17231                          }
17228 17232                  }
17229 17233                  bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
17230 17234                  rval = 0;
17231 17235          }
17232 17236  
17233 17237  fail:
17234 17238          /* Free allocated resources */
17235 17239          sata_free_local_buffer(spx);
17236 17240          sata_pkt_free(spx);
17237 17241          kmem_free(spx, sizeof (sata_pkt_txlate_t));
17238 17242  
17239 17243          return (rval);
17240 17244  }
17241 17245  
17242 17246  /*
17243 17247   * Used by LOG SENSE page 0x10
17244 17248   *
17245 17249   * return 0 for success, -1 otherwise
17246 17250   *
17247 17251   */
17248 17252  static int
17249 17253  sata_read_log_ext_directory(
17250 17254          sata_hba_inst_t *sata_hba_inst,
17251 17255          sata_drive_info_t *sdinfo,
17252 17256          struct read_log_ext_directory *logdir)
17253 17257  {
17254 17258          sata_pkt_txlate_t *spx;
17255 17259          sata_pkt_t *spkt;
17256 17260          sata_cmd_t *scmd;
17257 17261          int rval;
17258 17262          dev_info_t *dip = SATA_DIP(sata_hba_inst);
17259 17263  
17260 17264  #if ! defined(lint)
17261 17265          ASSERT(sizeof (struct read_log_ext_directory) == 512);
17262 17266  #endif
17263 17267  
17264 17268          spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17265 17269          spx->txlt_sata_hba_inst = sata_hba_inst;
17266 17270          spx->txlt_scsi_pkt = NULL;              /* No scsi pkt involved */
17267 17271          spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17268 17272          if (spkt == NULL) {
17269 17273                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17270 17274                  return (-1);
17271 17275          }
17272 17276  
17273 17277          /* Fill sata_pkt */
17274 17278          spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17275 17279          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17276 17280          /* Synchronous mode, no callback */
17277 17281          spkt->satapkt_comp = NULL;
17278 17282          /* Timeout 30s */
17279 17283          spkt->satapkt_time = sata_default_pkt_time;
17280 17284  
17281 17285          scmd = &spkt->satapkt_cmd;
17282 17286          scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17283 17287  
17284 17288          /*
17285 17289           * Allocate buffer for SMART READ LOG EXTENDED command
17286 17290           */
17287 17291          scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17288 17292              sizeof (struct read_log_ext_directory));
17289 17293          if (scmd->satacmd_bp == NULL) {
17290 17294                  sata_pkt_free(spx);
17291 17295                  kmem_free(spx, sizeof (sata_pkt_txlate_t));
17292 17296                  SATA_LOG_D((sata_hba_inst, CE_WARN,
17293 17297                      "sata_read_log_ext_directory: "
17294 17298                      "cannot allocate buffer"));
17295 17299                  return (-1);
17296 17300          }
17297 17301  
17298 17302          /* Build READ LOG EXT w/ log directory cmd in the  sata_pkt */
17299 17303          scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17300 17304          scmd->satacmd_sec_count_lsb = 1;        /* One sector of directory */
17301 17305          scmd->satacmd_sec_count_msb = 0;        /* One sector of directory */
17302 17306          scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
17303 17307          scmd->satacmd_lba_low_msb = 0;
17304 17308          scmd->satacmd_lba_mid_lsb = 0;
17305 17309          scmd->satacmd_lba_mid_msb = 0;
17306 17310          scmd->satacmd_device_reg = 0;           /* Always device 0 */
17307 17311          scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17308 17312  
17309 17313          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17310 17314              sdinfo->satadrv_addr.cport)));
17311 17315  
17312 17316          /* Send pkt to SATA HBA driver */
17313 17317          if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17314 17318              SATA_TRAN_ACCEPTED ||
17315 17319              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17316 17320                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17317 17321                      sdinfo->satadrv_addr.cport)));
17318 17322                  /*
17319 17323                   * Whoops, no SMART selftest log info available
17320 17324                   */
17321 17325                  rval = -1;
17322 17326                  goto fail;
17323 17327          } else {
17324 17328                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17325 17329                      sdinfo->satadrv_addr.cport)));
17326 17330                  if (spx->txlt_buf_dma_handle != NULL) {
17327 17331                          rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17328 17332                              DDI_DMA_SYNC_FORKERNEL);
17329 17333                          ASSERT(rval == DDI_SUCCESS);
17330 17334                          if (sata_check_for_dma_error(dip, spx)) {
17331 17335                                  ddi_fm_service_impact(dip,
17332 17336                                      DDI_SERVICE_UNAFFECTED);
17333 17337                                  rval = -1;
17334 17338                                  goto fail;
17335 17339                          }
17336 17340                  }
17337 17341                  bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
17338 17342                      sizeof (struct read_log_ext_directory));
17339 17343                  rval = 0;
17340 17344          }
17341 17345  
17342 17346  fail:
17343 17347          /* Free allocated resources */
17344 17348          sata_free_local_buffer(spx);
17345 17349          sata_pkt_free(spx);
17346 17350          kmem_free(spx, sizeof (sata_pkt_txlate_t));
17347 17351  
17348 17352          return (rval);
17349 17353  }
17350 17354  
17351 17355  /*
17352 17356   * Set up error retrieval sata command for NCQ command error data
17353 17357   * recovery.
17354 17358   *
17355 17359   * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
17356 17360   * returns SATA_FAILURE otherwise.
17357 17361   */
17358 17362  static int
17359 17363  sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
17360 17364  {
17361 17365  #ifndef __lock_lint
17362 17366          _NOTE(ARGUNUSED(sdinfo))
17363 17367  #endif
17364 17368  
17365 17369          sata_pkt_t *spkt = spx->txlt_sata_pkt;
17366 17370          sata_cmd_t *scmd;
17367 17371          struct buf *bp;
17368 17372  
17369 17373          /* Operation modes are up to the caller */
17370 17374          spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17371 17375  
17372 17376          /* Synchronous mode, no callback - may be changed by the caller */
17373 17377          spkt->satapkt_comp = NULL;
17374 17378          spkt->satapkt_time = sata_default_pkt_time;
17375 17379  
17376 17380          scmd = &spkt->satapkt_cmd;
17377 17381          bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
17378 17382          scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
17379 17383  
17380 17384          /*
17381 17385           * Allocate dma_able buffer error data.
17382 17386           * Buffer allocation will take care of buffer alignment and other DMA
17383 17387           * attributes.
17384 17388           */
17385 17389          bp = sata_alloc_local_buffer(spx,
17386 17390              sizeof (struct sata_ncq_error_recovery_page));
17387 17391          if (bp == NULL)
17388 17392                  return (SATA_FAILURE);
17389 17393  
17390 17394          bp_mapin(bp); /* make data buffer accessible */
17391 17395          scmd->satacmd_bp = bp;
17392 17396  
17393 17397          /*
17394 17398           * Set-up pointer to the buffer handle, so HBA can sync buffer
17395 17399           * before accessing it. Handle is in usual place in translate struct.
17396 17400           */
17397 17401          scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
17398 17402  
17399 17403          ASSERT(scmd->satacmd_num_dma_cookies != 0);
17400 17404          ASSERT(scmd->satacmd_dma_cookie_list != NULL);
17401 17405  
17402 17406          return (SATA_SUCCESS);
17403 17407  }
17404 17408  
17405 17409  /*
17406 17410   * sata_xlate_errors() is used to translate (S)ATA error
17407 17411   * information to SCSI information returned in the SCSI
17408 17412   * packet.
17409 17413   */
17410 17414  static void
17411 17415  sata_xlate_errors(sata_pkt_txlate_t *spx)
17412 17416  {
17413 17417          struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
17414 17418          struct scsi_extended_sense *sense;
17415 17419  
17416 17420          scsipkt->pkt_reason = CMD_INCOMPLETE;
17417 17421          *scsipkt->pkt_scbp = STATUS_CHECK;
17418 17422          sense = sata_arq_sense(spx);
17419 17423  
17420 17424          switch (spx->txlt_sata_pkt->satapkt_reason) {
17421 17425          case SATA_PKT_PORT_ERROR:
17422 17426                  /*
17423 17427                   * We have no device data. Assume no data transfered.
17424 17428                   */
17425 17429                  sense->es_key = KEY_HARDWARE_ERROR;
17426 17430                  break;
17427 17431  
17428 17432          case SATA_PKT_DEV_ERROR:
17429 17433                  if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
17430 17434                      SATA_STATUS_ERR) {
17431 17435                          /*
17432 17436                           * determine dev error reason from error
17433 17437                           * reg content
17434 17438                           */
17435 17439                          sata_decode_device_error(spx, sense);
17436 17440                          break;
17437 17441                  }
17438 17442                  /* No extended sense key - no info available */
17439 17443                  break;
17440 17444  
17441 17445          case SATA_PKT_TIMEOUT:
17442 17446                  scsipkt->pkt_reason = CMD_TIMEOUT;
17443 17447                  scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
17444 17448                  /* No extended sense key */
17445 17449                  break;
17446 17450  
17447 17451          case SATA_PKT_ABORTED:
17448 17452                  scsipkt->pkt_reason = CMD_ABORTED;
17449 17453                  scsipkt->pkt_statistics |= STAT_ABORTED;
17450 17454                  /* No extended sense key */
17451 17455                  break;
17452 17456  
17453 17457          case SATA_PKT_RESET:
17454 17458                  /*
17455 17459                   * pkt aborted either by an explicit reset request from
17456 17460                   * a host, or due to error recovery
17457 17461                   */
17458 17462                  scsipkt->pkt_reason = CMD_RESET;
17459 17463                  scsipkt->pkt_statistics |= STAT_DEV_RESET;
17460 17464                  break;
17461 17465  
17462 17466          default:
17463 17467                  scsipkt->pkt_reason = CMD_TRAN_ERR;
17464 17468                  break;
17465 17469          }
17466 17470  }
17467 17471  
17468 17472  
17469 17473  
17470 17474  
17471 17475  /*
17472 17476   * Log sata message
17473 17477   * dev pathname msg line preceeds the logged message.
17474 17478   */
17475 17479  
17476 17480  static  void
17477 17481  sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
17478 17482  {
17479 17483          char pathname[128];
17480 17484          dev_info_t *dip = NULL;
17481 17485          va_list ap;
17482 17486  
17483 17487          mutex_enter(&sata_log_mutex);
17484 17488  
17485 17489          va_start(ap, fmt);
17486 17490          (void) vsprintf(sata_log_buf, fmt, ap);
17487 17491          va_end(ap);
17488 17492  
17489 17493          if (sata_hba_inst != NULL) {
17490 17494                  dip = SATA_DIP(sata_hba_inst);
17491 17495                  (void) ddi_pathname(dip, pathname);
17492 17496          } else {
17493 17497                  pathname[0] = 0;
17494 17498          }
17495 17499          if (level == CE_CONT) {
17496 17500                  if (sata_debug_flags == 0)
17497 17501                          cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
17498 17502                  else
17499 17503                          cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
17500 17504          } else {
17501 17505                  if (level != CE_NOTE) {
17502 17506                          cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
17503 17507                  } else if (sata_msg) {
17504 17508                          cmn_err(level, "%s:\n %s", pathname,
17505 17509                              sata_log_buf);
17506 17510                  }
17507 17511          }
17508 17512  
17509 17513          /* sata trace debug */
17510 17514          sata_trace_debug(dip, sata_log_buf);
17511 17515  
17512 17516          mutex_exit(&sata_log_mutex);
17513 17517  }
17514 17518  
17515 17519  
17516 17520  /* ******** Asynchronous HBA events handling & hotplugging support ******** */
17517 17521  
17518 17522  /*
17519 17523   * Start or terminate the thread, depending on flag arg and current state
17520 17524   */
17521 17525  static void
17522 17526  sata_event_thread_control(int startstop)
17523 17527  {
17524 17528          static  int sata_event_thread_terminating = 0;
17525 17529          static  int sata_event_thread_starting = 0;
17526 17530          int i;
17527 17531  
17528 17532          mutex_enter(&sata_event_mutex);
17529 17533  
17530 17534          if (startstop == 0 && (sata_event_thread_starting == 1 ||
17531 17535              sata_event_thread_terminating == 1)) {
17532 17536                  mutex_exit(&sata_event_mutex);
17533 17537                  return;
17534 17538          }
17535 17539          if (startstop == 1 && sata_event_thread_starting == 1) {
17536 17540                  mutex_exit(&sata_event_mutex);
17537 17541                  return;
17538 17542          }
17539 17543          if (startstop == 1 && sata_event_thread_terminating == 1) {
17540 17544                  sata_event_thread_starting = 1;
17541 17545                  /* wait til terminate operation completes */
17542 17546                  i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17543 17547                  while (sata_event_thread_terminating == 1) {
17544 17548                          if (i-- <= 0) {
17545 17549                                  sata_event_thread_starting = 0;
17546 17550                                  mutex_exit(&sata_event_mutex);
17547 17551  #ifdef SATA_DEBUG
17548 17552                                  cmn_err(CE_WARN, "sata_event_thread_control: "
17549 17553                                      "timeout waiting for thread to terminate");
17550 17554  #endif
17551 17555                                  return;
17552 17556                          }
17553 17557                          mutex_exit(&sata_event_mutex);
17554 17558                          delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17555 17559                          mutex_enter(&sata_event_mutex);
17556 17560                  }
17557 17561          }
17558 17562          if (startstop == 1) {
17559 17563                  if (sata_event_thread == NULL) {
17560 17564                          sata_event_thread = thread_create(NULL, 0,
17561 17565                              (void (*)())sata_event_daemon,
17562 17566                              &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
17563 17567                  }
17564 17568                  sata_event_thread_starting = 0;
17565 17569                  mutex_exit(&sata_event_mutex);
17566 17570                  return;
17567 17571          }
17568 17572  
17569 17573          /*
17570 17574           * If we got here, thread may need to be terminated
17571 17575           */
17572 17576          if (sata_event_thread != NULL) {
17573 17577                  int i;
17574 17578                  /* Signal event thread to go away */
17575 17579                  sata_event_thread_terminating = 1;
17576 17580                  sata_event_thread_terminate = 1;
17577 17581                  cv_signal(&sata_event_cv);
17578 17582                  /*
17579 17583                   * Wait til daemon terminates.
17580 17584                   */
17581 17585                  i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17582 17586                  while (sata_event_thread_terminate == 1) {
17583 17587                          mutex_exit(&sata_event_mutex);
17584 17588                          if (i-- <= 0) {
17585 17589                                  /* Daemon did not go away !!! */
17586 17590  #ifdef SATA_DEBUG
17587 17591                                  cmn_err(CE_WARN, "sata_event_thread_control: "
17588 17592                                      "cannot terminate event daemon thread");
17589 17593  #endif
17590 17594                                  mutex_enter(&sata_event_mutex);
17591 17595                                  break;
17592 17596                          }
17593 17597                          delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17594 17598                          mutex_enter(&sata_event_mutex);
17595 17599                  }
17596 17600                  sata_event_thread_terminating = 0;
17597 17601          }
17598 17602          ASSERT(sata_event_thread_terminating == 0);
17599 17603          ASSERT(sata_event_thread_starting == 0);
17600 17604          mutex_exit(&sata_event_mutex);
17601 17605  }
17602 17606  
17603 17607  
17604 17608  /*
17605 17609   * SATA HBA event notification function.
17606 17610   * Events reported by SATA HBA drivers per HBA instance relate to a change in
17607 17611   * a port and/or device state or a controller itself.
17608 17612   * Events for different addresses/addr types cannot be combined.
17609 17613   * A warning message is generated for each event type.
17610 17614   * Events are not processed by this function, so only the
17611 17615   * event flag(s)is set for an affected entity and the event thread is
17612 17616   * waken up. Event daemon thread processes all events.
17613 17617   *
17614 17618   * NOTE: Since more than one event may be reported at the same time, one
17615 17619   * cannot determine a sequence of events when opposite event are reported, eg.
17616 17620   * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
17617 17621   * is taking precedence over reported events, i.e. may cause ignoring some
17618 17622   * events.
17619 17623   */
17620 17624  #define SATA_EVENT_MAX_MSG_LENGTH       79
17621 17625  
17622 17626  void
17623 17627  sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
17624 17628  {
17625 17629          sata_hba_inst_t *sata_hba_inst = NULL;
17626 17630          sata_address_t *saddr;
17627 17631          sata_pmult_info_t *pmultinfo;
17628 17632          sata_drive_info_t *sdinfo;
17629 17633          sata_port_stats_t *pstats;
17630 17634          sata_cport_info_t *cportinfo;
17631 17635          sata_pmport_info_t *pmportinfo;
17632 17636          int cport, pmport;
17633 17637          char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
17634 17638          char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
17635 17639          char *lcp;
17636 17640          static char *err_msg_evnt_1 =
17637 17641              "sata_hba_event_notify: invalid port event 0x%x ";
17638 17642          static char *err_msg_evnt_2 =
17639 17643              "sata_hba_event_notify: invalid device event 0x%x ";
17640 17644          int linkevent;
17641 17645  
17642 17646          /*
17643 17647           * There is a possibility that an event will be generated on HBA
17644 17648           * that has not completed attachment or is detaching. We still want
17645 17649           * to process events until HBA is detached.
17646 17650           */
17647 17651          mutex_enter(&sata_mutex);
17648 17652          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
17649 17653              sata_hba_inst = sata_hba_inst->satahba_next) {
17650 17654                  if (SATA_DIP(sata_hba_inst) == dip)
17651 17655                          if (sata_hba_inst->satahba_attached == 1)
17652 17656                                  break;
17653 17657          }
17654 17658          mutex_exit(&sata_mutex);
17655 17659          if (sata_hba_inst == NULL)
17656 17660                  /* HBA not attached */
17657 17661                  return;
17658 17662  
17659 17663          ASSERT(sata_device != NULL);
17660 17664  
17661 17665          /*
17662 17666           * Validate address before - do not proceed with invalid address.
17663 17667           */
17664 17668          saddr = &sata_device->satadev_addr;
17665 17669          if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
17666 17670                  return;
17667 17671  
17668 17672          cport = saddr->cport;
17669 17673          pmport = saddr->pmport;
17670 17674  
17671 17675          buf1[0] = buf2[0] = '\0';
17672 17676  
17673 17677          /*
17674 17678           * If event relates to port or device, check port state.
17675 17679           * Port has to be initialized, or we cannot accept an event.
17676 17680           */
17677 17681          if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
17678 17682              SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
17679 17683                  mutex_enter(&sata_hba_inst->satahba_mutex);
17680 17684                  cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
17681 17685                  mutex_exit(&sata_hba_inst->satahba_mutex);
17682 17686                  if (cportinfo == NULL || cportinfo->cport_state == 0)
17683 17687                          return;
17684 17688          }
17685 17689  
17686 17690          if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
17687 17691              SATA_ADDR_DPMPORT)) != 0) {
17688 17692                  if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
17689 17693                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17690 17694                              "sata_hba_event_notify: Non-pmult device (0x%x)"
17691 17695                              "is attached to port %d, ignore pmult/pmport "
17692 17696                              "event 0x%x", cportinfo->cport_dev_type,
17693 17697                              cport, event));
17694 17698                          return;
17695 17699                  }
17696 17700  
17697 17701                  mutex_enter(&cportinfo->cport_mutex);
17698 17702                  pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17699 17703                  mutex_exit(&cportinfo->cport_mutex);
17700 17704  
17701 17705                  /*
17702 17706                   * The daemon might be processing attachment of port
17703 17707                   * multiplier, in that case we should ignore events on its
17704 17708                   * sub-devices.
17705 17709                   *
17706 17710                   * NOTE: Only pmult_state is checked in sata_hba_event_notify.
17707 17711                   * The pmport_state is checked by sata daemon.
17708 17712                   */
17709 17713                  if (pmultinfo == NULL ||
17710 17714                      pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
17711 17715                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17712 17716                              "sata_hba_event_notify: pmult is not"
17713 17717                              "available at port %d:%d, ignore event 0x%x",
17714 17718                              cport, pmport, event));
17715 17719                          return;
17716 17720                  }
17717 17721          }
17718 17722  
17719 17723          if ((saddr->qual &
17720 17724              (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
17721 17725  
17722 17726                  mutex_enter(&cportinfo->cport_mutex);
17723 17727                  if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
17724 17728                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17725 17729                              "sata_hba_event_notify: invalid/"
17726 17730                              "un-implemented port %d:%d (%d ports), "
17727 17731                              "ignore event 0x%x", cport, pmport,
17728 17732                              SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
17729 17733                          mutex_exit(&cportinfo->cport_mutex);
17730 17734                          return;
17731 17735                  }
17732 17736                  mutex_exit(&cportinfo->cport_mutex);
17733 17737  
17734 17738                  mutex_enter(&sata_hba_inst->satahba_mutex);
17735 17739                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
17736 17740                      cport, pmport);
17737 17741                  mutex_exit(&sata_hba_inst->satahba_mutex);
17738 17742  
17739 17743                  /* pmport is implemented/valid? */
17740 17744                  if (pmportinfo == NULL) {
17741 17745                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17742 17746                              "sata_hba_event_notify: invalid/"
17743 17747                              "un-implemented port %d:%d, ignore "
17744 17748                              "event 0x%x", cport, pmport, event));
17745 17749                          return;
17746 17750                  }
17747 17751          }
17748 17752  
17749 17753          /*
17750 17754           * Events refer to devices, ports and controllers - each has
17751 17755           * unique address. Events for different addresses cannot be combined.
17752 17756           */
17753 17757          if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
17754 17758  
17755 17759                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17756 17760  
17757 17761                  /* qualify this event(s) */
17758 17762                  if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
17759 17763                          /* Invalid event for the device port */
17760 17764                          (void) sprintf(buf2, err_msg_evnt_1,
17761 17765                              event & SATA_EVNT_PORT_EVENTS);
17762 17766                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17763 17767                          goto event_info;
17764 17768                  }
17765 17769                  if (saddr->qual == SATA_ADDR_CPORT) {
17766 17770                          /* Controller's device port event */
17767 17771  
17768 17772                          (SATA_CPORT_INFO(sata_hba_inst, cport))->
17769 17773                              cport_event_flags |=
17770 17774                              event & SATA_EVNT_PORT_EVENTS;
17771 17775                          pstats =
17772 17776                              &(SATA_CPORT_INFO(sata_hba_inst, cport))->
17773 17777                              cport_stats;
17774 17778                  } else {
17775 17779                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17776 17780                          mutex_enter(&pmportinfo->pmport_mutex);
17777 17781                          /* Port multiplier's device port event */
17778 17782                          (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17779 17783                              pmport_event_flags |=
17780 17784                              event & SATA_EVNT_PORT_EVENTS;
17781 17785                          pstats =
17782 17786                              &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17783 17787                              pmport_stats;
17784 17788                          mutex_exit(&pmportinfo->pmport_mutex);
17785 17789                          mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17786 17790                  }
17787 17791  
17788 17792                  /*
17789 17793                   * Add to statistics and log the message. We have to do it
17790 17794                   * here rather than in the event daemon, because there may be
17791 17795                   * multiple events occuring before they are processed.
17792 17796                   */
17793 17797                  linkevent = event &
17794 17798                      (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
17795 17799                  if (linkevent) {
17796 17800                          if (linkevent == (SATA_EVNT_LINK_LOST |
17797 17801                              SATA_EVNT_LINK_ESTABLISHED)) {
17798 17802                                  /* This is likely event combination */
17799 17803                                  (void) strlcat(buf1, "link lost/established, ",
17800 17804                                      SATA_EVENT_MAX_MSG_LENGTH);
17801 17805  
17802 17806                                  if (pstats->link_lost < 0xffffffffffffffffULL)
17803 17807                                          pstats->link_lost++;
17804 17808                                  if (pstats->link_established <
17805 17809                                      0xffffffffffffffffULL)
17806 17810                                          pstats->link_established++;
17807 17811                                  linkevent = 0;
17808 17812                          } else if (linkevent & SATA_EVNT_LINK_LOST) {
17809 17813                                  (void) strlcat(buf1, "link lost, ",
17810 17814                                      SATA_EVENT_MAX_MSG_LENGTH);
17811 17815  
17812 17816                                  if (pstats->link_lost < 0xffffffffffffffffULL)
17813 17817                                          pstats->link_lost++;
17814 17818                          } else {
17815 17819                                  (void) strlcat(buf1, "link established, ",
17816 17820                                      SATA_EVENT_MAX_MSG_LENGTH);
17817 17821                                  if (pstats->link_established <
17818 17822                                      0xffffffffffffffffULL)
17819 17823                                          pstats->link_established++;
17820 17824                          }
17821 17825                  }
17822 17826                  if (event & SATA_EVNT_DEVICE_ATTACHED) {
17823 17827                          (void) strlcat(buf1, "device attached, ",
17824 17828                              SATA_EVENT_MAX_MSG_LENGTH);
17825 17829                          if (pstats->device_attached < 0xffffffffffffffffULL)
17826 17830                                  pstats->device_attached++;
17827 17831                  }
17828 17832                  if (event & SATA_EVNT_DEVICE_DETACHED) {
17829 17833                          (void) strlcat(buf1, "device detached, ",
17830 17834                              SATA_EVENT_MAX_MSG_LENGTH);
17831 17835                          if (pstats->device_detached < 0xffffffffffffffffULL)
17832 17836                                  pstats->device_detached++;
17833 17837                  }
17834 17838                  if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
17835 17839                          SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17836 17840                              "port %d power level changed", cport);
17837 17841                          if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
17838 17842                                  pstats->port_pwr_changed++;
17839 17843                  }
17840 17844  
17841 17845                  if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
17842 17846                          /* There should be no other events for this address */
17843 17847                          (void) sprintf(buf2, err_msg_evnt_1,
17844 17848                              event & ~SATA_EVNT_PORT_EVENTS);
17845 17849                  }
17846 17850                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17847 17851  
17848 17852          } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
17849 17853                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17850 17854  
17851 17855                  /* qualify this event */
17852 17856                  if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
17853 17857                          /* Invalid event for a device */
17854 17858                          (void) sprintf(buf2, err_msg_evnt_2,
17855 17859                              event & SATA_EVNT_DEVICE_RESET);
17856 17860                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17857 17861                          goto event_info;
17858 17862                  }
17859 17863                  /* drive event */
17860 17864                  sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
17861 17865                  if (sdinfo != NULL) {
17862 17866                          if (event & SATA_EVNT_DEVICE_RESET) {
17863 17867                                  (void) strlcat(buf1, "device reset, ",
17864 17868                                      SATA_EVENT_MAX_MSG_LENGTH);
17865 17869                                  if (sdinfo->satadrv_stats.drive_reset <
17866 17870                                      0xffffffffffffffffULL)
17867 17871                                          sdinfo->satadrv_stats.drive_reset++;
17868 17872                                  sdinfo->satadrv_event_flags |=
17869 17873                                      SATA_EVNT_DEVICE_RESET;
17870 17874                          }
17871 17875                  }
17872 17876                  if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
17873 17877                          /* Invalid event for a device */
17874 17878                          (void) sprintf(buf2, err_msg_evnt_2,
17875 17879                              event & ~SATA_EVNT_DRIVE_EVENTS);
17876 17880                  }
17877 17881                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17878 17882          } else if (saddr->qual == SATA_ADDR_PMULT) {
17879 17883                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17880 17884  
17881 17885                  /* qualify this event */
17882 17886                  if ((event & (SATA_EVNT_DEVICE_RESET |
17883 17887                      SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
17884 17888                          /* Invalid event for a port multiplier */
17885 17889                          (void) sprintf(buf2, err_msg_evnt_2,
17886 17890                              event & SATA_EVNT_DEVICE_RESET);
17887 17891                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17888 17892                          goto event_info;
17889 17893                  }
17890 17894  
17891 17895                  pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17892 17896  
17893 17897                  if (event & SATA_EVNT_DEVICE_RESET) {
17894 17898  
17895 17899                          SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17896 17900                              "[Reset] port-mult on cport %d", cport);
17897 17901                          pmultinfo->pmult_event_flags |=
17898 17902                              SATA_EVNT_DEVICE_RESET;
17899 17903                          (void) strlcat(buf1, "pmult reset, ",
17900 17904                              SATA_EVENT_MAX_MSG_LENGTH);
17901 17905                  }
17902 17906  
17903 17907                  if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
17904 17908  
17905 17909                          SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17906 17910                              "pmult link changed on cport %d", cport);
17907 17911                          pmultinfo->pmult_event_flags |=
17908 17912                              SATA_EVNT_PMULT_LINK_CHANGED;
17909 17913                          (void) strlcat(buf1, "pmult link changed, ",
17910 17914                              SATA_EVENT_MAX_MSG_LENGTH);
17911 17915                  }
17912 17916                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17913 17917  
17914 17918          } else {
17915 17919                  if (saddr->qual != SATA_ADDR_NULL) {
17916 17920                          /* Wrong address qualifier */
17917 17921                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17918 17922                              "sata_hba_event_notify: invalid address 0x%x",
17919 17923                              *(uint32_t *)saddr));
17920 17924                          return;
17921 17925                  }
17922 17926                  if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
17923 17927                      (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
17924 17928                          /* Invalid event for the controller */
17925 17929                          SATA_LOG_D((sata_hba_inst, CE_WARN,
17926 17930                              "sata_hba_event_notify: invalid event 0x%x for "
17927 17931                              "controller",
17928 17932                              event & SATA_EVNT_CONTROLLER_EVENTS));
17929 17933                          return;
17930 17934                  }
17931 17935                  buf1[0] = '\0';
17932 17936                  /* This may be a frequent and not interesting event */
17933 17937                  SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17934 17938                      "controller power level changed\n", NULL);
17935 17939  
17936 17940                  mutex_enter(&sata_hba_inst->satahba_mutex);
17937 17941                  if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
17938 17942                      0xffffffffffffffffULL)
17939 17943                          sata_hba_inst->satahba_stats.ctrl_pwr_change++;
17940 17944  
17941 17945                  sata_hba_inst->satahba_event_flags |=
17942 17946                      SATA_EVNT_PWR_LEVEL_CHANGED;
17943 17947                  mutex_exit(&sata_hba_inst->satahba_mutex);
17944 17948          }
17945 17949          /*
17946 17950           * If we got here, there is something to do with this HBA
17947 17951           * instance.
17948 17952           */
17949 17953          mutex_enter(&sata_hba_inst->satahba_mutex);
17950 17954          sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
17951 17955          mutex_exit(&sata_hba_inst->satahba_mutex);
17952 17956          mutex_enter(&sata_mutex);
17953 17957          sata_event_pending |= SATA_EVNT_MAIN;   /* global event indicator */
17954 17958          mutex_exit(&sata_mutex);
17955 17959  
17956 17960          /* Tickle event thread */
17957 17961          mutex_enter(&sata_event_mutex);
17958 17962          if (sata_event_thread_active == 0)
17959 17963                  cv_signal(&sata_event_cv);
17960 17964          mutex_exit(&sata_event_mutex);
17961 17965  
17962 17966  event_info:
17963 17967          if (buf1[0] != '\0') {
17964 17968                  lcp = strrchr(buf1, ',');
17965 17969                  if (lcp != NULL)
17966 17970                          *lcp = '\0';
17967 17971          }
17968 17972          if (saddr->qual == SATA_ADDR_CPORT ||
17969 17973              saddr->qual == SATA_ADDR_DCPORT) {
17970 17974                  if (buf1[0] != '\0') {
17971 17975                          sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17972 17976                              cport, buf1);
17973 17977                  }
17974 17978                  if (buf2[0] != '\0') {
17975 17979                          sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17976 17980                              cport, buf2);
17977 17981                  }
17978 17982          } else if (saddr->qual == SATA_ADDR_PMPORT ||
17979 17983              saddr->qual == SATA_ADDR_DPMPORT) {
17980 17984                  if (buf1[0] != '\0') {
17981 17985                          sata_log(sata_hba_inst, CE_NOTE,
17982 17986                              "port %d pmport %d: %s\n", cport, pmport, buf1);
17983 17987                  }
17984 17988                  if (buf2[0] != '\0') {
17985 17989                          sata_log(sata_hba_inst, CE_NOTE,
17986 17990                              "port %d pmport %d: %s\n", cport, pmport, buf2);
17987 17991                  }
17988 17992          }
17989 17993  }
17990 17994  
17991 17995  
17992 17996  /*
17993 17997   * Event processing thread.
17994 17998   * Arg is a pointer to the sata_hba_list pointer.
17995 17999   * It is not really needed, because sata_hba_list is global and static
17996 18000   */
17997 18001  static void
17998 18002  sata_event_daemon(void *arg)
17999 18003  {
18000 18004  #ifndef __lock_lint
18001 18005          _NOTE(ARGUNUSED(arg))
18002 18006  #endif
18003 18007          sata_hba_inst_t *sata_hba_inst;
18004 18008          clock_t delta;
18005 18009  
18006 18010          SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18007 18011              "SATA event daemon started\n", NULL);
18008 18012  loop:
18009 18013          /*
18010 18014           * Process events here. Walk through all registered HBAs
18011 18015           */
18012 18016          mutex_enter(&sata_mutex);
18013 18017          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18014 18018              sata_hba_inst = sata_hba_inst->satahba_next) {
18015 18019                  ASSERT(sata_hba_inst != NULL);
18016 18020                  mutex_enter(&sata_hba_inst->satahba_mutex);
18017 18021                  if (sata_hba_inst->satahba_attached == 0 ||
18018 18022                      (sata_hba_inst->satahba_event_flags &
18019 18023                      SATA_EVNT_SKIP) != 0) {
18020 18024                          mutex_exit(&sata_hba_inst->satahba_mutex);
18021 18025                          continue;
18022 18026                  }
18023 18027                  if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18024 18028                          sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18025 18029                          mutex_exit(&sata_hba_inst->satahba_mutex);
18026 18030                          mutex_exit(&sata_mutex);
18027 18031                          /* Got the controller with pending event */
18028 18032                          sata_process_controller_events(sata_hba_inst);
18029 18033                          /*
18030 18034                           * Since global mutex was released, there is a
18031 18035                           * possibility that HBA list has changed, so start
18032 18036                           * over from the top. Just processed controller
18033 18037                           * will be passed-over because of the SKIP flag.
18034 18038                           */
18035 18039                          goto loop;
18036 18040                  }
18037 18041                  mutex_exit(&sata_hba_inst->satahba_mutex);
18038 18042          }
18039 18043          /* Clear SKIP flag in all controllers */
18040 18044          for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18041 18045              sata_hba_inst = sata_hba_inst->satahba_next) {
18042 18046                  mutex_enter(&sata_hba_inst->satahba_mutex);
18043 18047                  sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18044 18048                  mutex_exit(&sata_hba_inst->satahba_mutex);
18045 18049          }
18046 18050          mutex_exit(&sata_mutex);
18047 18051  
18048 18052          SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18049 18053              "SATA EVENT DAEMON suspending itself", NULL);
18050 18054  
18051 18055  #ifdef SATA_DEBUG
18052 18056          if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18053 18057                  sata_log(sata_hba_inst, CE_WARN,
18054 18058                      "SATA EVENTS PROCESSING DISABLED\n");
18055 18059                  thread_exit(); /* Daemon will not run again */
18056 18060          }
18057 18061  #endif
18058 18062          mutex_enter(&sata_event_mutex);
18059 18063          sata_event_thread_active = 0;
18060 18064          mutex_exit(&sata_event_mutex);
18061 18065          /*
18062 18066           * Go to sleep/suspend itself and wake up either because new event or
18063 18067           * wait timeout. Exit if there is a termination request (driver
18064 18068           * unload).
18065 18069           */
18066 18070          delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18067 18071          do {
18068 18072                  mutex_enter(&sata_event_mutex);
18069 18073                  (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18070 18074                      delta, TR_CLOCK_TICK);
18071 18075  
18072 18076                  if (sata_event_thread_active != 0) {
18073 18077                          mutex_exit(&sata_event_mutex);
18074 18078                          continue;
18075 18079                  }
18076 18080  
18077 18081                  /* Check if it is time to go away */
18078 18082                  if (sata_event_thread_terminate == 1) {
18079 18083                          /*
18080 18084                           * It is up to the thread setting above flag to make
18081 18085                           * sure that this thread is not killed prematurely.
18082 18086                           */
18083 18087                          sata_event_thread_terminate = 0;
18084 18088                          sata_event_thread = NULL;
18085 18089                          mutex_exit(&sata_event_mutex);
18086 18090                          SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18087 18091                              "SATA_EVENT_DAEMON_TERMINATING", NULL);
18088 18092                          thread_exit();  { _NOTE(NOT_REACHED) }
18089 18093                  }
18090 18094                  mutex_exit(&sata_event_mutex);
18091 18095          } while (!(sata_event_pending & SATA_EVNT_MAIN));
18092 18096  
18093 18097          mutex_enter(&sata_event_mutex);
18094 18098          sata_event_thread_active = 1;
18095 18099          mutex_exit(&sata_event_mutex);
18096 18100  
18097 18101          mutex_enter(&sata_mutex);
18098 18102          sata_event_pending &= ~SATA_EVNT_MAIN;
18099 18103          mutex_exit(&sata_mutex);
18100 18104  
18101 18105          SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18102 18106              "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18103 18107  
18104 18108          goto loop;
18105 18109  }
18106 18110  
18107 18111  /*
18108 18112   * Specific HBA instance event processing.
18109 18113   *
18110 18114   * NOTE: At the moment, device event processing is limited to hard disks
18111 18115   * only.
18112 18116   * Port multiplier is supported now.
18113 18117   */
18114 18118  static void
18115 18119  sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18116 18120  {
18117 18121          int ncport;
18118 18122          uint32_t event_flags;
18119 18123          sata_address_t *saddr;
18120 18124          sata_cport_info_t *cportinfo;
18121 18125          sata_pmult_info_t *pmultinfo;
18122 18126  
18123 18127          SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18124 18128              "Processing controller %d event(s)",
18125 18129              ddi_get_instance(SATA_DIP(sata_hba_inst)));
18126 18130  
18127 18131          mutex_enter(&sata_hba_inst->satahba_mutex);
18128 18132          sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18129 18133          event_flags = sata_hba_inst->satahba_event_flags;
18130 18134          mutex_exit(&sata_hba_inst->satahba_mutex);
18131 18135          /*
18132 18136           * Process controller power change first
18133 18137           * HERE
18134 18138           */
18135 18139          if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18136 18140                  sata_process_cntrl_pwr_level_change(sata_hba_inst);
18137 18141  
18138 18142          /*
18139 18143           * Search through ports/devices to identify affected port/device.
18140 18144           * We may have to process events for more than one port/device.
18141 18145           */
18142 18146          for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18143 18147                  /*
18144 18148                   * Not all ports may be processed in attach by the time we
18145 18149                   * get an event. Check if port info is initialized.
18146 18150                   */
18147 18151                  mutex_enter(&sata_hba_inst->satahba_mutex);
18148 18152                  cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18149 18153                  mutex_exit(&sata_hba_inst->satahba_mutex);
18150 18154                  if (cportinfo == NULL || cportinfo->cport_state == NULL)
18151 18155                          continue;
18152 18156  
18153 18157                  /* We have initialized controller port info */
18154 18158                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18155 18159                  event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18156 18160                      cport_event_flags;
18157 18161                  /* Check if port was locked by IOCTL processing */
18158 18162                  if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18159 18163                          /*
18160 18164                           * We ignore port events because port is busy
18161 18165                           * with AP control processing. Set again
18162 18166                           * controller and main event flag, so that
18163 18167                           * events may be processed by the next daemon
18164 18168                           * run.
18165 18169                           */
18166 18170                          mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18167 18171                          mutex_enter(&sata_hba_inst->satahba_mutex);
18168 18172                          sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18169 18173                          mutex_exit(&sata_hba_inst->satahba_mutex);
18170 18174                          mutex_enter(&sata_mutex);
18171 18175                          sata_event_pending |= SATA_EVNT_MAIN;
18172 18176                          mutex_exit(&sata_mutex);
18173 18177                          SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
18174 18178                              "Event processing postponed until "
18175 18179                              "AP control processing completes",
18176 18180                              NULL);
18177 18181                          /* Check other ports */
18178 18182                          continue;
18179 18183                  } else {
18180 18184                          /*
18181 18185                           * Set BSY flag so that AP control would not
18182 18186                           * interfere with events processing for
18183 18187                           * this port.
18184 18188                           */
18185 18189                          (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18186 18190                              cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
18187 18191                  }
18188 18192                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18189 18193  
18190 18194                  saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
18191 18195  
18192 18196                  if ((event_flags &
18193 18197                      (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18194 18198                          /*
18195 18199                           * Got port event.
18196 18200                           * We need some hierarchy of event processing as they
18197 18201                           * are affecting each other:
18198 18202                           * 1. port failed
18199 18203                           * 2. device detached/attached
18200 18204                           * 3. link events - link events may trigger device
18201 18205                           *    detached or device attached events in some
18202 18206                           *    circumstances.
18203 18207                           * 4. port power level changed
18204 18208                           */
18205 18209                          if (event_flags & SATA_EVNT_PORT_FAILED) {
18206 18210                                  sata_process_port_failed_event(sata_hba_inst,
18207 18211                                      saddr);
18208 18212                          }
18209 18213                          if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18210 18214                                  sata_process_device_detached(sata_hba_inst,
18211 18215                                      saddr);
18212 18216                          }
18213 18217                          if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18214 18218                                  sata_process_device_attached(sata_hba_inst,
18215 18219                                      saddr);
18216 18220                          }
18217 18221                          if (event_flags &
18218 18222                              (SATA_EVNT_LINK_ESTABLISHED |
18219 18223                              SATA_EVNT_LINK_LOST)) {
18220 18224                                  sata_process_port_link_events(sata_hba_inst,
18221 18225                                      saddr);
18222 18226                          }
18223 18227                          if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
18224 18228                                  sata_process_port_pwr_change(sata_hba_inst,
18225 18229                                      saddr);
18226 18230                          }
18227 18231                          if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18228 18232                                  sata_process_target_node_cleanup(
18229 18233                                      sata_hba_inst, saddr);
18230 18234                          }
18231 18235                          if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
18232 18236                                  sata_process_device_autoonline(
18233 18237                                      sata_hba_inst, saddr);
18234 18238                          }
18235 18239                  }
18236 18240  
18237 18241  
18238 18242                  /*
18239 18243                   * Scan port multiplier and all its sub-ports event flags.
18240 18244                   * The events are marked by
18241 18245                   * (1) sata_pmult_info.pmult_event_flags
18242 18246                   * (2) sata_pmport_info.pmport_event_flags
18243 18247                   */
18244 18248                  mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18245 18249                  if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
18246 18250                          /*
18247 18251                           * There should be another extra check: this
18248 18252                           * port multiplier still exists?
18249 18253                           */
18250 18254                          pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
18251 18255                              ncport);
18252 18256  
18253 18257                          if (pmultinfo != NULL) {
18254 18258                                  mutex_exit(&(SATA_CPORT_MUTEX(
18255 18259                                      sata_hba_inst, ncport)));
18256 18260                                  sata_process_pmult_events(
18257 18261                                      sata_hba_inst, ncport);
18258 18262                                  mutex_enter(&(SATA_CPORT_MUTEX(
18259 18263                                      sata_hba_inst, ncport)));
18260 18264                          } else {
18261 18265                                  SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18262 18266                                      "Port-multiplier is gone. "
18263 18267                                      "Ignore all sub-device events "
18264 18268                                      "at port %d.", ncport);
18265 18269                          }
18266 18270                  }
18267 18271  
18268 18272                  if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
18269 18273                      SATA_DTYPE_NONE) &&
18270 18274                      (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
18271 18275                          if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
18272 18276                              satadrv_event_flags &
18273 18277                              (SATA_EVNT_DEVICE_RESET |
18274 18278                              SATA_EVNT_INPROC_DEVICE_RESET)) {
18275 18279                                  /* Have device event */
18276 18280                                  sata_process_device_reset(sata_hba_inst,
18277 18281                                      saddr);
18278 18282                          }
18279 18283                  }
18280 18284                  /* Release PORT_BUSY flag */
18281 18285                  (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18282 18286                      cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18283 18287                  mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18284 18288  
18285 18289          } /* End of loop through the controller SATA ports */
18286 18290  }
18287 18291  
18288 18292  /*
18289 18293   * Specific port multiplier instance event processing. At the moment, device
18290 18294   * event processing is limited to link/attach event only.
18291 18295   *
18292 18296   * NOTE: power management event is not supported yet.
18293 18297   */
18294 18298  static void
18295 18299  sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
18296 18300  {
18297 18301          sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18298 18302          sata_pmult_info_t *pmultinfo;
18299 18303          sata_pmport_info_t *pmportinfo;
18300 18304          sata_address_t *saddr;
18301 18305          sata_device_t sata_device;
18302 18306          uint32_t event_flags;
18303 18307          int npmport;
18304 18308          int rval;
18305 18309  
18306 18310          SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18307 18311              "Processing pmult event(s) on cport %d of controller %d",
18308 18312              cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18309 18313  
18310 18314          /* First process events on port multiplier */
18311 18315          mutex_enter(&cportinfo->cport_mutex);
18312 18316          pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18313 18317          event_flags = pmultinfo->pmult_event_flags;
18314 18318  
18315 18319          /*
18316 18320           * Reset event (of port multiplier) has higher priority because the
18317 18321           * port multiplier itself might be failed or removed after reset.
18318 18322           */
18319 18323          if (event_flags & SATA_EVNT_DEVICE_RESET) {
18320 18324                  /*
18321 18325                   * The status of the sub-links are uncertain,
18322 18326                   * so mark all sub-ports as RESET
18323 18327                   */
18324 18328                  for (npmport = 0; npmport < SATA_NUM_PMPORTS(
18325 18329                      sata_hba_inst, cport); npmport ++) {
18326 18330                          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18327 18331                              cport, npmport);
18328 18332                          if (pmportinfo == NULL) {
18329 18333                                  /* That's weird. */
18330 18334                                  SATA_LOG_D((sata_hba_inst, CE_WARN,
18331 18335                                      "sata_hba_event_notify: "
18332 18336                                      "invalid/un-implemented "
18333 18337                                      "port %d:%d (%d ports), ",
18334 18338                                      cport, npmport, SATA_NUM_PMPORTS(
18335 18339                                      sata_hba_inst, cport)));
18336 18340                                  continue;
18337 18341                          }
18338 18342  
18339 18343                          mutex_enter(&pmportinfo->pmport_mutex);
18340 18344  
18341 18345                          /* Mark all pmport to unknow state. */
18342 18346                          pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
18343 18347                          /* Mark all pmports with link events. */
18344 18348                          pmportinfo->pmport_event_flags =
18345 18349                              (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
18346 18350                          mutex_exit(&pmportinfo->pmport_mutex);
18347 18351                  }
18348 18352  
18349 18353          } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
18350 18354                  /*
18351 18355                   * We need probe the port multiplier to know what has
18352 18356                   * happened.
18353 18357                   */
18354 18358                  bzero(&sata_device, sizeof (sata_device_t));
18355 18359                  sata_device.satadev_rev = SATA_DEVICE_REV;
18356 18360                  sata_device.satadev_addr.cport = cport;
18357 18361                  sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
18358 18362                  sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
18359 18363  
18360 18364                  mutex_exit(&cportinfo->cport_mutex);
18361 18365                  rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18362 18366                      (SATA_DIP(sata_hba_inst), &sata_device);
18363 18367                  mutex_enter(&cportinfo->cport_mutex);
18364 18368                  if (rval != SATA_SUCCESS) {
18365 18369                          /* Something went wrong? Fail the port */
18366 18370                          cportinfo->cport_state = SATA_PSTATE_FAILED;
18367 18371                          mutex_exit(&cportinfo->cport_mutex);
18368 18372                          SATA_LOG_D((sata_hba_inst, CE_WARN,
18369 18373                              "SATA port %d probing failed", cport));
18370 18374  
18371 18375                          /* PMult structure must be released.  */
18372 18376                          sata_free_pmult(sata_hba_inst, &sata_device);
18373 18377                          return;
18374 18378                  }
18375 18379  
18376 18380                  sata_update_port_info(sata_hba_inst, &sata_device);
18377 18381  
18378 18382                  /*
18379 18383                   * Sanity check - Port is active? Is the link active?
18380 18384                   * The device is still a port multiplier?
18381 18385                   */
18382 18386                  if ((cportinfo->cport_state &
18383 18387                      (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
18384 18388                      ((cportinfo->cport_scr.sstatus &
18385 18389                      SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
18386 18390                      (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
18387 18391                          mutex_exit(&cportinfo->cport_mutex);
18388 18392  
18389 18393                          /* PMult structure must be released.  */
18390 18394                          sata_free_pmult(sata_hba_inst, &sata_device);
18391 18395                          return;
18392 18396                  }
18393 18397  
18394 18398                  /* Probed succeed, set port ready. */
18395 18399                  cportinfo->cport_state |=
18396 18400                      SATA_STATE_PROBED | SATA_STATE_READY;
18397 18401          }
18398 18402  
18399 18403          /* Release port multiplier event flags. */
18400 18404          pmultinfo->pmult_event_flags &=
18401 18405              ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
18402 18406          mutex_exit(&cportinfo->cport_mutex);
18403 18407  
18404 18408          /*
18405 18409           * Check all sub-links.
18406 18410           */
18407 18411          for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
18408 18412              npmport ++) {
18409 18413                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
18410 18414                  mutex_enter(&pmportinfo->pmport_mutex);
18411 18415                  event_flags = pmportinfo->pmport_event_flags;
18412 18416                  mutex_exit(&pmportinfo->pmport_mutex);
18413 18417                  saddr = &pmportinfo->pmport_addr;
18414 18418  
18415 18419                  if ((event_flags &
18416 18420                      (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18417 18421                          /*
18418 18422                           * Got port multiplier port event.
18419 18423                           * We need some hierarchy of event processing as they
18420 18424                           * are affecting each other:
18421 18425                           * 1. device detached/attached
18422 18426                           * 2. link events - link events may trigger device
18423 18427                           *    detached or device attached events in some
18424 18428                           *    circumstances.
18425 18429                           */
18426 18430                          if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18427 18431                                  sata_process_pmdevice_detached(sata_hba_inst,
18428 18432                                      saddr);
18429 18433                          }
18430 18434                          if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18431 18435                                  sata_process_pmdevice_attached(sata_hba_inst,
18432 18436                                      saddr);
18433 18437                          }
18434 18438                          if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
18435 18439                              event_flags & SATA_EVNT_LINK_LOST) {
18436 18440                                  sata_process_pmport_link_events(sata_hba_inst,
18437 18441                                      saddr);
18438 18442                          }
18439 18443                          if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18440 18444                                  sata_process_target_node_cleanup(
18441 18445                                      sata_hba_inst, saddr);
18442 18446                          }
18443 18447                  }
18444 18448  
18445 18449                  /* Checking drive event(s). */
18446 18450                  mutex_enter(&pmportinfo->pmport_mutex);
18447 18451                  if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
18448 18452                      pmportinfo->pmport_sata_drive != NULL) {
18449 18453                          event_flags = pmportinfo->pmport_sata_drive->
18450 18454                              satadrv_event_flags;
18451 18455                          if (event_flags & (SATA_EVNT_DEVICE_RESET |
18452 18456                              SATA_EVNT_INPROC_DEVICE_RESET)) {
18453 18457  
18454 18458                                  /* Have device event */
18455 18459                                  sata_process_pmdevice_reset(sata_hba_inst,
18456 18460                                      saddr);
18457 18461                          }
18458 18462                  }
18459 18463                  mutex_exit(&pmportinfo->pmport_mutex);
18460 18464  
18461 18465                  /* Release PORT_BUSY flag */
18462 18466                  mutex_enter(&cportinfo->cport_mutex);
18463 18467                  cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18464 18468                  mutex_exit(&cportinfo->cport_mutex);
18465 18469          }
18466 18470  
18467 18471          SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18468 18472              "[DONE] pmult event(s) on cport %d of controller %d",
18469 18473              cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18470 18474  }
18471 18475  
18472 18476  /*
18473 18477   * Process HBA power level change reported by HBA driver.
18474 18478   * Not implemented at this time - event is ignored.
18475 18479   */
18476 18480  static void
18477 18481  sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
18478 18482  {
18479 18483          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18480 18484              "Processing controller power level change", NULL);
18481 18485  
18482 18486          /* Ignoring it for now */
18483 18487          mutex_enter(&sata_hba_inst->satahba_mutex);
18484 18488          sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18485 18489          mutex_exit(&sata_hba_inst->satahba_mutex);
18486 18490  }
18487 18491  
18488 18492  /*
18489 18493   * Process port power level change reported by HBA driver.
18490 18494   * Not implemented at this time - event is ignored.
18491 18495   */
18492 18496  static void
18493 18497  sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
18494 18498      sata_address_t *saddr)
18495 18499  {
18496 18500          sata_cport_info_t *cportinfo;
18497 18501  
18498 18502          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18499 18503              "Processing port power level change", NULL);
18500 18504  
18501 18505          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18502 18506          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18503 18507          /* Reset event flag */
18504 18508          cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18505 18509          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18506 18510  }
18507 18511  
18508 18512  /*
18509 18513   * Process port failure reported by HBA driver.
18510 18514   * cports support only - no pmports.
18511 18515   */
18512 18516  static void
18513 18517  sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
18514 18518      sata_address_t *saddr)
18515 18519  {
18516 18520          sata_cport_info_t *cportinfo;
18517 18521  
18518 18522          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18519 18523          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18520 18524          /* Reset event flag first */
18521 18525          cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
18522 18526          /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
18523 18527          if ((cportinfo->cport_state &
18524 18528              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
18525 18529                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18526 18530                      cport_mutex);
18527 18531                  return;
18528 18532          }
18529 18533          /* Fail the port */
18530 18534          cportinfo->cport_state = SATA_PSTATE_FAILED;
18531 18535          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18532 18536          sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
18533 18537  }
18534 18538  
18535 18539  /*
18536 18540   * Device Reset Event processing.
18537 18541   * The sequence is managed by 3 stage flags:
18538 18542   * - reset event reported,
18539 18543   * - reset event being processed,
18540 18544   * - request to clear device reset state.
18541 18545   *
18542 18546   * NOTE: This function has to be entered with cport mutex held. It exits with
18543 18547   * mutex held as well, but can release mutex during the processing.
18544 18548   */
18545 18549  static void
18546 18550  sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
18547 18551      sata_address_t *saddr)
18548 18552  {
18549 18553          sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18550 18554          sata_drive_info_t *sdinfo;
18551 18555          sata_cport_info_t *cportinfo;
18552 18556          sata_device_t sata_device;
18553 18557          int rval_probe, rval_set;
18554 18558  
18555 18559          /* We only care about host sata cport for now */
18556 18560          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18557 18561          sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18558 18562          /*
18559 18563           * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18560 18564           * state, ignore reset event.
18561 18565           */
18562 18566          if (((cportinfo->cport_state &
18563 18567              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18564 18568              (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18565 18569                  sdinfo->satadrv_event_flags &=
18566 18570                      ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18567 18571                  return;
18568 18572          }
18569 18573  
18570 18574          if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
18571 18575              SATA_DTYPE_PMULT)) {
18572 18576                  /*
18573 18577                   * Should not happened: this is already handled in
18574 18578                   * sata_hba_event_notify()
18575 18579                   */
18576 18580                  mutex_exit(&cportinfo->cport_mutex);
18577 18581                  goto done;
18578 18582          }
18579 18583  
18580 18584          if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
18581 18585              SATA_VALID_DEV_TYPE) == 0) {
18582 18586                  /*
18583 18587                   * This should not happen - coding error.
18584 18588                   * But we can recover, so do not panic, just clean up
18585 18589                   * and if in debug mode, log the message.
18586 18590                   */
18587 18591  #ifdef SATA_DEBUG
18588 18592                  sata_log(sata_hba_inst, CE_WARN,
18589 18593                      "sata_process_device_reset: "
18590 18594                      "Invalid device type with sdinfo!", NULL);
18591 18595  #endif
18592 18596                  sdinfo->satadrv_event_flags = 0;
18593 18597                  return;
18594 18598          }
18595 18599  
18596 18600  #ifdef SATA_DEBUG
18597 18601          if ((sdinfo->satadrv_event_flags &
18598 18602              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18599 18603                  /* Nothing to do */
18600 18604                  /* Something is weird - why we are processing dev reset? */
18601 18605                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18602 18606                      "No device reset event!!!!", NULL);
18603 18607  
18604 18608                  return;
18605 18609          }
18606 18610          if ((sdinfo->satadrv_event_flags &
18607 18611              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18608 18612              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18609 18613                  /* Something is weird - new device reset event */
18610 18614                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18611 18615                      "Overlapping device reset events!", NULL);
18612 18616          }
18613 18617  #endif
18614 18618          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18615 18619              "Processing port %d device reset", saddr->cport);
18616 18620  
18617 18621          /* Clear event flag */
18618 18622          sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18619 18623  
18620 18624          /* It seems that we always need to check the port state first */
18621 18625          sata_device.satadev_rev = SATA_DEVICE_REV;
18622 18626          sata_device.satadev_addr = *saddr;
18623 18627          /*
18624 18628           * We have to exit mutex, because the HBA probe port function may
18625 18629           * block on its own mutex.
18626 18630           */
18627 18631          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18628 18632          rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18629 18633              (SATA_DIP(sata_hba_inst), &sata_device);
18630 18634          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18631 18635          sata_update_port_info(sata_hba_inst, &sata_device);
18632 18636          if (rval_probe != SATA_SUCCESS) {
18633 18637                  /* Something went wrong? Fail the port */
18634 18638                  cportinfo->cport_state = SATA_PSTATE_FAILED;
18635 18639                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18636 18640                  if (sdinfo != NULL)
18637 18641                          sdinfo->satadrv_event_flags = 0;
18638 18642                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18639 18643                      cport_mutex);
18640 18644                  SATA_LOG_D((sata_hba_inst, CE_WARN,
18641 18645                      "SATA port %d probing failed",
18642 18646                      saddr->cport));
18643 18647                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
18644 18648                      saddr->cport)->cport_mutex);
18645 18649                  return;
18646 18650          }
18647 18651          if ((sata_device.satadev_scr.sstatus  &
18648 18652              SATA_PORT_DEVLINK_UP_MASK) !=
18649 18653              SATA_PORT_DEVLINK_UP ||
18650 18654              sata_device.satadev_type == SATA_DTYPE_NONE) {
18651 18655                  /*
18652 18656                   * No device to process, anymore. Some other event processing
18653 18657                   * would or have already performed port info cleanup.
18654 18658                   * To be safe (HBA may need it), request clearing device
18655 18659                   * reset condition.
18656 18660                   */
18657 18661                  sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18658 18662                  if (sdinfo != NULL) {
18659 18663                          sdinfo->satadrv_event_flags &=
18660 18664                              ~SATA_EVNT_INPROC_DEVICE_RESET;
18661 18665                          sdinfo->satadrv_event_flags |=
18662 18666                              SATA_EVNT_CLEAR_DEVICE_RESET;
18663 18667                  }
18664 18668                  return;
18665 18669          }
18666 18670  
18667 18671          sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18668 18672          if (sdinfo == NULL) {
18669 18673                  return;
18670 18674          }
18671 18675          if ((sdinfo->satadrv_event_flags &
18672 18676              SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18673 18677                  /*
18674 18678                   * Start tracking time for device feature restoration and
18675 18679                   * identification. Save current time (lbolt value).
18676 18680                   */
18677 18681                  sdinfo->satadrv_reset_time = ddi_get_lbolt();
18678 18682          }
18679 18683          /* Mark device reset processing as active */
18680 18684          sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18681 18685  
18682 18686          old_sdinfo = *sdinfo;   /* local copy of the drive info */
18683 18687          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18684 18688  
18685 18689          rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
18686 18690  
18687 18691          if (rval_set  != SATA_SUCCESS) {
18688 18692                  /*
18689 18693                   * Restoring drive setting failed.
18690 18694                   * Probe the port first, to check if the port state has changed
18691 18695                   */
18692 18696                  sata_device.satadev_rev = SATA_DEVICE_REV;
18693 18697                  sata_device.satadev_addr = *saddr;
18694 18698                  sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
18695 18699                  /* probe port */
18696 18700                  rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18697 18701                      (SATA_DIP(sata_hba_inst), &sata_device);
18698 18702                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18699 18703                      cport_mutex);
18700 18704                  if (rval_probe == SATA_SUCCESS &&
18701 18705                      (sata_device.satadev_state &
18702 18706                      (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18703 18707                      (sata_device.satadev_scr.sstatus  &
18704 18708                      SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18705 18709                      sata_device.satadev_type != SATA_DTYPE_NONE) {
18706 18710                          /*
18707 18711                           * We may retry this a bit later - in-process reset
18708 18712                           * condition should be already set.
18709 18713                           * Track retry time for device identification.
18710 18714                           */
18711 18715                          if ((cportinfo->cport_dev_type &
18712 18716                              SATA_VALID_DEV_TYPE) != 0 &&
18713 18717                              SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
18714 18718                              sdinfo->satadrv_reset_time != 0) {
18715 18719                                  clock_t cur_time = ddi_get_lbolt();
18716 18720                                  /*
18717 18721                                   * If the retry time limit was not
18718 18722                                   * exceeded, retry.
18719 18723                                   */
18720 18724                                  if ((cur_time - sdinfo->satadrv_reset_time) <
18721 18725                                      drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18722 18726                                          mutex_enter(
18723 18727                                              &sata_hba_inst->satahba_mutex);
18724 18728                                          sata_hba_inst->satahba_event_flags |=
18725 18729                                              SATA_EVNT_MAIN;
18726 18730                                          mutex_exit(
18727 18731                                              &sata_hba_inst->satahba_mutex);
18728 18732                                          mutex_enter(&sata_mutex);
18729 18733                                          sata_event_pending |= SATA_EVNT_MAIN;
18730 18734                                          mutex_exit(&sata_mutex);
18731 18735                                          return;
18732 18736                                  }
18733 18737                                  if (rval_set == SATA_RETRY) {
18734 18738                                          /*
18735 18739                                           * Setting drive features failed, but
18736 18740                                           * the drive is still accessible,
18737 18741                                           * so emit a warning message before
18738 18742                                           * return.
18739 18743                                           */
18740 18744                                          mutex_exit(&SATA_CPORT_INFO(
18741 18745                                              sata_hba_inst,
18742 18746                                              saddr->cport)->cport_mutex);
18743 18747                                          goto done;
18744 18748                                  }
18745 18749                          }
18746 18750                          /* Fail the drive */
18747 18751                          sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18748 18752  
18749 18753                          sata_log(sata_hba_inst, CE_WARN,
18750 18754                              "SATA device at port %d - device failed",
18751 18755                              saddr->cport);
18752 18756  
18753 18757                          DTRACE_PROBE(port_failed_f);
18754 18758                  }
18755 18759                  /*
18756 18760                   * No point of retrying - device failed or some other event
18757 18761                   * processing or already did or will do port info cleanup.
18758 18762                   * To be safe (HBA may need it),
18759 18763                   * request clearing device reset condition.
18760 18764                   */
18761 18765                  sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
18762 18766                  sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
18763 18767                  sdinfo->satadrv_reset_time = 0;
18764 18768                  return;
18765 18769          }
18766 18770  done:
18767 18771          /*
18768 18772           * If setting of drive features failed, but the drive is still
18769 18773           * accessible, emit a warning message.
18770 18774           */
18771 18775          if (rval_set == SATA_RETRY) {
18772 18776                  sata_log(sata_hba_inst, CE_WARN,
18773 18777                      "SATA device at port %d - desired setting could not be "
18774 18778                      "restored after reset. Device may not operate as expected.",
18775 18779                      saddr->cport);
18776 18780          }
18777 18781          /*
18778 18782           * Raise the flag indicating that the next sata command could
18779 18783           * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
18780 18784           * reset is reported.
18781 18785           */
18782 18786          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18783 18787          if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
18784 18788                  sdinfo->satadrv_reset_time = 0;
18785 18789                  if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
18786 18790                          sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
18787 18791                          sdinfo->satadrv_event_flags &=
18788 18792                              ~SATA_EVNT_INPROC_DEVICE_RESET;
18789 18793                          sdinfo->satadrv_event_flags |=
18790 18794                              SATA_EVNT_CLEAR_DEVICE_RESET;
18791 18795                  }
18792 18796          }
18793 18797  }
18794 18798  
18795 18799  
18796 18800  /*
18797 18801   * Port Multiplier Port Device Reset Event processing.
18798 18802   *
18799 18803   * NOTE: This function has to be entered with pmport mutex held. It exits with
18800 18804   * mutex held as well, but can release mutex during the processing.
18801 18805   */
18802 18806  static void
18803 18807  sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
18804 18808      sata_address_t *saddr)
18805 18809  {
18806 18810          sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18807 18811          sata_drive_info_t *sdinfo = NULL;
18808 18812          sata_cport_info_t *cportinfo = NULL;
18809 18813          sata_pmport_info_t *pmportinfo = NULL;
18810 18814          sata_pmult_info_t *pminfo = NULL;
18811 18815          sata_device_t sata_device;
18812 18816          uint8_t cport = saddr->cport;
18813 18817          uint8_t pmport = saddr->pmport;
18814 18818          int rval;
18815 18819  
18816 18820          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18817 18821              "Processing drive reset at port %d:%d", cport, pmport);
18818 18822  
18819 18823          cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18820 18824          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
18821 18825          sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
18822 18826  
18823 18827          /*
18824 18828           * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18825 18829           * state, ignore reset event.
18826 18830           */
18827 18831          if (((cportinfo->cport_state &
18828 18832              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18829 18833              (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18830 18834                  sdinfo->satadrv_event_flags &=
18831 18835                      ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18832 18836                  return;
18833 18837          }
18834 18838  
18835 18839          if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
18836 18840                  /*
18837 18841                   * This should not happen - coding error.
18838 18842                   * But we can recover, so do not panic, just clean up
18839 18843                   * and if in debug mode, log the message.
18840 18844                   */
18841 18845  #ifdef SATA_DEBUG
18842 18846                  sata_log(sata_hba_inst, CE_WARN,
18843 18847                      "sata_process_pmdevice_reset: "
18844 18848                      "Invalid device type with sdinfo!", NULL);
18845 18849  #endif
18846 18850                  sdinfo->satadrv_event_flags = 0;
18847 18851                  return;
18848 18852          }
18849 18853  
18850 18854  #ifdef SATA_DEBUG
18851 18855          if ((sdinfo->satadrv_event_flags &
18852 18856              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18853 18857                  /* Nothing to do */
18854 18858                  /* Something is weird - why we are processing dev reset? */
18855 18859                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18856 18860                      "No device reset event!!!!", NULL);
18857 18861  
18858 18862                  return;
18859 18863          }
18860 18864          if ((sdinfo->satadrv_event_flags &
18861 18865              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18862 18866              (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18863 18867                  /* Something is weird - new device reset event */
18864 18868                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18865 18869                      "Overlapping device reset events!", NULL);
18866 18870          }
18867 18871  #endif
18868 18872          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18869 18873              "Processing port %d:%d device reset", cport, pmport);
18870 18874  
18871 18875          /* Clear event flag */
18872 18876          sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18873 18877  
18874 18878          /* It seems that we always need to check the port state first */
18875 18879          sata_device.satadev_rev = SATA_DEVICE_REV;
18876 18880          sata_device.satadev_addr = *saddr;
18877 18881          /*
18878 18882           * We have to exit mutex, because the HBA probe port function may
18879 18883           * block on its own mutex.
18880 18884           */
18881 18885          mutex_exit(&pmportinfo->pmport_mutex);
18882 18886          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18883 18887              (SATA_DIP(sata_hba_inst), &sata_device);
18884 18888          mutex_enter(&pmportinfo->pmport_mutex);
18885 18889  
18886 18890          sata_update_pmport_info(sata_hba_inst, &sata_device);
18887 18891          if (rval != SATA_SUCCESS) {
18888 18892                  /* Something went wrong? Fail the port */
18889 18893                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
18890 18894                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18891 18895                      saddr->pmport);
18892 18896                  if (sdinfo != NULL)
18893 18897                          sdinfo->satadrv_event_flags = 0;
18894 18898                  mutex_exit(&pmportinfo->pmport_mutex);
18895 18899                  SATA_LOG_D((sata_hba_inst, CE_WARN,
18896 18900                      "SATA port %d:%d probing failed",
18897 18901                      saddr->cport, saddr->pmport));
18898 18902                  mutex_enter(&pmportinfo->pmport_mutex);
18899 18903                  return;
18900 18904          }
18901 18905          if ((sata_device.satadev_scr.sstatus  &
18902 18906              SATA_PORT_DEVLINK_UP_MASK) !=
18903 18907              SATA_PORT_DEVLINK_UP ||
18904 18908              sata_device.satadev_type == SATA_DTYPE_NONE) {
18905 18909                  /*
18906 18910                   * No device to process, anymore. Some other event processing
18907 18911                   * would or have already performed port info cleanup.
18908 18912                   * To be safe (HBA may need it), request clearing device
18909 18913                   * reset condition.
18910 18914                   */
18911 18915                  sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18912 18916                      saddr->pmport);
18913 18917                  if (sdinfo != NULL) {
18914 18918                          sdinfo->satadrv_event_flags &=
18915 18919                              ~SATA_EVNT_INPROC_DEVICE_RESET;
18916 18920                          /* must clear flags on cport */
18917 18921                          pminfo = SATA_PMULT_INFO(sata_hba_inst,
18918 18922                              saddr->cport);
18919 18923                          pminfo->pmult_event_flags |=
18920 18924                              SATA_EVNT_CLEAR_DEVICE_RESET;
18921 18925                  }
18922 18926                  return;
18923 18927          }
18924 18928  
18925 18929          sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18926 18930              saddr->pmport);
18927 18931          if (sdinfo == NULL) {
18928 18932                  return;
18929 18933          }
18930 18934          if ((sdinfo->satadrv_event_flags &
18931 18935              SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18932 18936                  /*
18933 18937                   * Start tracking time for device feature restoration and
18934 18938                   * identification. Save current time (lbolt value).
18935 18939                   */
18936 18940                  sdinfo->satadrv_reset_time = ddi_get_lbolt();
18937 18941          }
18938 18942          /* Mark device reset processing as active */
18939 18943          sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18940 18944  
18941 18945          old_sdinfo = *sdinfo;   /* local copy of the drive info */
18942 18946          mutex_exit(&pmportinfo->pmport_mutex);
18943 18947  
18944 18948          if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
18945 18949              SATA_FAILURE) {
18946 18950                  /*
18947 18951                   * Restoring drive setting failed.
18948 18952                   * Probe the port first, to check if the port state has changed
18949 18953                   */
18950 18954                  sata_device.satadev_rev = SATA_DEVICE_REV;
18951 18955                  sata_device.satadev_addr = *saddr;
18952 18956                  sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
18953 18957  
18954 18958                  /* probe port */
18955 18959                  rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18956 18960                      (SATA_DIP(sata_hba_inst), &sata_device);
18957 18961                  mutex_enter(&pmportinfo->pmport_mutex);
18958 18962                  if (rval == SATA_SUCCESS &&
18959 18963                      (sata_device.satadev_state &
18960 18964                      (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18961 18965                      (sata_device.satadev_scr.sstatus  &
18962 18966                      SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18963 18967                      sata_device.satadev_type != SATA_DTYPE_NONE) {
18964 18968                          /*
18965 18969                           * We may retry this a bit later - in-process reset
18966 18970                           * condition should be already set.
18967 18971                           * Track retry time for device identification.
18968 18972                           */
18969 18973                          if ((pmportinfo->pmport_dev_type &
18970 18974                              SATA_VALID_DEV_TYPE) != 0 &&
18971 18975                              SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
18972 18976                              sdinfo->satadrv_reset_time != 0) {
18973 18977                                  clock_t cur_time = ddi_get_lbolt();
18974 18978                                  /*
18975 18979                                   * If the retry time limit was not
18976 18980                                   * exceeded, retry.
18977 18981                                   */
18978 18982                                  if ((cur_time - sdinfo->satadrv_reset_time) <
18979 18983                                      drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18980 18984                                          mutex_enter(
18981 18985                                              &sata_hba_inst->satahba_mutex);
18982 18986                                          sata_hba_inst->satahba_event_flags |=
18983 18987                                              SATA_EVNT_MAIN;
18984 18988                                          mutex_exit(
18985 18989                                              &sata_hba_inst->satahba_mutex);
18986 18990                                          mutex_enter(&sata_mutex);
18987 18991                                          sata_event_pending |= SATA_EVNT_MAIN;
18988 18992                                          mutex_exit(&sata_mutex);
18989 18993                                          return;
18990 18994                                  }
18991 18995                          }
18992 18996                          /* Fail the drive */
18993 18997                          sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18994 18998  
18995 18999                          sata_log(sata_hba_inst, CE_WARN,
18996 19000                              "SATA device at port %d:%d - device failed",
18997 19001                              saddr->cport, saddr->pmport);
18998 19002                  } else {
18999 19003                          /*
19000 19004                           * No point of retrying - some other event processing
19001 19005                           * would or already did port info cleanup.
19002 19006                           * To be safe (HBA may need it),
19003 19007                           * request clearing device reset condition.
19004 19008                           */
19005 19009                          sdinfo->satadrv_event_flags |=
19006 19010                              SATA_EVNT_CLEAR_DEVICE_RESET;
19007 19011                  }
19008 19012                  sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19009 19013                  sdinfo->satadrv_reset_time = 0;
19010 19014                  return;
19011 19015          }
19012 19016          /*
19013 19017           * Raise the flag indicating that the next sata command could
19014 19018           * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19015 19019           * reset is reported.
19016 19020           */
19017 19021          mutex_enter(&pmportinfo->pmport_mutex);
19018 19022          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19019 19023                  sdinfo->satadrv_reset_time = 0;
19020 19024                  if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19021 19025                          sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19022 19026                          sdinfo->satadrv_event_flags &=
19023 19027                              ~SATA_EVNT_INPROC_DEVICE_RESET;
19024 19028                          /* must clear flags on cport */
19025 19029                          pminfo = SATA_PMULT_INFO(sata_hba_inst,
19026 19030                              saddr->cport);
19027 19031                          pminfo->pmult_event_flags |=
19028 19032                              SATA_EVNT_CLEAR_DEVICE_RESET;
19029 19033                  }
19030 19034          }
19031 19035  }
19032 19036  
19033 19037  /*
19034 19038   * Port Link Events processing.
19035 19039   * Every link established event may involve device reset (due to
19036 19040   * COMRESET signal, equivalent of the hard reset) so arbitrarily
19037 19041   * set device reset event for an attached device (if any).
19038 19042   * If the port is in SHUTDOWN or FAILED state, ignore link events.
19039 19043   *
19040 19044   * The link established event processing varies, depending on the state
19041 19045   * of the target node, HBA hotplugging capabilities, state of the port.
19042 19046   * If the link is not active, the link established event is ignored.
19043 19047   * If HBA cannot detect device attachment and there is no target node,
19044 19048   * the link established event triggers device attach event processing.
19045 19049   * Else, link established event triggers device reset event processing.
19046 19050   *
19047 19051   * The link lost event processing varies, depending on a HBA hotplugging
19048 19052   * capability and the state of the port (link active or not active).
19049 19053   * If the link is active, the lost link event is ignored.
19050 19054   * If HBA cannot detect device removal, the lost link event triggers
19051 19055   * device detached event processing after link lost timeout.
19052 19056   * Else, the event is ignored.
19053 19057   *
19054 19058   * NOTE: Port multiplier ports events are handled by
19055 19059   * sata_process_pmport_link_events();
19056 19060   */
19057 19061  static void
19058 19062  sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19059 19063      sata_address_t *saddr)
19060 19064  {
19061 19065          sata_device_t sata_device;
19062 19066          sata_cport_info_t *cportinfo;
19063 19067          sata_drive_info_t *sdinfo;
19064 19068          uint32_t event_flags;
19065 19069          int rval;
19066 19070  
19067 19071          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19068 19072              "Processing port %d link event(s)", saddr->cport);
19069 19073  
19070 19074          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19071 19075          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19072 19076          event_flags = cportinfo->cport_event_flags;
19073 19077  
19074 19078          /* Reset event flags first */
19075 19079          cportinfo->cport_event_flags &=
19076 19080              ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19077 19081  
19078 19082          /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19079 19083          if ((cportinfo->cport_state &
19080 19084              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19081 19085                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19082 19086                      cport_mutex);
19083 19087                  return;
19084 19088          }
19085 19089  
19086 19090          /*
19087 19091           * For the sanity sake get current port state.
19088 19092           * Set device address only. Other sata_device fields should be
19089 19093           * set by HBA driver.
19090 19094           */
19091 19095          sata_device.satadev_rev = SATA_DEVICE_REV;
19092 19096          sata_device.satadev_addr = *saddr;
19093 19097          /*
19094 19098           * We have to exit mutex, because the HBA probe port function may
19095 19099           * block on its own mutex.
19096 19100           */
19097 19101          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19098 19102          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19099 19103              (SATA_DIP(sata_hba_inst), &sata_device);
19100 19104          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19101 19105          sata_update_port_info(sata_hba_inst, &sata_device);
19102 19106          if (rval != SATA_SUCCESS) {
19103 19107                  /* Something went wrong? Fail the port */
19104 19108                  cportinfo->cport_state = SATA_PSTATE_FAILED;
19105 19109                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19106 19110                      cport_mutex);
19107 19111                  SATA_LOG_D((sata_hba_inst, CE_WARN,
19108 19112                      "SATA port %d probing failed",
19109 19113                      saddr->cport));
19110 19114                  /*
19111 19115                   * We may want to release device info structure, but
19112 19116                   * it is not necessary.
19113 19117                   */
19114 19118                  return;
19115 19119          } else {
19116 19120                  /* port probed successfully */
19117 19121                  cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19118 19122          }
19119 19123          if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19120 19124  
19121 19125                  if ((sata_device.satadev_scr.sstatus &
19122 19126                      SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19123 19127                          /* Ignore event */
19124 19128                          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19125 19129                              "Ignoring port %d link established event - "
19126 19130                              "link down",
19127 19131                              saddr->cport);
19128 19132                          goto linklost;
19129 19133                  }
19130 19134  
19131 19135                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19132 19136                      "Processing port %d link established event",
19133 19137                      saddr->cport);
19134 19138  
19135 19139                  /*
19136 19140                   * For the sanity sake check if a device is attached - check
19137 19141                   * return state of a port probing.
19138 19142                   */
19139 19143                  if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19140 19144                          /*
19141 19145                           * HBA port probe indicated that there is a device
19142 19146                           * attached. Check if the framework had device info
19143 19147                           * structure attached for this device.
19144 19148                           */
19145 19149                          if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19146 19150                                  ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19147 19151                                      NULL);
19148 19152  
19149 19153                                  sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19150 19154                                  if ((sdinfo->satadrv_type &
19151 19155                                      SATA_VALID_DEV_TYPE) != 0) {
19152 19156                                          /*
19153 19157                                           * Dev info structure is present.
19154 19158                                           * If dev_type is set to known type in
19155 19159                                           * the framework's drive info struct
19156 19160                                           * then the device existed before and
19157 19161                                           * the link was probably lost
19158 19162                                           * momentarily - in such case
19159 19163                                           * we may want to check device
19160 19164                                           * identity.
19161 19165                                           * Identity check is not supported now.
19162 19166                                           *
19163 19167                                           * Link established event
19164 19168                                           * triggers device reset event.
19165 19169                                           */
19166 19170                                          (SATA_CPORTINFO_DRV_INFO(cportinfo))->
19167 19171                                              satadrv_event_flags |=
19168 19172                                              SATA_EVNT_DEVICE_RESET;
19169 19173                                  }
19170 19174                          } else if (cportinfo->cport_dev_type ==
19171 19175                              SATA_DTYPE_NONE) {
19172 19176                                  /*
19173 19177                                   * We got new device attached! If HBA does not
19174 19178                                   * generate device attached events, trigger it
19175 19179                                   * here.
19176 19180                                   */
19177 19181                                  if (!(SATA_FEATURES(sata_hba_inst) &
19178 19182                                      SATA_CTLF_HOTPLUG)) {
19179 19183                                          cportinfo->cport_event_flags |=
19180 19184                                              SATA_EVNT_DEVICE_ATTACHED;
19181 19185                                  }
19182 19186                          }
19183 19187                          /* Reset link lost timeout */
19184 19188                          cportinfo->cport_link_lost_time = 0;
19185 19189                  }
19186 19190          }
19187 19191  linklost:
19188 19192          if (event_flags & SATA_EVNT_LINK_LOST) {
19189 19193                  if ((sata_device.satadev_scr.sstatus &
19190 19194                      SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19191 19195                          /* Ignore event */
19192 19196                          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19193 19197                              "Ignoring port %d link lost event - link is up",
19194 19198                              saddr->cport);
19195 19199                          goto done;
19196 19200                  }
19197 19201  #ifdef SATA_DEBUG
19198 19202                  if (cportinfo->cport_link_lost_time == 0) {
19199 19203                          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19200 19204                              "Processing port %d link lost event",
19201 19205                              saddr->cport);
19202 19206                  }
19203 19207  #endif
19204 19208                  /*
19205 19209                   * When HBA cannot generate device attached/detached events,
19206 19210                   * we need to track link lost time and eventually generate
19207 19211                   * device detach event.
19208 19212                   */
19209 19213                  if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19210 19214                          /* We are tracking link lost time */
19211 19215                          if (cportinfo->cport_link_lost_time == 0) {
19212 19216                                  /* save current time (lbolt value) */
19213 19217                                  cportinfo->cport_link_lost_time =
19214 19218                                      ddi_get_lbolt();
19215 19219                                  /* just keep link lost event */
19216 19220                                  cportinfo->cport_event_flags |=
19217 19221                                      SATA_EVNT_LINK_LOST;
19218 19222                          } else {
19219 19223                                  clock_t cur_time = ddi_get_lbolt();
19220 19224                                  if ((cur_time -
19221 19225                                      cportinfo->cport_link_lost_time) >=
19222 19226                                      drv_usectohz(
19223 19227                                      SATA_EVNT_LINK_LOST_TIMEOUT)) {
19224 19228                                          /* trigger device detach event */
19225 19229                                          cportinfo->cport_event_flags |=
19226 19230                                              SATA_EVNT_DEVICE_DETACHED;
19227 19231                                          cportinfo->cport_link_lost_time = 0;
19228 19232                                          SATADBG1(SATA_DBG_EVENTS,
19229 19233                                              sata_hba_inst,
19230 19234                                              "Triggering port %d "
19231 19235                                              "device detached event",
19232 19236                                              saddr->cport);
19233 19237                                  } else {
19234 19238                                          /* keep link lost event */
19235 19239                                          cportinfo->cport_event_flags |=
19236 19240                                              SATA_EVNT_LINK_LOST;
19237 19241                                  }
19238 19242                          }
19239 19243                  }
19240 19244                  /*
19241 19245                   * We could change port state to disable/delay access to
19242 19246                   * the attached device until the link is recovered.
19243 19247                   */
19244 19248          }
19245 19249  done:
19246 19250          event_flags = cportinfo->cport_event_flags;
19247 19251          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19248 19252          if (event_flags != 0) {
19249 19253                  mutex_enter(&sata_hba_inst->satahba_mutex);
19250 19254                  sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19251 19255                  mutex_exit(&sata_hba_inst->satahba_mutex);
19252 19256                  mutex_enter(&sata_mutex);
19253 19257                  sata_event_pending |= SATA_EVNT_MAIN;
19254 19258                  mutex_exit(&sata_mutex);
19255 19259          }
19256 19260  }
19257 19261  
19258 19262  /*
19259 19263   * Port Multiplier Port Link Events processing.
19260 19264   */
19261 19265  static void
19262 19266  sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
19263 19267      sata_address_t *saddr)
19264 19268  {
19265 19269          sata_device_t sata_device;
19266 19270          sata_pmport_info_t *pmportinfo = NULL;
19267 19271          sata_drive_info_t *sdinfo = NULL;
19268 19272          uint32_t event_flags;
19269 19273          uint8_t cport = saddr->cport;
19270 19274          uint8_t pmport = saddr->pmport;
19271 19275          int rval;
19272 19276  
19273 19277          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19274 19278              "Processing port %d:%d link event(s)",
19275 19279              cport, pmport);
19276 19280  
19277 19281          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19278 19282          mutex_enter(&pmportinfo->pmport_mutex);
19279 19283          event_flags = pmportinfo->pmport_event_flags;
19280 19284  
19281 19285          /* Reset event flags first */
19282 19286          pmportinfo->pmport_event_flags &=
19283 19287              ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19284 19288  
19285 19289          /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19286 19290          if ((pmportinfo->pmport_state &
19287 19291              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19288 19292                  mutex_exit(&pmportinfo->pmport_mutex);
19289 19293                  return;
19290 19294          }
19291 19295  
19292 19296          /*
19293 19297           * For the sanity sake get current port state.
19294 19298           * Set device address only. Other sata_device fields should be
19295 19299           * set by HBA driver.
19296 19300           */
19297 19301          sata_device.satadev_rev = SATA_DEVICE_REV;
19298 19302          sata_device.satadev_addr = *saddr;
19299 19303          /*
19300 19304           * We have to exit mutex, because the HBA probe port function may
19301 19305           * block on its own mutex.
19302 19306           */
19303 19307          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19304 19308              saddr->pmport));
19305 19309          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19306 19310              (SATA_DIP(sata_hba_inst), &sata_device);
19307 19311          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19308 19312              saddr->pmport));
19309 19313          sata_update_pmport_info(sata_hba_inst, &sata_device);
19310 19314          if (rval != SATA_SUCCESS) {
19311 19315                  /* Something went wrong? Fail the port */
19312 19316                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19313 19317                  mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19314 19318                      saddr->pmport));
19315 19319                  SATA_LOG_D((sata_hba_inst, CE_WARN,
19316 19320                      "SATA port %d:%d probing failed",
19317 19321                      saddr->cport, saddr->pmport));
19318 19322                  /*
19319 19323                   * We may want to release device info structure, but
19320 19324                   * it is not necessary.
19321 19325                   */
19322 19326                  return;
19323 19327          } else {
19324 19328                  /* port probed successfully */
19325 19329                  pmportinfo->pmport_state |=
19326 19330                      SATA_STATE_PROBED | SATA_STATE_READY;
19327 19331          }
19328 19332          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
19329 19333              saddr->cport, saddr->pmport));
19330 19334          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
19331 19335              saddr->cport, saddr->pmport));
19332 19336          if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19333 19337  
19334 19338                  if ((sata_device.satadev_scr.sstatus &
19335 19339                      SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19336 19340                          /* Ignore event */
19337 19341                          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19338 19342                              "Ignoring port %d:%d link established event - "
19339 19343                              "link down",
19340 19344                              saddr->cport, saddr->pmport);
19341 19345                          goto linklost;
19342 19346                  }
19343 19347  
19344 19348                  SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19345 19349                      "Processing port %d:%d link established event",
19346 19350                      cport, pmport);
19347 19351  
19348 19352                  /*
19349 19353                   * For the sanity sake check if a device is attached - check
19350 19354                   * return state of a port probing.
19351 19355                   */
19352 19356                  if (sata_device.satadev_type != SATA_DTYPE_NONE &&
19353 19357                      sata_device.satadev_type != SATA_DTYPE_PMULT) {
19354 19358                          /*
19355 19359                           * HBA port probe indicated that there is a device
19356 19360                           * attached. Check if the framework had device info
19357 19361                           * structure attached for this device.
19358 19362                           */
19359 19363                          if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
19360 19364                                  ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
19361 19365                                      NULL);
19362 19366  
19363 19367                                  sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19364 19368                                  if ((sdinfo->satadrv_type &
19365 19369                                      SATA_VALID_DEV_TYPE) != 0) {
19366 19370                                          /*
19367 19371                                           * Dev info structure is present.
19368 19372                                           * If dev_type is set to known type in
19369 19373                                           * the framework's drive info struct
19370 19374                                           * then the device existed before and
19371 19375                                           * the link was probably lost
19372 19376                                           * momentarily - in such case
19373 19377                                           * we may want to check device
19374 19378                                           * identity.
19375 19379                                           * Identity check is not supported now.
19376 19380                                           *
19377 19381                                           * Link established event
19378 19382                                           * triggers device reset event.
19379 19383                                           */
19380 19384                                          (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
19381 19385                                              satadrv_event_flags |=
19382 19386                                              SATA_EVNT_DEVICE_RESET;
19383 19387                                  }
19384 19388                          } else if (pmportinfo->pmport_dev_type ==
19385 19389                              SATA_DTYPE_NONE) {
19386 19390                                  /*
19387 19391                                   * We got new device attached! If HBA does not
19388 19392                                   * generate device attached events, trigger it
19389 19393                                   * here.
19390 19394                                   */
19391 19395                                  if (!(SATA_FEATURES(sata_hba_inst) &
19392 19396                                      SATA_CTLF_HOTPLUG)) {
19393 19397                                          pmportinfo->pmport_event_flags |=
19394 19398                                              SATA_EVNT_DEVICE_ATTACHED;
19395 19399                                  }
19396 19400                          }
19397 19401                          /* Reset link lost timeout */
19398 19402                          pmportinfo->pmport_link_lost_time = 0;
19399 19403                  }
19400 19404          }
19401 19405  linklost:
19402 19406          if (event_flags & SATA_EVNT_LINK_LOST) {
19403 19407  #ifdef SATA_DEBUG
19404 19408                  if (pmportinfo->pmport_link_lost_time == 0) {
19405 19409                          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19406 19410                              "Processing port %d:%d link lost event",
19407 19411                              saddr->cport, saddr->pmport);
19408 19412                  }
19409 19413  #endif
19410 19414                  if ((sata_device.satadev_scr.sstatus &
19411 19415                      SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19412 19416                          /* Ignore event */
19413 19417                          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19414 19418                              "Ignoring port %d:%d link lost event - link is up",
19415 19419                              saddr->cport, saddr->pmport);
19416 19420                          goto done;
19417 19421                  }
19418 19422                  /*
19419 19423                   * When HBA cannot generate device attached/detached events,
19420 19424                   * we need to track link lost time and eventually generate
19421 19425                   * device detach event.
19422 19426                   */
19423 19427                  if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19424 19428                          /* We are tracking link lost time */
19425 19429                          if (pmportinfo->pmport_link_lost_time == 0) {
19426 19430                                  /* save current time (lbolt value) */
19427 19431                                  pmportinfo->pmport_link_lost_time =
19428 19432                                      ddi_get_lbolt();
19429 19433                                  /* just keep link lost event */
19430 19434                                  pmportinfo->pmport_event_flags |=
19431 19435                                      SATA_EVNT_LINK_LOST;
19432 19436                          } else {
19433 19437                                  clock_t cur_time = ddi_get_lbolt();
19434 19438                                  if ((cur_time -
19435 19439                                      pmportinfo->pmport_link_lost_time) >=
19436 19440                                      drv_usectohz(
19437 19441                                      SATA_EVNT_LINK_LOST_TIMEOUT)) {
19438 19442                                          /* trigger device detach event */
19439 19443                                          pmportinfo->pmport_event_flags |=
19440 19444                                              SATA_EVNT_DEVICE_DETACHED;
19441 19445                                          pmportinfo->pmport_link_lost_time = 0;
19442 19446                                          SATADBG2(SATA_DBG_EVENTS,
19443 19447                                              sata_hba_inst,
19444 19448                                              "Triggering port %d:%d "
19445 19449                                              "device detached event",
19446 19450                                              saddr->cport, saddr->pmport);
19447 19451                                  } else {
19448 19452                                          /* keep link lost event */
19449 19453                                          pmportinfo->pmport_event_flags |=
19450 19454                                              SATA_EVNT_LINK_LOST;
19451 19455                                  }
19452 19456                          }
19453 19457                  }
19454 19458                  /*
19455 19459                   * We could change port state to disable/delay access to
19456 19460                   * the attached device until the link is recovered.
19457 19461                   */
19458 19462          }
19459 19463  done:
19460 19464          event_flags = pmportinfo->pmport_event_flags;
19461 19465          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19462 19466              saddr->pmport));
19463 19467          if (event_flags != 0) {
19464 19468                  mutex_enter(&sata_hba_inst->satahba_mutex);
19465 19469                  sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19466 19470                  mutex_exit(&sata_hba_inst->satahba_mutex);
19467 19471                  mutex_enter(&sata_mutex);
19468 19472                  sata_event_pending |= SATA_EVNT_MAIN;
19469 19473                  mutex_exit(&sata_mutex);
19470 19474          }
19471 19475  }
19472 19476  
19473 19477  /*
19474 19478   * Device Detached Event processing.
19475 19479   * Port is probed to find if a device is really gone. If so,
19476 19480   * the device info structure is detached from the SATA port info structure
19477 19481   * and released.
19478 19482   * Port status is updated.
19479 19483   *
19480 19484   * NOTE: Port multiplier ports events are handled by
19481 19485   * sata_process_pmdevice_detached()
19482 19486   */
19483 19487  static void
19484 19488  sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
19485 19489      sata_address_t *saddr)
19486 19490  {
19487 19491          sata_cport_info_t *cportinfo;
19488 19492          sata_pmport_info_t *pmportinfo;
19489 19493          sata_drive_info_t *sdevinfo;
19490 19494          sata_device_t sata_device;
19491 19495          sata_address_t pmport_addr;
19492 19496          char name[16];
19493 19497          uint8_t cport = saddr->cport;
19494 19498          int npmport;
19495 19499          int rval;
19496 19500  
19497 19501          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19498 19502              "Processing port %d device detached", saddr->cport);
19499 19503  
19500 19504          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19501 19505          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19502 19506          /* Clear event flag */
19503 19507          cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19504 19508  
19505 19509          /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19506 19510          if ((cportinfo->cport_state &
19507 19511              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19508 19512                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19509 19513                      cport_mutex);
19510 19514                  return;
19511 19515          }
19512 19516          /* For sanity, re-probe the port */
19513 19517          sata_device.satadev_rev = SATA_DEVICE_REV;
19514 19518          sata_device.satadev_addr = *saddr;
19515 19519  
19516 19520          /*
19517 19521           * We have to exit mutex, because the HBA probe port function may
19518 19522           * block on its own mutex.
19519 19523           */
19520 19524          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19521 19525          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19522 19526              (SATA_DIP(sata_hba_inst), &sata_device);
19523 19527          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19524 19528          sata_update_port_info(sata_hba_inst, &sata_device);
19525 19529          if (rval != SATA_SUCCESS) {
19526 19530                  /* Something went wrong? Fail the port */
19527 19531                  cportinfo->cport_state = SATA_PSTATE_FAILED;
19528 19532                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19529 19533                      cport_mutex);
19530 19534                  SATA_LOG_D((sata_hba_inst, CE_WARN,
19531 19535                      "SATA port %d probing failed",
19532 19536                      saddr->cport));
19533 19537                  /*
19534 19538                   * We may want to release device info structure, but
19535 19539                   * it is not necessary.
19536 19540                   */
19537 19541                  return;
19538 19542          } else {
19539 19543                  /* port probed successfully */
19540 19544                  cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19541 19545          }
19542 19546          /*
19543 19547           * Check if a device is still attached. For sanity, check also
19544 19548           * link status - if no link, there is no device.
19545 19549           */
19546 19550          if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19547 19551              SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19548 19552              SATA_DTYPE_NONE) {
19549 19553                  /*
19550 19554                   * Device is still attached - ignore detach event.
19551 19555                   */
19552 19556                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19553 19557                      cport_mutex);
19554 19558                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19555 19559                      "Ignoring detach - device still attached to port %d",
19556 19560                      sata_device.satadev_addr.cport);
19557 19561                  return;
19558 19562          }
19559 19563          /*
19560 19564           * We need to detach and release device info structure here
19561 19565           */
19562 19566          if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19563 19567                  /*
19564 19568                   * A port-multiplier is removed.
19565 19569                   *
19566 19570                   * Calling sata_process_pmdevice_detached() does not work
19567 19571                   * here. The port multiplier is gone, so we cannot probe
19568 19572                   * sub-port any more and all pmult-related data structure must
19569 19573                   * be de-allocated immediately. Following structure of every
19570 19574                   * implemented sub-port behind the pmult are required to
19571 19575                   * released.
19572 19576                   *
19573 19577                   *   - attachment point
19574 19578                   *   - target node
19575 19579                   *   - sata_drive_info
19576 19580                   *   - sata_pmport_info
19577 19581                   */
19578 19582                  for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
19579 19583                      cport); npmport ++) {
19580 19584                          SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
19581 19585                              sata_hba_inst,
19582 19586                              "Detaching target node at port %d:%d",
19583 19587                              cport, npmport);
19584 19588  
19585 19589                          mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19586 19590  
19587 19591                          /* Remove attachment point. */
19588 19592                          name[0] = '\0';
19589 19593                          (void) sprintf(name, "%d.%d", cport, npmport);
19590 19594                          ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
19591 19595                          sata_log(sata_hba_inst, CE_NOTE,
19592 19596                              "Remove attachment point of port %d:%d",
19593 19597                              cport, npmport);
19594 19598  
19595 19599                          /* Remove target node */
19596 19600                          pmport_addr.cport = cport;
19597 19601                          pmport_addr.pmport = (uint8_t)npmport;
19598 19602                          pmport_addr.qual = SATA_ADDR_PMPORT;
19599 19603                          sata_remove_target_node(sata_hba_inst, &pmport_addr);
19600 19604  
19601 19605                          mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19602 19606  
19603 19607                          /* Release sata_pmport_info & sata_drive_info. */
19604 19608                          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19605 19609                              cport, npmport);
19606 19610                          ASSERT(pmportinfo != NULL);
19607 19611  
19608 19612                          sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19609 19613                          if (sdevinfo != NULL) {
19610 19614                                  (void) kmem_free((void *) sdevinfo,
19611 19615                                      sizeof (sata_drive_info_t));
19612 19616                          }
19613 19617  
19614 19618                          /* Release sata_pmport_info at last */
19615 19619                          (void) kmem_free((void *) pmportinfo,
19616 19620                              sizeof (sata_pmport_info_t));
19617 19621                  }
19618 19622  
19619 19623                  /* Finally, release sata_pmult_info */
19620 19624                  (void) kmem_free((void *)
19621 19625                      SATA_CPORTINFO_PMULT_INFO(cportinfo),
19622 19626                      sizeof (sata_pmult_info_t));
19623 19627                  SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
19624 19628  
19625 19629                  sata_log(sata_hba_inst, CE_WARN,
19626 19630                      "SATA port-multiplier detached at port %d", cport);
19627 19631  
19628 19632                  cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19629 19633                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19630 19634                      saddr->cport)->cport_mutex);
19631 19635          } else {
19632 19636                  if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19633 19637                          sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19634 19638                          SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19635 19639                          (void) kmem_free((void *)sdevinfo,
19636 19640                              sizeof (sata_drive_info_t));
19637 19641                  }
19638 19642                  sata_log(sata_hba_inst, CE_WARN,
19639 19643                      "SATA device detached at port %d", cport);
19640 19644  
19641 19645                  cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19642 19646                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19643 19647                      saddr->cport)->cport_mutex);
19644 19648  
19645 19649                  /*
19646 19650                   * Try to offline a device and remove target node
19647 19651                   * if it still exists
19648 19652                   */
19649 19653                  sata_remove_target_node(sata_hba_inst, saddr);
19650 19654          }
19651 19655  
19652 19656  
19653 19657          /*
19654 19658           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19655 19659           * with the hint: SE_HINT_REMOVE
19656 19660           */
19657 19661          sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19658 19662  }
19659 19663  
19660 19664  /*
19661 19665   * Port Multiplier Port Device Deattached Event processing.
19662 19666   *
19663 19667   * NOTE: No Mutex should be hold.
19664 19668   */
19665 19669  static void
19666 19670  sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
19667 19671      sata_address_t *saddr)
19668 19672  {
19669 19673          sata_pmport_info_t *pmportinfo;
19670 19674          sata_drive_info_t *sdevinfo;
19671 19675          sata_device_t sata_device;
19672 19676          int rval;
19673 19677          uint8_t cport, pmport;
19674 19678  
19675 19679          cport = saddr->cport;
19676 19680          pmport = saddr->pmport;
19677 19681  
19678 19682          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19679 19683              "Processing port %d:%d device detached",
19680 19684              cport, pmport);
19681 19685  
19682 19686          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19683 19687          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19684 19688  
19685 19689          /* Clear event flag */
19686 19690          pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19687 19691  
19688 19692          /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19689 19693          if ((pmportinfo->pmport_state &
19690 19694              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19691 19695                  mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19692 19696                  return;
19693 19697          }
19694 19698          /* For sanity, re-probe the port */
19695 19699          sata_device.satadev_rev = SATA_DEVICE_REV;
19696 19700          sata_device.satadev_addr = *saddr;
19697 19701  
19698 19702          /*
19699 19703           * We have to exit mutex, because the HBA probe port function may
19700 19704           * block on its own mutex.
19701 19705           */
19702 19706          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19703 19707          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19704 19708              (SATA_DIP(sata_hba_inst), &sata_device);
19705 19709          mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19706 19710          sata_update_pmport_info(sata_hba_inst, &sata_device);
19707 19711          if (rval != SATA_SUCCESS) {
19708 19712                  /* Something went wrong? Fail the port */
19709 19713                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19710 19714                  mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19711 19715                  SATA_LOG_D((sata_hba_inst, CE_WARN,
19712 19716                      "SATA port %d:%d probing failed",
19713 19717                      saddr->pmport));
19714 19718                  /*
19715 19719                   * We may want to release device info structure, but
19716 19720                   * it is not necessary.
19717 19721                   */
19718 19722                  return;
19719 19723          } else {
19720 19724                  /* port probed successfully */
19721 19725                  pmportinfo->pmport_state |=
19722 19726                      SATA_STATE_PROBED | SATA_STATE_READY;
19723 19727          }
19724 19728          /*
19725 19729           * Check if a device is still attached. For sanity, check also
19726 19730           * link status - if no link, there is no device.
19727 19731           */
19728 19732          if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19729 19733              SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19730 19734              SATA_DTYPE_NONE) {
19731 19735                  /*
19732 19736                   * Device is still attached - ignore detach event.
19733 19737                   */
19734 19738                  mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19735 19739                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19736 19740                      "Ignoring detach - device still attached to port %d",
19737 19741                      sata_device.satadev_addr.pmport);
19738 19742                  return;
19739 19743          }
19740 19744          /*
19741 19745           * We need to detach and release device info structure here
19742 19746           */
19743 19747          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19744 19748                  sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19745 19749                  SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
19746 19750                  (void) kmem_free((void *)sdevinfo,
19747 19751                      sizeof (sata_drive_info_t));
19748 19752          }
19749 19753          pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
19750 19754          /*
19751 19755           * Device cannot be reached anymore, even if the target node may be
19752 19756           * still present.
19753 19757           */
19754 19758          mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19755 19759  
19756 19760          /*
19757 19761           * Try to offline a device and remove target node if it still exists
19758 19762           */
19759 19763          sata_remove_target_node(sata_hba_inst, saddr);
19760 19764  
19761 19765          /*
19762 19766           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19763 19767           * with the hint: SE_HINT_REMOVE
19764 19768           */
19765 19769          sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19766 19770  }
19767 19771  
19768 19772  
19769 19773  /*
19770 19774   * Device Attached Event processing.
19771 19775   * Port state is checked to verify that a device is really attached. If so,
19772 19776   * the device info structure is created and attached to the SATA port info
19773 19777   * structure.
19774 19778   *
19775 19779   * If attached device cannot be identified or set-up, the retry for the
19776 19780   * attach processing is set-up. Subsequent daemon run would try again to
19777 19781   * identify the device, until the time limit is reached
19778 19782   * (SATA_DEV_IDENTIFY_TIMEOUT).
19779 19783   *
19780 19784   * This function cannot be called in interrupt context (it may sleep).
19781 19785   *
19782 19786   * NOTE: Port multiplier ports events are handled by
19783 19787   * sata_process_pmdevice_attached()
19784 19788   */
19785 19789  static void
19786 19790  sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
19787 19791      sata_address_t *saddr)
19788 19792  {
19789 19793          sata_cport_info_t *cportinfo = NULL;
19790 19794          sata_drive_info_t *sdevinfo = NULL;
19791 19795          sata_pmult_info_t *pmultinfo = NULL;
19792 19796          sata_pmport_info_t *pmportinfo = NULL;
19793 19797          sata_device_t sata_device;
19794 19798          dev_info_t *tdip;
19795 19799          uint32_t event_flags = 0, pmult_event_flags = 0;
19796 19800          int rval;
19797 19801          int npmport;
19798 19802  
19799 19803          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19800 19804              "Processing port %d device attached", saddr->cport);
19801 19805  
19802 19806          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19803 19807          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19804 19808  
19805 19809          /* Clear attach event flag first */
19806 19810          cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
19807 19811  
19808 19812          /* If the port is in SHUTDOWN or FAILED state, ignore event. */
19809 19813          if ((cportinfo->cport_state &
19810 19814              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19811 19815                  cportinfo->cport_dev_attach_time = 0;
19812 19816                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19813 19817                      cport_mutex);
19814 19818                  return;
19815 19819          }
19816 19820  
19817 19821          /*
19818 19822           * If the sata_drive_info structure is found attached to the port info,
19819 19823           * despite the fact the device was removed and now it is re-attached,
19820 19824           * the old drive info structure was not removed.
19821 19825           * Arbitrarily release device info structure.
19822 19826           */
19823 19827          if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19824 19828                  sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19825 19829                  SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19826 19830                  (void) kmem_free((void *)sdevinfo,
19827 19831                      sizeof (sata_drive_info_t));
19828 19832                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19829 19833                      "Arbitrarily detaching old device info.", NULL);
19830 19834          }
19831 19835          cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19832 19836  
19833 19837          /* For sanity, re-probe the port */
19834 19838          sata_device.satadev_rev = SATA_DEVICE_REV;
19835 19839          sata_device.satadev_addr = *saddr;
19836 19840  
19837 19841          /*
19838 19842           * We have to exit mutex, because the HBA probe port function may
19839 19843           * block on its own mutex.
19840 19844           */
19841 19845          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19842 19846          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19843 19847              (SATA_DIP(sata_hba_inst), &sata_device);
19844 19848          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19845 19849          sata_update_port_info(sata_hba_inst, &sata_device);
19846 19850          if (rval != SATA_SUCCESS) {
19847 19851                  /* Something went wrong? Fail the port */
19848 19852                  cportinfo->cport_state = SATA_PSTATE_FAILED;
19849 19853                  cportinfo->cport_dev_attach_time = 0;
19850 19854                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19851 19855                      cport_mutex);
19852 19856                  SATA_LOG_D((sata_hba_inst, CE_WARN,
19853 19857                      "SATA port %d probing failed",
19854 19858                      saddr->cport));
19855 19859                  return;
19856 19860          } else {
19857 19861                  /* port probed successfully */
19858 19862                  cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19859 19863          }
19860 19864          /*
19861 19865           * Check if a device is still attached. For sanity, check also
19862 19866           * link status - if no link, there is no device.
19863 19867           */
19864 19868          if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
19865 19869              SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
19866 19870              SATA_DTYPE_NONE) {
19867 19871                  /*
19868 19872                   * No device - ignore attach event.
19869 19873                   */
19870 19874                  cportinfo->cport_dev_attach_time = 0;
19871 19875                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19872 19876                      cport_mutex);
19873 19877                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19874 19878                      "Ignoring attach - no device connected to port %d",
19875 19879                      sata_device.satadev_addr.cport);
19876 19880                  return;
19877 19881          }
19878 19882  
19879 19883          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19880 19884          /*
19881 19885           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19882 19886           * with the hint: SE_HINT_INSERT
19883 19887           */
19884 19888          sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
19885 19889  
19886 19890          /*
19887 19891           * Port reprobing will take care of the creation of the device
19888 19892           * info structure and determination of the device type.
19889 19893           */
19890 19894          sata_device.satadev_addr = *saddr;
19891 19895          (void) sata_reprobe_port(sata_hba_inst, &sata_device,
19892 19896              SATA_DEV_IDENTIFY_NORETRY);
19893 19897  
19894 19898          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19895 19899              cport_mutex);
19896 19900          if ((cportinfo->cport_state & SATA_STATE_READY) &&
19897 19901              (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
19898 19902                  /* Some device is attached to the port */
19899 19903                  if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
19900 19904                          /*
19901 19905                           * A device was not successfully attached.
19902 19906                           * Track retry time for device identification.
19903 19907                           */
19904 19908                          if (cportinfo->cport_dev_attach_time != 0) {
19905 19909                                  clock_t cur_time = ddi_get_lbolt();
19906 19910                                  /*
19907 19911                                   * If the retry time limit was not exceeded,
19908 19912                                   * reinstate attach event.
19909 19913                                   */
19910 19914                                  if ((cur_time -
19911 19915                                      cportinfo->cport_dev_attach_time) <
19912 19916                                      drv_usectohz(
19913 19917                                      SATA_DEV_IDENTIFY_TIMEOUT)) {
19914 19918                                          /* OK, restore attach event */
19915 19919                                          cportinfo->cport_event_flags |=
19916 19920                                              SATA_EVNT_DEVICE_ATTACHED;
19917 19921                                  } else {
19918 19922                                          /* Timeout - cannot identify device */
19919 19923                                          cportinfo->cport_dev_attach_time = 0;
19920 19924                                          sata_log(sata_hba_inst,
19921 19925                                              CE_WARN,
19922 19926                                              "Could not identify SATA device "
19923 19927                                              "at port %d",
19924 19928                                              saddr->cport);
19925 19929                                  }
19926 19930                          } else {
19927 19931                                  /*
19928 19932                                   * Start tracking time for device
19929 19933                                   * identification.
19930 19934                                   * Save current time (lbolt value).
19931 19935                                   */
19932 19936                                  cportinfo->cport_dev_attach_time =
19933 19937                                      ddi_get_lbolt();
19934 19938                                  /* Restore attach event */
19935 19939                                  cportinfo->cport_event_flags |=
19936 19940                                      SATA_EVNT_DEVICE_ATTACHED;
19937 19941                          }
19938 19942                  } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19939 19943                          cportinfo->cport_dev_attach_time = 0;
19940 19944                          sata_log(sata_hba_inst, CE_NOTE,
19941 19945                              "SATA port-multiplier detected at port %d",
19942 19946                              saddr->cport);
19943 19947  
19944 19948                          if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
19945 19949                                  /* Log the info of new port multiplier */
19946 19950                                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19947 19951                                      saddr->cport)->cport_mutex);
19948 19952                                  sata_show_pmult_info(sata_hba_inst,
19949 19953                                      &sata_device);
19950 19954                                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19951 19955                                      saddr->cport)->cport_mutex);
19952 19956                          }
19953 19957  
19954 19958                          ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
19955 19959                          pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
19956 19960                          for (npmport = 0; npmport <
19957 19961                              pmultinfo->pmult_num_dev_ports; npmport++) {
19958 19962                                  pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19959 19963                                      saddr->cport, npmport);
19960 19964                                  ASSERT(pmportinfo != NULL);
19961 19965  
19962 19966                                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19963 19967                                      saddr->cport)->cport_mutex);
19964 19968                                  mutex_enter(&pmportinfo->pmport_mutex);
19965 19969                                  /* Marked all pmports with link events. */
19966 19970                                  pmportinfo->pmport_event_flags =
19967 19971                                      SATA_EVNT_LINK_ESTABLISHED;
19968 19972                                  pmult_event_flags |=
19969 19973                                      pmportinfo->pmport_event_flags;
19970 19974                                  mutex_exit(&pmportinfo->pmport_mutex);
19971 19975                                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19972 19976                                      saddr->cport)->cport_mutex);
19973 19977                          }
19974 19978                          /* Auto-online is not available for PMult now. */
19975 19979  
19976 19980                  } else {
19977 19981                          /*
19978 19982                           * If device was successfully attached, the subsequent
19979 19983                           * action depends on a state of the
19980 19984                           * sata_auto_online variable. If it is set to zero.
19981 19985                           * an explicit 'configure' command will be needed to
19982 19986                           * configure it. If its value is non-zero, we will
19983 19987                           * attempt to online (configure) the device.
19984 19988                           * First, log the message indicating that a device
19985 19989                           * was attached.
19986 19990                           */
19987 19991                          cportinfo->cport_dev_attach_time = 0;
19988 19992                          sata_log(sata_hba_inst, CE_WARN,
19989 19993                              "SATA device detected at port %d", saddr->cport);
19990 19994  
19991 19995                          if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19992 19996                                  sata_drive_info_t new_sdinfo;
19993 19997  
19994 19998                                  /* Log device info data */
19995 19999                                  new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
19996 20000                                      cportinfo));
19997 20001                                  sata_show_drive_info(sata_hba_inst,
19998 20002                                      &new_sdinfo);
19999 20003                          }
20000 20004  
20001 20005                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20002 20006                              saddr->cport)->cport_mutex);
20003 20007  
20004 20008                          /*
20005 20009                           * Make sure that there is no target node for that
20006 20010                           * device. If so, release it. It should not happen,
20007 20011                           * unless we had problem removing the node when
20008 20012                           * device was detached.
20009 20013                           */
20010 20014                          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20011 20015                              saddr->cport, saddr->pmport);
20012 20016                          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20013 20017                              saddr->cport)->cport_mutex);
20014 20018                          if (tdip != NULL) {
20015 20019  
20016 20020  #ifdef SATA_DEBUG
20017 20021                                  if ((cportinfo->cport_event_flags &
20018 20022                                      SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20019 20023                                          sata_log(sata_hba_inst, CE_WARN,
20020 20024                                              "sata_process_device_attached: "
20021 20025                                              "old device target node exists!");
20022 20026  #endif
20023 20027                                  /*
20024 20028                                   * target node exists - try to unconfigure
20025 20029                                   * device and remove the node.
20026 20030                                   */
20027 20031                                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20028 20032                                      saddr->cport)->cport_mutex);
20029 20033                                  rval = ndi_devi_offline(tdip,
20030 20034                                      NDI_DEVI_REMOVE);
20031 20035                                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20032 20036                                      saddr->cport)->cport_mutex);
20033 20037  
20034 20038                                  if (rval == NDI_SUCCESS) {
20035 20039                                          cportinfo->cport_event_flags &=
20036 20040                                              ~SATA_EVNT_TARGET_NODE_CLEANUP;
20037 20041                                          cportinfo->cport_tgtnode_clean = B_TRUE;
20038 20042                                  } else {
20039 20043                                          /*
20040 20044                                           * PROBLEM - the target node remained
20041 20045                                           * and it belongs to a previously
20042 20046                                           * attached device.
20043 20047                                           * This happens when the file was open
20044 20048                                           * or the node was waiting for
20045 20049                                           * resources at the time the
20046 20050                                           * associated device was removed.
20047 20051                                           * Instruct event daemon to retry the
20048 20052                                           * cleanup later.
20049 20053                                           */
20050 20054                                          sata_log(sata_hba_inst,
20051 20055                                              CE_WARN,
20052 20056                                              "Application(s) accessing "
20053 20057                                              "previously attached SATA "
20054 20058                                              "device have to release "
20055 20059                                              "it before newly inserted "
20056 20060                                              "device can be made accessible.",
20057 20061                                              saddr->cport);
20058 20062                                          cportinfo->cport_event_flags |=
20059 20063                                              SATA_EVNT_TARGET_NODE_CLEANUP;
20060 20064                                          cportinfo->cport_tgtnode_clean =
20061 20065                                              B_FALSE;
20062 20066                                  }
20063 20067                          }
20064 20068                          if (sata_auto_online != 0) {
20065 20069                                  cportinfo->cport_event_flags |=
20066 20070                                      SATA_EVNT_AUTOONLINE_DEVICE;
20067 20071                          }
20068 20072  
20069 20073                  }
20070 20074          } else {
20071 20075                  cportinfo->cport_dev_attach_time = 0;
20072 20076          }
20073 20077  
20074 20078          event_flags = cportinfo->cport_event_flags;
20075 20079          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20076 20080          if (event_flags != 0 || pmult_event_flags != 0) {
20077 20081                  mutex_enter(&sata_hba_inst->satahba_mutex);
20078 20082                  sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20079 20083                  mutex_exit(&sata_hba_inst->satahba_mutex);
20080 20084                  mutex_enter(&sata_mutex);
20081 20085                  sata_event_pending |= SATA_EVNT_MAIN;
20082 20086                  mutex_exit(&sata_mutex);
20083 20087          }
20084 20088  }
20085 20089  
20086 20090  /*
20087 20091   * Port Multiplier Port Device Attached Event processing.
20088 20092   *
20089 20093   * NOTE: No Mutex should be hold.
20090 20094   */
20091 20095  static void
20092 20096  sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20093 20097      sata_address_t *saddr)
20094 20098  {
20095 20099          sata_pmport_info_t *pmportinfo;
20096 20100          sata_drive_info_t *sdinfo;
20097 20101          sata_device_t sata_device;
20098 20102          dev_info_t *tdip;
20099 20103          uint32_t event_flags;
20100 20104          uint8_t cport = saddr->cport;
20101 20105          uint8_t pmport = saddr->pmport;
20102 20106          int rval;
20103 20107  
20104 20108          SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20105 20109              "Processing port %d:%d device attached", cport, pmport);
20106 20110  
20107 20111          pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20108 20112  
20109 20113          mutex_enter(&pmportinfo->pmport_mutex);
20110 20114  
20111 20115          /* Clear attach event flag first */
20112 20116          pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20113 20117  
20114 20118          /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20115 20119          if ((pmportinfo->pmport_state &
20116 20120              (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20117 20121                  pmportinfo->pmport_dev_attach_time = 0;
20118 20122                  mutex_exit(&pmportinfo->pmport_mutex);
20119 20123                  return;
20120 20124          }
20121 20125  
20122 20126          /*
20123 20127           * If the sata_drive_info structure is found attached to the port info,
20124 20128           * despite the fact the device was removed and now it is re-attached,
20125 20129           * the old drive info structure was not removed.
20126 20130           * Arbitrarily release device info structure.
20127 20131           */
20128 20132          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20129 20133                  sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20130 20134                  SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20131 20135                  (void) kmem_free((void *)sdinfo,
20132 20136                      sizeof (sata_drive_info_t));
20133 20137                  SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20134 20138                      "Arbitrarily detaching old device info.", NULL);
20135 20139          }
20136 20140          pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20137 20141  
20138 20142          /* For sanity, re-probe the port */
20139 20143          sata_device.satadev_rev = SATA_DEVICE_REV;
20140 20144          sata_device.satadev_addr = *saddr;
20141 20145  
20142 20146          /*
20143 20147           * We have to exit mutex, because the HBA probe port function may
20144 20148           * block on its own mutex.
20145 20149           */
20146 20150          mutex_exit(&pmportinfo->pmport_mutex);
20147 20151          rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20148 20152              (SATA_DIP(sata_hba_inst), &sata_device);
20149 20153          mutex_enter(&pmportinfo->pmport_mutex);
20150 20154  
20151 20155          sata_update_pmport_info(sata_hba_inst, &sata_device);
20152 20156          if (rval != SATA_SUCCESS) {
20153 20157                  /* Something went wrong? Fail the port */
20154 20158                  pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20155 20159                  pmportinfo->pmport_dev_attach_time = 0;
20156 20160                  mutex_exit(&pmportinfo->pmport_mutex);
20157 20161                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20158 20162                      "SATA port %d:%d probing failed", cport, pmport));
20159 20163                  return;
20160 20164          } else {
20161 20165                  /* pmport probed successfully */
20162 20166                  pmportinfo->pmport_state |=
20163 20167                      SATA_STATE_PROBED | SATA_STATE_READY;
20164 20168          }
20165 20169          /*
20166 20170           * Check if a device is still attached. For sanity, check also
20167 20171           * link status - if no link, there is no device.
20168 20172           */
20169 20173          if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20170 20174              SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20171 20175              SATA_DTYPE_NONE) {
20172 20176                  /*
20173 20177                   * No device - ignore attach event.
20174 20178                   */
20175 20179                  pmportinfo->pmport_dev_attach_time = 0;
20176 20180                  mutex_exit(&pmportinfo->pmport_mutex);
20177 20181                  SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20178 20182                      "Ignoring attach - no device connected to port %d:%d",
20179 20183                      cport, pmport);
20180 20184                  return;
20181 20185          }
20182 20186  
20183 20187          mutex_exit(&pmportinfo->pmport_mutex);
20184 20188          /*
20185 20189           * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20186 20190           * with the hint: SE_HINT_INSERT
20187 20191           */
20188 20192          sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20189 20193  
20190 20194          /*
20191 20195           * Port reprobing will take care of the creation of the device
20192 20196           * info structure and determination of the device type.
20193 20197           */
20194 20198          sata_device.satadev_addr = *saddr;
20195 20199          (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20196 20200              SATA_DEV_IDENTIFY_NORETRY);
20197 20201  
20198 20202          mutex_enter(&pmportinfo->pmport_mutex);
20199 20203          if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
20200 20204              (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
20201 20205                  /* Some device is attached to the port */
20202 20206                  if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
20203 20207                          /*
20204 20208                           * A device was not successfully attached.
20205 20209                           * Track retry time for device identification.
20206 20210                           */
20207 20211                          if (pmportinfo->pmport_dev_attach_time != 0) {
20208 20212                                  clock_t cur_time = ddi_get_lbolt();
20209 20213                                  /*
20210 20214                                   * If the retry time limit was not exceeded,
20211 20215                                   * reinstate attach event.
20212 20216                                   */
20213 20217                                  if ((cur_time -
20214 20218                                      pmportinfo->pmport_dev_attach_time) <
20215 20219                                      drv_usectohz(
20216 20220                                      SATA_DEV_IDENTIFY_TIMEOUT)) {
20217 20221                                          /* OK, restore attach event */
20218 20222                                          pmportinfo->pmport_event_flags |=
20219 20223                                              SATA_EVNT_DEVICE_ATTACHED;
20220 20224                                  } else {
20221 20225                                          /* Timeout - cannot identify device */
20222 20226                                          pmportinfo->pmport_dev_attach_time = 0;
20223 20227                                          sata_log(sata_hba_inst, CE_WARN,
20224 20228                                              "Could not identify SATA device "
20225 20229                                              "at port %d:%d",
20226 20230                                              cport, pmport);
20227 20231                                  }
20228 20232                          } else {
20229 20233                                  /*
20230 20234                                   * Start tracking time for device
20231 20235                                   * identification.
20232 20236                                   * Save current time (lbolt value).
20233 20237                                   */
20234 20238                                  pmportinfo->pmport_dev_attach_time =
20235 20239                                      ddi_get_lbolt();
20236 20240                                  /* Restore attach event */
20237 20241                                  pmportinfo->pmport_event_flags |=
20238 20242                                      SATA_EVNT_DEVICE_ATTACHED;
20239 20243                          }
20240 20244                  } else {
20241 20245                          /*
20242 20246                           * If device was successfully attached, the subsequent
20243 20247                           * action depends on a state of the
20244 20248                           * sata_auto_online variable. If it is set to zero.
20245 20249                           * an explicit 'configure' command will be needed to
20246 20250                           * configure it. If its value is non-zero, we will
20247 20251                           * attempt to online (configure) the device.
20248 20252                           * First, log the message indicating that a device
20249 20253                           * was attached.
20250 20254                           */
20251 20255                          pmportinfo->pmport_dev_attach_time = 0;
20252 20256                          sata_log(sata_hba_inst, CE_WARN,
20253 20257                              "SATA device detected at port %d:%d",
20254 20258                              cport, pmport);
20255 20259  
20256 20260                          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20257 20261                                  sata_drive_info_t new_sdinfo;
20258 20262  
20259 20263                                  /* Log device info data */
20260 20264                                  new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
20261 20265                                      pmportinfo));
20262 20266                                  sata_show_drive_info(sata_hba_inst,
20263 20267                                      &new_sdinfo);
20264 20268                          }
20265 20269  
20266 20270                          mutex_exit(&pmportinfo->pmport_mutex);
20267 20271  
20268 20272                          /*
20269 20273                           * Make sure that there is no target node for that
20270 20274                           * device. If so, release it. It should not happen,
20271 20275                           * unless we had problem removing the node when
20272 20276                           * device was detached.
20273 20277                           */
20274 20278                          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20275 20279                              saddr->cport, saddr->pmport);
20276 20280                          mutex_enter(&pmportinfo->pmport_mutex);
20277 20281                          if (tdip != NULL) {
20278 20282  
20279 20283  #ifdef SATA_DEBUG
20280 20284                                  if ((pmportinfo->pmport_event_flags &
20281 20285                                      SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20282 20286                                          sata_log(sata_hba_inst, CE_WARN,
20283 20287                                              "sata_process_device_attached: "
20284 20288                                              "old device target node exists!");
20285 20289  #endif
20286 20290                                  /*
20287 20291                                   * target node exists - try to unconfigure
20288 20292                                   * device and remove the node.
20289 20293                                   */
20290 20294                                  mutex_exit(&pmportinfo->pmport_mutex);
20291 20295                                  rval = ndi_devi_offline(tdip,
20292 20296                                      NDI_DEVI_REMOVE);
20293 20297                                  mutex_enter(&pmportinfo->pmport_mutex);
20294 20298  
20295 20299                                  if (rval == NDI_SUCCESS) {
20296 20300                                          pmportinfo->pmport_event_flags &=
20297 20301                                              ~SATA_EVNT_TARGET_NODE_CLEANUP;
20298 20302                                          pmportinfo->pmport_tgtnode_clean =
20299 20303                                              B_TRUE;
20300 20304                                  } else {
20301 20305                                          /*
20302 20306                                           * PROBLEM - the target node remained
20303 20307                                           * and it belongs to a previously
20304 20308                                           * attached device.
20305 20309                                           * This happens when the file was open
20306 20310                                           * or the node was waiting for
20307 20311                                           * resources at the time the
20308 20312                                           * associated device was removed.
20309 20313                                           * Instruct event daemon to retry the
20310 20314                                           * cleanup later.
20311 20315                                           */
20312 20316                                          sata_log(sata_hba_inst,
20313 20317                                              CE_WARN,
20314 20318                                              "Application(s) accessing "
20315 20319                                              "previously attached SATA "
20316 20320                                              "device have to release "
20317 20321                                              "it before newly inserted "
20318 20322                                              "device can be made accessible."
20319 20323                                              "at port %d:%d",
20320 20324                                              cport, pmport);
20321 20325                                          pmportinfo->pmport_event_flags |=
20322 20326                                              SATA_EVNT_TARGET_NODE_CLEANUP;
20323 20327                                          pmportinfo->pmport_tgtnode_clean =
20324 20328                                              B_FALSE;
20325 20329                                  }
20326 20330                          }
20327 20331                          if (sata_auto_online != 0) {
20328 20332                                  pmportinfo->pmport_event_flags |=
20329 20333                                      SATA_EVNT_AUTOONLINE_DEVICE;
20330 20334                          }
20331 20335  
20332 20336                  }
20333 20337          } else {
20334 20338                  pmportinfo->pmport_dev_attach_time = 0;
20335 20339          }
20336 20340  
20337 20341          event_flags = pmportinfo->pmport_event_flags;
20338 20342          mutex_exit(&pmportinfo->pmport_mutex);
20339 20343          if (event_flags != 0) {
20340 20344                  mutex_enter(&sata_hba_inst->satahba_mutex);
20341 20345                  sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20342 20346                  mutex_exit(&sata_hba_inst->satahba_mutex);
20343 20347                  mutex_enter(&sata_mutex);
20344 20348                  sata_event_pending |= SATA_EVNT_MAIN;
20345 20349                  mutex_exit(&sata_mutex);
20346 20350          }
20347 20351  
20348 20352          /* clear the reset_in_progress events */
20349 20353          if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20350 20354                  if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
20351 20355                          /* must clear flags on cport */
20352 20356                          sata_pmult_info_t *pminfo =
20353 20357                              SATA_PMULT_INFO(sata_hba_inst,
20354 20358                              saddr->cport);
20355 20359                          pminfo->pmult_event_flags |=
20356 20360                              SATA_EVNT_CLEAR_DEVICE_RESET;
20357 20361                  }
20358 20362          }
20359 20363  }
20360 20364  
20361 20365  /*
20362 20366   * Device Target Node Cleanup Event processing.
20363 20367   * If the target node associated with a sata port device is in
20364 20368   * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
20365 20369   * If the target node cannot be removed, the event flag is left intact,
20366 20370   * so that event daemon may re-run this function later.
20367 20371   *
20368 20372   * This function cannot be called in interrupt context (it may sleep).
20369 20373   *
20370 20374   * NOTE: Processes cport events only, not port multiplier ports.
20371 20375   */
20372 20376  static void
20373 20377  sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20374 20378      sata_address_t *saddr)
20375 20379  {
20376 20380          sata_cport_info_t *cportinfo;
20377 20381          dev_info_t *tdip;
20378 20382  
20379 20383          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20380 20384              "Processing port %d device target node cleanup", saddr->cport);
20381 20385  
20382 20386          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20383 20387  
20384 20388          /*
20385 20389           * Check if there is target node for that device and it is in the
20386 20390           * DEVI_DEVICE_REMOVED state. If so, release it.
20387 20391           */
20388 20392          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20389 20393              saddr->pmport);
20390 20394          if (tdip != NULL) {
20391 20395                  /*
20392 20396                   * target node exists - check if it is target node of
20393 20397                   * a removed device.
20394 20398                   */
20395 20399                  if (sata_check_device_removed(tdip) == B_TRUE) {
20396 20400                          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20397 20401                              "sata_process_target_node_cleanup: "
20398 20402                              "old device target node exists!", NULL);
20399 20403                          /*
20400 20404                           * Unconfigure and remove the target node
20401 20405                           */
20402 20406                          if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
20403 20407                              NDI_SUCCESS) {
20404 20408                                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20405 20409                                      saddr->cport)->cport_mutex);
20406 20410                                  cportinfo->cport_event_flags &=
20407 20411                                      ~SATA_EVNT_TARGET_NODE_CLEANUP;
20408 20412                                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20409 20413                                      saddr->cport)->cport_mutex);
20410 20414                                  return;
20411 20415                          }
20412 20416                          /*
20413 20417                           * Event daemon will retry the cleanup later.
20414 20418                           */
20415 20419                          mutex_enter(&sata_hba_inst->satahba_mutex);
20416 20420                          sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20417 20421                          mutex_exit(&sata_hba_inst->satahba_mutex);
20418 20422                          mutex_enter(&sata_mutex);
20419 20423                          sata_event_pending |= SATA_EVNT_MAIN;
20420 20424                          mutex_exit(&sata_mutex);
20421 20425                  }
20422 20426          } else {
20423 20427                  if (saddr->qual == SATA_ADDR_CPORT ||
20424 20428                      saddr->qual == SATA_ADDR_DCPORT) {
20425 20429                          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20426 20430                              saddr->cport)->cport_mutex);
20427 20431                          cportinfo->cport_event_flags &=
20428 20432                              ~SATA_EVNT_TARGET_NODE_CLEANUP;
20429 20433                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20430 20434                              saddr->cport)->cport_mutex);
20431 20435                  } else {
20432 20436                          /* sanity check */
20433 20437                          if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
20434 20438                              SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
20435 20439                              saddr->cport) == NULL)
20436 20440                                  return;
20437 20441                          if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20438 20442                              saddr->pmport) == NULL)
20439 20443                                  return;
20440 20444  
20441 20445                          mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20442 20446                              saddr->cport, saddr->pmport)->pmport_mutex);
20443 20447                          SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20444 20448                              saddr->pmport)->pmport_event_flags &=
20445 20449                              ~SATA_EVNT_TARGET_NODE_CLEANUP;
20446 20450                          mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20447 20451                              saddr->cport, saddr->pmport)->pmport_mutex);
20448 20452                  }
20449 20453          }
20450 20454  }
20451 20455  
20452 20456  /*
20453 20457   * Device AutoOnline Event processing.
20454 20458   * If attached device is to be onlined, an attempt is made to online this
20455 20459   * device, but only if there is no lingering (old) target node present.
20456 20460   * If the device cannot be onlined, the event flag is left intact,
20457 20461   * so that event daemon may re-run this function later.
20458 20462   *
20459 20463   * This function cannot be called in interrupt context (it may sleep).
20460 20464   *
20461 20465   * NOTE: Processes cport events only, not port multiplier ports.
20462 20466   */
20463 20467  static void
20464 20468  sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
20465 20469      sata_address_t *saddr)
20466 20470  {
20467 20471          sata_cport_info_t *cportinfo;
20468 20472          sata_drive_info_t *sdinfo;
20469 20473          sata_device_t sata_device;
20470 20474          dev_info_t *tdip;
20471 20475  
20472 20476          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20473 20477              "Processing port %d attached device auto-onlining", saddr->cport);
20474 20478  
20475 20479          cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20476 20480  
20477 20481          /*
20478 20482           * Check if device is present and recognized. If not, reset event.
20479 20483           */
20480 20484          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20481 20485          if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
20482 20486                  /* Nothing to online */
20483 20487                  cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20484 20488                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20485 20489                      saddr->cport)->cport_mutex);
20486 20490                  return;
20487 20491          }
20488 20492          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20489 20493  
20490 20494          /*
20491 20495           * Check if there is target node for this device and if it is in the
20492 20496           * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
20493 20497           * the event for later processing.
20494 20498           */
20495 20499          tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20496 20500              saddr->pmport);
20497 20501          if (tdip != NULL) {
20498 20502                  /*
20499 20503                   * target node exists - check if it is target node of
20500 20504                   * a removed device.
20501 20505                   */
20502 20506                  if (sata_check_device_removed(tdip) == B_TRUE) {
20503 20507                          SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20504 20508                              "sata_process_device_autoonline: "
20505 20509                              "old device target node exists!", NULL);
20506 20510                          /*
20507 20511                           * Event daemon will retry device onlining later.
20508 20512                           */
20509 20513                          mutex_enter(&sata_hba_inst->satahba_mutex);
20510 20514                          sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20511 20515                          mutex_exit(&sata_hba_inst->satahba_mutex);
20512 20516                          mutex_enter(&sata_mutex);
20513 20517                          sata_event_pending |= SATA_EVNT_MAIN;
20514 20518                          mutex_exit(&sata_mutex);
20515 20519                          return;
20516 20520                  }
20517 20521                  /*
20518 20522                   * If the target node is not in the 'removed" state, assume
20519 20523                   * that it belongs to this device. There is nothing more to do,
20520 20524                   * but reset the event.
20521 20525                   */
20522 20526          } else {
20523 20527  
20524 20528                  /*
20525 20529                   * Try to online the device
20526 20530                   * If there is any reset-related event, remove it. We are
20527 20531                   * configuring the device and no state restoring is needed.
20528 20532                   */
20529 20533                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20530 20534                      saddr->cport)->cport_mutex);
20531 20535                  sata_device.satadev_addr = *saddr;
20532 20536                  if (saddr->qual == SATA_ADDR_CPORT)
20533 20537                          sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
20534 20538                  else
20535 20539                          sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
20536 20540                  sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
20537 20541                  if (sdinfo != NULL) {
20538 20542                          if (sdinfo->satadrv_event_flags &
20539 20543                              (SATA_EVNT_DEVICE_RESET |
20540 20544                              SATA_EVNT_INPROC_DEVICE_RESET))
20541 20545                                  sdinfo->satadrv_event_flags = 0;
20542 20546                          sdinfo->satadrv_event_flags |=
20543 20547                              SATA_EVNT_CLEAR_DEVICE_RESET;
20544 20548  
20545 20549                          /* Need to create a new target node. */
20546 20550                          cportinfo->cport_tgtnode_clean = B_TRUE;
20547 20551                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20548 20552                              saddr->cport)->cport_mutex);
20549 20553                          tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
20550 20554                              sata_hba_inst, &sata_device.satadev_addr);
20551 20555                          if (tdip == NULL) {
20552 20556                                  /*
20553 20557                                   * Configure (onlining) failed.
20554 20558                                   * We will NOT retry
20555 20559                                   */
20556 20560                                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20557 20561                                      "sata_process_device_autoonline: "
20558 20562                                      "configuring SATA device at port %d failed",
20559 20563                                      saddr->cport));
20560 20564                          }
20561 20565                  } else {
20562 20566                          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20563 20567                              saddr->cport)->cport_mutex);
20564 20568                  }
20565 20569  
20566 20570          }
20567 20571          mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20568 20572          cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20569 20573          mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20570 20574              saddr->cport)->cport_mutex);
20571 20575  }
20572 20576  
20573 20577  
20574 20578  static void
20575 20579  sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
20576 20580      int hint)
20577 20581  {
20578 20582          char ap[MAXPATHLEN];
20579 20583          nvlist_t *ev_attr_list = NULL;
20580 20584          int err;
20581 20585  
20582 20586          /* Allocate and build sysevent attribute list */
20583 20587          err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
20584 20588          if (err != 0) {
20585 20589                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20586 20590                      "sata_gen_sysevent: "
20587 20591                      "cannot allocate memory for sysevent attributes\n"));
20588 20592                  return;
20589 20593          }
20590 20594          /* Add hint attribute */
20591 20595          err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
20592 20596          if (err != 0) {
20593 20597                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20594 20598                      "sata_gen_sysevent: "
20595 20599                      "failed to add DR_HINT attr for sysevent"));
20596 20600                  nvlist_free(ev_attr_list);
20597 20601                  return;
20598 20602          }
20599 20603          /*
20600 20604           * Add AP attribute.
20601 20605           * Get controller pathname and convert it into AP pathname by adding
20602 20606           * a target number.
20603 20607           */
20604 20608          (void) snprintf(ap, MAXPATHLEN, "/devices");
20605 20609          (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
20606 20610          (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
20607 20611              SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
20608 20612  
20609 20613          err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
20610 20614          if (err != 0) {
20611 20615                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20612 20616                      "sata_gen_sysevent: "
20613 20617                      "failed to add DR_AP_ID attr for sysevent"));
20614 20618                  nvlist_free(ev_attr_list);
20615 20619                  return;
20616 20620          }
20617 20621  
20618 20622          /* Generate/log sysevent */
20619 20623          err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
20620 20624              ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
20621 20625          if (err != DDI_SUCCESS) {
20622 20626                  SATA_LOG_D((sata_hba_inst, CE_WARN,
20623 20627                      "sata_gen_sysevent: "
20624 20628                      "cannot log sysevent, err code %x\n", err));
20625 20629          }
20626 20630  
20627 20631          nvlist_free(ev_attr_list);
20628 20632  }
20629 20633  
20630 20634  
20631 20635  
20632 20636  
20633 20637  /*
20634 20638   * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
20635 20639   */
20636 20640  static void
20637 20641  sata_set_device_removed(dev_info_t *tdip)
20638 20642  {
20639 20643          int circ;
20640 20644  
20641 20645          ASSERT(tdip != NULL);
20642 20646  
20643 20647          ndi_devi_enter(tdip, &circ);
20644 20648          mutex_enter(&DEVI(tdip)->devi_lock);
20645 20649          DEVI_SET_DEVICE_REMOVED(tdip);
20646 20650          mutex_exit(&DEVI(tdip)->devi_lock);
20647 20651          ndi_devi_exit(tdip, circ);
20648 20652  }
20649 20653  
20650 20654  
20651 20655  /*
20652 20656   * Set internal event instructing event daemon to try
20653 20657   * to perform the target node cleanup.
20654 20658   */
20655 20659  static void
20656 20660  sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20657 20661      sata_address_t *saddr)
20658 20662  {
20659 20663          if (saddr->qual == SATA_ADDR_CPORT ||
20660 20664              saddr->qual == SATA_ADDR_DCPORT) {
20661 20665                  mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20662 20666                      saddr->cport)->cport_mutex);
20663 20667                  SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
20664 20668                      SATA_EVNT_TARGET_NODE_CLEANUP;
20665 20669                  SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20666 20670                      cport_tgtnode_clean = B_FALSE;
20667 20671                  mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20668 20672                      saddr->cport)->cport_mutex);
20669 20673          } else {
20670 20674                  mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20671 20675                      saddr->cport, saddr->pmport)->pmport_mutex);
20672 20676                  SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
20673 20677                      saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
20674 20678                  SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
20675 20679                      pmport_tgtnode_clean = B_FALSE;
20676 20680                  mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20677 20681                      saddr->cport, saddr->pmport)->pmport_mutex);
20678 20682          }
20679 20683          mutex_enter(&sata_hba_inst->satahba_mutex);
20680 20684          sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20681 20685          mutex_exit(&sata_hba_inst->satahba_mutex);
20682 20686          mutex_enter(&sata_mutex);
20683 20687          sata_event_pending |= SATA_EVNT_MAIN;
20684 20688          mutex_exit(&sata_mutex);
20685 20689  }
20686 20690  
20687 20691  
20688 20692  /*
20689 20693   * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
20690 20694   * i.e. check if the target node state indicates that it belongs to a removed
20691 20695   * device.
20692 20696   *
20693 20697   * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
20694 20698   * B_FALSE otherwise.
20695 20699   */
20696 20700  static boolean_t
20697 20701  sata_check_device_removed(dev_info_t *tdip)
20698 20702  {
20699 20703          ASSERT(tdip != NULL);
20700 20704  
20701 20705          if (DEVI_IS_DEVICE_REMOVED(tdip))
20702 20706                  return (B_TRUE);
20703 20707          else
20704 20708                  return (B_FALSE);
20705 20709  }
20706 20710  
20707 20711  
20708 20712  /*
20709 20713   * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
20710 20714   */
20711 20715  static boolean_t
20712 20716  sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
20713 20717  {
20714 20718          int fm_capability = ddi_fm_capable(dip);
20715 20719          ddi_fm_error_t de;
20716 20720  
20717 20721          if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
20718 20722                  if (spx->txlt_buf_dma_handle != NULL) {
20719 20723                          ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
20720 20724                              DDI_FME_VERSION);
20721 20725                          if (de.fme_status != DDI_SUCCESS)
20722 20726                                  return (B_TRUE);
20723 20727                  }
20724 20728          }
20725 20729          return (B_FALSE);
20726 20730  }
20727 20731  
20728 20732  
20729 20733  /* ************************ FAULT INJECTTION **************************** */
20730 20734  
20731 20735  #ifdef SATA_INJECT_FAULTS
20732 20736  
20733 20737  static  uint32_t sata_fault_count = 0;
20734 20738  static  uint32_t sata_fault_suspend_count = 0;
20735 20739  
20736 20740  /*
20737 20741   * Inject sata pkt fault
20738 20742   * It modifies returned values of the sata packet.
20739 20743   * It returns immediately if:
20740 20744   * pkt fault injection is not enabled (via sata_inject_fault,
20741 20745   * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
20742 20746   * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
20743 20747   * pkt is not directed to specified fault controller/device
20744 20748   * (sata_fault_ctrl_dev and sata_fault_device).
20745 20749   * If fault controller is not specified, fault injection applies to all
20746 20750   * controllers and devices.
20747 20751   *
20748 20752   * First argument is the pointer to the executed sata packet.
20749 20753   * Second argument is a pointer to a value returned by the HBA tran_start
20750 20754   * function.
20751 20755   * Third argument specifies injected error. Injected sata packet faults
20752 20756   * are the satapkt_reason values.
20753 20757   * SATA_PKT_BUSY                -1      Not completed, busy
20754 20758   * SATA_PKT_DEV_ERROR           1       Device reported error
20755 20759   * SATA_PKT_QUEUE_FULL          2       Not accepted, queue full
20756 20760   * SATA_PKT_PORT_ERROR          3       Not completed, port error
20757 20761   * SATA_PKT_CMD_UNSUPPORTED     4       Cmd unsupported
20758 20762   * SATA_PKT_ABORTED             5       Aborted by request
20759 20763   * SATA_PKT_TIMEOUT             6       Operation timeut
20760 20764   * SATA_PKT_RESET               7       Aborted by reset request
20761 20765   *
20762 20766   * Additional global variables affecting the execution:
20763 20767   *
20764 20768   * sata_inject_fault_count variable specifies number of times in row the
20765 20769   * error is injected. Value of -1 specifies permanent fault, ie. every time
20766 20770   * the fault injection point is reached, the fault is injected and a pause
20767 20771   * between fault injection specified by sata_inject_fault_pause_count is
20768 20772   * ignored). Fault injection routine decrements sata_inject_fault_count
20769 20773   * (if greater than zero) until it reaches 0. No fault is injected when
20770 20774   * sata_inject_fault_count is 0 (zero).
20771 20775   *
20772 20776   * sata_inject_fault_pause_count variable specifies number of times a fault
20773 20777   * injection is bypassed (pause between fault injections).
20774 20778   * If set to 0, a fault is injected only a number of times specified by
20775 20779   * sata_inject_fault_count.
20776 20780   *
20777 20781   * The fault counts are static, so for periodic errors they have to be manually
20778 20782   * reset to start repetition sequence from scratch.
20779 20783   * If the original value returned by the HBA tran_start function is not
20780 20784   * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
20781 20785   * is injected (to avoid masking real problems);
20782 20786   *
20783 20787   * NOTE: In its current incarnation, this function should be invoked only for
20784 20788   * commands executed in SYNCHRONOUS mode.
20785 20789   */
20786 20790  
20787 20791  
20788 20792  static void
20789 20793  sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
20790 20794  {
20791 20795  
20792 20796          if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
20793 20797                  return;
20794 20798  
20795 20799          if (sata_inject_fault_count == 0)
20796 20800                  return;
20797 20801  
20798 20802          if (fault == 0)
20799 20803                  return;
20800 20804  
20801 20805          if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
20802 20806                  return;
20803 20807  
20804 20808          if (sata_fault_ctrl != NULL) {
20805 20809                  sata_pkt_txlate_t *spx =
20806 20810                      (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
20807 20811  
20808 20812                  if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
20809 20813                      spx->txlt_sata_hba_inst->satahba_dip)
20810 20814                          return;
20811 20815  
20812 20816                  if (sata_fault_device.satadev_addr.cport !=
20813 20817                      spkt->satapkt_device.satadev_addr.cport ||
20814 20818                      sata_fault_device.satadev_addr.pmport !=
20815 20819                      spkt->satapkt_device.satadev_addr.pmport ||
20816 20820                      sata_fault_device.satadev_addr.qual !=
20817 20821                      spkt->satapkt_device.satadev_addr.qual)
20818 20822                          return;
20819 20823          }
20820 20824  
20821 20825          /* Modify pkt return parameters */
20822 20826          if (*rval != SATA_TRAN_ACCEPTED ||
20823 20827              spkt->satapkt_reason != SATA_PKT_COMPLETED) {
20824 20828                  sata_fault_count = 0;
20825 20829                  sata_fault_suspend_count = 0;
20826 20830                  return;
20827 20831          }
20828 20832          if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
20829 20833                  /* Pause in the injection */
20830 20834                  sata_fault_suspend_count -= 1;
20831 20835                  return;
20832 20836          }
20833 20837  
20834 20838          if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
20835 20839                  /*
20836 20840                   * Init inject fault cycle. If fault count is set to -1,
20837 20841                   * it is a permanent fault.
20838 20842                   */
20839 20843                  if (sata_inject_fault_count != -1) {
20840 20844                          sata_fault_count = sata_inject_fault_count;
20841 20845                          sata_fault_suspend_count =
20842 20846                              sata_inject_fault_pause_count;
20843 20847                          if (sata_fault_suspend_count == 0)
20844 20848                                  sata_inject_fault_count = 0;
20845 20849                  }
20846 20850          }
20847 20851  
20848 20852          if (sata_fault_count != 0)
20849 20853                  sata_fault_count -= 1;
20850 20854  
20851 20855          switch (fault) {
20852 20856          case SATA_PKT_BUSY:
20853 20857                  *rval = SATA_TRAN_BUSY;
20854 20858                  spkt->satapkt_reason = SATA_PKT_BUSY;
20855 20859                  break;
20856 20860  
20857 20861          case SATA_PKT_QUEUE_FULL:
20858 20862                  *rval = SATA_TRAN_QUEUE_FULL;
20859 20863                  spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
20860 20864                  break;
20861 20865  
20862 20866          case SATA_PKT_CMD_UNSUPPORTED:
20863 20867                  *rval = SATA_TRAN_CMD_UNSUPPORTED;
20864 20868                  spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
20865 20869                  break;
20866 20870  
20867 20871          case SATA_PKT_PORT_ERROR:
20868 20872                  /* This is "rejected" command */
20869 20873                  *rval = SATA_TRAN_PORT_ERROR;
20870 20874                  spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
20871 20875                  /* Additional error setup could be done here - port state */
20872 20876                  break;
20873 20877  
20874 20878          case SATA_PKT_DEV_ERROR:
20875 20879                  spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
20876 20880                  /*
20877 20881                   * Additional error setup could be done here
20878 20882                   */
20879 20883                  break;
20880 20884  
20881 20885          case SATA_PKT_ABORTED:
20882 20886                  spkt->satapkt_reason = SATA_PKT_ABORTED;
20883 20887                  break;
20884 20888  
20885 20889          case SATA_PKT_TIMEOUT:
20886 20890                  spkt->satapkt_reason = SATA_PKT_TIMEOUT;
20887 20891                  /* Additional error setup could be done here */
20888 20892                  break;
20889 20893  
20890 20894          case SATA_PKT_RESET:
20891 20895                  spkt->satapkt_reason = SATA_PKT_RESET;
20892 20896                  /*
20893 20897                   * Additional error setup could be done here - device reset
20894 20898                   */
20895 20899                  break;
20896 20900  
20897 20901          default:
20898 20902                  break;
20899 20903          }
20900 20904  }
20901 20905  
20902 20906  #endif
20903 20907  
20904 20908  /*
20905 20909   * SATA Trace Ring Buffer
20906 20910   * ----------------------
20907 20911   *
20908 20912   * Overview
20909 20913   *
20910 20914   * The SATA trace ring buffer is a ring buffer created and managed by
20911 20915   * the SATA framework module that can be used by any module or driver
20912 20916   * within the SATA framework to store debug messages.
20913 20917   *
20914 20918   * Ring Buffer Interfaces:
20915 20919   *
20916 20920   *      sata_vtrace_debug()     <-- Adds debug message to ring buffer
20917 20921   *      sata_trace_debug()      <-- Wraps varargs into sata_vtrace_debug()
20918 20922   *
20919 20923   *      Note that the sata_trace_debug() interface was created to give
20920 20924   *      consumers the flexibilty of sending debug messages to ring buffer
20921 20925   *      as variable arguments.  Consumers can send type va_list debug
20922 20926   *      messages directly to sata_vtrace_debug(). The sata_trace_debug()
20923 20927   *      and sata_vtrace_debug() relationship is similar to that of
20924 20928   *      cmn_err(9F) and vcmn_err(9F).
20925 20929   *
20926 20930   * Below is a diagram of the SATA trace ring buffer interfaces and
20927 20931   * sample consumers:
20928 20932   *
20929 20933   * +---------------------------------+
20930 20934   * |    o  o  SATA Framework Module  |
20931 20935   * | o  SATA  o     +------------------+      +------------------+
20932 20936   * |o   Trace  o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
20933 20937   * |o   R-Buf  o    |sata_trace_debug  |<--+  +------------------+
20934 20938   * | o        o     +------------------+   |  +------------------+
20935 20939   * |    o  o                ^        |     +--|SATA HBA Driver #2|
20936 20940   * |                        |        |        +------------------+
20937 20941   * |           +------------------+  |
20938 20942   * |           |SATA Debug Message|  |
20939 20943   * |           +------------------+  |
20940 20944   * +---------------------------------+
20941 20945   *
20942 20946   * Supporting Routines:
20943 20947   *
20944 20948   *      sata_trace_rbuf_alloc() <-- Initializes ring buffer
20945 20949   *      sata_trace_rbuf_free()  <-- Destroys ring buffer
20946 20950   *      sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
20947 20951   *      sata_trace_dmsg_free()  <-- Destroys content of ring buffer
20948 20952   *
20949 20953   * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
20950 20954   * The ring buffer size can be adjusted by setting dmsg_ring_size in
20951 20955   * /etc/system to desired size in unit of bytes.
20952 20956   *
20953 20957   * The individual debug message size in the ring buffer is restricted
20954 20958   * to DMSG_BUF_SIZE.
20955 20959   */
20956 20960  void
20957 20961  sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
20958 20962  {
20959 20963          sata_trace_dmsg_t *dmsg;
20960 20964  
20961 20965          if (sata_debug_rbuf == NULL) {
20962 20966                  return;
20963 20967          }
20964 20968  
20965 20969          /*
20966 20970           * If max size of ring buffer is smaller than size
20967 20971           * required for one debug message then just return
20968 20972           * since we have no room for the debug message.
20969 20973           */
20970 20974          if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
20971 20975                  return;
20972 20976          }
20973 20977  
20974 20978          mutex_enter(&sata_debug_rbuf->lock);
20975 20979  
20976 20980          /* alloc or reuse on ring buffer */
20977 20981          dmsg = sata_trace_dmsg_alloc();
20978 20982  
20979 20983          if (dmsg == NULL) {
20980 20984                  /* resource allocation failed */
20981 20985                  mutex_exit(&sata_debug_rbuf->lock);
20982 20986                  return;
20983 20987          }
20984 20988  
20985 20989          dmsg->dip = dip;
20986 20990          gethrestime(&dmsg->timestamp);
20987 20991  
20988 20992          (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
20989 20993  
20990 20994          mutex_exit(&sata_debug_rbuf->lock);
20991 20995  }
20992 20996  
20993 20997  void
20994 20998  sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
20995 20999  {
20996 21000          va_list ap;
20997 21001  
20998 21002          va_start(ap, fmt);
20999 21003          sata_vtrace_debug(dip, fmt, ap);
21000 21004          va_end(ap);
21001 21005  }
21002 21006  
21003 21007  /*
21004 21008   * This routine is used to manage debug messages
21005 21009   * on ring buffer.
21006 21010   */
21007 21011  static sata_trace_dmsg_t *
21008 21012  sata_trace_dmsg_alloc(void)
21009 21013  {
21010 21014          sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21011 21015  
21012 21016          if (sata_debug_rbuf->looped == TRUE) {
21013 21017                  sata_debug_rbuf->dmsgp = dmsg->next;
21014 21018                  return (sata_debug_rbuf->dmsgp);
21015 21019          }
21016 21020  
21017 21021          /*
21018 21022           * If we're looping for the first time,
21019 21023           * connect the ring.
21020 21024           */
21021 21025          if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21022 21026              sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21023 21027                  dmsg->next = sata_debug_rbuf->dmsgh;
21024 21028                  sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21025 21029                  sata_debug_rbuf->looped = TRUE;
21026 21030                  return (sata_debug_rbuf->dmsgp);
21027 21031          }
21028 21032  
21029 21033          /* If we've gotten this far then memory allocation is needed */
21030 21034          dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21031 21035          if (dmsg_alloc == NULL) {
21032 21036                  sata_debug_rbuf->allocfailed++;
21033 21037                  return (dmsg_alloc);
21034 21038          } else {
21035 21039                  sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21036 21040          }
21037 21041  
21038 21042          if (sata_debug_rbuf->dmsgp != NULL) {
21039 21043                  dmsg->next = dmsg_alloc;
21040 21044                  sata_debug_rbuf->dmsgp = dmsg->next;
21041 21045                  return (sata_debug_rbuf->dmsgp);
21042 21046          } else {
21043 21047                  /*
21044 21048                   * We should only be here if we're initializing
21045 21049                   * the ring buffer.
21046 21050                   */
21047 21051                  if (sata_debug_rbuf->dmsgh == NULL) {
21048 21052                          sata_debug_rbuf->dmsgh = dmsg_alloc;
21049 21053                  } else {
21050 21054                          /* Something is wrong */
21051 21055                          kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21052 21056                          return (NULL);
21053 21057                  }
21054 21058  
21055 21059                  sata_debug_rbuf->dmsgp = dmsg_alloc;
21056 21060                  return (sata_debug_rbuf->dmsgp);
21057 21061          }
21058 21062  }
21059 21063  
21060 21064  
21061 21065  /*
21062 21066   * Free all messages on debug ring buffer.
21063 21067   */
21064 21068  static void
21065 21069  sata_trace_dmsg_free(void)
21066 21070  {
21067 21071          sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21068 21072  
21069 21073          while (dmsg != NULL) {
21070 21074                  dmsg_next = dmsg->next;
21071 21075                  kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21072 21076  
21073 21077                  /*
21074 21078                   * If we've looped around the ring than we're done.
21075 21079                   */
21076 21080                  if (dmsg_next == sata_debug_rbuf->dmsgh) {
21077 21081                          break;
21078 21082                  } else {
21079 21083                          dmsg = dmsg_next;
21080 21084                  }
21081 21085          }
21082 21086  }
21083 21087  
21084 21088  
21085 21089  /*
21086 21090   * This function can block
21087 21091   */
21088 21092  static void
21089 21093  sata_trace_rbuf_alloc(void)
21090 21094  {
21091 21095          sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21092 21096  
21093 21097          mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21094 21098  
21095 21099          if (dmsg_ring_size > 0) {
21096 21100                  sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21097 21101          }
21098 21102  }
21099 21103  
21100 21104  
21101 21105  static void
21102 21106  sata_trace_rbuf_free(void)
21103 21107  {
21104 21108          sata_trace_dmsg_free();
21105 21109          mutex_destroy(&sata_debug_rbuf->lock);
21106 21110          kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21107 21111  }
21108 21112  
21109 21113  /*
21110 21114   * If SATA_DEBUG is not defined then this routine is called instead
21111 21115   * of sata_log() via the SATA_LOG_D macro.
21112 21116   */
21113 21117  static void
21114 21118  sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level,
21115 21119      const char *fmt, ...)
21116 21120  {
21117 21121  #ifndef __lock_lint
21118 21122          _NOTE(ARGUNUSED(level))
21119 21123  #endif
21120 21124  
21121 21125          dev_info_t *dip = NULL;
21122 21126          va_list ap;
21123 21127  
21124 21128          if (sata_hba_inst != NULL) {
21125 21129                  dip = SATA_DIP(sata_hba_inst);
21126 21130          }
21127 21131  
21128 21132          va_start(ap, fmt);
21129 21133          sata_vtrace_debug(dip, fmt, ap);
21130 21134          va_end(ap);
21131 21135  }
  
    | 
      ↓ open down ↓ | 
    8848 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX