usr/src/uts/common/io/sata/impl/sata.c
author Phi Tran <Phi.Tran@Sun.COM>
Mon, 03 Aug 2009 12:46:12 -0700
changeset 10247 27d5d7e9cd70
parent 10131 7fe254ca5fe8
child 10318 811db323512d
permissions -rw-r--r--
6741163 sata should return check cond for mode select if cache mode change is requested but not supported 6857468 incorrect check for LLBAA bit of Mode Sense(10) command with DBD set to 0 in sata.c 6862927 sata mode sense command for page 1c returns incorrect mode page length 6862923 sata mode select command fails for multi-page commands
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     1
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     2
 * CDDL HEADER START
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     3
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     7
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    11
 * and limitations under the License.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    12
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    18
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    19
 * CDDL HEADER END
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    20
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    21
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    22
/*
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
    23
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    24
 * Use is subject to license terms.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    25
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    26
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    27
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    28
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    29
 * SATA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    30
 * Generic SATA Host Adapter Implementation
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    31
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    32
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    33
#include <sys/conf.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    34
#include <sys/file.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    35
#include <sys/ddi.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    36
#include <sys/sunddi.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    37
#include <sys/modctl.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    38
#include <sys/cmn_err.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    39
#include <sys/errno.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    40
#include <sys/thread.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    41
#include <sys/kstat.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    42
#include <sys/note.h>
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
    43
#include <sys/sysevent.h>
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
    44
#include <sys/sysevent/eventdefs.h>
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
    45
#include <sys/sysevent/dr.h>
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
    46
#include <sys/taskq.h>
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
    47
#include <sys/disp.h>
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    48
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    49
#include <sys/sata/impl/sata.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    50
#include <sys/sata/sata_hba.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    51
#include <sys/sata/sata_defs.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    52
#include <sys/sata/sata_cfgadm.h>
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    53
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    54
/* Debug flags - defined in sata.h */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    55
int	sata_debug_flags = 0;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
    56
int	sata_msg = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    57
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    58
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    59
 * Flags enabling selected SATA HBA framework functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    60
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    61
#define	SATA_ENABLE_QUEUING		1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    62
#define	SATA_ENABLE_NCQ			2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    63
#define	SATA_ENABLE_PROCESS_EVENTS	4
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
    64
int sata_func_enable =
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
    65
	SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    66
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    67
/*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    68
 * Global variable setting default maximum queue depth (NCQ or TCQ)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    69
 * Note:minimum queue depth is 1
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    70
 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    71
int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    72
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    73
/*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    74
 * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    75
 * initialization, using value from sata_max_queue_depth
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    76
 * It is adjusted to minimum supported by the controller and by the device,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    77
 * if queueing is enabled.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    78
 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    79
static	int sata_current_max_qdepth;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
    80
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    81
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    82
 * Global variable determining the default behavior after device hotpluggin.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    83
 * If non-zero, the hotplugged device is onlined (if possible) without explicit
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    84
 * IOCTL request (AP_CONFIGURE).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    85
 * If zero, hotplugged device is identified, but not onlined.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    86
 * Enabling (AP_CONNECT) device port with an attached device does not result
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    87
 * in device onlining regardless of the flag setting
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    88
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    89
int sata_auto_online = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
    90
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    91
#ifdef SATA_DEBUG
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    92
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
    93
#define	SATA_LOG_D(args)	sata_log args
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
    94
uint64_t mbuf_count = 0;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
    95
uint64_t mbuffail_count = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    96
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    97
sata_atapi_cmd_t sata_atapi_trace[64];
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    98
uint32_t sata_atapi_trace_index = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
    99
int sata_atapi_trace_save = 1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   100
static	void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   101
#define	SATAATAPITRACE(spx, count)	if (sata_atapi_trace_save) \
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   102
    sata_save_atapi_trace(spx, count);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   103
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   104
#else
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   105
#define	SATA_LOG_D(args)	sata_trace_log args
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   106
#define	SATAATAPITRACE(spx, count)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   107
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   108
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   109
#if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   110
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   111
sata_test_atapi_packet_command(sata_hba_inst_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   112
#endif
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   113
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   114
#ifdef SATA_INJECT_FAULTS
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   115
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   116
#define		SATA_INJECT_PKT_FAULT	1
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   117
uint32_t	sata_inject_fault = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   118
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   119
uint32_t	sata_inject_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   120
uint32_t	sata_inject_fault_pause_count = 0;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   121
uint32_t	sata_fault_type = 0;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   122
uint32_t	sata_fault_cmd = 0;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   123
dev_info_t	*sata_fault_ctrl = NULL;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   124
sata_device_t	sata_fault_device;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   125
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   126
static	void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   127
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   128
#endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
   129
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
   130
#define	LEGACY_HWID_LEN	64	/* Model (40) + Serial (20) + pad */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
   131
10006
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
   132
static char sata_rev_tag[] = {"1.43"};
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
   133
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   134
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   135
 * SATA cb_ops functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   136
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   137
static 	int sata_hba_open(dev_t *, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   138
static 	int sata_hba_close(dev_t, int, int, cred_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   139
static 	int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *,	int *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   140
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   141
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   142
 * SCSA required entry points
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   143
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   144
static	int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   145
    scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   146
static	int sata_scsi_tgt_probe(struct scsi_device *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   147
    int (*callback)(void));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   148
static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   149
    scsi_hba_tran_t *, struct scsi_device *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   150
static 	int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   151
static 	int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   152
static 	int sata_scsi_reset(struct scsi_address *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   153
static 	int sata_scsi_getcap(struct scsi_address *, char *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   154
static 	int sata_scsi_setcap(struct scsi_address *, char *, int, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   155
static 	struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   156
    struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   157
    caddr_t);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   158
static 	void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   159
static 	void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   160
static 	void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   161
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   162
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   163
 * SATA HBA interface functions are defined in sata_hba.h header file
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   164
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   165
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   166
/* Event processing functions */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   167
static	void sata_event_daemon(void *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   168
static	void sata_event_thread_control(int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   169
static	void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   170
static	void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   171
static	void sata_process_port_failed_event(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   172
    sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   173
static	void sata_process_port_link_events(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   174
    sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   175
static	void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   176
static	void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   177
static	void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   178
static	void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   179
static	void sata_process_target_node_cleanup(sata_hba_inst_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   180
    sata_address_t *);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   181
static	void sata_process_device_autoonline(sata_hba_inst_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   182
    sata_address_t *saddr);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   183
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   184
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   185
 * Local translation functions
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   186
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   187
static	int sata_txlt_inquiry(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   188
static	int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   189
static	int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   190
static	int sata_txlt_read_capacity(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   191
static	int sata_txlt_request_sense(sata_pkt_txlate_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   192
static	int sata_txlt_read(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   193
static	int sata_txlt_write(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   194
static	int sata_txlt_log_sense(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   195
static	int sata_txlt_log_select(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   196
static	int sata_txlt_mode_sense(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   197
static	int sata_txlt_mode_select(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   198
static	int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   199
static	int sata_txlt_write_buffer(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   200
static	int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   201
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   202
static	int sata_hba_start(sata_pkt_txlate_t *, int *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   203
static	int sata_txlt_invalid_command(sata_pkt_txlate_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   204
static	int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   205
static	int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   206
static	void sata_txlt_rw_completion(sata_pkt_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   207
static	void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   208
static	void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   209
static	int sata_emul_rw_completion(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   210
static	struct scsi_extended_sense *sata_immediate_error_response(
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   211
    sata_pkt_txlate_t *, int);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   212
static	struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   213
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   214
static	int sata_txlt_atapi(sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   215
static	void sata_txlt_atapi_completion(sata_pkt_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   216
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   217
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   218
 * Local functions for ioctl
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   219
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   220
static	int32_t sata_get_port_num(sata_hba_inst_t *,  struct devctl_iocdata *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   221
static	void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   222
    devctl_ap_state_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   223
static	dev_info_t *sata_get_target_dip(dev_info_t *, int32_t);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   224
static	dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   225
static	dev_info_t *sata_devt_to_devinfo(dev_t);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   226
static	int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   227
static	int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   228
static	int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   229
static	int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   230
static	int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   231
static	int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   232
static	int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   233
static	int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   234
static	int sata_ioctl_reset_all(sata_hba_inst_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   235
static	int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   236
static	int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   237
    sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   238
static	int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   239
    sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   240
static	int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   241
    sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   242
static	int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   243
    sata_ioctl_data_t *, int mode);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   244
static	int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   245
    sata_device_t *, sata_ioctl_data_t *, int mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   247
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   248
 * Local functions
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   249
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   250
static 	void sata_remove_hba_instance(dev_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   251
static 	int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   252
static 	void sata_probe_ports(sata_hba_inst_t *);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
   253
static 	int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
   254
static 	int sata_add_device(dev_info_t *, sata_hba_inst_t *, int cport,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
   255
    int pmport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   256
static 	dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   257
    sata_address_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   258
static 	int sata_validate_scsi_address(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   259
    struct scsi_address *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   260
static 	int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   261
static	sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   262
static	void sata_pkt_free(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   263
static	int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   264
    caddr_t, ddi_dma_attr_t *);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
   265
static	void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   266
static	int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   267
static	sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   268
    sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   269
static 	int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
   270
static	void sata_reidentify_device(sata_pkt_txlate_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   271
static	struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   272
static 	void sata_free_local_buffer(sata_pkt_txlate_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   273
static 	uint64_t sata_check_capacity(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   274
void 	sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   275
    ddi_dma_attr_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   276
static 	int sata_fetch_device_identify_data(sata_hba_inst_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   277
    sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   278
static	void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   279
static	void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   280
static	int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   281
static	int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   282
static	int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   283
static	int sata_set_drive_features(sata_hba_inst_t *,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   284
    sata_drive_info_t *, int flag);
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
   285
static	void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   286
static	int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   287
static	void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   288
    uint8_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   289
static	int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   290
    struct scsi_inquiry *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   291
static	int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   292
static	int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   293
static	int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   294
static	int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   295
static	int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   296
static	int sata_mode_select_page_8(sata_pkt_txlate_t *,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   297
    struct mode_cache_scsi3 *, int, int *, int *, int *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   298
static	int sata_mode_select_page_1a(sata_pkt_txlate_t *,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   299
    struct mode_info_power_cond *, int, int *, int *, int *);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
   300
static	int sata_mode_select_page_1c(sata_pkt_txlate_t *,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
   301
    struct mode_info_excpt_page *, int, int *, int *, int *);
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
   302
static	int sata_mode_select_page_30(sata_pkt_txlate_t *,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
   303
    struct mode_acoustic_management *, int, int *, int *, int *);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
   304
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   305
static	int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   306
static	int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   307
    sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   308
static	int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   309
    sata_hba_inst_t *);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   310
static	int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   311
    sata_hba_inst_t *);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   312
static	int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   313
    sata_pkt_txlate_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   314
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   315
static	void sata_set_arq_data(sata_pkt_t *);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   316
static	void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   317
static	void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   318
static	uint8_t sata_get_standby_timer(uint8_t *timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
   319
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   320
static	void sata_save_drive_settings(sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   321
static	void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   322
static	void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   323
static	void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   324
static	int sata_fetch_smart_return_status(sata_hba_inst_t *,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   325
    sata_drive_info_t *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   326
static	int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   327
    struct smart_data *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   328
static	int sata_smart_selftest_log(sata_hba_inst_t *,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   329
    sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   330
    struct smart_selftest_log *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   331
static	int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   332
    sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   333
static	int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   334
    uint8_t *, uint8_t, uint8_t);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   335
static	int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
   336
    struct read_log_ext_directory *);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
   337
static	void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
   338
static	void sata_xlate_errors(sata_pkt_txlate_t *);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
   339
static	void sata_decode_device_error(sata_pkt_txlate_t *,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
   340
    struct scsi_extended_sense *);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   341
static	void sata_set_device_removed(dev_info_t *);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   342
static	boolean_t sata_check_device_removed(dev_info_t *);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   343
static	void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
5225
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
   344
static	int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
   345
    sata_drive_info_t *);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   346
static	int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   347
    sata_drive_info_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   348
static	void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   349
static	void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
   350
static  void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
   351
static  int sata_check_modser(char *, int);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
   352
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
   353
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   354
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   355
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   356
 * SATA Framework will ignore SATA HBA driver cb_ops structure and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   357
 * register following one with SCSA framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   358
 * Open & close are provided, so scsi framework will not use its own
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   359
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   360
static struct cb_ops sata_cb_ops = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   361
	sata_hba_open,			/* open */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   362
	sata_hba_close,			/* close */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   363
	nodev,				/* strategy */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   364
	nodev,				/* print */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   365
	nodev,				/* dump */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   366
	nodev,				/* read */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   367
	nodev,				/* write */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   368
	sata_hba_ioctl,			/* ioctl */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   369
	nodev,				/* devmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   370
	nodev,				/* mmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   371
	nodev,				/* segmap */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   372
	nochpoll,			/* chpoll */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   373
	ddi_prop_op,			/* cb_prop_op */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   374
	0,				/* streamtab */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   375
	D_NEW | D_MP,			/* cb_flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   376
	CB_REV,				/* rev */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   377
	nodev,				/* aread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   378
	nodev				/* awrite */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   379
};
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   380
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   382
extern struct mod_ops mod_miscops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   383
extern uchar_t	scsi_cdb_size[];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   384
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   385
static struct modlmisc modlmisc = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   386
	&mod_miscops,			/* Type of module */
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
   387
	"SATA Module"			/* module name */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   388
};
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   389
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   390
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   391
static struct modlinkage modlinkage = {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   392
	MODREV_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   393
	(void *)&modlmisc,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   394
	NULL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   395
};
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   396
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   397
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   398
 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   399
 * i.e. when scsi_pkt has not timeout specified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   400
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   401
static int sata_default_pkt_time = 60;	/* 60 seconds */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   402
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   403
/*
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   404
 * Intermediate buffer device access attributes - they are required,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   405
 * but not necessarily used.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   406
 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   407
static ddi_device_acc_attr_t sata_acc_attr = {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   408
	DDI_DEVICE_ATTR_V0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   409
	DDI_STRUCTURE_LE_ACC,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   410
	DDI_STRICTORDER_ACC
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   411
};
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   412
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   413
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
   414
/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   415
 * Mutexes protecting structures in multithreaded operations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   416
 * Because events are relatively rare, a single global mutex protecting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   417
 * data structures should be sufficient. To increase performance, add
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   418
 * separate mutex per each sata port and use global mutex only to protect
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   419
 * common data structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   420
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   421
static	kmutex_t sata_mutex;		/* protects sata_hba_list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   422
static	kmutex_t sata_log_mutex;	/* protects log */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   423
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   424
static 	char sata_log_buf[256];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   425
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   426
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   427
 * sata trace debug
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   428
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   429
static	sata_trace_rbuf_t *sata_debug_rbuf;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   430
static	sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   431
static	void sata_trace_dmsg_free(void);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   432
static	void sata_trace_rbuf_alloc(void);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   433
static	void sata_trace_rbuf_free(void);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   434
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   435
int	dmsg_ring_size = DMSG_RING_SIZE;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   436
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   437
/* Default write cache setting for SATA hard disks */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   438
int	sata_write_cache = 1;		/* enabled */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   439
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   440
/* Default write cache setting for SATA ATAPI CD/DVD */
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
   441
int	sata_atapicdvd_write_cache = 1; /* enabled */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   442
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
   443
/* Default write cache setting for SATA ATAPI tape */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
   444
int	sata_atapitape_write_cache = 1; /* enabled */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
   445
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
   446
/* Default write cache setting for SATA ATAPI disk */
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
   447
int	sata_atapidisk_write_cache = 1;	/* enabled */
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
   448
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   449
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   450
 * Linked list of HBA instances
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   451
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   452
static 	sata_hba_inst_t *sata_hba_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   453
static 	sata_hba_inst_t *sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   454
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   455
 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   456
 * structure and in sata soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   457
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   458
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   459
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   460
 * Event daemon related variables
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   461
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   462
static 	kmutex_t sata_event_mutex;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   463
static 	kcondvar_t sata_event_cv;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   464
static 	kthread_t *sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   465
static 	int sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   466
static 	int sata_event_pending = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   467
static 	int sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   468
extern 	pri_t minclsyspri;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   469
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   470
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   471
 * NCQ error recovery command
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   472
 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   473
static const sata_cmd_t sata_rle_cmd = {
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   474
	SATA_CMD_REV,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   475
	NULL,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   476
	{
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   477
		SATA_DIR_READ
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   478
	},
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   479
	ATA_ADDR_LBA48,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   480
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   481
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   482
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   483
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   484
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   485
	1,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   486
	READ_LOG_EXT_NCQ_ERROR_RECOVERY,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   487
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   488
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   489
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   490
	SATAC_READ_LOG_EXT,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   491
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   492
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   493
	0,
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   494
};
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   495
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   496
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   497
 * ATAPI error recovery CDB
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   498
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   499
static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   500
	SCMD_REQUEST_SENSE,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   501
	0,			/* Only fixed RQ format is supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   502
	0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   503
	0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   504
	SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   505
	0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   506
};
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   507
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   508
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   509
/* Warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   510
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   511
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   512
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   513
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   514
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   515
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   516
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   517
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   518
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   519
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   520
_NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   521
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   522
_NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   523
_NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   524
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   525
    sata_hba_inst::satahba_scsi_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   526
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   527
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   528
_NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   529
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   530
_NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex, 
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   531
    sata_hba_inst::satahba_event_flags))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   532
_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   533
    sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   534
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   535
_NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   536
_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   537
    sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   538
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   539
_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   540
    sata_cport_info::cport_state))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   541
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   542
_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   543
    sata_pmport_info::pmport_state))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
   544
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   545
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   546
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   547
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   548
_NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   549
#ifdef SATA_DEBUG
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   550
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   551
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   552
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
   553
_NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
   554
#endif
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   555
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   556
/* End of warlock directives */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   557
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   558
/* ************** loadable module configuration functions ************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   559
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   560
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   561
_init()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   562
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   563
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   564
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   565
	mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   566
	mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   567
	mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   568
	cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   569
	sata_trace_rbuf_alloc();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   570
	if ((rval = mod_install(&modlinkage)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   571
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   572
		cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   573
#endif
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   574
		sata_trace_rbuf_free();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   575
		mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   576
		cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   577
		mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   578
		mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   579
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   580
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   581
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   582
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   583
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   584
_fini()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   585
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   586
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   587
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   588
	if ((rval = mod_remove(&modlinkage)) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   589
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   590
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
   591
	sata_trace_rbuf_free();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   592
	mutex_destroy(&sata_log_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   593
	cv_destroy(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   594
	mutex_destroy(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   595
	mutex_destroy(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   596
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   597
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   598
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   599
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   600
_info(struct modinfo *modinfop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   601
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   602
	return (mod_info(&modlinkage, modinfop));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   603
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   604
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   605
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   606
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   607
/* ********************* SATA HBA entry points ********************* */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   608
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   609
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   610
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   611
 * Called by SATA HBA from _init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   612
 * Registers HBA driver instance/sata framework pair with scsi framework, by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   613
 * calling scsi_hba_init().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   614
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   615
 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   616
 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   617
 * cb_ops pointer in SATA HBA driver dev_ops structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   618
 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   619
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   620
 * Return status of the scsi_hba_init() is returned to a calling SATA HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   621
 * driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   622
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   623
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   624
sata_hba_init(struct modlinkage *modlp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   625
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   626
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   627
	struct dev_ops *hba_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   628
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   629
	SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   630
	    "sata_hba_init: name %s \n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   631
	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   632
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   633
	 * Fill-up cb_ops and dev_ops when necessary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   634
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   635
	hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   636
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   637
	 * Provide pointer to SATA dev_ops
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   638
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   639
	hba_ops->devo_cb_ops = &sata_cb_ops;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   640
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   641
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   642
	 * Register SATA HBA with SCSI framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   643
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   644
	if ((rval = scsi_hba_init(modlp)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   645
		SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   646
		    "sata_hba_init: scsi hba init failed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   647
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   648
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   649
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   650
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   651
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   652
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   653
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   654
/* HBA attach stages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   655
#define	HBA_ATTACH_STAGE_SATA_HBA_INST	1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   656
#define	HBA_ATTACH_STAGE_SCSI_ATTACHED	2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   657
#define	HBA_ATTACH_STAGE_SETUP		4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   658
#define	HBA_ATTACH_STAGE_LINKED		8
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   659
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   660
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   661
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   662
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   663
 * Called from SATA HBA driver's attach routine to attach an instance of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   664
 * the HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   665
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   666
 * For DDI_ATTACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   667
 * sata_hba_inst structure is allocated here and initialized with pointers to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   668
 * SATA framework implementation of required scsi tran functions.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   669
 * The scsi_tran's tran_hba_private field is used by SATA Framework to point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   670
 * to the soft structure (sata_hba_inst) allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   671
 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   672
 * The scsi_tran's tran_hba_private field is used by SATA framework to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   673
 * store a pointer to per-HBA-instance of sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   674
 * The sata_hba_inst structure is cross-linked to scsi tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   675
 * Among other info, a pointer to sata_hba_tran structure is stored in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   676
 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   677
 * linked together into the list, pointed to by sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   678
 * On the first HBA instance attach the sata event thread is initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   679
 * Attachment points are created for all SATA ports of the HBA being attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   680
 * All HBA instance's SATA ports are probed and type of plugged devices is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   681
 * determined. For each device of a supported type, a target node is created.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   682
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   683
 * DDI_SUCCESS is returned when attachment process is successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   684
 * DDI_FAILURE is returned otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   685
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   686
 * For DDI_RESUME command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   687
 * Not implemented at this time (postponed until phase 2 of the development).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   688
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   689
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   690
sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   691
    ddi_attach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   692
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   693
	sata_hba_inst_t	*sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   694
	scsi_hba_tran_t *scsi_tran = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   695
	int hba_attach_state = 0;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   696
	char taskq_name[MAXPATHLEN];
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   697
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   698
	SATADBG3(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   699
	    "sata_hba_attach: node %s (%s%d)\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   700
	    ddi_node_name(dip), ddi_driver_name(dip),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   701
	    ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   702
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   703
	if (cmd == DDI_RESUME) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   704
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   705
		 * Postponed until phase 2 of the development
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   706
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   707
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   708
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   709
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   710
	if (cmd != DDI_ATTACH) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   711
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   712
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   713
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   714
	/* cmd == DDI_ATTACH */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   715
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   716
	if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   717
		SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   718
		    "sata_hba_attach: invalid sata_hba_tran"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   719
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   720
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   721
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   722
	 * Allocate and initialize SCSI tran structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   723
	 * SATA copy of tran_bus_config is provided to create port nodes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   724
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   725
	scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   726
	if (scsi_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   727
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   728
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   729
	 * Allocate soft structure for SATA HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   730
	 * There is a separate softstate for each HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   731
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   732
	sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   733
	ASSERT(sata_hba_inst != NULL); /* this should not fail */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   734
	mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   735
	hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   736
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   737
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   738
	 * scsi_trans's tran_hba_private is used by SATA Framework to point to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   739
	 * soft structure allocated by SATA framework for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   740
	 * SATA HBA instance related data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   741
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   742
	scsi_tran->tran_hba_private	= sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   743
	scsi_tran->tran_tgt_private	= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   744
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   745
	scsi_tran->tran_tgt_init	= sata_scsi_tgt_init;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   746
	scsi_tran->tran_tgt_probe	= sata_scsi_tgt_probe;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   747
	scsi_tran->tran_tgt_free	= sata_scsi_tgt_free;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   748
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   749
	scsi_tran->tran_start		= sata_scsi_start;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   750
	scsi_tran->tran_reset		= sata_scsi_reset;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   751
	scsi_tran->tran_abort		= sata_scsi_abort;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   752
	scsi_tran->tran_getcap		= sata_scsi_getcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   753
	scsi_tran->tran_setcap		= sata_scsi_setcap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   754
	scsi_tran->tran_init_pkt	= sata_scsi_init_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   755
	scsi_tran->tran_destroy_pkt	= sata_scsi_destroy_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   756
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   757
	scsi_tran->tran_dmafree		= sata_scsi_dmafree;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   758
	scsi_tran->tran_sync_pkt	= sata_scsi_sync_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   759
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   760
	scsi_tran->tran_reset_notify	= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   761
	scsi_tran->tran_get_bus_addr	= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   762
	scsi_tran->tran_quiesce		= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   763
	scsi_tran->tran_unquiesce	= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   764
	scsi_tran->tran_bus_reset	= NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   765
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   766
	if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   767
	    scsi_tran, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   768
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   769
		cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   770
		    ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   771
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   772
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   773
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   774
	hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   775
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   776
	if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   777
		if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   778
		    "sata", 1) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   779
			SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   780
			    "failed to create hba sata prop"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   781
			goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   782
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   783
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   785
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   786
	 * Save pointers in hba instance soft state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   787
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   788
	sata_hba_inst->satahba_scsi_tran = scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   789
	sata_hba_inst->satahba_tran = sata_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   790
	sata_hba_inst->satahba_dip = dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   791
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   792
	/*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   793
	 * Create a task queue to handle emulated commands completion
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   794
	 * Use node name, dash, instance number as the queue name.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   795
	 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   796
	taskq_name[0] = '\0';
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   797
	(void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   798
	    sizeof (taskq_name));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   799
	(void) snprintf(taskq_name + strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   800
	    sizeof (taskq_name) - strlen(taskq_name),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   801
	    "-%d", DEVI(dip)->devi_instance);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   802
	sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
9699
fb90a02808bd 6824084 sata: callout queue size allocated per registered controller is too small
Martin Faltesek <Martin.Faltesek@Sun.COM>
parents: 9305
diff changeset
   803
	    minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   804
	    TASKQ_DYNAMIC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   805
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   806
	hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   807
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   808
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   809
	 * Create events thread if not created yet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   810
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   811
	sata_event_thread_control(1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   813
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   814
	 * Link this hba instance into the list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   815
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   816
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   817
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   818
	if (sata_hba_list == NULL) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   819
		/*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   820
		 * The first instance of HBA is attached.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   821
		 * Set current/active default maximum NCQ/TCQ queue depth for
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   822
		 * all SATA devices. It is done here and now, to eliminate the
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   823
		 * possibility of the dynamic, programatic modification of the
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   824
		 * queue depth via global (and public) sata_max_queue_depth
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   825
		 * variable (this would require special handling in HBA drivers)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   826
		 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   827
		sata_current_max_qdepth = sata_max_queue_depth;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   828
		if (sata_current_max_qdepth > 32)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   829
			sata_current_max_qdepth = 32;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   830
		else if (sata_current_max_qdepth < 1)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   831
			sata_current_max_qdepth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
   832
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   833
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   834
	sata_hba_inst->satahba_next = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   835
	sata_hba_inst->satahba_prev = sata_hba_list_tail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   836
	if (sata_hba_list == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   837
		sata_hba_list = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   838
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   839
	if (sata_hba_list_tail != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   840
		sata_hba_list_tail->satahba_next = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   841
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   842
	sata_hba_list_tail = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   843
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   844
	hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   845
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   846
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   847
	 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   848
	 * SATA HBA driver should not use its own open/close entry points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   849
	 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   850
	 * Make sure that instance number doesn't overflow
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   851
	 * when forming minor numbers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   852
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   853
	ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   854
	if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   855
	    INST2DEVCTL(ddi_get_instance(dip)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   856
	    DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   857
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   858
		cmn_err(CE_WARN, "sata_hba_attach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   859
		    "cannot create devctl minor node");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   860
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   861
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   862
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   863
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   864
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   865
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   866
	 * Set-up kstats here, if necessary.
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   867
	 * (postponed until future phase of the development).
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   868
	 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   869
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   870
	/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   871
	 * Indicate that HBA is attached. This will enable events processing
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   872
	 * for this HBA.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   873
	 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
   874
	sata_hba_inst->satahba_attached = 1;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   875
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   876
	 * Probe controller ports. This operation will describe a current
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   877
	 * controller/port/multipliers/device configuration and will create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   878
	 * attachment points.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   879
	 * We may end-up with just a controller with no devices attached.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
   880
	 * For the ports with a supported device attached, device target nodes
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
   881
	 * are created and devices are initialized.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   882
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   883
	sata_probe_ports(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   884
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   885
	return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   886
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   887
fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   888
	if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   889
		(void) sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   890
		if (sata_hba_list == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   891
			sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   892
	}
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   893
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   894
	if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   895
		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   896
		taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
   897
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   898
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   899
	if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   900
		(void) scsi_hba_detach(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   901
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   902
	if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   903
		mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   904
		kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   905
		    sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   906
		scsi_hba_tran_free(scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   907
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   908
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   909
	sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   910
	    ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   911
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   912
	return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   913
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   914
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   915
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   916
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   917
 * Called by SATA HBA from to detach an instance of the driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   918
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   919
 * For DDI_DETACH command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   920
 * Free local structures allocated for SATA HBA instance during
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   921
 * sata_hba_attach processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   922
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   923
 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   924
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   925
 * For DDI_SUSPEND command:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   926
 * Not implemented at this time (postponed until phase 2 of the development)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   927
 * Returnd DDI_SUCCESS.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   928
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   929
 * When the last HBA instance is detached, the event daemon is terminated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   930
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   931
 * NOTE: cport support only, no port multiplier support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   932
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   933
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   934
sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   935
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   936
	dev_info_t	*tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   937
	sata_hba_inst_t	*sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   938
	scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   939
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   940
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   941
	int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   942
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   943
	SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   944
	    ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   945
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   946
	switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   947
	case DDI_DETACH:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   948
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   949
		if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   950
			return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   951
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   952
		sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   953
		if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   954
			return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   955
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   956
		if (scsi_hba_detach(dip) == DDI_FAILURE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   957
			sata_hba_inst->satahba_attached = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   958
			return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   959
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   960
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   961
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   962
		 * Free all target nodes - at this point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   963
		 * devices should be at least offlined
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   964
		 * otherwise scsi_hba_detach() should not be called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   965
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   966
		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   967
		    ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   968
			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   969
			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   970
				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   971
				if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   972
					tdip = sata_get_target_dip(dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   973
					    ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   974
					if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   975
						if (ndi_devi_offline(tdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   976
						    NDI_DEVI_REMOVE) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   977
						    NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   978
							SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   979
							    sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   980
							    CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   981
							    "sata_hba_detach: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   982
							    "Target node not "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   983
							    "removed !"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   984
							return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   985
						}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   986
					}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   987
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   988
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   989
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   990
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   991
		 * Disable sata event daemon processing for this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   992
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   993
		sata_hba_inst->satahba_attached = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   994
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   995
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   996
		 * Remove event daemon thread, if it is last HBA instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   997
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   998
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
   999
		mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1000
		if (sata_hba_list->satahba_next == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1001
			mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1002
			sata_event_thread_control(0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1003
			mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1004
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1005
		mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1006
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1007
		/* Remove this HBA instance from the HBA list */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1008
		sata_remove_hba_instance(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1009
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1010
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1011
		 * At this point there should be no target nodes attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1012
		 * Detach and destroy device and port info structures.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1013
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1014
		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1015
		    ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1016
			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1017
			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1018
				sdinfo =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1019
				    cportinfo->cport_devp.cport_sata_drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1020
				if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1021
					/* Release device structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1022
					kmem_free(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1023
					    sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1024
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1025
				/* Release cport info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1026
				mutex_destroy(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1027
				kmem_free(cportinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1028
				    sizeof (sata_cport_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1029
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1030
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1031
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1032
		scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1033
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  1034
		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  1035
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  1036
		taskq_destroy(sata_hba_inst->satahba_taskq);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  1037
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1038
		mutex_destroy(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1039
		kmem_free((void *)sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1040
		    sizeof (struct sata_hba_inst));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1042
		return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1043
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1044
	case DDI_SUSPEND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1045
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1046
		 * Postponed until phase 2
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1047
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1048
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1049
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1050
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1051
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1052
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1053
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1054
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1055
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1056
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1057
 * Called by an HBA drive from _fini() routine.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1058
 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1059
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1060
void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1061
sata_hba_fini(struct modlinkage *modlp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1062
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1063
	SATADBG1(SATA_DBG_HBA_IF, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1064
	    "sata_hba_fini: name %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1065
	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1066
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1067
	scsi_hba_fini(modlp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1068
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1069
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1070
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1071
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1072
 * Default open and close routine for sata_hba framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1073
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1074
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1075
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1076
 * Open devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1077
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1078
 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1079
 * 0 if node was open successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1080
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1081
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1082
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1083
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1084
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1085
sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1086
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1087
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1088
	_NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1089
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1090
	int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1091
	dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1092
	scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1093
	sata_hba_inst_t	*sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1094
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1095
	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1096
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1097
	if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1098
		return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1099
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1100
	dip = sata_devt_to_devinfo(*devp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1101
	if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1102
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1103
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1104
	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1105
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1106
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1107
	sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1108
	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1109
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1110
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1111
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1112
	if (flags & FEXCL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1113
		if (sata_hba_inst->satahba_open_flag != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1114
			rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1115
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1116
			sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1117
			    SATA_DEVCTL_EXOPENED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1118
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1119
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1120
		if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1121
			rv = EBUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1122
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1123
			sata_hba_inst->satahba_open_flag =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1124
			    SATA_DEVCTL_SOPENED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1125
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1126
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1127
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1128
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1129
	return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1130
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1131
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1132
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1133
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1134
 * Close devctl node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1135
 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1136
 * 0 if node was closed successfully, error code otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1137
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1138
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1139
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1140
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1141
sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1142
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1143
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1144
	_NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1145
	_NOTE(ARGUNUSED(flag))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1146
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1147
	dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1148
	scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1149
	sata_hba_inst_t	*sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1150
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1151
	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1152
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1153
	if (otyp != OTYP_CHR)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1154
		return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1155
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1156
	dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1157
	if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1158
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1159
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1160
	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1161
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1162
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1163
	sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1164
	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1165
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1166
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1167
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1168
	sata_hba_inst->satahba_open_flag = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1169
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1170
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1171
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1172
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1173
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1174
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1175
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1176
 * Standard IOCTL commands for SATA hotplugging.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1177
 * Implemented DEVCTL_AP commands:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1178
 * DEVCTL_AP_CONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1179
 * DEVCTL_AP_DISCONNECT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1180
 * DEVCTL_AP_CONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1181
 * DEVCTL_UNCONFIGURE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1182
 * DEVCTL_AP_CONTROL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1183
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1184
 * Commands passed to default ndi ioctl handler:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1185
 * DEVCTL_DEVICE_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1186
 * DEVCTL_DEVICE_ONLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1187
 * DEVCTL_DEVICE_OFFLINE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1188
 * DEVCTL_DEVICE_REMOVE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1189
 * DEVCTL_DEVICE_INSERT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1190
 * DEVCTL_BUS_GETSTATE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1191
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1192
 * All other cmds are passed to HBA if it provide ioctl handler, or failed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1193
 * if not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1194
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1195
 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1196
 * 0 if successful,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1197
 * error code if operation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1198
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1199
 * NOTE: Port Multiplier is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1200
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1201
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1202
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1203
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1204
sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1205
    int *rvalp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1206
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1207
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1208
	_NOTE(ARGUNUSED(credp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1209
	_NOTE(ARGUNUSED(rvalp))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1210
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1211
	int rv = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1212
	int32_t	comp_port = -1;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1213
	dev_info_t *dip;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1214
	devctl_ap_state_t ap_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1215
	struct devctl_iocdata *dcp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1216
	scsi_hba_tran_t *scsi_hba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1217
	sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1218
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1219
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1220
	int cport, pmport, qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1221
	int rval = SATA_SUCCESS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1222
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1223
	dip = sata_devt_to_devinfo(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1224
	if (dip == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1225
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1226
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1227
	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1228
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1229
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1230
	sata_hba_inst = scsi_hba_tran->tran_hba_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1231
	if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1232
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1233
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1234
	if (sata_hba_inst->satahba_tran == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1235
		return (ENXIO);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1236
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1237
	switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1238
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1239
	case DEVCTL_DEVICE_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1240
	case DEVCTL_DEVICE_ONLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1241
	case DEVCTL_DEVICE_OFFLINE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1242
	case DEVCTL_DEVICE_REMOVE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1243
	case DEVCTL_BUS_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1244
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1245
		 * There may be more cases that we want to pass to default
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1246
		 * handler rather than fail them.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1247
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1248
		return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1249
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1250
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1251
	/* read devctl ioctl data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1252
	if (cmd != DEVCTL_AP_CONTROL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1253
		if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1254
			return (EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1255
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1256
		if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1257
		    -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1258
			if (dcp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1259
				ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1260
			return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1261
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1262
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1263
		cport = SCSI_TO_SATA_CPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1264
		pmport = SCSI_TO_SATA_PMPORT(comp_port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1265
		/* Only cport is considered now, i.e. SATA_ADDR_CPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1266
		qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1267
		if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1268
		    qual) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1269
			ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1270
			return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1271
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1272
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1273
		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1274
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1275
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1276
		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1277
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1278
			 * Cannot process ioctl request now. Come back later.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1279
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1280
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1281
			    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1282
			ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1283
			return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1284
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1285
		/* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1286
		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1287
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1288
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1289
		sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1290
		sata_device.satadev_addr.pmport = pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1291
		sata_device.satadev_addr.qual = qual;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1292
		sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1293
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1295
	switch (cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1296
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1297
	case DEVCTL_AP_DISCONNECT:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1298
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1299
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1300
		 * Normally, cfgadm sata plugin will try to offline
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1301
		 * (unconfigure) device before this request. Nevertheless,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1302
		 * if a device is still configured, we need to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1303
		 * attempt to offline and unconfigure device first, and we will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1304
		 * deactivate the port regardless of the unconfigure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1305
		 * operation results.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1306
		 *
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1307
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1308
		rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1309
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1310
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1311
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1312
	case DEVCTL_AP_UNCONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1313
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1314
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1315
		 * The unconfigure operation uses generic nexus operation to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1316
		 * offline a device. It leaves a target device node attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1317
		 * and obviously sata_drive_info attached as well, because
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1318
		 * from the hardware point of view nothing has changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1319
		 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1320
		rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1321
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1323
	case DEVCTL_AP_CONNECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1324
	{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1325
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1326
		 * The sata cfgadm pluging will invoke this operation only if
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1327
		 * port was found in the disconnect state (failed state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1328
		 * is also treated as the disconnected state).
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1329
		 * If port activation is successful and a device is found
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1330
		 * attached to the port, the initialization sequence is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1331
		 * executed to probe the port and attach
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1332
		 * a device structure to a port structure. The device is not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1333
		 * set in configured state (system-wise) by this operation.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1334
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1335
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1336
		rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1337
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1338
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1339
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1340
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1341
	case DEVCTL_AP_CONFIGURE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1342
	{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1343
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1344
		 * A port may be in an active or shutdown state.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1345
		 * If port is in a failed state, operation is aborted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1346
		 * If a port is in a shutdown state, sata_tran_port_activate()
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1347
		 * is invoked prior to any other operation.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1348
		 *
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1349
		 * Onlining the device involves creating a new target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1350
		 * If there is an old target node present (belonging to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1351
		 * previously removed device), the operation is aborted - the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1352
		 * old node has to be released and removed before configure
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1353
		 * operation is attempted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1354
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1355
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1356
		rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1358
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1359
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1360
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1361
	case DEVCTL_AP_GETSTATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1362
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1363
		sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1364
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1365
		ap_state.ap_last_change = (time_t)-1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1366
		ap_state.ap_error_code = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1367
		ap_state.ap_in_transition = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1368
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1369
		/* Copy the return AP-state information to the user space */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1370
		if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1371
			rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1372
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1373
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1374
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1375
	case DEVCTL_AP_CONTROL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1376
	{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1377
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1378
		 * Generic devctl for hardware specific functionality
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1379
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1380
		sata_ioctl_data_t	ioc;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1382
		ASSERT(dcp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1383
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1384
		/* Copy in user ioctl data first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1385
#ifdef _MULTI_DATAMODEL
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1386
		if (ddi_model_convert_from(mode & FMODELS) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1387
		    DDI_MODEL_ILP32) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1388
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1389
			sata_ioctl_data_32_t	ioc32;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1390
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1391
			if (ddi_copyin((void *)arg, (void *)&ioc32,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1392
			    sizeof (ioc32), mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1393
				rv = EFAULT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1394
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1395
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1396
			ioc.cmd 	= (uint_t)ioc32.cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1397
			ioc.port	= (uint_t)ioc32.port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1398
			ioc.get_size	= (uint_t)ioc32.get_size;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1399
			ioc.buf		= (caddr_t)(uintptr_t)ioc32.buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1400
			ioc.bufsiz	= (uint_t)ioc32.bufsiz;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1401
			ioc.misc_arg	= (uint_t)ioc32.misc_arg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1402
		} else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1403
#endif /* _MULTI_DATAMODEL */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1404
		if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1405
		    mode) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1406
			return (EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1407
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1408
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1409
		SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1410
		    "sata_hba_ioctl: DEVCTL_AP_CONTROL "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1411
		    "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1412
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1413
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1414
		 * To avoid BE/LE and 32/64 issues, a get_size always returns
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1415
		 * a 32-bit number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1416
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1417
		if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1418
			return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1419
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1420
		/* validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1421
		cport = SCSI_TO_SATA_CPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1422
		pmport = SCSI_TO_SATA_PMPORT(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1423
		qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1424
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1425
		/* Override address qualifier - handle cport only for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1426
		qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1427
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1428
		if (sata_validate_sata_address(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1429
		    pmport, qual) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1430
			return (EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1431
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1432
		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1433
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1434
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1435
		/* Is the port locked by event processing daemon ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1436
		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1437
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1438
			 * Cannot process ioctl request now. Come back later
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1439
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1440
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1441
			    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1442
			return (EBUSY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1443
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1444
		/* Block event processing for this port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1445
		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1446
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1447
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1448
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1449
		sata_device.satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1450
		sata_device.satadev_addr.pmport = pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1451
		sata_device.satadev_addr.qual = qual;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1452
		sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1453
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1454
		switch (ioc.cmd) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1455
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1456
		case SATA_CFGA_RESET_PORT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1457
			/*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1458
			 * There is no protection for configured device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1459
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1460
			rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1461
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1462
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1463
		case SATA_CFGA_RESET_DEVICE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1464
			/*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1465
			 * There is no protection for configured device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1466
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1467
			rv = sata_ioctl_reset_device(sata_hba_inst,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1468
			    &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1469
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1470
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1471
		case SATA_CFGA_RESET_ALL:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1472
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1473
			 * There is no protection for configured devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1474
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1475
			rv = sata_ioctl_reset_all(sata_hba_inst);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1476
			/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1477
			 * We return here, because common return is for
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1478
			 * a single port operation - we have already unlocked
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1479
			 * all ports and no dc handle was allocated.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1480
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1481
			return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1482
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1483
		case SATA_CFGA_PORT_DEACTIVATE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1484
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1485
			 * Arbitrarily unconfigure attached device, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1486
			 * Even if the unconfigure fails, proceed with the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1487
			 * port deactivation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1488
			 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1489
			rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1490
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1491
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1492
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1493
		case SATA_CFGA_PORT_ACTIVATE:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1494
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1495
			rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1496
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1497
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1498
		case SATA_CFGA_PORT_SELF_TEST:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1499
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1500
			rv = sata_ioctl_port_self_test(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1501
			    &sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1502
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1503
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1504
		case SATA_CFGA_GET_DEVICE_PATH:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1505
			if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1506
				sata_device.satadev_addr.qual =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1507
				    SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1508
			else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1509
				sata_device.satadev_addr.qual =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1510
				    SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1511
			rv = sata_ioctl_get_device_path(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1512
			    &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1513
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1514
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1515
		case SATA_CFGA_GET_AP_TYPE:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1516
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1517
			rv = sata_ioctl_get_ap_type(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1518
			    &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1519
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1520
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1521
		case SATA_CFGA_GET_MODEL_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1522
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1523
			rv = sata_ioctl_get_model_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1524
			    &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1525
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1526
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1527
		case SATA_CFGA_GET_REVFIRMWARE_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1528
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1529
			rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1530
			    &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1531
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1532
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1533
		case SATA_CFGA_GET_SERIALNUMBER_INFO:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1534
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1535
			rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1536
			    &sata_device, &ioc, mode);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1537
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1538
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1539
		default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1540
			rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1541
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1542
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1543
		} /* End of DEVCTL_AP_CONTROL cmd switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1544
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1545
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1546
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1547
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1548
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1549
	{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1550
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1551
		 * If we got here, we got an IOCTL that SATA HBA Framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1552
		 * does not recognize. Pass ioctl to HBA driver, in case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1553
		 * it could process it.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1554
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1555
		sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1556
		dev_info_t	*mydip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1557
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1558
		SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1559
		    "IOCTL 0x%2x not supported in SATA framework, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1560
		    "passthrough to HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1561
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1562
		if (sata_tran->sata_tran_ioctl == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1563
			rv = EINVAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1564
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1565
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1566
		rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1567
		if (rval != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1568
			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1569
			    "IOCTL 0x%2x failed in HBA", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1570
			rv = rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1571
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1572
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1573
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1574
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1575
	} /* End of main IOCTL switch */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1576
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1577
	if (dcp) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1578
		ndi_dc_freehdl(dcp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1579
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1580
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1581
	cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1582
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1583
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1584
	return (rv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1585
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1586
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1587
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1588
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1589
 * Create error retrieval sata packet
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1590
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1591
 * A sata packet is allocated and set-up to contain specified error retrieval
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1592
 * command and appropriate dma-able data buffer.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1593
 * No association with any scsi packet is made and no callback routine is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1594
 * specified.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1595
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1596
 * Returns a pointer to sata packet upon successfull packet creation.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1597
 * Returns NULL, if packet cannot be created.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1598
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1599
sata_pkt_t *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1600
sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1601
    int pkt_type)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1602
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1603
	sata_hba_inst_t	*sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1604
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1605
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1606
	sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1607
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1608
	mutex_enter(&sata_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1609
	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1610
	    sata_hba_inst = sata_hba_inst->satahba_next) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1611
		if (SATA_DIP(sata_hba_inst) == dip)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1612
			break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1613
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1614
	mutex_exit(&sata_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1615
	ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1616
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1617
	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1618
	if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1619
		sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1620
		    "sata: error recovery request for non-attached device at "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1621
		    "cport %d", sata_device->satadev_addr.cport);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1622
		return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1623
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1624
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1625
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1626
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1627
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1628
	spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1629
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1630
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1631
		return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1632
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1633
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1634
	spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1635
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1636
	switch (pkt_type) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1637
	case SATA_ERR_RETR_PKT_TYPE_NCQ:
5225
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
  1638
		if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS)
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
  1639
			return (spkt);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1640
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1641
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1642
	case SATA_ERR_RETR_PKT_TYPE_ATAPI:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1643
		if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1644
			return (spkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1645
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1646
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1647
	default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1648
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1649
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1650
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1651
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1652
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1653
	return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1654
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1655
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1656
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1657
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1658
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1659
 * Free error retrieval sata packet
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1660
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1661
 * Free sata packet and any associated resources allocated previously by
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1662
 * sata_get_error_retrieval_pkt().
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1663
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1664
 * Void return.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1665
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1666
void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1667
sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1668
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1669
	sata_pkt_txlate_t *spx =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1670
	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1671
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1672
	ASSERT(sata_pkt != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1673
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1674
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1675
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1676
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1677
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1678
}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1679
6777
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1680
/*
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1681
 * sata_name_child is for composing the name of the node
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1682
 * the format of the name is "target,0".
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1683
 */
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1684
static int
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1685
sata_name_child(dev_info_t *dip, char *name, int namelen)
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1686
{
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1687
	int target;
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1688
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1689
	target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1690
	    DDI_PROP_DONTPASS, "target", -1);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1691
	if (target == -1)
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1692
		return (DDI_FAILURE);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1693
	(void) snprintf(name, namelen, "%x,0", target);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1694
	return (DDI_SUCCESS);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1695
}
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1696
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1697
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1698
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1699
/* ****************** SCSA required entry points *********************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1700
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1701
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1702
 * Implementation of scsi tran_tgt_init.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1703
 * sata_scsi_tgt_init() initializes scsi_device structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1704
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1705
 * If successful, DDI_SUCCESS is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1706
 * DDI_FAILURE is returned if addressed device does not exist
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1707
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1708
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1709
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1710
sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1711
    scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1712
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1713
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1714
	_NOTE(ARGUNUSED(hba_dip))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1715
	_NOTE(ARGUNUSED(tgt_dip))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1716
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1717
	sata_device_t		sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1718
	sata_drive_info_t	*sdinfo;
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1719
	struct sata_id		*sid;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1720
	sata_hba_inst_t		*sata_hba_inst;
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1721
	char			model[SATA_ID_MODEL_LEN + 1];
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1722
	char			fw[SATA_ID_FW_LEN + 1];
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1723
	char			*vid, *pid;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1724
	int			i;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1725
6777
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1726
	/*
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1727
	 * Fail tran_tgt_init for .conf stub node
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1728
	 */
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1729
	if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1730
		(void) ndi_merge_node(tgt_dip, sata_name_child);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1731
		ddi_set_name_addr(tgt_dip, NULL);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1732
		return (DDI_FAILURE);
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1733
	}
cc437863808b PSARC 2008/337 scsi-self-identifying
jw149990
parents: 6591
diff changeset
  1734
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1735
	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1736
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1737
	/* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1738
	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1739
	    &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1740
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1741
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1742
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1743
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1744
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1745
	/* sata_device now contains a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1746
	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1747
	if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1748
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1749
		    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1750
		return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1751
	}
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1752
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1753
	    sata_device.satadev_addr.cport)));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1754
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1755
	/*
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1756
	 * Check if we need to create a legacy devid (i.e cmdk style) for
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1757
	 * the target disks.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1758
	 *
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1759
	 * HBA devinfo node will have the property "use-cmdk-devid-format"
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1760
	 * if we need to create cmdk-style devid for all the disk devices
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1761
	 * attached to this controller. This property may have been set
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1762
	 * from HBA driver's .conf file or by the HBA driver in its
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1763
	 * attach(9F) function.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1764
	 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1765
	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1766
	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1767
	    "use-cmdk-devid-format", 0) == 1)) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1768
		/* register a legacy devid for this target node */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1769
		sata_target_devid_register(tgt_dip, sdinfo);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1770
	}
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1771
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1772
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1773
	/*
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1774
	 * 'Identify Device Data' does not always fit in standard SCSI
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1775
	 * INQUIRY data, so establish INQUIRY_* properties with full-form
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1776
	 * of information.
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1777
	 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1778
	sid = &sdinfo->satadrv_id;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1779
#ifdef	_LITTLE_ENDIAN
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1780
	swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1781
	swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1782
#else	/* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1783
	bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1784
	bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1785
#endif	/* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1786
	model[SATA_ID_MODEL_LEN] = 0;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1787
	fw[SATA_ID_FW_LEN] = 0;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1788
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1789
	/* split model into into vid/pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1790
	for (i = 0, pid = model; i < SATA_ID_MODEL_LEN; i++, pid++)
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1791
		if ((*pid == ' ') || (*pid == '\t'))
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1792
			break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1793
	if (i < SATA_ID_MODEL_LEN) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1794
		vid = model;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1795
		*pid++ = 0;		/* terminate vid, establish pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1796
	} else {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1797
		vid = NULL;		/* vid will stay "ATA     " */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1798
		pid = model;		/* model is all pid */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1799
	}
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1800
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1801
	if (vid)
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1802
		(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1803
		    vid, strlen(vid));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1804
	if (pid)
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1805
		(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1806
		    pid, strlen(pid));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1807
	(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1808
	    fw, strlen(fw));
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1809
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1810
	return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1811
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1812
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1813
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1814
 * Implementation of scsi tran_tgt_probe.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1815
 * Probe target, by calling default scsi routine scsi_hba_probe()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1816
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1817
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1818
sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1819
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1820
	sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1821
	    (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1822
	int rval;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  1823
	uint32_t pm_cap;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1824
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1825
	rval = scsi_hba_probe(sd, callback);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  1826
	pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  1827
	    SATA_CAP_LOG_SENSE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1828
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1829
	if (rval == SCSIPROBE_EXISTS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1830
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1831
		 * Set property "pm-capable" on the target device node, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1832
		 * the target driver will not try to fetch scsi cycle counters
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1833
		 * before enabling device power-management.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1834
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1835
		if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  1836
		    "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1837
			sata_log(sata_hba_inst, CE_WARN,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1838
			    "SATA device at port %d: "
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1839
			    "will not be power-managed ",
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1840
			    SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1841
			SATA_LOG_D((sata_hba_inst, CE_WARN,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  1842
			    "failure updating pm-capable property"));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1843
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1844
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1845
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1846
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1847
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1848
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1849
 * Implementation of scsi tran_tgt_free.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1850
 * Release all resources allocated for scsi_device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1851
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1852
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1853
sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1854
    scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1855
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1856
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1857
	_NOTE(ARGUNUSED(hba_dip))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1858
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1859
	sata_device_t		sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1860
	sata_drive_info_t	*sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1861
	sata_hba_inst_t		*sata_hba_inst;
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1862
	ddi_devid_t		devid;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1863
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1864
	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1865
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1866
	/* Validate scsi device address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1867
	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1868
	    &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1869
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1870
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1871
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1872
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1873
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1874
	/* sata_device now should contain a valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1875
	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1876
	if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1877
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1878
		    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1879
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1880
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1881
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1882
	 * We did not allocate any resources in sata_scsi_tgt_init()
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1883
	 * other than few properties.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1884
	 * Free them.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1885
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1886
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  1887
	    sata_device.satadev_addr.cport)));
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  1888
	(void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1889
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1890
	/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1891
	 * If devid was previously created but not freed up from
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1892
	 * sd(7D) driver (i.e during detach(9F)) then do it here.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1893
	 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1894
	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1895
	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1896
	    "use-cmdk-devid-format", 0) == 1) &&
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1897
	    (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1898
		ddi_devid_unregister(tgt_dip);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1899
		ddi_devid_free(devid);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  1900
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1901
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1902
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1903
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1904
 * Implementation of scsi tran_init_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1905
 * Upon successful return, scsi pkt buffer has DMA resources allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1906
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1907
 * It seems that we should always allocate pkt, even if the address is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1908
 * for non-existing device - just use some default for dma_attr.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1909
 * The reason is that there is no way to communicate this to a caller here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1910
 * Subsequent call to sata_scsi_start may fail appropriately.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1911
 * Simply returning NULL does not seem to discourage a target driver...
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1912
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1913
 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1914
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1915
static struct scsi_pkt *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1916
sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1917
    struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1918
    int (*callback)(caddr_t), caddr_t arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1919
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1920
	sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1921
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1922
	dev_info_t *dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1923
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1924
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1925
	sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1926
	ddi_dma_attr_t cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1927
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1928
	boolean_t new_pkt = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1929
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1930
	ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1931
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1932
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1933
	 * We need to translate the address, even if it could be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1934
	 * a bogus one, for a non-existing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1935
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1936
	sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1937
	sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1938
	sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1939
	sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1940
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1941
	if (pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1942
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1943
		 * Have to allocate a brand new scsi packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1944
		 * We need to operate with auto request sense enabled.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1945
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1946
		pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1947
		    MAX(statuslen, sizeof (struct scsi_arq_status)),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1948
		    tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1949
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1950
		if (pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1951
			return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1952
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1953
		/* Fill scsi packet structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1954
		pkt->pkt_comp		= (void (*)())NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1955
		pkt->pkt_time		= 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1956
		pkt->pkt_resid		= 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1957
		pkt->pkt_statistics	= 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1958
		pkt->pkt_reason		= 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1959
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1960
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1961
		 * pkt_hba_private will point to sata pkt txlate structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1962
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1963
		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1964
		bzero(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1965
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1966
		spx->txlt_scsi_pkt = pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1967
		spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1968
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1969
		/* Allocate sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1970
		spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1971
		if (spx->txlt_sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1972
			/* Could not allocate sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1973
			scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1974
			return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1975
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1976
		/* Set sata address */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  1977
		spx->txlt_sata_pkt->satapkt_device.satadev_addr =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  1978
		    sata_device.satadev_addr;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  1979
		spx->txlt_sata_pkt->satapkt_device.satadev_rev =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  1980
		    sata_device.satadev_rev;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1981
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1982
		if ((bp == NULL) || (bp->b_bcount == 0))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1983
			return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1984
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1985
		spx->txlt_total_residue = bp->b_bcount;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1986
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1987
		new_pkt = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1988
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1989
		 * Packet was preallocated/initialized by previous call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1990
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1991
		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1992
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1993
		if ((bp == NULL) || (bp->b_bcount == 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1994
			return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1995
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1996
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1997
		/* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1998
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  1999
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2000
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2001
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2002
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2003
	 * We use an adjusted version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2004
	 * for device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2005
	 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2006
	 * happen when a device is not yet configured.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2007
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2008
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2009
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2010
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2011
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2012
	/* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2013
	sata_adjust_dma_attr(sdinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2014
	    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2015
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2016
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2017
	/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2018
	 * Allocate necessary DMA resources for the packet's data buffer
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2019
	 * NOTE:
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2020
	 * In case of read/write commands, DMA resource allocation here is
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2021
	 * based on the premise that the transfer length specified in
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2022
	 * the read/write scsi cdb will match exactly DMA resources -
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2023
	 * returning correct packet residue is crucial.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2024
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2025
	if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2026
	    &cur_dma_attr)) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2027
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2028
		 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2029
		 * DDI_DMA_NOMAPPING, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2030
		 * bioerror(9F) with bp and an error code of EFAULT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2031
		 * If a DMA allocation request fails with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2032
		 * DDI_DMA_TOOBIG, indicate the error by calling
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2033
		 * bioerror(9F) with bp and an error code of EINVAL.
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2034
		 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2035
		 * Request may be repeated later - there is no real error.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2036
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2037
		switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2038
		case DDI_DMA_NORESOURCES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2039
			bioerror(bp, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2040
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2041
		case DDI_DMA_NOMAPPING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2042
		case DDI_DMA_BADATTR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2043
			bioerror(bp, EFAULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2044
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2045
		case DDI_DMA_TOOBIG:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2046
		default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2047
			bioerror(bp, EINVAL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2048
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2049
		}
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2050
		if (new_pkt == TRUE) {
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2051
			/*
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2052
			 * Since this is a new packet, we can clean-up
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2053
			 * everything
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2054
			 */
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2055
			sata_scsi_destroy_pkt(ap, pkt);
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2056
		} else {
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2057
			/*
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2058
			 * This is a re-used packet. It will be target driver's
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2059
			 * responsibility to eventually destroy it (which
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2060
			 * will free allocated resources).
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2061
			 * Here, we just "complete" the request, leaving
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2062
			 * allocated resources intact, so the request may
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2063
			 * be retried.
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2064
			 */
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2065
			spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2066
			sata_pkt_free(spx);
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  2067
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2068
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2069
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2070
	/* Set number of bytes that are not yet accounted for */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2071
	pkt->pkt_resid = spx->txlt_total_residue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2072
	ASSERT(pkt->pkt_resid >= 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2073
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2074
	return (pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2075
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2076
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2077
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2078
 * Implementation of scsi tran_start.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2079
 * Translate scsi cmd into sata operation and return status.
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2080
 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2081
 * are supported.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2082
 * For SATA hard disks, supported scsi commands:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2083
 * SCMD_INQUIRY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2084
 * SCMD_TEST_UNIT_READY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2085
 * SCMD_START_STOP
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2086
 * SCMD_READ_CAPACITY
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2087
 * SCMD_REQUEST_SENSE
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  2088
 * SCMD_LOG_SENSE_G1
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  2089
 * SCMD_LOG_SELECT_G1
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2090
 * SCMD_MODE_SENSE	(specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2091
 * SCMD_MODE_SENSE_G1	(specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2092
 * SCMD_MODE_SELECT	(specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2093
 * SCMD_MODE_SELECT_G1	(specific pages)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2094
 * SCMD_SYNCHRONIZE_CACHE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2095
 * SCMD_SYNCHRONIZE_CACHE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2096
 * SCMD_READ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2097
 * SCMD_READ_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2098
 * SCMD_READ_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2099
 * SCMD_READ_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2100
 * SCMD_WRITE
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2101
 * SCMD_WRITE_BUFFER
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2102
 * SCMD_WRITE_G1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2103
 * SCMD_WRITE_G4
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2104
 * SCMD_WRITE_G5
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2105
 * SCMD_SEEK		(noop)
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  2106
 * SCMD_SDIAG
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2107
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2108
 * All other commands are rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2109
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2110
 * Returns:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2111
 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2112
 * for execution. TRAN_ACCEPT may be returned also if device was removed but
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2113
 * a callback could be scheduled.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2114
 * TRAN_BADPKT if cmd was directed to invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2115
 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2116
 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2117
 * was removed and there was no callback specified in scsi pkt.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2118
 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2119
 * framework was busy performing some other operation(s).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2120
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2121
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2122
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2123
sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2124
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2125
	sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2126
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2127
	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2128
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2129
	struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2130
	int cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2131
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2132
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2133
	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2134
	    "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2135
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2136
	ASSERT(spx != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2137
	    spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2138
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2139
	cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2140
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2141
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2142
	sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2143
	    &spx->txlt_sata_pkt->satapkt_device);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2144
	if (sdinfo == NULL ||
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2145
	    SATA_CPORT_INFO(sata_hba_inst, cport)->cport_tgtnode_clean ==
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  2146
	    B_FALSE ||
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  2147
	    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  2148
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2149
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2150
		pkt->pkt_reason = CMD_DEV_GONE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2151
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2152
		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2153
		 * only in callback function (for normal requests) and
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2154
		 * in the dump code path.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2155
		 * So, if the callback is available, we need to do
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2156
		 * the callback rather than returning TRAN_FATAL_ERROR here.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2157
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2158
		if (pkt->pkt_comp != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2159
			/* scsi callback required */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2160
			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2161
			    (task_func_t *)pkt->pkt_comp,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2162
			    (void *)pkt, TQ_SLEEP) == NULL)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2163
				/* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2164
				return (TRAN_BUSY);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2165
			return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2166
		}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2167
		/* No callback available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2168
		return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2169
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2170
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2171
	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2172
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2173
		rval = sata_txlt_atapi(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2174
		SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2175
		    "sata_scsi_start atapi: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2176
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2177
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2178
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2179
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2180
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2181
	 * Checking for power state, if it was on
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2182
	 * STOPPED state, then the drive is not capable
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2183
	 * of processing media access command.  And
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2184
	 * TEST_UNIT_READY, REQUEST_SENSE has special handling
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2185
	 * in the function for different power state.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2186
	 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2187
	if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2188
	    (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2189
	    (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2190
		return (sata_txlt_check_condition(spx, KEY_NOT_READY,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2191
		    SD_SCSI_ASC_LU_NOT_READY));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2192
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  2193
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2194
	/* ATA Disk commands processing starts here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2195
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2196
	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2197
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2198
	switch (pkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2199
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2200
	case SCMD_INQUIRY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2201
		/* Mapped to identify device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2202
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2203
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2204
		rval = sata_txlt_inquiry(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2205
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2206
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2207
	case SCMD_TEST_UNIT_READY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2208
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2209
		 * SAT "SATA to ATA Translation" doc specifies translation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2210
		 * to ATA CHECK POWER MODE.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2211
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2212
		rval = sata_txlt_test_unit_ready(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2213
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2214
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2215
	case SCMD_START_STOP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2216
		/* Mapping depends on the command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2217
		rval = sata_txlt_start_stop_unit(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2218
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2219
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2220
	case SCMD_READ_CAPACITY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2221
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2222
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2223
		rval = sata_txlt_read_capacity(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2224
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2225
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2226
	case SCMD_REQUEST_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2227
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2228
		 * Always No Sense, since we force ARQ
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2229
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2230
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2231
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2232
		rval = sata_txlt_request_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2233
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2234
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2235
	case SCMD_LOG_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2236
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2237
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2238
		rval = sata_txlt_log_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2239
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2240
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2241
	case SCMD_LOG_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2242
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2243
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2244
		rval = sata_txlt_log_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2245
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2246
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2247
	case SCMD_MODE_SENSE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2248
	case SCMD_MODE_SENSE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2249
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2250
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2251
		rval = sata_txlt_mode_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2252
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2253
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2254
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2255
	case SCMD_MODE_SELECT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2256
	case SCMD_MODE_SELECT_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2257
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2258
			bp_mapin(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2259
		rval = sata_txlt_mode_select(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2260
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2262
	case SCMD_SYNCHRONIZE_CACHE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2263
	case SCMD_SYNCHRONIZE_CACHE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2264
		rval = sata_txlt_synchronize_cache(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2265
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2267
	case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2268
	case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2269
	case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2270
	case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2271
		rval = sata_txlt_read(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2272
		break;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2273
	case SCMD_WRITE_BUFFER:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2274
		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2275
			bp_mapin(bp);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2276
		rval = sata_txlt_write_buffer(spx);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  2277
		break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2278
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2279
	case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2280
	case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2281
	case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2282
	case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2283
		rval = sata_txlt_write(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2284
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2285
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2286
	case SCMD_SEEK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2287
		rval = sata_txlt_nodata_cmd_immediate(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2288
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2289
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2290
		/* Other cases will be filed later */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2291
		/* postponed until phase 2 of the development */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2292
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2293
		rval = sata_txlt_invalid_command(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2294
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2295
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2296
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2297
	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2298
	    "sata_scsi_start: rval %d\n", rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2299
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2300
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2301
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2302
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2303
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2304
 * Implementation of scsi tran_abort.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2305
 * Abort specific pkt or all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2306
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2307
 * Returns 1 if one or more packets were aborted, returns 0 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2308
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2309
 * May be called from an interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2310
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2311
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2312
sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2313
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2314
	sata_hba_inst_t *sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2315
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2316
	sata_device_t	sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2317
	sata_pkt_t	*sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2318
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2319
	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2320
	    "sata_scsi_abort: %s at target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2321
	    scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2323
	/* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2324
	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2325
		/* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2326
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2327
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2328
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2329
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2330
	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2331
		/* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2332
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2333
		    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2334
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2335
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2336
	if (scsi_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2337
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2338
		 * Abort all packets.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2339
		 * Although we do not have specific packet, we still need
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2340
		 * dummy packet structure to pass device address to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2341
		 * Allocate one, without sleeping. Fail if pkt cannot be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2342
		 * allocated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2343
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2344
		sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2345
		if (sata_pkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2346
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2347
			    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2348
			SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2349
			    "could not allocate sata_pkt"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2350
			return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2351
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2352
		sata_pkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2353
		sata_pkt->satapkt_device = sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2354
		sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2355
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2356
		if (scsi_pkt->pkt_ha_private == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2357
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2358
			    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2359
			return (0); /* Bad scsi pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2360
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2361
		/* extract pointer to sata pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2362
		sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2363
		    txlt_sata_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2364
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2365
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2366
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2367
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2368
	/* Send abort request to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2369
	if ((*SATA_ABORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2370
	    (SATA_DIP(sata_hba_inst), sata_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2371
	    scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2372
	    SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2373
		if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2374
			kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2375
		/* Success */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2376
		return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2377
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2378
	/* Else, something did not go right */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2379
	if (scsi_pkt == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2380
		kmem_free(sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2381
	/* Failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2382
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2383
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2384
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2385
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2386
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2387
 * Implementation of scsi tran_reset.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2388
 * RESET_ALL request is translated into port reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2389
 * RESET_TARGET requests is translated into a device reset,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2390
 * RESET_LUN request is accepted only for LUN 0 and translated into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2391
 * device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2392
 * The target reset should cause all HBA active and queued packets to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2393
 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2394
 * the return. HBA should report reset event for the device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2395
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2396
 * Returns 1 upon success, 0 upon failure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2397
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2398
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2399
sata_scsi_reset(struct scsi_address *ap, int level)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2400
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2401
	sata_hba_inst_t	*sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2402
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2403
	sata_device_t	sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2404
	int		val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2405
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2406
	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2407
	    "sata_scsi_reset: level %d target: 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2408
	    level, ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2409
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2410
	/* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2411
	val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2412
	if (val == -1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2413
		/* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2414
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2415
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2416
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2417
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2418
	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2419
		/* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2420
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2421
		    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2422
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2423
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2424
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2425
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2426
	if (level == RESET_ALL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2427
		/* port reset - cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2428
		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2429
		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2430
		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2431
			return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2432
		else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2433
			return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2434
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2435
	} else if (val == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2436
	    (level == RESET_TARGET || level == RESET_LUN)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2437
		/* reset device (device attached) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2438
		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2439
		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2440
			return (1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2441
		else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2442
			return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2443
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2444
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2445
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2446
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2447
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2448
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2449
 * Implementation of scsi tran_getcap (get transport/device capabilities).
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2450
 * Supported capabilities for SATA hard disks:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2451
 * auto-rqsense		(always supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2452
 * tagged-qing		(supported if HBA supports it)
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2453
 * untagged-qing	(could be supported if disk supports it, but because
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2454
 *			 caching behavior allowing untagged queuing actually
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2455
 *			 results in reduced performance.  sd tries to throttle
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2456
 *			 back to only 3 outstanding commands, which may
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2457
 *			 work for real SCSI disks, but with read ahead
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2458
 *			 caching, having more than 1 outstanding command
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2459
 *			 results in cache thrashing.)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2460
 * sector_size
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2461
 * dma_max
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2462
 * interconnect-type	(INTERCONNECT_SATA)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2463
 *
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2464
 * Supported capabilities for ATAPI CD/DVD devices:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2465
 * auto-rqsense		(always supported)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2466
 * sector_size
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2467
 * dma_max
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2468
 * max-cdb-length
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2469
 * interconnect-type	(INTERCONNECT_SATA)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2470
 *
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2471
 * Supported capabilities for ATAPI TAPE devices:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2472
 * auto-rqsense		(always supported)
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2473
 * dma_max
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2474
 * max-cdb-length
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2475
 *
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  2476
 * Supported capabilities for SATA ATAPI hard disks:
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  2477
 * auto-rqsense		(always supported)
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  2478
 * interconnect-type	(INTERCONNECT_SATA)
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  2479
 * max-cdb-length
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  2480
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2481
 * Request for other capabilities is rejected as unsupported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2482
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2483
 * Returns supported capability value, or -1 if capability is unsuppported or
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2484
 * the address is invalid - no device.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2485
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2486
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2487
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2488
sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2489
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2490
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2491
	sata_hba_inst_t 	*sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2492
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2493
	sata_device_t		sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2494
	sata_drive_info_t	*sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2495
	ddi_dma_attr_t		adj_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2496
	int 			rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2497
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2498
	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2499
	    "sata_scsi_getcap: target: 0x%x, cap: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2500
	    ap->a_target, cap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2501
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2502
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2503
	 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2504
	 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2505
	 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2506
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2507
	if (cap == NULL || whom == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2508
		return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2509
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2510
	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2511
		/* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2512
		return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2513
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2514
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2515
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2516
	if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2517
	    NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2518
		/* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2519
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2520
		    sata_device.satadev_addr.cport)));
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2521
		return (-1);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2522
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2523
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2524
	switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2525
	case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2526
		rval = 1;		/* ARQ supported, turned on */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2527
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2528
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2529
	case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2530
		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2531
			rval = SATA_DISK_SECTOR_SIZE;	/* fixed size */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2532
		else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2533
			rval = SATA_ATAPI_SECTOR_SIZE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2534
		else rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2535
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2536
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2537
	/*
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2538
	 * untagged queuing cause a performance inversion because of
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2539
	 * the way sd operates.  Because of this reason we do not
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2540
	 * use it when available.
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2541
	 */
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2542
	case SCSI_CAP_UNTAGGED_QING:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2543
		if (sdinfo->satadrv_features_enabled &
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2544
		    SATA_DEV_F_E_UNTAGGED_QING)
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2545
			rval = 1;	/* Untagged queuing available */
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2546
		else
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2547
			rval = -1;	/* Untagged queuing not available */
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2548
		break;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2549
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2550
	case SCSI_CAP_TAGGED_QING:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2551
		if ((sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2552
		    SATA_DEV_F_E_TAGGED_QING) &&
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2553
		    (sdinfo->satadrv_max_queue_depth > 1))
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2554
			rval = 1;	/* Tagged queuing available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2555
		else
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2556
			rval = -1;	/* Tagged queuing not available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2557
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2558
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2559
	case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2560
		sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2561
		    &adj_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2562
		rval = (int)adj_dma_attr.dma_attr_maxxfer;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2563
		/* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2564
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2565
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2566
	case SCSI_CAP_INTERCONNECT_TYPE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2567
		rval = INTERCONNECT_SATA;	/* SATA interconnect type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2568
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2569
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2570
	case SCSI_CAP_CDB_LEN:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2571
		if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2572
			rval = sdinfo->satadrv_atapi_cdb_len;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2573
		else
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2574
			rval = -1;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2575
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  2576
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2577
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2578
		rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2579
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2580
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2581
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2582
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2583
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2584
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2585
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2586
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2587
 * Implementation of scsi tran_setcap
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2588
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2589
 * Only SCSI_CAP_UNTAGGED_QING and  SCSI_CAP_TAGGED_QING are changeable.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2590
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2591
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2592
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2593
sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2594
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2595
	sata_hba_inst_t	*sata_hba_inst =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2596
	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2597
	sata_device_t	sata_device;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2598
	sata_drive_info_t	*sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2599
	int		rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2600
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2601
	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2602
	    "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2603
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2604
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2605
	 * We want to process the capabilities on per port granularity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2606
	 * So, we are specifically restricting ourselves to whom != 0
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2607
	 * to exclude the controller wide handling.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2608
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2609
	if (cap == NULL || whom == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2610
		return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2611
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2612
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2613
	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2614
		/* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2615
		return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2616
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2617
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2618
	    sata_device.satadev_addr.cport)));
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2619
	if ((sdinfo = sata_get_device_info(sata_hba_inst,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2620
	    &sata_device)) == NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2621
		/* invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2622
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2623
		    sata_device.satadev_addr.cport)));
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2624
		return (-1);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2625
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2626
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2627
	    sata_device.satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2628
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2629
	switch (scsi_hba_lookup_capstr(cap)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2630
	case SCSI_CAP_ARQ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2631
	case SCSI_CAP_SECTOR_SIZE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2632
	case SCSI_CAP_DMA_MAX:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2633
	case SCSI_CAP_INTERCONNECT_TYPE:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2634
		rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2635
		break;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  2636
	case SCSI_CAP_UNTAGGED_QING:
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2637
		if (SATA_QDEPTH(sata_hba_inst) > 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2638
			rval = 1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2639
			if (value == 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2640
				sdinfo->satadrv_features_enabled |=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2641
				    SATA_DEV_F_E_UNTAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2642
			} else if (value == 0) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2643
				sdinfo->satadrv_features_enabled &=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2644
				    ~SATA_DEV_F_E_UNTAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2645
			} else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2646
				rval = -1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2647
			}
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2648
		} else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2649
			rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2650
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2651
		break;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2652
	case SCSI_CAP_TAGGED_QING:
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2653
		/* This can TCQ or NCQ */
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2654
		if (sata_func_enable & SATA_ENABLE_QUEUING &&
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2655
		    ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2656
		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2657
		    (sata_func_enable & SATA_ENABLE_NCQ &&
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2658
		    sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2659
		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  2660
		    (sdinfo->satadrv_max_queue_depth > 1)) {
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2661
			rval = 1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2662
			if (value == 1) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2663
				sdinfo->satadrv_features_enabled |=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2664
				    SATA_DEV_F_E_TAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2665
			} else if (value == 0) {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2666
				sdinfo->satadrv_features_enabled &=
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  2667
				    ~SATA_DEV_F_E_TAGGED_QING;
3821
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2668
			} else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2669
				rval = -1;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2670
			}
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2671
		} else {
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2672
			rval = 0;
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2673
		}
2c5d11a65307 6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands
ls24207
parents: 3116
diff changeset
  2674
		break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2675
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2676
		rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2677
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2678
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2679
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2680
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2681
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2682
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2683
 * Implementations of scsi tran_destroy_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2684
 * Free resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2685
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2686
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2687
sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2688
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2689
	sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2691
	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2692
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  2693
	sata_common_free_dma_rsrcs(spx);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  2694
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2695
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2696
	sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2697
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2698
	scsi_hba_pkt_free(ap, pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2699
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2700
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2701
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2702
 * Implementation of scsi tran_dmafree.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2703
 * Free DMA resources allocated by sata_scsi_init_pkt()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2704
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2705
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2706
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2707
sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2708
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2709
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2710
	_NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2711
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2712
	sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2713
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2714
	ASSERT(pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2715
	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2716
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  2717
	sata_common_free_dma_rsrcs(spx);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2718
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2719
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2720
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2721
 * Implementation of scsi tran_sync_pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2722
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2723
 * The assumption below is that pkt is unique - there is no need to check ap
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2724
 *
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2725
 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2726
 * into/from the real buffer.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2727
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2728
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2729
sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2730
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2731
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2732
	_NOTE(ARGUNUSED(ap))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2733
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2734
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2735
	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2736
	struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2737
	int direction;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2738
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2739
	ASSERT(spx != NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2740
	if (spx->txlt_buf_dma_handle != NULL) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2741
		direction = spx->txlt_sata_pkt->
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2742
		    satapkt_cmd.satacmd_flags.sata_data_direction;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2743
		if (spx->txlt_sata_pkt != NULL &&
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2744
		    direction != SATA_DIR_NODATA_XFER) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2745
			if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2746
				/* Intermediate DMA buffer used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2747
				bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2748
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2749
				if (direction & SATA_DIR_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2750
					bcopy(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2751
					    spx->txlt_tmp_buf, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2752
				}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2753
			}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2754
			/* Sync the buffer for device or for CPU */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2755
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle,   0, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2756
			    (direction & SATA_DIR_WRITE) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2757
			    DDI_DMA_SYNC_FORDEV :  DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2758
			ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2759
			if (spx->txlt_tmp_buf != NULL &&
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2760
			    !(direction & SATA_DIR_WRITE)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2761
				/* Intermediate DMA buffer used for read */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2762
				bcopy(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2763
				    bp->b_un.b_addr, bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2764
			}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  2765
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2766
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2767
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2768
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2769
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2770
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2771
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2772
/* *******************  SATA - SCSI Translation functions **************** */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2773
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2774
 * SCSI to SATA pkt and command translation and SATA to SCSI status/error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2775
 * translation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2776
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2777
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2778
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2779
 * Checks if a device exists and can be access and translates common
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2780
 * scsi_pkt data to sata_pkt data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2781
 *
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2782
 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2783
 * sata_pkt was set-up.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2784
 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2785
 * exist and pkt_comp callback was scheduled.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2786
 * Returns other TRAN_XXXXX values when error occured and command should be
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2787
 * rejected with the returned TRAN_XXXXX value.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2788
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2789
 * This function should be called with port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2790
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2791
static int
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2792
sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2793
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2794
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2795
	sata_device_t sata_device;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2796
	const struct sata_cmd_flags sata_initial_cmd_flags = {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2797
		SATA_DIR_NODATA_XFER,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2798
		/* all other values to 0/FALSE */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2799
	};
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2800
	/*
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2801
	 * Pkt_reason has to be set if the pkt_comp callback is invoked,
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2802
	 * and that implies TRAN_ACCEPT return value. Any other returned value
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2803
	 * indicates that the scsi packet was not accepted (the reason will not
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2804
	 * be checked by the scsi target driver).
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2805
	 * To make debugging easier, we set pkt_reason to know value here.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2806
	 * It may be changed later when different completion reason is
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2807
	 * determined.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2808
	 */
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2809
	spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2810
	*reason = CMD_TRAN_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2812
	/* Validate address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2813
	switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2814
	    &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2816
	case -1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2817
		/* Invalid address or invalid device type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2818
		return (TRAN_BADPKT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2819
	case 1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2820
		/* valid address but no device - it has disappeared ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2821
		spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2822
		*reason = CMD_DEV_GONE;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2823
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2824
		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2825
		 * only in callback function (for normal requests) and
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2826
		 * in the dump code path.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2827
		 * So, if the callback is available, we need to do
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2828
		 * the callback rather than returning TRAN_FATAL_ERROR here.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2829
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2830
		if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2831
			/* scsi callback required */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2832
			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2833
			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2834
			    (void *)spx->txlt_scsi_pkt,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2835
			    TQ_SLEEP) == NULL)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2836
				/* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2837
				return (TRAN_BUSY);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2838
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2839
			return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2840
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2841
		return (TRAN_FATAL_ERROR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2842
	default:
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2843
		/* all OK; pkt reason will be overwritten later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2844
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2845
	}
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2846
	/*
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2847
	 * If in an interrupt context, reject packet if it is to be
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2848
	 * executed in polling mode
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2849
	 */
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2850
	if (servicing_interrupt() &&
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2851
	    (spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2852
		SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2853
		    "sata_scsi_start: rejecting synchronous command because "
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2854
		    "of interrupt context\n", NULL);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2855
		return (TRAN_BUSY);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2856
	}
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  2857
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2858
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2859
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2860
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2861
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2862
	 * If device is in reset condition, reject the packet with
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2863
	 * TRAN_BUSY, unless:
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2864
	 * 1. system is panicking (dumping)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2865
	 * In such case only one thread is running and there is no way to
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2866
	 * process reset.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2867
	 * 2. cfgadm operation is is progress (internal APCTL lock is set)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2868
	 * Some cfgadm operations involve drive commands, so reset condition
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2869
	 * needs to be ignored for IOCTL operations.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2870
	 */
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  2871
	if ((sdinfo->satadrv_event_flags &
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2872
	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2873
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2874
		if (!ddi_in_panic() &&
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2875
		    ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2876
		    sata_device.satadev_addr.cport) &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2877
		    SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2878
			spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2879
			*reason = CMD_INCOMPLETE;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2880
			SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2881
			    "sata_scsi_start: rejecting command because "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2882
			    "of device reset state\n", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2883
			return (TRAN_BUSY);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2884
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2885
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2886
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2887
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2888
	 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2889
	 * sata_scsi_pkt_init() because pkt init had to work also with
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2890
	 * non-existing devices.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2891
	 * Now we know that the packet was set-up for a real device, so its
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2892
	 * type is known.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2893
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2894
	spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2895
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2896
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2897
	if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2898
	    sata_device.satadev_addr.cport)->cport_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2899
	    SATA_APCTL_LOCK_PORT_BUSY) != 0) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2900
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2901
		    sata_ignore_dev_reset = B_TRUE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  2902
	}
4010
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2903
	/*
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2904
	 * At this point the generic translation routine determined that the
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2905
	 * scsi packet should be accepted. Packet completion reason may be
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2906
	 * changed later when a different completion reason is determined.
d83e031dd201 6543221 sata: should abort processing a command when device is gone and scsi pkt callback is scheduled
pawelw
parents: 3935
diff changeset
  2907
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2908
	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  2909
	*reason = CMD_CMPLT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2910
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2911
	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2912
		/* Synchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2913
		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2914
		    SATA_OPMODE_POLLING;
3023
87cffc3df3bf 6485154 crash dumps for drivers using the sata framework fail
ls24207
parents: 2960
diff changeset
  2915
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
87cffc3df3bf 6485154 crash dumps for drivers using the sata framework fail
ls24207
parents: 2960
diff changeset
  2916
		    sata_ignore_dev_reset = ddi_in_panic();
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2917
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2918
		/* Asynchronous execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2919
		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2920
		    SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2921
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2922
	/* Convert queuing information */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2923
	if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2924
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2925
		    B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2926
	else if (spx->txlt_scsi_pkt->pkt_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2927
	    (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2928
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2929
		    B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2930
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2931
	/* Always limit pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2932
	if (spx->txlt_scsi_pkt->pkt_time == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2933
		spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2934
	else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2935
		/* Pass on scsi_pkt time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2936
		spx->txlt_sata_pkt->satapkt_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2937
		    spx->txlt_scsi_pkt->pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2938
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2939
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2940
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2941
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2942
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2943
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2944
 * Translate ATA Identify Device data to SCSI Inquiry data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2945
 * This function may be called only for ATA devices.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2946
 * This function should not be called for ATAPI devices - they
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2947
 * respond directly to SCSI Inquiry command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2948
 *
10006
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
  2949
 * SATA Identify Device data has to be valid in sata_drive_info.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2950
 * Buffer has to accomodate the inquiry length (36 bytes).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2951
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2952
 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2953
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2954
static	void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2955
sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2956
    sata_drive_info_t *sdinfo, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2957
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2958
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2959
	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2960
	struct sata_id *sid = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2961
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2962
	/* Start with a nice clean slate */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2963
	bzero((void *)inq, sizeof (struct scsi_inquiry));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  2964
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2965
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2966
	 * Rely on the dev_type for setting paripheral qualifier.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2967
	 * Assume that  DTYPE_RODIRECT applies to CD/DVD R/W devices.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2968
	 * It could be that DTYPE_OPTICAL could also qualify in the future.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2969
	 * ATAPI Inquiry may provide more data to the target driver.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2970
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2971
	inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2972
	    DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2973
10006
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
  2974
	/* CFA type device is not a removable media device */
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
  2975
	inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
  2976
	    (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2977
	inq->inq_qual = 0;	/* Device type qualifier (obsolete in SCSI3? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2978
	inq->inq_iso = 0;	/* ISO version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2979
	inq->inq_ecma = 0;	/* ECMA version */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2980
	inq->inq_ansi = 3;	/* ANSI version - SCSI 3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2981
	inq->inq_aenc = 0;	/* Async event notification cap. */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  2982
	inq->inq_trmiop = 0;	/* Supports TERMINATE I/O PROC msg - NO */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2983
	inq->inq_normaca = 0;	/* setting NACA bit supported - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2984
	inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2985
	inq->inq_len = 31;	/* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2986
	inq->inq_dualp = 0;	/* dual port device - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2987
	inq->inq_reladdr = 0;	/* Supports relative addressing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2988
	inq->inq_sync = 0;	/* Supports synchronous data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2989
	inq->inq_linked = 0;	/* Supports linked commands - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2990
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2991
				 * Queuing support - controller has to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2992
				 * support some sort of command queuing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2993
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2994
	if (SATA_QDEPTH(sata_hba_inst) > 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2995
		inq->inq_cmdque = 1; /* Supports command queueing - YES */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2996
	else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2997
		inq->inq_cmdque = 0; /* Supports command queueing - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2998
	inq->inq_sftre = 0;	/* Supports Soft Reset option - NO ??? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  2999
	inq->inq_wbus32 = 0;	/* Supports 32 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3000
	inq->inq_wbus16 = 0;	/* Supports 16 bit wide data xfers - NO */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3001
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3002
#ifdef	_LITTLE_ENDIAN
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3003
	/* Swap text fields to match SCSI format */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3004
	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3005
	swab(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3006
	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3007
		swab(sid->ai_fw, inq->inq_revision, 4);	/* Revision level */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3008
	else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3009
		swab(&sid->ai_fw[4], inq->inq_revision, 4);	/* Rev. level */
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3010
#else	/* _LITTLE_ENDIAN */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3011
	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3012
	bcopy(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3013
	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3014
		bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3015
	else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3016
		bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3017
#endif	/* _LITTLE_ENDIAN */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3018
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3019
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3020
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3021
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3022
 * Scsi response set up for invalid command (command not supported)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3023
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3024
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3025
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3026
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3027
sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3028
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3029
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3030
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3031
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3032
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3033
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3034
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3035
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3036
	*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3037
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3038
	sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3039
	sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3040
	sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3042
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3043
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3044
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3045
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3046
	    scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3047
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3048
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3049
		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3050
		    (void *)spx->txlt_scsi_pkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3051
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3052
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3053
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3054
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3055
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3056
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3057
/*
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3058
 * Scsi response set up for check condition with special sense key
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3059
 * and additional sense code.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3060
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3061
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3062
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3063
static int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3064
sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3065
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3066
	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3067
	int cport = SATA_TXLT_CPORT(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3068
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3069
	struct scsi_extended_sense *sense;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3070
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3071
	mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3072
	scsipkt->pkt_reason = CMD_CMPLT;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3073
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3074
	    STATE_SENT_CMD | STATE_GOT_STATUS;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3075
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3076
	*scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3077
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3078
	sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3079
	sense->es_key = key;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3080
	sense->es_add_code = code;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3081
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3082
	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3083
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3084
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3085
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3086
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3087
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3088
		/* scsi callback required */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3089
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3090
		    (task_func_t *)scsi_hba_pkt_comp,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3091
		    (void *)spx->txlt_scsi_pkt,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3092
		    TQ_SLEEP) == NULL)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3093
			/* Scheduling the callback failed */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3094
			return (TRAN_BUSY);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3095
	return (TRAN_ACCEPT);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3096
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3097
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3098
/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3099
 * Scsi response setup for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3100
 * emulated non-data command that requires no action/return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3101
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3102
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3103
 */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3104
static	int
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3105
sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3106
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3107
	int rval;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3108
	int reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3109
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3110
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3111
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3112
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3113
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3114
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3115
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3116
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3117
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3118
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3119
	spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3120
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3121
	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3122
	*(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3123
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3124
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3125
	    "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3126
	    spx->txlt_scsi_pkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3127
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3128
	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3129
	    spx->txlt_scsi_pkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3130
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3131
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3132
		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3133
		    (void *)spx->txlt_scsi_pkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3134
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3135
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3136
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3137
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3138
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3139
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3140
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3141
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3142
 * SATA translate command: Inquiry / Identify Device
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3143
 * Use cached Identify Device data for now, rather than issuing actual
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3144
 * Device Identify cmd request. If device is detached and re-attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3145
 * asynchromous event processing should fetch and refresh Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3146
 * data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3147
 * Two VPD pages are supported now:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3148
 * Vital Product Data page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3149
 * Unit Serial Number page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3150
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3151
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3152
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3153
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3154
#define	EVPD			1	/* Extended Vital Product Data flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3155
#define	CMDDT			2	/* Command Support Data - Obsolete */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3156
#define	INQUIRY_SUP_VPD_PAGE	0	/* Supported VDP Pages Page COde */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3157
#define	INQUIRY_USN_PAGE	0x80	/* Unit Serial Number Page Code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3158
#define	INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3159
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3160
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3161
sata_txlt_inquiry(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3162
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3163
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3164
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3165
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3166
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3167
	int count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3168
	uint8_t *p;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3169
	int i, j;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3170
	uint8_t page_buf[0xff]; /* Max length */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3171
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3172
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3173
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3174
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3175
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3176
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3177
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3178
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3179
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3180
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3181
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3182
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3183
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3184
	ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3185
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3186
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3187
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3188
	    STATE_SENT_CMD | STATE_GOT_STATUS;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3189
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3190
	/* Reject not supported request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3191
	if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3192
		*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3193
		sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3194
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3195
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3196
		goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3197
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3198
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3199
	/* Valid Inquiry request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3200
	*scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3201
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3202
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3203
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3204
		/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3205
		 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3206
		 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3207
		 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3208
		 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3209
		 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3210
		sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3211
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3212
		if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3213
			/* Standard Inquiry Data request */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3214
			struct scsi_inquiry inq;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3215
			unsigned int bufsize;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3216
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3217
			sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3218
			    sdinfo, (uint8_t *)&inq);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3219
			/* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3220
			count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3221
			    sizeof (struct scsi_inquiry));
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3222
			bufsize = scsipkt->pkt_cdbp[4];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3223
			bufsize |= scsipkt->pkt_cdbp[3] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3224
			count = MIN(count, bufsize);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3225
			bcopy(&inq, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3226
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3227
			scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3228
			scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  3229
			    bufsize - count : 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3230
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3231
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3232
			 * peripheral_qualifier = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3233
			 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3234
			 * We are dealing only with HD and will be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3235
			 * dealing with CD/DVD devices soon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3236
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3237
			uint8_t peripheral_device_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3238
			    sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  3239
			    DTYPE_DIRECT : DTYPE_RODIRECT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3240
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3241
			switch ((uint_t)scsipkt->pkt_cdbp[2]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3242
			case INQUIRY_SUP_VPD_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3243
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3244
				 * Request for suported Vital Product Data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3245
				 * pages - assuming only 2 page codes
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3246
				 * supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3247
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3248
				page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3249
				page_buf[1] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3250
				page_buf[2] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3251
				page_buf[3] = 2; /* page length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3252
				page_buf[4] = INQUIRY_SUP_VPD_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3253
				page_buf[5] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3254
				/* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3255
				count = MIN(bp->b_bcount, 6);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3256
				bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3257
				break;
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3258
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3259
			case INQUIRY_USN_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3260
				/*
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3261
				 * Request for Unit Serial Number page.
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3262
				 * Set-up the page.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3263
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3264
				page_buf[0] = peripheral_device_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3265
				page_buf[1] = INQUIRY_USN_PAGE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3266
				page_buf[2] = 0;
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3267
				/* remaining page length */
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3268
				page_buf[3] = SATA_ID_SERIAL_LEN;
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3269
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3270
				/*
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3271
				 * Copy serial number from Identify Device data
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3272
				 * words into the inquiry page and swap bytes
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3273
				 * when necessary.
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3274
				 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3275
				p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3276
#ifdef	_LITTLE_ENDIAN
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3277
				swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3278
#else
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3279
				bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3280
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3281
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3282
				 * Least significant character of the serial
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3283
				 * number shall appear as the last byte,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3284
				 * according to SBC-3 spec.
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3285
				 * Count trailing spaces to determine the
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3286
				 * necessary shift length.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3287
				 */
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3288
				p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3289
				for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3290
					if (*(p - j) != '\0' &&
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3291
					    *(p - j) != '\040')
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3292
						break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3293
				}
8168
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3294
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3295
				/*
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3296
				 * Shift SN string right, so that the last
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3297
				 * non-blank character would appear in last
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3298
				 * byte of SN field in the page.
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3299
				 * 'j' is the shift length.
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3300
				 */
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3301
				for (i = 0;
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3302
				    i < (SATA_ID_SERIAL_LEN - j) && j != 0;
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3303
				    i++, p--)
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3304
					*p = *(p - j);
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3305
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3306
				/*
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3307
				 * Add leading spaces - same number as the
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3308
				 * shift size
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3309
				 */
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3310
				for (; j > 0; j--)
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3311
					page_buf[4 + j - 1] = '\040';
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3312
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3313
				count = MIN(bp->b_bcount,
1ce10d7bb169 6771971 sata:invalid serial number in inquiry page 0x80 if sata disk SN field contains leading spaces
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 8010
diff changeset
  3314
				    SATA_ID_SERIAL_LEN + 4);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3315
				bcopy(page_buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3316
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3317
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3318
			case INQUIRY_DEV_IDENTIFICATION_PAGE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3319
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3320
				 * We may want to implement this page, when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3321
				 * identifiers are common for SATA devices
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3322
				 * But not now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3323
				 */
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3324
				/*FALLTHROUGH*/
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3326
			default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3327
				/* Request for unsupported VPD page */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3328
				*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3329
				sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3330
				sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3331
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3332
				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3333
				goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3334
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3335
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3336
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3337
		scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3338
		    scsipkt->pkt_cdbp[4] - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3339
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3340
done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3341
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3342
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3343
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3344
	    "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3345
	    scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3346
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3347
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3348
	    scsipkt->pkt_comp != NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3349
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3350
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3351
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3352
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3353
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3354
			return (TRAN_BUSY);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3355
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3356
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3357
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3358
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3359
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3360
 * SATA translate command: Request Sense.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3361
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3362
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3363
 * At the moment this is an emulated command (ATA version for SATA hard disks).
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3364
 * May be translated into Check Power Mode command in the future.
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3365
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3366
 * Note: There is a mismatch between already implemented Informational
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3367
 * Exception Mode Select page 0x1C and this function.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3368
 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3369
 * NO SENSE and set additional sense code to the exception code - this is not
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  3370
 * implemented here.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3371
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3372
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3373
sata_txlt_request_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3374
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3375
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3376
	struct scsi_extended_sense sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3377
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3378
	sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3379
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3380
	int rval, reason, power_state = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3382
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3383
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3384
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3385
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3386
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3387
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3388
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3389
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3390
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3391
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3392
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3393
	*scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3394
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3395
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3396
	 * when CONTROL field's NACA bit == 1
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3397
	 * return ILLEGAL_REQUEST
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3398
	 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3399
	if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3400
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3401
		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3402
		    SD_SCSI_ASC_CMD_SEQUENCE_ERR));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3403
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3404
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3405
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3406
	    &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3407
	ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3408
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3409
	spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3410
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3411
	sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3412
	scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3413
	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3414
	if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3415
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3416
		return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3417
	} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3418
		if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3419
			mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3420
			return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3421
			    SD_SCSI_ASC_NO_ADD_SENSE));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3422
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3423
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3424
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3425
	switch (scmd->satacmd_sec_count_lsb) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3426
	case SATA_PWRMODE_STANDBY: /* device in standby mode */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3427
		if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3428
			power_state = SATA_POWER_STOPPED;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3429
		else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3430
			power_state = SATA_POWER_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3431
			sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3432
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3433
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3434
	case SATA_PWRMODE_IDLE: /* device in idle mode */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3435
		power_state = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3436
		sdinfo->satadrv_power_level = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3437
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3438
	case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3439
	default:		  /* 0x40, 0x41 active mode */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3440
		if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3441
			power_state = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3442
		else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3443
			power_state = SATA_POWER_ACTIVE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3444
			sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3445
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3446
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3447
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3448
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3449
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3450
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3451
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3452
		/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3453
		 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3454
		 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3455
		 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3456
		 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3457
		 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3458
		int count = MIN(bp->b_bcount,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3459
		    sizeof (struct scsi_extended_sense));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3460
		sata_scsi_dmafree(NULL, scsipkt);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3461
		bzero(&sense, sizeof (struct scsi_extended_sense));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3462
		sense.es_valid = 0;	/* Valid LBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3463
		sense.es_class = 7;	/* Response code 0x70 - current err */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3464
		sense.es_key = KEY_NO_SENSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3465
		sense.es_add_len = 6;	/* Additional length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3466
		/* Copy no more than requested */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3467
		bcopy(&sense, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3468
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3469
		scsipkt->pkt_resid = 0;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3470
		switch (power_state) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3471
		case SATA_POWER_IDLE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3472
		case SATA_POWER_STANDBY:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3473
			sense.es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3474
			    SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3475
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3476
		case SATA_POWER_STOPPED:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3477
			sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3478
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3479
		case SATA_POWER_ACTIVE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3480
		default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3481
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3482
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3483
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3484
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3485
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3486
	    "Scsi_pkt completion reason %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3487
	    scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3488
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3489
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3490
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3491
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3492
		    (task_func_t *)scsi_hba_pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3493
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3494
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3495
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3496
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3497
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3498
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3499
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3500
 * SATA translate command: Test Unit Ready
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3501
 * At the moment this is an emulated command (ATA version for SATA hard disks).
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3502
 * May be translated into Check Power Mode command in the future
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3503
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3504
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3505
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3506
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3507
sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3508
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3509
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3510
	struct scsi_extended_sense *sense;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3511
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3512
	sata_drive_info_t *sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3513
	int power_state;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3514
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3515
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3516
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3517
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3518
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3519
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3520
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3521
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3522
	}
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3523
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3524
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3525
	    &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3526
	ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3527
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3528
	spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3529
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3530
	/* send CHECK POWER MODE command */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3531
	sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3532
	scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3533
	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3534
	if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3535
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3536
		return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3537
	} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3538
		if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3539
			mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3540
			return (sata_txlt_check_condition(spx, KEY_NOT_READY,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3541
			    SD_SCSI_ASC_LU_NOT_RESPONSE));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3542
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3543
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3544
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3545
	power_state = scmd->satacmd_sec_count_lsb;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3546
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3547
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3548
	 * return NOT READY when device in STOPPED mode
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3549
	 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3550
	if (power_state == SATA_PWRMODE_STANDBY &&
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3551
	    sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3552
		*scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3553
		sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3554
		sense->es_key = KEY_NOT_READY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3555
		sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3556
	} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3557
		/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3558
		 * For other power mode, return GOOD status
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3559
		 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3560
		*scsipkt->pkt_scbp = STATUS_GOOD;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3561
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3562
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3563
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3564
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3565
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3566
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3567
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3568
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3569
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3570
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3571
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3572
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3573
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3574
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3575
		    (task_func_t *)scsi_hba_pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  3576
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3577
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  3578
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3579
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3580
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3581
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3582
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3583
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3584
 * SATA translate command: Start Stop Unit
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3585
 * Translation depends on a command:
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3586
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3587
 * Power condition bits will be supported
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3588
 * and the power level should be maintained by SATL,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3589
 * When SATL received a command, it will check the
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3590
 * power level firstly, and return the status according
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3591
 * to SAT2 v2.6 and SAT-2 Standby Modifications
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3592
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3593
 * SPC-4/SBC-3      SATL    ATA power condition  SATL      SPC/SBC
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3594
 * -----------------------------------------------------------------------
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3595
 * SSU_PC1 Active   <==>     ATA  Active         <==>     SSU:start_bit =1
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3596
 * SSU_PC2 Idle     <==>     ATA  Idle           <==>     N/A
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3597
 * SSU_PC3 Standby  <==>     ATA  Standby        <==>     N/A
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3598
 * SSU_PC4 Stopped  <==>     ATA  Standby        <==>     SSU:start_bit = 0
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3599
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3600
 *	Unload Media / NOT SUPPORTED YET
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3601
 *	Load Media / NOT SUPPROTED YET
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3602
 *	Immediate bit / NOT SUPPORTED YET (deferred error)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3603
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3604
 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3605
 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3606
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3607
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3608
sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3609
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3610
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3611
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3612
	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3613
	int cport = SATA_TXLT_CPORT(spx);
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3614
	int rval, reason;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3615
	sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3616
	sata_id_t *sata_id;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3617
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3618
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3619
	    "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3620
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3621
	mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3622
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3623
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3624
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3625
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3626
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3627
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3628
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3629
	if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3630
		/* IMMED bit - not supported */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3631
		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3632
		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3633
		    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3634
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3635
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3636
	spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3637
	spx->txlt_sata_pkt->satapkt_comp = NULL;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3638
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3639
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3640
	    &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3641
	ASSERT(sdinfo != NULL);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3642
	sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3643
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3644
	switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3645
	case 0:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3646
		if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3647
			/* Load/Unload Media - invalid request */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3648
			goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3649
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3650
		if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3651
			/* Start Unit */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3652
			sata_build_read_verify_cmd(scmd, 1, 5);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3653
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3654
			/* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3655
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3656
				/* Pkt not accepted for execution */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3657
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3658
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3659
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3660
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3661
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3662
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3663
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3664
			sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3665
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3666
			/* Stop Unit */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3667
			sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3668
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3669
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3670
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3671
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3672
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3673
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3674
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3675
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3676
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3677
			/* ata standby immediate command */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3678
			sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3679
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3680
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3681
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3682
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3683
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3684
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3685
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3686
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3687
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3688
			sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3689
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3690
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3691
	case 0x1:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3692
		sata_build_generic_cmd(scmd, SATAC_IDLE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3693
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3694
		if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3695
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3696
			return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3697
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3698
			if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3699
				goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3700
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3701
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3702
		sata_build_read_verify_cmd(scmd, 1, 5);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3703
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3704
		/* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3705
		if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3706
			/* Pkt not accepted for execution */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3707
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3708
			return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3709
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3710
			if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3711
				goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3712
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3713
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3714
		sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3715
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3716
	case 0x2:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3717
		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3718
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3719
		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3720
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3721
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3722
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3723
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3724
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3725
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3726
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3727
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3728
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3729
		sata_build_generic_cmd(scmd, SATAC_IDLE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3730
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3731
		if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3732
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3733
			return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3734
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3735
			if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3736
				goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3737
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3738
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3739
		if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3740
			/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3741
			 *  POWER CONDITION MODIFIER bit set
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3742
			 *  to 0x1 or larger it will be handled
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3743
			 *  on the same way as bit = 0x1
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3744
			 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3745
			if (!(sata_id->ai_cmdset84 &
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3746
			    SATA_IDLE_UNLOAD_SUPPORTED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3747
				sdinfo->satadrv_power_level = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3748
				break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3749
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3750
			sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3751
			scmd->satacmd_features_reg = 0x44;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3752
			scmd->satacmd_lba_low_lsb = 0x4c;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3753
			scmd->satacmd_lba_mid_lsb = 0x4e;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3754
			scmd->satacmd_lba_high_lsb = 0x55;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3755
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3756
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3757
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3758
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3759
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3760
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3761
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3762
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3763
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3764
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3765
		sdinfo->satadrv_power_level = SATA_POWER_IDLE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3766
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3767
	case 0x3:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3768
		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3769
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3770
		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3771
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3772
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3773
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3774
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3775
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3776
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3777
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3778
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3779
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3780
		sata_build_generic_cmd(scmd, SATAC_STANDBY);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3781
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3782
		if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3783
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3784
			return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3785
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3786
			if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3787
				goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3788
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3789
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3790
		sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3791
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3792
	case 0x7:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3793
		sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3794
		scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3795
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3796
		if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3797
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3798
			return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3799
		} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3800
			if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3801
				goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3802
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3803
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3804
		switch (scmd->satacmd_sec_count_lsb) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3805
		case SATA_PWRMODE_STANDBY:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3806
			sata_build_generic_cmd(scmd, SATAC_STANDBY);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3807
			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3808
			    sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3809
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3810
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3811
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3812
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3813
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3814
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3815
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3816
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3817
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3818
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3819
		case SATA_PWRMODE_IDLE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3820
			sata_build_generic_cmd(scmd, SATAC_IDLE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3821
			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3822
			    sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3823
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3824
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3825
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3826
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3827
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3828
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3829
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3830
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3831
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3832
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3833
		case SATA_PWRMODE_ACTIVE_SPINDOWN:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3834
		case SATA_PWRMODE_ACTIVE_SPINUP:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3835
		case SATA_PWRMODE_ACTIVE:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3836
			sata_build_generic_cmd(scmd, SATAC_IDLE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3837
			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3838
			    sdinfo->satadrv_standby_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3839
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3840
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3841
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3842
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3843
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3844
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3845
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3846
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3847
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3848
			sata_build_read_verify_cmd(scmd, 1, 5);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3849
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3850
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3851
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3852
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3853
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3854
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3855
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3856
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3857
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3858
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3859
		default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3860
			goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3861
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3862
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3863
	case 0xb:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3864
		if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3865
		    0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3866
			mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3867
			return (sata_txlt_check_condition(spx,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3868
			    KEY_ILLEGAL_REQUEST,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3869
			    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3870
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3871
		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3872
		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3873
		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3874
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3875
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3876
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3877
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3878
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3879
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3880
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3881
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3882
			sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3883
			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3884
			if (sata_hba_start(spx, &rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3885
				mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3886
				return (rval);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3887
			} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3888
				if (scmd->satacmd_error_reg != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3889
					goto err_out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3890
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3891
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3892
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3893
		bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3894
		break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3895
	default:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3896
err_out:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3897
		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3898
		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3899
		    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3900
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3901
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3902
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3903
	 * since it was synchronous commands,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3904
	 * a callback function will be called directely.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3905
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3906
	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3907
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3908
	    "synchronous execution status %x\n",
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3909
	    spx->txlt_sata_pkt->satapkt_reason);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3910
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3911
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3912
		sata_set_arq_data(spx->txlt_sata_pkt);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3913
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3914
		    (task_func_t *)scsi_hba_pkt_comp, (void *) scsipkt,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3915
		    TQ_SLEEP) == 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3916
			return (TRAN_BUSY);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3917
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3918
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3919
	else
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3920
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3921
		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  3922
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3923
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3924
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3925
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3926
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3927
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3928
 * SATA translate command:  Read Capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3929
 * Emulated command for SATA disks.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3930
 * Capacity is retrieved from cached Idenifty Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3931
 * Identify Device data shows effective disk capacity, not the native
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3932
 * capacity, which may be limitted by Set Max Address command.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  3933
 * This is ATA version for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3934
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3935
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3936
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3937
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3938
sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3939
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3940
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3941
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3942
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3943
	uint64_t val;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3944
	uchar_t *rbuf;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3945
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3946
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3947
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3948
	    "sata_txlt_read_capacity: ", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3949
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3950
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3951
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3952
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  3953
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3954
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3955
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3956
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3957
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3958
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3959
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3960
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3961
	*scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3962
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3963
		/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3964
		 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3965
		 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3966
		 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3967
		 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3968
		 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3969
		sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  3970
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3971
		sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3972
		    spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3973
		    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3974
		/* Last logical block address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3975
		val = sdinfo->satadrv_capacity - 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3976
		rbuf = (uchar_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3977
		/* Need to swap endians to match scsi format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3978
		rbuf[0] = (val >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3979
		rbuf[1] = (val >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3980
		rbuf[2] = (val >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3981
		rbuf[3] = val & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3982
		/* block size - always 512 bytes, for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3983
		rbuf[4] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3984
		rbuf[5] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3985
		rbuf[6] = 0x02;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3986
		rbuf[7] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3987
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3988
		scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3989
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3990
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3991
		    sdinfo->satadrv_capacity -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3992
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3993
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3994
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3995
	 * If a callback was requested, do it now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3996
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3997
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3998
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  3999
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4000
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4001
	    scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4002
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4003
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4004
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  4005
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4006
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4007
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4008
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4009
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4010
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4011
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4012
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4013
 * SATA translate command: Mode Sense.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4014
 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4015
 * Saved Values Page Control (03) are not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4016
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4017
 * NOTE: only caching mode sense page is currently implemented.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4018
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4019
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4020
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4021
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  4022
#define	LLBAA	0x10	/* Long LBA Accepted */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  4023
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4024
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4025
sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4026
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4027
	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4028
	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4029
	sata_drive_info_t *sdinfo;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4030
	sata_id_t *sata_id;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4031
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4032
	int 		len, bdlen, count, alc_len;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4033
	int		pc;	/* Page Control code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4034
	uint8_t		*buf;	/* mode sense buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4035
	int		rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4036
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4037
	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4038
	    "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4039
	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4040
	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4042
	buf = kmem_zalloc(1024, KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4043
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4044
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4045
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4046
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4047
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4048
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4049
		kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4050
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4051
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4052
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4053
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4054
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4055
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4056
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4057
	pc = scsipkt->pkt_cdbp[2] >> 6;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4058
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4059
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4060
		/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4061
		 * Because it is fully emulated command storing data
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4062
		 * programatically in the specified buffer, release
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4063
		 * preallocated DMA resources before storing data in the buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4064
		 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4065
		 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4066
		sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4067
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4068
		len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4069
		bdlen = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4070
		if (!(scsipkt->pkt_cdbp[1] & 8)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4071
			if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  4072
			    (scsipkt->pkt_cdbp[1] & LLBAA))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4073
				bdlen = 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4074
			else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4075
				bdlen = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4076
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4077
		/* Build mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4078
		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4079
			/* 4-byte mode parameter header */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4080
			buf[len++] = 0;		/* mode data length */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4081
			buf[len++] = 0;		/* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4082
			buf[len++] = 0;		/* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4083
			buf[len++] = bdlen;	/* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4084
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4085
			/* 8-byte mode parameter header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4086
			buf[len++] = 0;		/* mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4087
			buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4088
			buf[len++] = 0;		/* medium type */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4089
			buf[len++] = 0;		/* dev-specific param */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4090
			if (bdlen == 16)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4091
				buf[len++] = 1;	/* long lba descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4092
			else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4093
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4094
			buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4095
			buf[len++] = 0;		/* Block Descriptor length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4096
			buf[len++] = bdlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4097
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4098
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4099
		sdinfo = sata_get_device_info(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4100
		    spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4101
		    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4102
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4103
		/* Build block descriptor only if not disabled (DBD) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4104
		if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4105
			/* Block descriptor - direct-access device format */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4106
			if (bdlen == 8) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4107
				/* build regular block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4108
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4109
				    (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4110
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4111
				    (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4112
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4113
				    (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4114
				buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4115
				buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4116
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4117
				if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4118
				    SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4119
					buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4120
				else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4121
					/* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4122
					buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4123
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4124
			} else if (bdlen == 16) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4125
				/* Long LBA Accepted */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4126
				/* build long lba block descriptor */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4127
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4128
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4129
				    (sdinfo->satadrv_capacity >> 56) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4130
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4131
				    (sdinfo->satadrv_capacity >> 48) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4132
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4133
				    (sdinfo->satadrv_capacity >> 40) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4134
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4135
				    (sdinfo->satadrv_capacity >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4136
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4137
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4138
				    (sdinfo->satadrv_capacity >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4139
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4140
				    (sdinfo->satadrv_capacity >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4141
				buf[len++] =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4142
				    (sdinfo->satadrv_capacity >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4143
				buf[len++] = sdinfo->satadrv_capacity & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4144
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4145
				buf[len++] = 0; /* density code */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4146
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4147
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4148
				if (sdinfo->satadrv_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4149
				    SATA_DTYPE_ATADISK)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4150
					buf[len++] = 2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4151
				else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4152
					/* ATAPI */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4153
					buf[len++] = 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4154
				buf[len++] = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4155
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4156
		}
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4157
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4158
		sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4159
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4160
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4161
		 * Add requested pages.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4162
		 * Page 3 and 4 are obsolete and we are not supporting them.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4163
		 * We deal now with:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4164
		 * caching (read/write cache control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4165
		 * We should eventually deal with following mode pages:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4166
		 * error recovery  (0x01),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4167
		 * power condition (0x1a),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4168
		 * exception control page (enables SMART) (0x1c),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4169
		 * enclosure management (ses),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4170
		 * protocol-specific port mode (port control).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4171
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4172
		switch (scsipkt->pkt_cdbp[2] & 0x3f) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4173
		case MODEPAGE_RW_ERRRECOV:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4174
			/* DAD_MODE_ERR_RECOV */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4175
			/* R/W recovery */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4176
			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4177
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4178
		case MODEPAGE_CACHING:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4179
			/* DAD_MODE_CACHE */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4180
			/* Reject not supported request for saved parameters */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4181
			if (pc == 3) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4182
				*scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4183
				sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4184
				sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4185
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4186
				    SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4187
				goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4188
			}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4189
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4190
			/* caching */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4191
			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4192
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4193
		case MODEPAGE_INFO_EXCPT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4194
			/* exception cntrl */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4195
			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4196
				len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4197
				    buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4198
			}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4199
			else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4200
				goto err;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4201
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4202
		case MODEPAGE_POWER_COND:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4203
			/* DAD_MODE_POWER_COND */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4204
			/* power condition */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4205
			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4206
			break;
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4207
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4208
		case MODEPAGE_ACOUSTIC_MANAG:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4209
			/* acoustic management */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4210
			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4211
			break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4212
		case MODEPAGE_ALLPAGES:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4213
			/* all pages */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4214
			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4215
			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4216
			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4217
			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4218
				len += sata_build_msense_page_1c(sdinfo, pc,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4219
				    buf+len);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4220
			}
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4221
			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4222
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4223
		default:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4224
		err:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4225
			/* Invalid request */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4226
			*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4227
			sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4228
			sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4229
			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4230
			goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4231
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4232
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4233
		/* fix total mode data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4234
		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4235
			/* 4-byte mode parameter header */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4236
			buf[0] = len - 1;	/* mode data length */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4237
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4238
			buf[0] = (len -2) >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4239
			buf[1] = (len -2) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4240
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4241
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4242
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4243
		/* Check allocation length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4244
		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4245
			alc_len = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4246
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4247
			alc_len = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4248
			alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4249
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4250
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4251
		 * We do not check for possible parameters truncation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4252
		 * (alc_len < len) assuming that the target driver works
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4253
		 * correctly. Just avoiding overrun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4254
		 * Copy no more than requested and possible, buffer-wise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4255
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4256
		count = MIN(alc_len, len);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4257
		count = MIN(bp->b_bcount, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4258
		bcopy(buf, bp->b_un.b_addr, count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4260
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4261
		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4262
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4263
	*scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4264
done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4265
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4266
	(void) kmem_free(buf, 1024);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4267
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4268
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4269
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4270
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4271
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4272
	    scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4273
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4274
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4275
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  4276
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4277
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4278
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4279
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4280
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4281
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4282
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4283
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4284
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4285
 * SATA translate command: Mode Select.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4286
 * Translated into appropriate SATA command or emulated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4287
 * Saving parameters is not supported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4288
 * Changing device capacity is not supported (although theoretically
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4289
 * possible by executing SET FEATURES/SET MAX ADDRESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4290
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4291
 * Assumption is that the target driver is working correctly.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4292
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4293
 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4294
 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4295
 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4296
 *
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4297
 * NOTE: Implemented pages:
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4298
 * - caching page
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4299
 * - informational exception page
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4300
 * - acoustic management page
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4301
 * - power condition page
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4302
 * Caching setup is remembered so it could be re-stored in case of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4303
 * an unexpected device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4304
 *
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4305
 * Returns TRAN_XXXX.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4306
 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4307
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4308
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4309
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4310
sata_txlt_mode_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4311
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4312
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4313
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4314
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4315
	int len, pagelen, count, pllen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4316
	uint8_t *buf;	/* mode select buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4317
	int rval, stat, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4318
	uint_t nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4319
	int dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4320
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4321
	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4322
	    "sata_txlt_mode_select, pc %x page code 0x%02x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4323
	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4324
	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4325
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4326
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4327
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4328
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4329
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4330
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4331
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4332
	}
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4333
	/*
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4334
	 * If in interrupt context, reject this packet because it may result
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4335
	 * in issuing a synchronous command to HBA.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4336
	 */
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4337
	if (servicing_interrupt()) {
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4338
		SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4339
		    "sata_txlt_mode_select: rejecting command because "
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4340
		    "of interrupt context\n", NULL);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4341
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4342
		return (TRAN_BUSY);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4343
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4344
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4345
	rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4346
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4347
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4348
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4349
	    STATE_SENT_CMD | STATE_GOT_STATUS;
7580
46eb99d9fe81 6731979 sata: value of nointr_flag in sata_txlt_mode_select on x86 could be 'random'
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7510
diff changeset
  4350
	nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4351
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4352
	/* Reject not supported request */
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4353
	if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4354
		*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4355
		sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4356
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4357
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4358
		goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4359
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4360
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4361
	if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4362
		pllen = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4363
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4364
		pllen = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4365
		pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4366
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4367
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4368
	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4369
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4370
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4371
		buf = (uint8_t *)bp->b_un.b_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4372
		count = MIN(bp->b_bcount, pllen);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4373
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4374
		scsipkt->pkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4375
		pllen = count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4376
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4377
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4378
		 * Check the header to skip the block descriptor(s) - we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4379
		 * do not support setting device capacity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4380
		 * Existing macros do not recognize long LBA dscriptor,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4381
		 * hence manual calculation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4382
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4383
		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4384
			/* 6-bytes CMD, 4 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4385
			if (count <= 4)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4386
				goto done;		/* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4387
			len = buf[3] + 4;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4388
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4389
			/* 10-bytes CMD, 8 bytes header */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4390
			if (count <= 8)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4391
				goto done;		/* header only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4392
			len = buf[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4393
			len = (len << 8) + buf[7] + 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4394
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4395
		if (len >= count)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4396
			goto done;	/* header + descriptor(s) only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4397
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4398
		pllen -= len;		/* remaining data length */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4399
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4400
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4401
		 * We may be executing SATA command and want to execute it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4402
		 * in SYNCH mode, regardless of scsi_pkt setting.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4403
		 * Save scsi_pkt setting and indicate SYNCH mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4404
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4405
		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4406
		    scsipkt->pkt_comp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4407
			scsipkt->pkt_flags |= FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4408
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4409
		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4410
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4411
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4412
		 * len is now the offset to a first mode select page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4413
		 * Process all pages
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4414
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4415
		while (pllen > 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4416
			switch ((int)buf[len]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4417
			case MODEPAGE_CACHING:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4418
				/* No support for SP (saving) */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4419
				if (scsipkt->pkt_cdbp[1] & 0x01) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4420
					*scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4421
					sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4422
					sense->es_key = KEY_ILLEGAL_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4423
					sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4424
					    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4425
					goto done;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4426
				}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4427
				stat = sata_mode_select_page_8(spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4428
				    (struct mode_cache_scsi3 *)&buf[len],
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4429
				    pllen, &pagelen, &rval, &dmod);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4430
				/*
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4431
				 * The pagelen value indicates the number of
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4432
				 * parameter bytes already processed.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4433
				 * The rval is the return value from
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4434
				 * sata_tran_start().
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4435
				 * The stat indicates the overall status of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4436
				 * the operation(s).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4437
				 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4438
				if (stat != SATA_SUCCESS)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4439
					/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4440
					 * Page processing did not succeed -
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4441
					 * all error info is already set-up,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4442
					 * just return
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4443
					 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4444
					pllen = 0; /* this breaks the loop */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4445
				else {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4446
					len += pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4447
					pllen -= pagelen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4448
				}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4449
				break;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4450
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4451
			case MODEPAGE_INFO_EXCPT:
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4452
				stat = sata_mode_select_page_1c(spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4453
				    (struct mode_info_excpt_page *)&buf[len],
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4454
				    pllen, &pagelen, &rval, &dmod);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4455
				/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4456
				 * The pagelen value indicates the number of
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4457
				 * parameter bytes already processed.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  4458
				 * The rval is the return value from
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4459
				 * sata_tran_start().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4460
				 * The stat indicates the overall status of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4461
				 * the operation(s).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4462
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4463
				if (stat != SATA_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4464
					/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4465
					 * Page processing did not succeed -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4466
					 * all error info is already set-up,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4467
					 * just return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4468
					 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4469
					pllen = 0; /* this breaks the loop */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4470
				else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4471
					len += pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4472
					pllen -= pagelen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4473
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4474
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4475
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4476
			case MODEPAGE_ACOUSTIC_MANAG:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4477
				stat = sata_mode_select_page_30(spx,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4478
				    (struct mode_acoustic_management *)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4479
				    &buf[len], pllen, &pagelen, &rval, &dmod);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4480
				/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4481
				 * The pagelen value indicates the number of
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4482
				 * parameter bytes already processed.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4483
				 * The rval is the return value from
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4484
				 * sata_tran_start().
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4485
				 * The stat indicates the overall status of
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4486
				 * the operation(s).
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4487
				 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4488
				if (stat != SATA_SUCCESS)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4489
					/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4490
					 * Page processing did not succeed -
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4491
					 * all error info is already set-up,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4492
					 * just return
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4493
					 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4494
					pllen = 0; /* this breaks the loop */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4495
				else {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4496
					len += pagelen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4497
					pllen -= pagelen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4498
				}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4499
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  4500
				break;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4501
			case MODEPAGE_POWER_COND:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4502
				stat = sata_mode_select_page_1a(spx,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4503
				    (struct mode_info_power_cond *)&buf[len],
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4504
				    pllen, &pagelen, &rval, &dmod);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4505
				/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4506
				 * The pagelen value indicates the number of
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4507
				 * parameter bytes already processed.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4508
				 * The rval is the return value from
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4509
				 * sata_tran_start().
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4510
				 * The stat indicates the overall status of
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4511
				 * the operation(s).
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4512
				 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4513
				if (stat != SATA_SUCCESS)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4514
					/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4515
					 * Page processing did not succeed -
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4516
					 * all error info is already set-up,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4517
					 * just return
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4518
					 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4519
					pllen = 0; /* this breaks the loop */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4520
				else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4521
					len += pagelen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4522
					pllen -= pagelen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4523
				}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4524
				break;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4525
			default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4526
				*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4527
				sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4528
				sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4529
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4530
				    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4531
				goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4532
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4533
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4534
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4535
done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4536
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4537
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4538
	 * If device parameters were modified, fetch and store the new
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4539
	 * Identify Device data. Since port mutex could have been released
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4540
	 * for accessing HBA driver, we need to re-check device existence.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4541
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4542
	if (dmod != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4543
		sata_drive_info_t new_sdinfo, *sdinfo;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4544
		int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4545
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4546
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4547
		 * Following statement has to be changed if this function is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4548
		 * used for devices other than SATA hard disks.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4549
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  4550
		new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4551
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4552
		new_sdinfo.satadrv_addr =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4553
		    spx->txlt_sata_pkt->satapkt_device.satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4554
		rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4555
		    &new_sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4556
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4557
		mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4558
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4559
		 * Since port mutex could have been released when
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4560
		 * accessing HBA driver, we need to re-check that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4561
		 * framework still holds the device info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4562
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4563
		sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4564
		    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4565
		if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4566
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4567
			 * Device still has info structure in the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4568
			 * sata framework. Copy newly fetched info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4569
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4570
			if (rv == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4571
				sdinfo->satadrv_id = new_sdinfo.satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4572
				sata_save_drive_settings(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4573
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4574
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4575
				 * Could not fetch new data - invalidate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4576
				 * sata_drive_info. That makes device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4577
				 * unusable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4578
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4579
				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4580
				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4581
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4582
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4583
		if (rv != 0 || sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4584
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4585
			 * This changes the overall mode select completion
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4586
			 * reason to a failed one !!!!!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4587
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4588
			*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4589
			sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4590
			scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4591
			rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4592
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4593
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4594
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4595
	/* Restore the scsi pkt flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4596
	scsipkt->pkt_flags &= ~FLAG_NOINTR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4597
	scsipkt->pkt_flags |= nointr_flag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4598
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4599
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4600
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4601
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4602
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4603
	    scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4604
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4605
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4606
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  4607
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4608
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4609
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4610
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4611
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4612
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4613
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4614
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4615
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4616
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4617
 * Translate command: Log Sense
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4618
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4619
static 	int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4620
sata_txlt_log_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4621
{
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4622
	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4623
	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4624
	sata_drive_info_t *sdinfo;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4625
	struct scsi_extended_sense *sense;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4626
	int 		len, count, alc_len;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4627
	int		pc;	/* Page Control code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4628
	int		page_code;	/* Page code */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4629
	uint8_t		*buf;	/* log sense buffer */
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4630
	int		rval, reason;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4631
#define	MAX_LOG_SENSE_PAGE_SIZE	512
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4632
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4633
	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4634
	    "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4635
	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4636
	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4637
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4638
	buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4639
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4640
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4641
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4642
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4643
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4644
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4645
		kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4646
		return (rval);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4647
	}
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4648
	/*
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4649
	 * If in interrupt context, reject this packet because it may result
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4650
	 * in issuing a synchronous command to HBA.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4651
	 */
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4652
	if (servicing_interrupt()) {
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4653
		SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4654
		    "sata_log_sense: rejecting command because "
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4655
		    "of interrupt context\n", NULL);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4656
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4657
		kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4658
		return (TRAN_BUSY);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  4659
	}
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4660
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4661
	scsipkt->pkt_reason = CMD_CMPLT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4662
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4663
	    STATE_SENT_CMD | STATE_GOT_STATUS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4664
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4665
	pc = scsipkt->pkt_cdbp[2] >> 6;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4666
	page_code = scsipkt->pkt_cdbp[2] & 0x3f;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4667
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  4668
	/* Reject not supported request for all but cumulative values */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4669
	switch (pc) {
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  4670
	case PC_CUMULATIVE_VALUES:
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4671
		break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4672
	default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4673
		*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4674
		sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4675
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4676
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4677
		goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4678
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4679
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4680
	switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4681
	case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4682
	case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4683
	case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4684
	case PAGE_CODE_SMART_READ_DATA:
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4685
	case PAGE_CODE_START_STOP_CYCLE_COUNTER:
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4686
		break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4687
	default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4688
		*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4689
		sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4690
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4691
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4692
		goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4693
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4694
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4695
	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4696
		/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4697
		 * Because log sense uses local buffers for data retrieval from
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4698
		 * the devices and sets the data programatically in the
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4699
		 * original specified buffer, release preallocated DMA
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4700
		 * resources before storing data in the original buffer,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4701
		 * so no unwanted DMA sync would take place.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4702
		 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4703
		sata_id_t *sata_id;
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4704
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4705
		sata_scsi_dmafree(NULL, scsipkt);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
  4706
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4707
		len = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4708
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4709
		/* Build log parameter header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4710
		buf[len++] = page_code;	/* page code as in the CDB */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4711
		buf[len++] = 0;		/* reserved */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4712
		buf[len++] = 0;		/* Zero out page length for now (MSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4713
		buf[len++] = 0;		/* (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4714
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4715
		sdinfo = sata_get_device_info(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4716
		    spx->txlt_sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4717
		    &spx->txlt_sata_pkt->satapkt_device);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4718
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4719
		/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4720
		 * Add requested pages.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4721
		 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4722
		switch (page_code) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4723
		case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4724
			len = sata_build_lsense_page_0(sdinfo, buf + len);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4725
			break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4726
		case PAGE_CODE_SELF_TEST_RESULTS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4727
			sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4728
			if ((! (sata_id->ai_cmdset84 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4729
			    SATA_SMART_SELF_TEST_SUPPORTED)) ||
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4730
			    (! (sata_id->ai_features87 &
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4731
			    SATA_SMART_SELF_TEST_SUPPORTED))) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4732
				*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4733
				sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4734
				sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4735
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4736
				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4737
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4738
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4739
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4740
			len = sata_build_lsense_page_10(sdinfo, buf + len,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4741
			    spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4742
			break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4743
		case PAGE_CODE_INFORMATION_EXCEPTIONS:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4744
			sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4745
			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4746
				*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4747
				sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4748
				sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4749
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4750
				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4751
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4752
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4753
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4754
			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4755
				*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4756
				sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4757
				sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4758
				sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4759
				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4760
				sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4761
				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4762
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4763
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4764
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4765
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4766
			len = sata_build_lsense_page_2f(sdinfo, buf + len,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4767
			    spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4768
			break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4769
		case PAGE_CODE_SMART_READ_DATA:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4770
			sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4771
			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4772
				*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4773
				sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4774
				sense->es_key = KEY_ILLEGAL_REQUEST;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4775
				sense->es_add_code =
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4776
				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4777
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4778
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4779
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4780
			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4781
				*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4782
				sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4783
				sense->es_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4784
				sense->es_add_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4785
				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4786
				sense->es_qual_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4787
				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4788
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4789
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4790
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4791
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4792
			/* This page doesn't include a page header */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4793
			len = sata_build_lsense_page_30(sdinfo, buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4794
			    spx->txlt_sata_hba_inst);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4795
			goto no_header;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4796
		case PAGE_CODE_START_STOP_CYCLE_COUNTER:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4797
			sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4798
			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4799
				*scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4800
				sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4801
				sense->es_key = KEY_ILLEGAL_REQUEST;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4802
				sense->es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4803
				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4804
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4805
				goto done;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4806
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4807
			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4808
				*scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4809
				sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4810
				sense->es_key = KEY_ABORTED_COMMAND;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4811
				sense->es_add_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4812
				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4813
				sense->es_qual_code =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4814
				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4815
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4816
				goto done;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4817
			}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4818
			len = sata_build_lsense_page_0e(sdinfo, buf, spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4819
			goto no_header;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4820
		default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4821
			/* Invalid request */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4822
			*scsipkt->pkt_scbp = STATUS_CHECK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4823
			sense = sata_arq_sense(spx);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4824
			sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4825
			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4826
			goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4827
		}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4828
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4829
		/* set parameter log sense data length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4830
		buf[2] = len >> 8;	/* log sense length (MSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4831
		buf[3] = len & 0xff;	/* log sense length (LSB) */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4832
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4833
		len += SCSI_LOG_PAGE_HDR_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4834
		ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4835
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4836
no_header:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4837
		/* Check allocation length */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4838
		alc_len = scsipkt->pkt_cdbp[7];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4839
		alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4840
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4841
		/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4842
		 * We do not check for possible parameters truncation
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4843
		 * (alc_len < len) assuming that the target driver works
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4844
		 * correctly. Just avoiding overrun.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4845
		 * Copy no more than requested and possible, buffer-wise.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4846
		 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4847
		count = MIN(alc_len, len);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4848
		count = MIN(bp->b_bcount, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4849
		bcopy(buf, bp->b_un.b_addr, count);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4850
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4851
		scsipkt->pkt_state |= STATE_XFERRED_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4852
		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4853
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4854
	*scsipkt->pkt_scbp = STATUS_GOOD;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4855
done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4856
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4857
	(void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4858
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4859
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4860
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4861
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4862
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4863
	    scsipkt->pkt_comp != NULL)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4864
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4865
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4866
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  4867
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4868
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  4869
			return (TRAN_BUSY);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4870
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4871
	return (TRAN_ACCEPT);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4872
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4873
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4874
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4875
 * Translate command: Log Select
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4876
 * Not implemented at this time - returns invalid command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4877
 */
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  4878
static	int
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4879
sata_txlt_log_select(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4880
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4881
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4882
	    "sata_txlt_log_select\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4883
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4884
	return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4885
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4886
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4887
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4888
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4889
 * Translate command: Read (various types).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4890
 * Translated into appropriate type of ATA READ command
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  4891
 * for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4892
 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4893
 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4894
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4895
 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4896
 * rdprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4897
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4898
 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4899
 * enable variable sata_func_enable), the capability of the controller and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4900
 * capability of a device are checked and if both support queueing, read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4901
 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4902
 * command rather than plain READ_XXX command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4903
 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4904
 * both the controller and device suport such functionality, the read
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4905
 * request will be translated to READ_FPDMA_QUEUED command.
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  4906
 * In both cases the maximum queue depth is derived as minimum of:
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  4907
 * HBA capability,device capability and sata_max_queue_depth variable setting.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  4908
 * The value passed to HBA driver is decremented by 1, because only 5 bits are
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  4909
 * used to pass max queue depth value, and the maximum possible queue depth
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  4910
 * is 32.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4911
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4912
 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4913
 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4914
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4915
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4916
sata_txlt_read(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4917
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4918
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4919
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4920
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4921
	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4922
	int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4923
	uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4924
	uint64_t lba;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4925
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4926
	int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4927
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4928
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4929
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4930
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  4931
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4932
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4933
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4934
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4935
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4936
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4937
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4938
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  4939
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4940
	/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  4941
	 * Extract LBA and sector count from scsi CDB.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4942
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4943
	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4944
	case SCMD_READ:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4945
		/* 6-byte scsi read cmd : 0x08 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4946
		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4947
		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4948
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4949
		sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4950
		/* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4951
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4952
	case SCMD_READ_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4953
		/* 10-bytes scsi read command : 0x28 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4954
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4955
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4956
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4957
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4958
		sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4959
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4960
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4961
	case SCMD_READ_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4962
		/* 12-bytes scsi read command : 0xA8 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4963
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4964
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4965
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4966
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4967
		sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4968
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4969
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4970
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4971
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4972
	case SCMD_READ_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4973
		/* 16-bytes scsi read command : 0x88 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4974
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4975
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4976
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4977
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4978
		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4979
		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4980
		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4981
		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4982
		sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4983
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4984
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4985
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4986
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4987
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4988
		/* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4989
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4990
		return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4991
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4992
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4993
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4994
	 * Check if specified address exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4995
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4996
	if ((lba >= sdinfo->satadrv_capacity) ||
2593
79c4a3cba4f1 6462265 sata: framework rejects last addressable LBA on disk as invalid one
pawelw
parents: 2553
diff changeset
  4997
	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4998
		/* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  4999
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5000
		return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5001
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5002
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5003
	/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5004
	 * For zero-length transfer, emulate good completion of the command
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5005
	 * (reasons for rejecting the command were already checked).
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5006
	 * No DMA resources were allocated.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5007
	 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5008
	if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5009
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5010
		return (sata_emul_rw_completion(spx));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5011
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5012
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5013
	/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5014
	 * Build cmd block depending on the device capability and
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5015
	 * requested operation mode.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5016
	 * Do not bother with non-dma mode - we are working only with
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5017
	 * devices supporting DMA.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5018
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5019
	scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5020
	scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5021
	scmd->satacmd_cmd_reg = SATAC_READ_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5022
	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5023
		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5024
		scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5025
		scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5026
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5027
		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5028
		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5029
		scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5030
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5031
	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5032
		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5033
		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5034
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5035
	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5036
	scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5037
	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5038
	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5039
	scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5040
	scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5041
	scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5042
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5043
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5044
	 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5045
	 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5046
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5047
	if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5048
		boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5049
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5050
		/* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5051
		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5052
		    (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5053
		    SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5054
		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5055
		    SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5056
			using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5057
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5058
			/* NCQ supported - use FPDMA READ */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5059
			scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5060
			    SATAC_READ_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5061
			scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5062
			    scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5063
			scmd->satacmd_sec_count_msb = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5064
		} else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5065
		    SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5066
		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5067
		    SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5068
			using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5069
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5070
			/* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5071
			if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5072
			    SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5073
				scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5074
				    SATAC_READ_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5075
				scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5076
				    scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5077
				scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5078
			} else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5079
				scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5080
				    SATAC_READ_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5081
			}
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5082
		} else	/* NCQ nor legacy queuing not supported */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5083
			using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5084
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5085
		/*
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5086
		 * If queuing, the sector count goes in the features register
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5087
		 * and the secount count will contain the tag.
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5088
		 */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5089
		if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5090
			scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5091
			    scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5092
			scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5093
			scmd->satacmd_flags.sata_queued = B_TRUE;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5094
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5095
			/* Set-up maximum queue depth */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5096
			scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5097
			    sdinfo->satadrv_max_queue_depth - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5098
		} else if (sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5099
		    SATA_DEV_F_E_UNTAGGED_QING) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5100
			/*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5101
			 * Although NCQ/TCQ is not enabled, untagged queuing
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5102
			 * may be still used.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5103
			 * Set-up the maximum untagged queue depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5104
			 * Use controller's queue depth from sata_hba_tran.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5105
			 * SATA HBA drivers may ignore this value and rely on
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5106
			 * the internal limits.For drivers that do not
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5107
			 * ignore untaged queue depth, limit the value to
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5108
			 * SATA_MAX_QUEUE_DEPTH (32), as this is the
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5109
			 * largest value that can be passed via
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5110
			 * satacmd_flags.sata_max_queue_depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5111
			 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5112
			scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5113
			    SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5114
			    SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5115
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5116
		} else {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5117
			scmd->satacmd_flags.sata_max_queue_depth = 0;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5118
		}
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5119
	} else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5120
		scmd->satacmd_flags.sata_max_queue_depth = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5121
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5122
	SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5123
	    "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5124
	    scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5125
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5126
	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5127
		/* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5128
		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5129
		synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5130
	} else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5131
		synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5132
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5133
	/* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5134
	if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5135
		/* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5136
		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5137
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5138
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5139
	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5140
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5141
	 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5142
	 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5143
	 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5144
	 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5145
	 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5146
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5147
	if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5148
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5149
		    "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5150
		    spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5151
		sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5152
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5153
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5154
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5155
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5157
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5158
 * SATA translate command: Write (various types)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5159
 * Translated into appropriate type of ATA WRITE command
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  5160
 * for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5161
 * Both the device capabilities and requested operation mode are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5162
 * considered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5163
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5164
 * Following scsi cdb fields are ignored:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5165
 * rwprotect, dpo, fua, fua_nv, group_number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5166
 *
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5167
 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5168
 * enable variable sata_func_enable), the capability of the controller and
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5169
 * capability of a device are checked and if both support queueing, write
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5170
 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5171
 * command rather than plain WRITE_XXX command.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5172
 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5173
 * both the controller and device suport such functionality, the write
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5174
 * request will be translated to WRITE_FPDMA_QUEUED command.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5175
 * In both cases the maximum queue depth is derived as minimum of:
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5176
 * HBA capability,device capability and sata_max_queue_depth variable setting.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5177
 * The value passed to HBA driver is decremented by 1, because only 5 bits are
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5178
 * used to pass max queue depth value, and the maximum possible queue depth
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5179
 * is 32.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5180
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5181
 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5182
 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5183
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5184
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5185
sata_txlt_write(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5186
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5187
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5188
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5189
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5190
	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5191
	int cport = SATA_TXLT_CPORT(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5192
	uint16_t sec_count;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5193
	uint64_t lba;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5194
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5195
	int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5196
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5197
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5198
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5199
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5200
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5201
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5202
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5203
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5204
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5205
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5206
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5207
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5208
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5209
	/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5210
	 * Extract LBA and sector count from scsi CDB
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5211
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5212
	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5213
	case SCMD_WRITE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5214
		/* 6-byte scsi read cmd : 0x0A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5215
		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5216
		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5217
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5218
		sec_count = scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5219
		/* sec_count 0 will be interpreted as 256 by a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5220
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5221
	case SCMD_WRITE_G1:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5222
		/* 10-bytes scsi write command : 0x2A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5223
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5224
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5225
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5226
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5227
		sec_count = scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5228
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5229
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5230
	case SCMD_WRITE_G5:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5231
		/* 12-bytes scsi read command : 0xAA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5232
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5233
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5234
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5235
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5236
		sec_count = scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5237
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5238
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5239
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5240
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5241
	case SCMD_WRITE_G4:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5242
		/* 16-bytes scsi write command : 0x8A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5243
		lba = scsipkt->pkt_cdbp[2];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5244
		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5245
		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5246
		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5247
		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5248
		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5249
		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5250
		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5251
		sec_count = scsipkt->pkt_cdbp[10];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5252
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5253
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5254
		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5255
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5256
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5257
		/* Unsupported command */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5258
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5259
		return (sata_txlt_invalid_command(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5260
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5262
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5263
	 * Check if specified address and length exceeds device capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5264
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5265
	if ((lba >= sdinfo->satadrv_capacity) ||
2593
79c4a3cba4f1 6462265 sata: framework rejects last addressable LBA on disk as invalid one
pawelw
parents: 2553
diff changeset
  5266
	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5267
		/* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5268
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5269
		return (sata_txlt_lba_out_of_range(spx));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5270
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5271
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5272
	/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5273
	 * For zero-length transfer, emulate good completion of the command
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5274
	 * (reasons for rejecting the command were already checked).
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5275
	 * No DMA resources were allocated.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5276
	 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5277
	if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5278
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5279
		return (sata_emul_rw_completion(spx));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5280
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5281
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5282
	/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5283
	 * Build cmd block depending on the device capability and
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5284
	 * requested operation mode.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5285
	 * Do not bother with non-dma mode- we are working only with
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5286
	 * devices supporting DMA.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5287
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5288
	scmd->satacmd_addr_type = ATA_ADDR_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5289
	scmd->satacmd_device_reg = SATA_ADH_LBA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5290
	scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5291
	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5292
		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5293
		scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5294
		scmd->satacmd_sec_count_msb = sec_count >> 8;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5295
		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5296
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5297
		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5298
		scmd->satacmd_lba_high_msb = lba >> 40;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5299
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5300
	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5301
		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5302
		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5303
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5304
	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5305
	scmd->satacmd_lba_low_lsb = lba & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5306
	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5307
	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5308
	scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5309
	scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5310
	scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5311
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5312
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5313
	 * Check if queueing commands should be used and switch
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5314
	 * to appropriate command if possible
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5315
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5316
	if (sata_func_enable & SATA_ENABLE_QUEUING) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5317
		boolean_t using_queuing;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5318
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5319
		/* Queuing supported by controller and device? */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5320
		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5321
		    (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5322
		    SATA_DEV_F_NCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5323
		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5324
		    SATA_CTLF_NCQ)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5325
			using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5326
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5327
			/* NCQ supported - use FPDMA WRITE */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5328
			scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5329
			    SATAC_WRITE_FPDMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5330
			scmd->satacmd_features_reg_ext =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5331
			    scmd->satacmd_sec_count_msb;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5332
			scmd->satacmd_sec_count_msb = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5333
		} else if ((sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5334
		    SATA_DEV_F_TCQ) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5335
		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5336
		    SATA_CTLF_QCMD)) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5337
			using_queuing = B_TRUE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5338
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5339
			/* Legacy queueing */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5340
			if (sdinfo->satadrv_features_support &
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5341
			    SATA_DEV_F_LBA48) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5342
				scmd->satacmd_cmd_reg =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5343
				    SATAC_WRITE_DMA_QUEUED_EXT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5344
				scmd->satacmd_features_reg_ext =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5345
				    scmd->satacmd_sec_count_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5346
				scmd->satacmd_sec_count_msb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5347
			} else {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5348
				scmd->satacmd_cmd_reg =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5349
				    SATAC_WRITE_DMA_QUEUED;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5350
			}
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5351
		} else	/*  NCQ nor legacy queuing not supported */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5352
			using_queuing = B_FALSE;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5353
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  5354
		if (using_queuing) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5355
			scmd->satacmd_features_reg =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5356
			    scmd->satacmd_sec_count_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5357
			scmd->satacmd_sec_count_lsb = 0;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5358
			scmd->satacmd_flags.sata_queued = B_TRUE;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5359
			/* Set-up maximum queue depth */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5360
			scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5361
			    sdinfo->satadrv_max_queue_depth - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5362
		} else if (sdinfo->satadrv_features_enabled &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5363
		    SATA_DEV_F_E_UNTAGGED_QING) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5364
			/*
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5365
			 * Although NCQ/TCQ is not enabled, untagged queuing
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5366
			 * may be still used.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5367
			 * Set-up the maximum untagged queue depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5368
			 * Use controller's queue depth from sata_hba_tran.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5369
			 * SATA HBA drivers may ignore this value and rely on
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5370
			 * the internal limits. For drivera that do not
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5371
			 * ignore untaged queue depth, limit the value to
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5372
			 * SATA_MAX_QUEUE_DEPTH (32), as this is the
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5373
			 * largest value that can be passed via
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5374
			 * satacmd_flags.sata_max_queue_depth.
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5375
			 */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5376
			scmd->satacmd_flags.sata_max_queue_depth =
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5377
			    SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5378
			    SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5379
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5380
		} else {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5381
			scmd->satacmd_flags.sata_max_queue_depth = 0;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5382
		}
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5383
	} else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  5384
		scmd->satacmd_flags.sata_max_queue_depth = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5385
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5386
	SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5387
	    "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5388
	    scmd->satacmd_cmd_reg, lba, sec_count);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5389
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5390
	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5391
		/* Need callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5392
		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5393
		synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5394
	} else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5395
		synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5396
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5397
	/* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5398
	if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5399
		/* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5400
		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5401
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5402
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5403
	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5404
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5405
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5406
	 * If execution is non-synchronous,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5407
	 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5408
	 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5409
	 * If it was synchronous, check execution status using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5410
	 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5411
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5412
	if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5413
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5414
		    "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5415
		    spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5416
		sata_txlt_rw_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5417
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5418
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5419
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5420
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5421
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5422
/*
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5423
 * Implements SCSI SBC WRITE BUFFER command download microcode option
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5424
 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5425
static int
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5426
sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5427
{
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5428
#define	WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE			4
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5429
#define	WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE			5
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5430
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5431
	sata_hba_inst_t *sata_hba_inst = SATA_TXLT_HBA_INST(spx);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5432
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5433
	struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5434
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5435
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5436
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5437
	struct scsi_extended_sense *sense;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5438
	int rval, mode, sector_count, reason;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5439
	int cport = SATA_TXLT_CPORT(spx);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5440
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5441
	mode = scsipkt->pkt_cdbp[1] & 0x1f;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5442
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5443
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5444
	    "sata_txlt_write_buffer, mode 0x%x\n", mode);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5445
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5446
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5447
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5448
	if ((rval = sata_txlt_generic_pkt_info(spx, &reason)) != TRAN_ACCEPT) {
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5449
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5450
		return (rval);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5451
	}
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5452
	/*
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5453
	 * If in interrupt context, reject this packet because it would issue
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5454
	 * a synchronous command to HBA.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5455
	 */
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5456
	if (servicing_interrupt()) {
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5457
		SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5458
		    "sata_txlt_write_buffer: rejecting command because "
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5459
		    "of interrupt context\n", NULL);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5460
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5461
		return (TRAN_BUSY);
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  5462
	}
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5463
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5464
	/* Use synchronous mode */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5465
	spx->txlt_sata_pkt->satapkt_op_mode
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5466
	    |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5467
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5468
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5469
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5470
	scsipkt->pkt_reason = CMD_CMPLT;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5471
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5472
	    STATE_SENT_CMD | STATE_GOT_STATUS;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5473
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5474
	/*
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5475
	 * The SCSI to ATA translation specification only calls
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5476
	 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5477
	 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5478
	 * ATA 8 (draft) got rid of download microcode for temp
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5479
	 * and it is even optional for ATA 7, so it may be aborted.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5480
	 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5481
	 * it is not specified and the buffer offset for SCSI is a 16-bit
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5482
	 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5483
	 * sectors.  Thus the offset really doesn't buy us anything.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5484
	 * If and when ATA 8 is stabilized and the SCSI to ATA specification
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5485
	 * is revised, this can be revisisted.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5486
	 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5487
	/* Reject not supported request */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5488
	switch (mode) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5489
	case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5490
		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5491
		break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5492
	case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5493
		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5494
		break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5495
	default:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5496
		goto bad_param;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5497
	}
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5498
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5499
	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5500
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5501
	scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5502
	if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5503
		goto bad_param;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5504
	sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5505
	scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5506
	scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5507
	scmd->satacmd_lba_mid_lsb = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5508
	scmd->satacmd_lba_high_lsb = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5509
	scmd->satacmd_device_reg = 0;
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5510
	spx->txlt_sata_pkt->satapkt_comp = NULL;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5511
	scmd->satacmd_addr_type = 0;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5512
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5513
	/* Transfer command to HBA */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5514
	if (sata_hba_start(spx, &rval) != 0) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5515
		/* Pkt not accepted for execution */
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5516
		mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5517
		return (rval);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5518
	}
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5519
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5520
	mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5521
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5522
	/* Then we need synchronous check the status of the disk */
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5523
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5524
	    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5525
	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5526
		scsipkt->pkt_reason = CMD_CMPLT;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5527
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5528
		/* Download commmand succeed, so probe and identify device */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5529
		sata_reidentify_device(spx);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5530
	} else {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5531
		/* Something went wrong, microcode download command failed */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5532
		scsipkt->pkt_reason = CMD_INCOMPLETE;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5533
		*scsipkt->pkt_scbp = STATUS_CHECK;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5534
		sense = sata_arq_sense(spx);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5535
		switch (sata_pkt->satapkt_reason) {
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5536
		case SATA_PKT_PORT_ERROR:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5537
			/*
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5538
			 * We have no device data. Assume no data transfered.
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5539
			 */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5540
			sense->es_key = KEY_HARDWARE_ERROR;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5541
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5542
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5543
		case SATA_PKT_DEV_ERROR:
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5544
			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5545
			    SATA_STATUS_ERR) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5546
				/*
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5547
				 * determine dev error reason from error
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5548
				 * reg content
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5549
				 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5550
				sata_decode_device_error(spx, sense);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5551
				break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5552
			}
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5553
			/* No extended sense key - no info available */
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5554
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5555
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5556
		case SATA_PKT_TIMEOUT:
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  5557
			scsipkt->pkt_reason = CMD_TIMEOUT;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  5558
			scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  5559
			    STAT_TIMEOUT | STAT_DEV_RESET;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5560
			/* No extended sense key ? */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5561
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5562
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5563
		case SATA_PKT_ABORTED:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5564
			scsipkt->pkt_reason = CMD_ABORTED;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  5565
			scsipkt->pkt_statistics |= STAT_ABORTED;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5566
			/* No extended sense key ? */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5567
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5568
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5569
		case SATA_PKT_RESET:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5570
			/* pkt aborted by an explicit reset from a host */
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5571
			scsipkt->pkt_reason = CMD_RESET;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  5572
			scsipkt->pkt_statistics |= STAT_DEV_RESET;
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5573
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5574
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5575
		default:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5576
			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5577
			    "sata_txlt_nodata_cmd_completion: "
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5578
			    "invalid packet completion reason %d",
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5579
			    sata_pkt->satapkt_reason));
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5580
			scsipkt->pkt_reason = CMD_TRAN_ERR;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5581
			break;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5582
		}
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5583
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5584
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5585
		    "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5586
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5587
		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5588
			/* scsi callback required */
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5589
			scsi_hba_pkt_comp(scsipkt);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  5590
	}
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5591
	return (TRAN_ACCEPT);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5592
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5593
bad_param:
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5594
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5595
	*scsipkt->pkt_scbp = STATUS_CHECK;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5596
	sense = sata_arq_sense(spx);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5597
	sense->es_key = KEY_ILLEGAL_REQUEST;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5598
	sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5599
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5600
	    scsipkt->pkt_comp != NULL) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5601
		/* scsi callback required */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5602
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5603
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5604
		    TQ_SLEEP) == 0) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5605
			/* Scheduling the callback failed */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5606
			rval = TRAN_BUSY;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5607
		}
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5608
	}
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5609
	return (rval);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5610
}
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5611
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5612
/*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5613
 * Re-identify device after doing a firmware download.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5614
 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5615
static void
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5616
sata_reidentify_device(sata_pkt_txlate_t *spx)
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5617
{
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5618
#define	DOWNLOAD_WAIT_TIME_SECS	60
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5619
#define	DOWNLOAD_WAIT_INTERVAL_SECS	1
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5620
	int rval;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5621
	int retry_cnt;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5622
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5623
	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5624
	sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5625
	sata_drive_info_t *sdinfo;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5626
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5627
	/*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5628
	 * Before returning good status, probe device.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5629
	 * Device probing will get IDENTIFY DEVICE data, if possible.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5630
	 * The assumption is that the new microcode is applied by the
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5631
	 * device. It is a caller responsibility to verify this.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5632
	 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5633
	for (retry_cnt = 0;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5634
	    retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5635
	    retry_cnt++) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5636
		rval = sata_probe_device(sata_hba_inst, &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5637
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5638
		if (rval == SATA_SUCCESS) { /* Set default features */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5639
			sdinfo = sata_get_device_info(sata_hba_inst,
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5640
			    &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5641
			if (sata_initialize_device(sata_hba_inst, sdinfo) !=
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5642
			    SATA_SUCCESS) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5643
				/* retry */
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5644
				rval = sata_initialize_device(sata_hba_inst,
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5645
				    sdinfo);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5646
				if (rval == SATA_RETRY)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5647
					sata_log(sata_hba_inst, CE_WARN,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5648
					    "SATA device at port %d pmport %d -"
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5649
					    " default device features could not"
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5650
					    " be set. Device may not operate "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5651
					    "as expected.",
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5652
					    sata_device.satadev_addr.cport,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  5653
					    sata_device.satadev_addr.pmport);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5654
			}
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5655
			if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5656
				scsi_hba_pkt_comp(scsipkt);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5657
			return;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5658
		} else if (rval == SATA_RETRY) {
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5659
			delay(drv_usectohz(1000000 *
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5660
			    DOWNLOAD_WAIT_INTERVAL_SECS));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5661
			continue;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5662
		} else	/* failed - no reason to retry */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5663
			break;
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5664
	}
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5665
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5666
	/*
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5667
	 * Something went wrong, device probing failed.
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5668
	 */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5669
	SATA_LOG_D((sata_hba_inst, CE_WARN,
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5670
	    "Cannot probe device after downloading microcode\n"));
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5671
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5672
	/* Reset device to force retrying the probe. */
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5673
	(void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5674
	    (SATA_DIP(sata_hba_inst), &sata_device);
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5675
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5676
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  5677
		scsi_hba_pkt_comp(scsipkt);
6190
beca2dfeedbd 6605485 ahci: needs to support firmware download
xz212153
parents: 5996
diff changeset
  5678
}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  5679
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5680
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5681
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5682
 * Translate command: Synchronize Cache.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  5683
 * Translates into Flush Cache command for SATA hard disks.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5684
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5685
 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5686
 * appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5687
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5688
static 	int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5689
sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5690
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5691
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5692
	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5693
	int cport = SATA_TXLT_CPORT(spx);
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5694
	int rval, reason;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5695
	int synch;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5696
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5697
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5698
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5699
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  5700
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5701
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5702
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5703
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5704
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5705
	scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5706
	scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5707
	scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5708
	scmd->satacmd_sec_count_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5709
	scmd->satacmd_lba_low_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5710
	scmd->satacmd_lba_mid_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5711
	scmd->satacmd_lba_high_lsb = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5712
	scmd->satacmd_features_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5713
	scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5714
	scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5715
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5716
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5717
	    "sata_txlt_synchronize_cache\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5718
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5719
	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5720
		/* Need to set-up a callback function */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5721
		spx->txlt_sata_pkt->satapkt_comp =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5722
		    sata_txlt_nodata_cmd_completion;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5723
		synch = FALSE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5724
	} else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5725
		synch = TRUE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5726
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5727
	/* Transfer command to HBA */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5728
	if (sata_hba_start(spx, &rval) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5729
		/* Pkt not accepted for execution */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5730
		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5731
		return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5732
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5733
	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5734
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5735
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5736
	 * If execution non-synchronous, it had to be completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5737
	 * a callback function will handle potential errors, translate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5738
	 * the response and will do a callback to a target driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5739
	 * If it was synchronous, check status, using the same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5740
	 * framework callback.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5741
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5742
	if (synch) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5743
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5744
		    "synchronous execution status %x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5745
		    spx->txlt_sata_pkt->satapkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5746
		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5747
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5748
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5749
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5750
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  5751
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5752
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5753
 * Send pkt to SATA HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5754
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5755
 * This function may be called only if the operation is requested by scsi_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5756
 * i.e. scsi_pkt is not NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5757
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5758
 * This function has to be called with cport mutex held. It does release
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5759
 * the mutex when it calls HBA driver sata_tran_start function and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5760
 * re-acquires it afterwards.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5761
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5762
 * If return value is 0, pkt was accepted, -1 otherwise
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5763
 * rval is set to appropriate sata_scsi_start return value.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5764
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5765
 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5766
 * have called the sata_pkt callback function for this packet.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5767
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5768
 * The scsi callback has to be performed by the caller of this routine.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5769
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5770
 * Note 2: No port multiplier support for now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5771
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5772
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5773
sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5774
{
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5775
	int stat, cport;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5776
	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5777
	sata_drive_info_t *sdinfo;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5778
	sata_device_t *sata_device;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5779
	uint8_t cmd;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5780
	struct sata_cmd_flags cmd_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5781
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5782
	ASSERT(spx->txlt_sata_pkt != NULL);
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5783
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5784
	cport = SATA_TXLT_CPORT(spx);
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5785
	ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5786
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5787
	sdinfo = sata_get_device_info(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5788
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5789
	ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5790
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5791
	/* Clear device reset state? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5792
	if (sdinfo->satadrv_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5793
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5794
		    sata_clear_dev_reset = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5795
		sdinfo->satadrv_event_flags &= ~SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5796
		SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5797
		    "sata_hba_start: clearing device reset state\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5798
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5799
	cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5800
	cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5801
	sata_device = &spx->txlt_sata_pkt->satapkt_device;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5802
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5803
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5804
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5805
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5806
	    "Sata cmd 0x%2x\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5807
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5808
	stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5809
	    spx->txlt_sata_pkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5810
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5811
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5812
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5813
	 * If sata pkt was accepted and executed in asynchronous mode, i.e.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5814
	 * with the sata callback, the sata_pkt could be already destroyed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5815
	 * by the time we check ther return status from the hba_start()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5816
	 * function, because sata_scsi_destroy_pkt() could have been already
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5817
	 * called (perhaps in the interrupt context). So, in such case, there
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5818
	 * should be no references to it. In other cases, sata_pkt still
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5819
	 * exists.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5820
	 */
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  5821
	if (stat == SATA_TRAN_ACCEPTED) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5822
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5823
		 * pkt accepted for execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5824
		 * If it was executed synchronously, it is already completed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5825
		 * and pkt completion_reason indicates completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5826
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5827
		*rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5828
		return (0);
7246
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  5829
	}
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  5830
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  5831
	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
27944777b08c 6723493 sata: pf panic in sata_get_device_info with kmem_flags=0x2f/0x3f
pawelw
parents: 7152
diff changeset
  5832
	switch (stat) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5833
	case SATA_TRAN_QUEUE_FULL:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5834
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5835
		 * Controller detected queue full condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5836
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5837
		SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5838
		    "sata_hba_start: queue full\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5839
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5840
		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5841
		*spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5842
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5843
		*rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5844
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5845
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5846
	case SATA_TRAN_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5847
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5848
		 * Communication/link with device or general port error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5849
		 * detected before pkt execution begun.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5850
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5851
		if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5852
		    SATA_ADDR_CPORT ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5853
		    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5854
		    SATA_ADDR_DCPORT)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5855
			sata_log(sata_hba_inst, CE_CONT,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5856
			    "SATA port %d error",
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5857
			    sata_device->satadev_addr.cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5858
		else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5859
			sata_log(sata_hba_inst, CE_CONT,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5860
			    "SATA port %d pmport %d error\n",
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5861
			    sata_device->satadev_addr.cport,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5862
			    sata_device->satadev_addr.pmport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5863
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5864
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5865
		 * Update the port/device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5866
		 * sata_pkt should be still valid. Since port error is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5867
		 * returned, sata_device content should reflect port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5868
		 * state - it means, that sata address have been changed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5869
		 * because original packet's sata address refered to a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5870
		 * attached to some port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5871
		 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5872
		sata_update_port_info(sata_hba_inst, sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5873
		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5874
		*rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5875
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5876
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5877
	case SATA_TRAN_CMD_UNSUPPORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5878
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5879
		 * Command rejected by HBA as unsupported. It was HBA driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5880
		 * that rejected the command, command was not sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5881
		 * an attached device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5882
		 */
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5883
		if ((sdinfo != NULL) &&
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5884
		    (sdinfo->satadrv_state & SATA_DSTATE_RESET))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5885
			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5886
			    "sat_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5887
			    "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5888
3116
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5889
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5890
		(void) sata_txlt_invalid_command(spx);
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5891
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
e4293e8671d8 6488114 system panic after unplugging disks during diskomizer/dd run
yt160523
parents: 3023
diff changeset
  5892
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5893
		*rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5894
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5895
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5896
	case SATA_TRAN_BUSY:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5897
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5898
		 * Command rejected by HBA because other operation prevents
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5899
		 * accepting the packet, or device is in RESET condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5900
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5901
		if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5902
			sdinfo->satadrv_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5903
			    spx->txlt_sata_pkt->satapkt_device.satadev_state;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5904
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5905
			if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5906
				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5907
				    "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5908
				    "because of device reset condition\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5909
				    cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5910
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5911
				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5912
				    "sata_hba_start: cmd 0x%2x rejected "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5913
				    "with SATA_TRAN_BUSY status\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5914
				    cmd);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5915
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5916
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5917
		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5918
		*rval = TRAN_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5919
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5920
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5921
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5922
		/* Unrecognized HBA response */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5923
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5924
		    "sata_hba_start: unrecognized HBA response "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5925
		    "to cmd : 0x%2x resp 0x%x", cmd, rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5926
		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5927
		*rval = TRAN_FATAL_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5928
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5929
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5930
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5931
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5932
	 * If we got here, the packet was rejected.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5933
	 * Check if we need to remember reset state clearing request
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5934
	 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  5935
	if (cmd_flags.sata_clear_dev_reset) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5936
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5937
		 * Check if device is still configured - it may have
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5938
		 * disapeared from the configuration
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5939
		 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  5940
		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5941
		if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5942
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5943
			 * Restore the flag that requests clearing of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5944
			 * the device reset state,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5945
			 * so the next sata packet may carry it to HBA.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5946
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5947
			sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5948
			    SATA_EVNT_CLEAR_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5949
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5950
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5951
	return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5952
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5953
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5954
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5955
 * Scsi response setup for invalid LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5956
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5957
 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5958
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5959
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5960
sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5961
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5962
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5963
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5964
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5965
	scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5966
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  5967
	    STATE_SENT_CMD | STATE_GOT_STATUS;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5968
	*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5969
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5970
	*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5971
	sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5972
	sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  5973
	sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5974
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5975
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5976
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5977
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5978
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5979
	    scsipkt->pkt_comp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5980
		/* scsi callback required */
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  5981
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  5982
		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  5983
		    TQ_SLEEP) == NULL)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  5984
			/* Scheduling the callback failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  5985
			return (TRAN_BUSY);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5986
	return (TRAN_ACCEPT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5987
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5988
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5989
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5990
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5991
 * Analyze device status and error registers and translate them into
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5992
 * appropriate scsi sense codes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5993
 * NOTE: non-packet commands only for now
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5994
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5995
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5996
sata_decode_device_error(sata_pkt_txlate_t *spx,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5997
    struct scsi_extended_sense *sense)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5998
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  5999
	uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6000
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6001
	ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6002
	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6003
	    SATA_STATUS_ERR);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6004
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6005
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6006
	if (err_reg & SATA_ERROR_ICRC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6007
		sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6008
		sense->es_add_code = 0x08; /* Communication failure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6009
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6010
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6011
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6012
	if (err_reg & SATA_ERROR_UNC) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6013
		sense->es_key = KEY_MEDIUM_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6014
		/* Information bytes (LBA) need to be set by a caller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6015
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6016
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6017
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6018
	/* ADD HERE: MC error bit handling for ATAPI CD/DVD */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6019
	if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6020
		sense->es_key = KEY_UNIT_ATTENTION;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6021
		sense->es_add_code = 0x3a; /* No media present */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6022
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6023
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6024
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6025
	if (err_reg & SATA_ERROR_IDNF) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6026
		if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6027
			sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6028
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6029
			sense->es_key = KEY_ILLEGAL_REQUEST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6030
			sense->es_add_code = 0x21; /* LBA out of range */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6031
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6032
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6033
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6034
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6035
	if (err_reg & SATA_ERROR_ABORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6036
		ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6037
		sense->es_key = KEY_ABORTED_COMMAND;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6038
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6039
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6040
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6041
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6042
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6043
 * Extract error LBA from sata_pkt.satapkt_cmd register fields
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6044
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6045
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6046
sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6047
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6048
	sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6049
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6050
	*lba = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6051
	if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6052
		*lba = sata_cmd->satacmd_lba_high_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6053
		*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6054
		*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6055
	} else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6056
		*lba = sata_cmd->satacmd_device_reg & 0xf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6057
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6058
	*lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6059
	*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  6060
	*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6061
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6062
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6063
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6064
 * This is fixed sense format - if LBA exceeds the info field size,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6065
 * no valid info will be returned (valid bit in extended sense will
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6066
 * be set to 0).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6067
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6068
static struct scsi_extended_sense *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6069
sata_arq_sense(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6070
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6071
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6072
	struct scsi_arq_status *arqs;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6073
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6074
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6075
	/* Fill ARQ sense data */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6076
	scsipkt->pkt_state |= STATE_ARQ_DONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6077
	arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6078
	*(uchar_t *)&arqs->sts_status = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6079
	*(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6080
	arqs->sts_rqpkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6081
	arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6082
	    STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6083
	arqs->sts_rqpkt_resid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6084
	sense = &arqs->sts_sensedata;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6085
	bzero(sense, sizeof (struct scsi_extended_sense));
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  6086
	sata_fixed_sense_data_preset(sense);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6087
	return (sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6088
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6089
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6090
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6091
/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6092
 * Emulated SATA Read/Write command completion for zero-length requests.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6093
 * This request always succedes, so in synchronous mode it always returns
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6094
 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6095
 * callback cannot be scheduled.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6096
 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6097
static int
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6098
sata_emul_rw_completion(sata_pkt_txlate_t *spx)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6099
{
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6100
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6101
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6102
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6103
	    STATE_SENT_CMD | STATE_GOT_STATUS;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6104
	scsipkt->pkt_reason = CMD_CMPLT;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6105
	*scsipkt->pkt_scbp = STATUS_GOOD;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6106
	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6107
		/* scsi callback required - have to schedule it */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6108
		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6109
		    (task_func_t *)scsipkt->pkt_comp,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6110
		    (void *)scsipkt, TQ_SLEEP) == NULL)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6111
			/* Scheduling the callback failed */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6112
			return (TRAN_BUSY);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6113
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6114
	return (TRAN_ACCEPT);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6115
}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6116
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6117
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  6118
/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6119
 * Translate completion status of SATA read/write commands into scsi response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6120
 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6121
 * Do scsi callback if necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6122
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6123
 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6124
 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6125
 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6126
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6127
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6128
sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6129
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6130
	sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6131
	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6132
	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6133
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6134
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6135
	uint64_t lba;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6136
	struct buf *bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6137
	int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6138
	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6139
		/* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6140
		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6141
		    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6142
		scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6143
		*scsipkt->pkt_scbp = STATUS_GOOD;
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6144
		if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6145
			/* Temporary buffer was used */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6146
			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6147
			if (bp->b_flags & B_READ) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6148
				rval = ddi_dma_sync(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6149
				    spx->txlt_buf_dma_handle, 0, 0,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6150
				    DDI_DMA_SYNC_FORCPU);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6151
				ASSERT(rval == DDI_SUCCESS);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6152
				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6153
				    bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6154
			}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
  6155
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6156
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6157
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6158
		 * Something went wrong - analyze return
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6159
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6160
		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6161
		    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6162
		scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6163
		*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6164
		sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6165
		ASSERT(sense != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6166
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6167
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6168
		 * SATA_PKT_DEV_ERROR is the only case where we may be able to
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  6169
		 * extract from device registers the failing LBA.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6170
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6171
		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6172
			if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6173
			    (scmd->satacmd_lba_mid_msb != 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6174
			    scmd->satacmd_lba_high_msb != 0)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6175
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6176
				 * We have problem reporting this cmd LBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6177
				 * in fixed sense data format, because of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6178
				 * the size of the scsi LBA fields.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6179
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6180
				sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6181
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6182
				sata_extract_error_lba(spx, &lba);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6183
				sense->es_info_1 = (lba & 0xFF000000) >> 24;
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  6184
				sense->es_info_2 = (lba & 0xFF0000) >> 16;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  6185
				sense->es_info_3 = (lba & 0xFF00) >> 8;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
  6186
				sense->es_info_4 = lba & 0xFF;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6187
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6188
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6189
			/* Invalid extended sense info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6190
			sense->es_valid = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6191
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6192
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6193
		switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6194
		case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6195
			/* We may want to handle DEV GONE state as well */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6196
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6197
			 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6198
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6199
			sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6200
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6201
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6202
		case SATA_PKT_DEV_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6203
			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6204
			    SATA_STATUS_ERR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6205
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6206
				 * determine dev error reason from error
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6207
				 * reg content
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6208
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6209
				sata_decode_device_error(spx, sense);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6210
				if (sense->es_key == KEY_MEDIUM_ERROR) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6211
					switch (scmd->satacmd_cmd_reg) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6212
					case SATAC_READ_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6213
					case SATAC_READ_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6214
					case SATAC_READ_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6215
					case SATAC_READ_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6216
					case SATAC_READ_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6217
						/* Unrecovered read error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6218
						sense->es_add_code =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  6219
						    SD_SCSI_ASC_UNREC_READ_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6220
						break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6221
					case SATAC_WRITE_DMA:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6222
					case SATAC_WRITE_DMA_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6223
					case SATAC_WRITE_DMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6224
					case SATAC_WRITE_DMA_QUEUED_EXT:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6225
					case SATAC_WRITE_FPDMA_QUEUED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6226
						/* Write error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6227
						sense->es_add_code =
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
  6228
						    SD_SCSI_ASC_WRITE_ERR;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6229
						break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6230
					default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6231
						/* Internal error */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6232
						SATA_LOG_D((
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6233
						    spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6234
						    CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6235
						    "sata_txlt_rw_completion :"
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6236
						    "internal error - invalid "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6237
						    "command 0x%2x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6238
						    scmd->satacmd_cmd_reg));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6239
						break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6240
					}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6241
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6242
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6243
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6244
			/* No extended sense key - no info available */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6245
			scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6246
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6247
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6248
		case SATA_PKT_TIMEOUT:
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6249
			scsipkt->pkt_reason = CMD_TIMEOUT;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6250
			scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6251
			    STAT_TIMEOUT | STAT_DEV_RESET;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6252
			sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6253
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6254
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6255
		case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6256
			scsipkt->pkt_reason = CMD_ABORTED;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6257
			scsipkt->pkt_statistics |= STAT_ABORTED;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6258
			sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6259
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6260
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6261
		case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6262
			scsipkt->pkt_reason = CMD_RESET;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6263
			scsipkt->pkt_statistics |= STAT_DEV_RESET;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6264
			sense->es_key = KEY_ABORTED_COMMAND;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6265
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6266
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6267
		default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6268
			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6269
			    "sata_txlt_rw_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6270
			    "invalid packet completion reason"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6271
			scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6272
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6273
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6274
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6275
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6276
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6277
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  6278
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6279
		/* scsi callback required */
9106
ee8f18cdafb2 6809527 scsi_hba_pkt_comp():More consumers
srivijitha dugganapalli <Srivijitha.Dugganapalli@Sun.COM>
parents: 9058
diff changeset
  6280
		scsi_hba_pkt_comp(scsipkt);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6281
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6282
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6283
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6284
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6285
 * Translate completion status of non-data commands (i.e. commands returning
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6286
 * no data).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6287
 * pkt completion_reason is checked to determine the completion status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6288
 * Do scsi callback if necessary (FLAG_NOINTR == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6289
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6290
 * Note: this function may be called also for synchronously executed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6291
 * commands.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6292
 * This function may be used only if scsi_pkt is non-NULL.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6293
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6294
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6295
static	void
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6296
sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6297
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6298
	sata_pkt_txlate_t *spx =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6299
	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6300
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6301
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6302
	sata_set_arq_data(sata_pkt);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6303
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6304
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6305
		/* scsi callback required */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6306
		scsi_hba_pkt_comp(scsipkt);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6307
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6308
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6309
static	void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6310
sata_set_arq_data(sata_pkt_t *sata_pkt)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6311
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6312
	sata_pkt_txlate_t *spx =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6313
	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6314
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6315
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6316
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6317
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6318
	    STATE_SENT_CMD | STATE_GOT_STATUS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6319
	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6320
		/* Normal completion */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6321
		scsipkt->pkt_reason = CMD_CMPLT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6322
		*scsipkt->pkt_scbp = STATUS_GOOD;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6323
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6324
		/* Something went wrong */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6325
		scsipkt->pkt_reason = CMD_INCOMPLETE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6326
		*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6327
		sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6328
		switch (sata_pkt->satapkt_reason) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6329
		case SATA_PKT_PORT_ERROR:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6330
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6331
			 * We have no device data. Assume no data transfered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6332
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6333
			sense->es_key = KEY_HARDWARE_ERROR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6334
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6335
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6336
		case SATA_PKT_DEV_ERROR:
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6337
			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6338
			    SATA_STATUS_ERR) {
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6339
				/*
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6340
				 * determine dev error reason from error
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6341
				 * reg content
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6342
				 */
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6343
				sata_decode_device_error(spx, sense);
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6344
				break;
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6345
			}
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6346
			/* No extended sense key - no info available */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6347
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6348
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6349
		case SATA_PKT_TIMEOUT:
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6350
			scsipkt->pkt_reason = CMD_TIMEOUT;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6351
			scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6352
			    STAT_TIMEOUT | STAT_DEV_RESET;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6353
			/* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6354
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6355
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6356
		case SATA_PKT_ABORTED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6357
			scsipkt->pkt_reason = CMD_ABORTED;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6358
			scsipkt->pkt_statistics |= STAT_ABORTED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6359
			/* No extended sense key ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6360
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6361
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6362
		case SATA_PKT_RESET:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6363
			/* pkt aborted by an explicit reset from a host */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6364
			scsipkt->pkt_reason = CMD_RESET;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  6365
			scsipkt->pkt_statistics |= STAT_DEV_RESET;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6366
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6367
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6368
		default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6369
			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6370
			    "sata_txlt_nodata_cmd_completion: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6371
			    "invalid packet completion reason %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6372
			    sata_pkt->satapkt_reason));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6373
			scsipkt->pkt_reason = CMD_TRAN_ERR;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6374
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6375
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6376
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6377
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6378
	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6379
	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6380
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6381
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6382
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6383
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6384
 * Build Mode sense R/W recovery page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6385
 * NOT IMPLEMENTED
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6386
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6387
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6388
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6389
sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6390
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6391
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6392
	_NOTE(ARGUNUSED(sdinfo))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6393
	_NOTE(ARGUNUSED(pcntrl))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6394
	_NOTE(ARGUNUSED(buf))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6395
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6396
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6397
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6398
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6399
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6400
 * Build Mode sense caching page  -  scsi-3 implementation.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6401
 * Page length distinguishes previous format from scsi-3 format.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6402
 * buf must have space for 0x12 bytes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6403
 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6404
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6405
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6406
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6407
sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6408
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6409
	struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6410
	sata_id_t *sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6411
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6412
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6413
	 * Most of the fields are set to 0, being not supported and/or disabled
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6414
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6415
	bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6416
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6417
	/* Saved paramters not supported */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6418
	if (pcntrl == 3)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6419
		return (0);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6420
	if (pcntrl == 0 || pcntrl == 2) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6421
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6422
		 * For now treat current and default parameters as same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6423
		 * That may have to change, if target driver will complain
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6424
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6425
		page->mode_page.code = MODEPAGE_CACHING;	/* PS = 0 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6426
		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6427
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6428
		if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6429
		    !SATA_READ_AHEAD_ENABLED(*sata_id)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6430
			page->dra = 1;		/* Read Ahead disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6431
			page->rcd = 1;		/* Read Cache disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6432
		}
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6433
		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6434
		    SATA_WRITE_CACHE_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6435
			page->wce = 1;		/* Write Cache enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6436
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6437
		/* Changeable parameters */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6438
		page->mode_page.code = MODEPAGE_CACHING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6439
		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6440
		if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6441
			page->dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6442
			page->rcd = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6443
		}
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6444
		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6445
			page->wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6446
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6447
	return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  6448
	    sizeof (struct mode_page));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6449
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6450
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6451
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6452
 * Build Mode sense exception cntrl page
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6453
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6454
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6455
sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6456
{
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6457
	struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6458
	sata_id_t *sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6459
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6460
	/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6461
	 * Most of the fields are set to 0, being not supported and/or disabled
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6462
	 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6463
	bzero(buf, PAGELENGTH_INFO_EXCPT);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6464
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6465
	page->mode_page.code = MODEPAGE_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6466
	page->mode_page.length = PAGELENGTH_INFO_EXCPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6467
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6468
	/* Indicate that this is page is saveable */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6469
	page->mode_page.ps = 1;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6470
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6471
	/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6472
	 * We will return the same data for default, current and saved page.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6473
	 * The only changeable bit is dexcpt and that bit is required
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6474
	 * by the ATA specification to be preserved across power cycles.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6475
	 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6476
	if (pcntrl != 1) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6477
		page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6478
		page->mrie = MRIE_ONLY_ON_REQUEST;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6479
	}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6480
	else
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6481
		page->dexcpt = 1;	/* Only changeable parameter */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6482
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6483
	return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6484
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6485
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6486
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6487
static int
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6488
sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6489
{
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6490
	struct mode_acoustic_management *page =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6491
	    (struct mode_acoustic_management *)buf;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6492
	sata_id_t *sata_id = &sdinfo->satadrv_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6493
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6494
	/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6495
	 * Most of the fields are set to 0, being not supported and/or disabled
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6496
	 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6497
	bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6498
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6499
	switch (pcntrl) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6500
	case P_CNTRL_DEFAULT:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6501
		/*  default paramters not supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6502
		return (0);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6503
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6504
	case P_CNTRL_CURRENT:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6505
	case P_CNTRL_SAVED:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6506
		/* Saved and current are supported and are identical */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6507
		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6508
		page->mode_page.length =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6509
		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6510
		page->mode_page.ps = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6511
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6512
		/* Word 83 indicates if feature is supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6513
		/* If feature is not supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6514
		if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6515
			page->acoustic_manag_enable =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6516
			    ACOUSTIC_DISABLED;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6517
		} else {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6518
			page->acoustic_manag_enable =
4837
fe2f53c9eb50 6556577 Need to support Advanced Acoustic Management Feature (AAM (fix lint)
ls24207
parents: 4836
diff changeset
  6519
			    ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6520
			    != 0);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6521
			/* Word 94 inidicates the value */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6522
#ifdef	_LITTLE_ENDIAN
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6523
			page->acoustic_manag_level =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6524
			    (uchar_t)sata_id->ai_acoustic;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6525
			page->vendor_recommended_value =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6526
			    sata_id->ai_acoustic >> 8;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6527
#else
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6528
			page->acoustic_manag_level =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6529
			    sata_id->ai_acoustic >> 8;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6530
			page->vendor_recommended_value =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6531
			    (uchar_t)sata_id->ai_acoustic;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6532
#endif
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6533
		}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6534
		break;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6535
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6536
	case P_CNTRL_CHANGEABLE:
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6537
		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6538
		page->mode_page.length =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6539
		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6540
		page->mode_page.ps = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6541
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6542
		/* Word 83 indicates if the feature is supported */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6543
		if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6544
			page->acoustic_manag_enable =
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6545
			    ACOUSTIC_ENABLED;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6546
			page->acoustic_manag_level = 0xff;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6547
		}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6548
		break;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6549
	}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6550
	return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6551
	    sizeof (struct mode_page));
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6552
}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6553
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6554
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6555
/*
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6556
 * Build Mode sense power condition page.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6557
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6558
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6559
sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6560
{
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6561
	struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6562
	sata_id_t *sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6563
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6564
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6565
	 * Most of the fields are set to 0, being not supported and/or disabled
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6566
	 * power condition page length was 0x0a
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6567
	 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6568
	bzero(buf, sizeof (struct mode_info_power_cond));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6569
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6570
	if (pcntrl == P_CNTRL_DEFAULT) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6571
		/*  default paramters not supported */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6572
		return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6573
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6574
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6575
	page->mode_page.code = MODEPAGE_POWER_COND;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6576
	page->mode_page.length = sizeof (struct mode_info_power_cond);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6577
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6578
	if (sata_id->ai_cap && SATA_STANDBYTIMER) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6579
		page->standby = 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6580
		bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6581
		    sizeof (uchar_t) * 4);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6582
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6583
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6584
	return (sizeof (struct mode_info_power_cond));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6585
}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6586
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6587
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6588
 * Process mode select caching page 8 (scsi3 format only).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6589
 * Read Ahead (same as read cache) and Write Cache may be turned on and off
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6590
 * if these features are supported by the device. If these features are not
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6591
 * supported, the command will be terminated with STATUS_CHECK.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6592
 * This function fails only if the SET FEATURE command sent to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6593
 * the device fails. The page format is not varified, assuming that the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6594
 * target driver operates correctly - if parameters length is too short,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6595
 * we just drop the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6596
 * Two command may be sent if both Read Cache/Read Ahead and Write Cache
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6597
 * setting have to be changed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6598
 * SET FEATURE command is executed synchronously, i.e. we wait here until
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6599
 * it is completed, regardless of the scsi pkt directives.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6600
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6601
 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6602
 * changing DRA will change RCD.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6603
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6604
 * More than one SATA command may be executed to perform operations specified
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6605
 * by mode select pages. The first error terminates further execution.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6606
 * Operations performed successully are not backed-up in such case.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6607
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6608
 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6609
 * If operation resulted in changing device setup, dmod flag should be set to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6610
 * one (1). If parameters were not changed, dmod flag should be set to 0.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6611
 * Upon return, if operation required sending command to the device, the rval
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6612
 * should be set to the value returned by sata_hba_start. If operation
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6613
 * did not require device access, rval should be set to TRAN_ACCEPT.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6614
 * The pagelen should be set to the length of the page.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6615
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6616
 * This function has to be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6617
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6618
 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6619
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6620
int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6621
sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6622
    int parmlen, int *pagelen, int *rval, int *dmod)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6623
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6624
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6625
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6626
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6627
	sata_id_t *sata_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6628
	struct scsi_extended_sense *sense;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6629
	int wce, dra;	/* Current settings */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6630
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6631
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6632
	    &spx->txlt_sata_pkt->satapkt_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6633
	sata_id = &sdinfo->satadrv_id;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6634
	*dmod = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6635
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6636
	/* Verify parameters length. If too short, drop it */
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6637
	if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6638
	    sizeof (struct mode_page)) > parmlen) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6639
		*scsipkt->pkt_scbp = STATUS_CHECK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6640
		sense = sata_arq_sense(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6641
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  6642
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6643
		*pagelen = parmlen;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6644
		*rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6645
		return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6646
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6647
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6648
	*pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6649
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6650
	/* Current setting of Read Ahead (and Read Cache) */
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6651
	if (SATA_READ_AHEAD_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6652
		dra = 0;	/* 0 == not disabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6653
	else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6654
		dra = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6655
	/* Current setting of Write Cache */
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
  6656
	if (SATA_WRITE_CACHE_ENABLED(*sata_id))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6657
		wce = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6658
	else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6659
		wce = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6660
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6661
	if (page->dra == dra && page->wce == wce && page->rcd == dra) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6662
		/* nothing to do */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6663
		*rval = TRAN_ACCEPT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6664
		return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6665
	}
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6666
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6667
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6668
	 * Need to flip some setting
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6669
	 * Set-up Internal SET FEATURES command(s)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6670
	 */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  6671
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6672
	scmd->satacmd_addr_type = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6673
	scmd->satacmd_device_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6674
	scmd->satacmd_status_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6675
	scmd->satacmd_error_reg = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6676
	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6677
	if (page->dra != dra || page->rcd != dra) {
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6678
		if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6679
			/* Need to flip read ahead setting */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6680
			if (dra == 0)
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6681
				/* Disable read ahead / read cache */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6682
				scmd->satacmd_features_reg =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6683
				    SATAC_SF_DISABLE_READ_AHEAD;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6684
			else
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6685
				/* Enable read ahead  / read cache */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6686
				scmd->satacmd_features_reg =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6687
				    SATAC_SF_ENABLE_READ_AHEAD;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6688
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6689
			/* Transfer command to HBA */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6690
			if (sata_hba_start(spx, rval) != 0)
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6691
				/*
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6692
				 * Pkt not accepted for execution.
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6693
				 */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6694
				return (SATA_FAILURE);
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6695
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6696
			*dmod = 1;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6697
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6698
			/* Now process return */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6699
			if (spx->txlt_sata_pkt->satapkt_reason !=
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6700
			    SATA_PKT_COMPLETED) {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6701
				goto failure;	/* Terminate */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6702
			}
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6703
		} else {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6704
			*scsipkt->pkt_scbp = STATUS_CHECK;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6705
			sense = sata_arq_sense(spx);
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6706
			sense->es_key = KEY_ILLEGAL_REQUEST;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6707
			sense->es_add_code =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6708
			    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6709
			*pagelen = parmlen;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6710
			*rval = TRAN_ACCEPT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6711
			return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6712
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6713
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6714
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6715
	/* Note that the packet is not removed, so it could be re-used */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6716
	if (page->wce != wce) {
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6717
		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6718
			/* Need to flip Write Cache setting */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6719
			if (page->wce == 1)
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6720
				/* Enable write cache */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6721
				scmd->satacmd_features_reg =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6722
				    SATAC_SF_ENABLE_WRITE_CACHE;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6723
			else
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6724
				/* Disable write cache */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6725
				scmd->satacmd_features_reg =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6726
				    SATAC_SF_DISABLE_WRITE_CACHE;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6727
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6728
			/* Transfer command to HBA */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6729
			if (sata_hba_start(spx, rval) != 0)
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6730
				/*
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6731
				 * Pkt not accepted for execution.
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6732
				 */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6733
				return (SATA_FAILURE);
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6734
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6735
			*dmod = 1;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6736
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6737
			/* Now process return */
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6738
			if (spx->txlt_sata_pkt->satapkt_reason !=
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6739
			    SATA_PKT_COMPLETED) {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6740
				goto failure;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6741
			}
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6742
		} else {
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6743
			*scsipkt->pkt_scbp = STATUS_CHECK;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6744
			sense = sata_arq_sense(spx);
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6745
			sense->es_key = KEY_ILLEGAL_REQUEST;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6746
			sense->es_add_code =
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6747
			    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6748
			*pagelen = parmlen;
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6749
			*rval = TRAN_ACCEPT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6750
			return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6751
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6752
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6753
	return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6755
failure:
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6756
	sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6757
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6758
	return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6759
}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6760
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6761
/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6762
 * Process mode select informational exceptions control page 0x1c
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6763
 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6764
 * The only changeable bit is dexcpt (disable exceptions).
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6765
 * MRIE (method of reporting informational exceptions) must be
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6766
 * "only on request".
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6767
 * This page applies to informational exceptions that report
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6768
 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6769
 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6770
 * Informational exception conditions occur as the result of background scan
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6771
 * errors, background self-test errors, or vendor specific events within a
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6772
 * logical unit. An informational exception condition may occur asynchronous
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6773
 * to any commands.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6774
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6775
 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6776
 * If operation resulted in changing device setup, dmod flag should be set to
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6777
 * one (1). If parameters were not changed, dmod flag should be set to 0.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6778
 * Upon return, if operation required sending command to the device, the rval
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6779
 * should be set to the value returned by sata_hba_start. If operation
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6780
 * did not require device access, rval should be set to TRAN_ACCEPT.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6781
 * The pagelen should be set to the length of the page.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6782
 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6783
 * This function has to be called with a port mutex held.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6784
 *
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6785
 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6786
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6787
 * Cannot be called in the interrupt context.
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6788
 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6789
static	int
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6790
sata_mode_select_page_1c(
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6791
	sata_pkt_txlate_t *spx,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6792
	struct mode_info_excpt_page *page,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6793
	int parmlen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6794
	int *pagelen,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6795
	int *rval,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6796
	int *dmod)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6797
{
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6798
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6799
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6800
	sata_drive_info_t *sdinfo;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6801
	sata_id_t *sata_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6802
	struct scsi_extended_sense *sense;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6803
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6804
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6805
	    &spx->txlt_sata_pkt->satapkt_device);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6806
	sata_id = &sdinfo->satadrv_id;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6807
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6808
	*dmod = 0;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6809
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6810
	/* Verify parameters length. If too short, drop it */
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6811
	if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6812
	    page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6813
		*scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6814
		sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6815
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  6816
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6817
		*pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6818
		*rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6819
		return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6820
	}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6821
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6822
	*pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6823
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6824
	if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6825
		*scsipkt->pkt_scbp = STATUS_CHECK;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6826
		sense = sata_arq_sense(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6827
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  6828
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6829
		*pagelen = parmlen;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6830
		*rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6831
		return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6832
	}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6833
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6834
	/* If already in the state requested, we are done */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6835
	if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6836
		/* nothing to do */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6837
		*rval = TRAN_ACCEPT;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6838
		return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6839
	}
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6840
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6841
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6842
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6843
	/* Build SMART_ENABLE or SMART_DISABLE command */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6844
	scmd->satacmd_addr_type = 0;		/* N/A */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6845
	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6846
	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6847
	scmd->satacmd_features_reg = page->dexcpt ?
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6848
	    SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6849
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6850
	scmd->satacmd_cmd_reg = SATAC_SMART;
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6851
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6852
	/* Transfer command to HBA */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6853
	if (sata_hba_start(spx, rval) != 0)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6854
		/*
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6855
		 * Pkt not accepted for execution.
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6856
		 */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6857
		return (SATA_FAILURE);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6858
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6859
	*dmod = 1;	/* At least may have been modified */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6860
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6861
	/* Now process return */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6862
	if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6863
		return (SATA_SUCCESS);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6864
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6865
	/* Packet did not complete successfully */
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6866
	sata_xlate_errors(spx);
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
  6867
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6868
	return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6869
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  6870
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6871
/*
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6872
 * Process mode select acoustic management control page 0x30
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6873
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6874
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6875
 * This function has to be called with a port mutex held.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6876
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6877
 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6878
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6879
 * Cannot be called in the interrupt context.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  6880
 */
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6881
int
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6882
sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6883
    mode_acoustic_management *page, int parmlen, int *pagelen,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6884
    int *rval, int *dmod)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6885
{
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6886
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6887
	sata_drive_info_t *sdinfo;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6888
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6889
	sata_id_t *sata_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6890
	struct scsi_extended_sense *sense;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6891
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6892
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6893
	    &spx->txlt_sata_pkt->satapkt_device);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6894
	sata_id = &sdinfo->satadrv_id;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6895
	*dmod = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6896
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6897
	/* If parmlen is too short or the feature is not supported, drop it */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6898
	if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
10247
27d5d7e9cd70 6741163 sata should return check cond for mode select if cache mode change is requested but not supported
Phi Tran <Phi.Tran@Sun.COM>
parents: 10131
diff changeset
  6899
	    sizeof (struct mode_page)) > parmlen) ||
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6900
	    (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6901
		*scsipkt->pkt_scbp = STATUS_CHECK;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6902
		sense = sata_arq_sense(spx);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6903
		sense->es_key = KEY_ILLEGAL_REQUEST;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  6904
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6905
		*pagelen = parmlen;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6906
		*rval = TRAN_ACCEPT;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6907
		return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6908
	}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6909
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6910
	*pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6911
	    sizeof (struct mode_page);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6912
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6913
	/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6914
	 * We can enable and disable acoustice management and
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6915
	 * set the acoustic management level.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6916
	 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6917
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6918
	/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6919
	 * Set-up Internal SET FEATURES command(s)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6920
	 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6921
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6922
	scmd->satacmd_addr_type = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6923
	scmd->satacmd_device_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6924
	scmd->satacmd_status_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6925
	scmd->satacmd_error_reg = 0;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6926
	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6927
	if (page->acoustic_manag_enable) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6928
		scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6929
		scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6930
	} else {	/* disabling acoustic management */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6931
		scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6932
	}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6933
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6934
	/* Transfer command to HBA */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6935
	if (sata_hba_start(spx, rval) != 0)
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6936
		/*
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6937
		 * Pkt not accepted for execution.
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6938
		 */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6939
		return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6940
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6941
	/* Now process return */
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6942
	if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6943
		sata_xlate_errors(spx);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6944
		return (SATA_FAILURE);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6945
	}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6946
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6947
	*dmod = 1;
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6948
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6949
	return (SATA_SUCCESS);
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6950
}
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  6951
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6952
/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6953
 * Process mode select power condition page 0x1a
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6954
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6955
 * This function has to be called with a port mutex held.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6956
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6957
 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6958
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6959
 * Cannot be called in the interrupt context.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6960
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6961
int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6962
sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6963
    mode_info_power_cond *page, int parmlen, int *pagelen,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6964
    int *rval, int *dmod)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6965
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6966
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6967
	sata_drive_info_t *sdinfo;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6968
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6969
	sata_id_t *sata_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6970
	struct scsi_extended_sense *sense;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6971
	uint8_t ata_count;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6972
	int i, len;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6973
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6974
	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6975
	    &spx->txlt_sata_pkt->satapkt_device);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6976
	sata_id = &sdinfo->satadrv_id;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6977
	*dmod = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6978
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6979
	len = sizeof (struct mode_info_power_cond);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6980
	len += sizeof (struct mode_page);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6981
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6982
	/* If parmlen is too short or the feature is not supported, drop it */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6983
	if ((len < parmlen) || (page->idle == 1) ||
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6984
	    (!(sata_id->ai_cap && SATA_STANDBYTIMER) && page->standby == 1)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6985
		*scsipkt->pkt_scbp = STATUS_CHECK;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6986
		sense = sata_arq_sense(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6987
		sense->es_key = KEY_ILLEGAL_REQUEST;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6988
		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6989
		*pagelen = parmlen;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6990
		*rval = TRAN_ACCEPT;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6991
		return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6992
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6993
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6994
	*pagelen = len;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6995
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6996
	/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6997
	 * Set-up Internal STANDBY command(s)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6998
	 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  6999
	if (page->standby == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7000
		goto out;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7001
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7002
	ata_count = sata_get_standby_timer(page->standby_cond_timer);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7003
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7004
	scmd->satacmd_addr_type = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7005
	scmd->satacmd_sec_count_lsb = ata_count;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7006
	scmd->satacmd_lba_low_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7007
	scmd->satacmd_lba_mid_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7008
	scmd->satacmd_lba_high_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7009
	scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7010
	scmd->satacmd_device_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7011
	scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7012
	scmd->satacmd_cmd_reg = SATAC_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7013
	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7014
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7015
	/* Transfer command to HBA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7016
	if (sata_hba_start(spx, rval) != 0) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7017
		return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7018
	} else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7019
		if ((scmd->satacmd_error_reg != 0) ||
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7020
		    (spx->txlt_sata_pkt->satapkt_reason !=
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7021
		    SATA_PKT_COMPLETED)) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7022
			sata_xlate_errors(spx);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7023
			return (SATA_FAILURE);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7024
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7025
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7026
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7027
	for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7028
		sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7029
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7030
out:
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7031
	*dmod = 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7032
	return (SATA_SUCCESS);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7033
}
4836
7e0fe47fd304 PSARC/2007/422 Acoustic Management support under SATA module
ls24207
parents: 4659
diff changeset
  7034
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7035
/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7036
 * sata_build_lsense_page0() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7037
 * SCSI LOG SENSE page 0 (supported log pages)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7038
 *
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7039
 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7040
 * (supported log pages, self-test results, informational exceptions
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7041
 * Sun vendor specific ATA SMART data, and start stop cycle counter).
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7042
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7043
 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7044
 * in which to create the page information.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7045
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7046
 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7047
 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7048
static	int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7049
sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7050
{
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7051
	struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7052
	uint8_t *page_ptr = (uint8_t *)lpp->param_values;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7053
	int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7054
	sata_id_t *sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7055
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7056
	lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7057
	lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7058
	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7059
	*page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7060
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7061
	if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7062
		if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7063
			*page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7064
			++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7065
		}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7066
		*page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7067
		++num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7068
		*page_ptr++ = PAGE_CODE_SMART_READ_DATA;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7069
		++num_pages_supported;
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7070
		*page_ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7071
		++num_pages_supported;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7072
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7073
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7074
	lpp->param_len = num_pages_supported;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7075
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7076
	return ((&lpp->param_values[0] - (uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7077
	    num_pages_supported);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7078
}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7079
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7080
/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7081
 * sata_build_lsense_page_10() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7082
 * SCSI LOG SENSE page 0x10 (self-test results)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7083
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7084
 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7085
 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7086
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7087
 * Returns the number of bytes valid in the buffer.
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7088
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7089
 * Note: Self test and SMART data is accessible in device log pages.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7090
 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7091
 * of data can be transferred by a single command), or by the General Purpose
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7092
 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7093
 * - approximately 33MB - can be transferred by a single command.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7094
 * The SCT Command response (either error or command) is the same for both
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7095
 * the SMART and GPL methods of issuing commands.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7096
 * This function uses READ LOG EXT command when drive supports LBA48, and
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7097
 * SMART READ command otherwise.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7098
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7099
 * Since above commands are executed in a synchronous mode, this function
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7100
 * should not be called in an interrupt context.
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7101
 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7102
static	int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7103
sata_build_lsense_page_10(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7104
	sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7105
	uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7106
	sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7107
{
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7108
	struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7109
	int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7110
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7111
	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7112
		struct smart_ext_selftest_log *ext_selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7113
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7114
		ext_selftest_log = kmem_zalloc(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7115
		    sizeof (struct smart_ext_selftest_log), KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7116
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7117
		rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7118
		    ext_selftest_log, 0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7119
		if (rval == 0) {
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7120
			int index, start_index;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7121
			struct smart_ext_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7122
			static const struct smart_ext_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7123
			    {0};
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7124
			uint16_t block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7125
			int count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7126
			boolean_t only_one_block = B_FALSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7127
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7128
			index = ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7129
			    smart_ext_selftest_log_index[0];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7130
			index |= ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7131
			    smart_ext_selftest_log_index[1] << 8;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7132
			if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7133
				goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7134
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7135
			--index;	/* Correct for 0 origin */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7136
			start_index = index;	/* remember where we started */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7137
			block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7138
			if (block_num != 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7139
				rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7140
				    sata_hba_inst, sdinfo, ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7141
				    block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7142
				if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7143
					goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7144
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7145
			index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7146
			entry =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7147
			    &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7148
			    smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7149
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7150
			for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7151
			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7152
			    ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7153
				uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7154
				uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7155
				uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7156
				uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7157
				uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7158
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7159
				/* If this is an unused entry, we are done */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7160
				if (bcmp(entry, &empty, sizeof (empty)) == 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7161
					/* Broken firmware on some disks */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7162
					if (index + 1 ==
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7163
					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7164
						--entry;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7165
						--index;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7166
						if (bcmp(entry, &empty,
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7167
						    sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7168
							goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7169
					} else
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7170
						goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7171
				}
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7172
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7173
				if (only_one_block &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7174
				    start_index == index)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7175
					goto out;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7176
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7177
				lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7178
				lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7179
				lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7180
				    LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7181
				lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7182
				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7183
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7184
				status = entry->smart_ext_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7185
				status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7186
				switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7187
				case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7188
				default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7189
					sense_key = KEY_NO_SENSE;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7190
					add_sense_code =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7191
					    SD_SCSI_ASC_NO_ADD_SENSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7192
					add_sense_code_qual = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7193
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7194
				case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7195
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7196
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7197
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7198
					add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7199
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7200
				case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7201
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7202
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7203
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7204
					add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7205
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7206
				case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7207
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7208
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7209
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7210
					add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7211
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7212
				case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7213
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7214
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7215
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7216
					add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7217
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7218
				case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7219
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7220
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7221
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7222
					add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7223
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7224
				case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7225
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7226
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7227
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7228
					add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7229
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7230
				case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7231
					sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7232
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7233
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7234
					add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7235
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7236
				case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7237
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7238
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7239
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7240
					add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7241
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7242
				}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7243
				code = 0;	/* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7244
				status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7245
				lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7246
				lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7247
				lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7248
				    smart_ext_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7249
				lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7250
				    smart_ext_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7251
				if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7252
					lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7253
					lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7254
					lpp->param_values[6] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7255
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7256
					    [5];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7257
					lpp->param_values[7] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7258
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7259
					    [4];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7260
					lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7261
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7262
					    [3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7263
					lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7264
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7265
					    [2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7266
					lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7267
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7268
					    [1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7269
					lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7270
					    smart_ext_selftest_log_failing_lba
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7271
					    [0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7272
				} else {	/* No bad block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7273
					lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7274
					lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7275
					lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7276
					lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7277
					lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7278
					lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7279
					lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7280
					lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7281
				}
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7282
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7283
				lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7284
				lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7285
				lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7286
				lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7287
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7288
				lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7289
				    (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7290
				    SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7291
				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7292
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7293
				--index;	/* Back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7294
				if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7295
					if (block_num > 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7296
						--block_num;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7297
					} else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7298
						struct read_log_ext_directory
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7299
						    logdir;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7300
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7301
						rval =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7302
						    sata_read_log_ext_directory(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7303
						    sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7304
						    &logdir);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7305
						if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7306
							goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7307
						if ((logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7308
						    [0] == 0) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7309
						    (logdir.read_log_ext_vers
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7310
						    [1] == 0))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7311
							goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7312
						block_num =
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7313
						    logdir.read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7314
						    [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7315
						    - 1][0];
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7316
						block_num |= logdir.
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7317
						    read_log_ext_nblks
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7318
						    [EXT_SMART_SELFTEST_LOG_PAGE
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7319
						    - 1][1] << 8;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7320
						--block_num;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7321
						only_one_block =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7322
						    (block_num == 0);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7323
					}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7324
					rval = sata_ext_smart_selftest_read_log(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7325
					    sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7326
					    ext_selftest_log, block_num);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7327
					if (rval != 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7328
						goto out;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7329
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7330
					index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7331
					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7332
					    1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7333
				}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7334
				index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7335
				entry = &ext_selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7336
				    smart_ext_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7337
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7338
		}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7339
out:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7340
		kmem_free(ext_selftest_log,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7341
		    sizeof (struct smart_ext_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7342
	} else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7343
		struct smart_selftest_log *selftest_log;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7344
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7345
		selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7346
		    KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7347
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7348
		rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7349
		    selftest_log);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7350
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7351
		if (rval == 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7352
			int index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7353
			int count;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7354
			struct smart_selftest_log_entry *entry;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7355
			static const struct smart_selftest_log_entry empty =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7356
			    { 0 };
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7357
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7358
			index = selftest_log->smart_selftest_log_index;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7359
			if (index == 0)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7360
				goto done;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7361
			--index;	/* Correct for 0 origin */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7362
			entry = &selftest_log->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7363
			    smart_selftest_log_entries[index];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7364
			for (count = 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7365
			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7366
			    ++count) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7367
				uint8_t status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7368
				uint8_t code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7369
				uint8_t sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7370
				uint8_t add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7371
				uint8_t add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7372
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7373
				if (bcmp(entry, &empty, sizeof (empty)) == 0)
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7374
					goto done;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7375
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7376
				lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7377
				lpp->param_code[1] = count;
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7378
				lpp->param_ctrl_flags =
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7379
				    LOG_CTRL_LP | LOG_CTRL_LBIN;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7380
				lpp->param_len =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7381
				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7382
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7383
				status = entry->smart_selftest_log_status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7384
				status >>= 4;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7385
				switch (status) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7386
				case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7387
				default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7388
					sense_key = KEY_NO_SENSE;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7389
					add_sense_code =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7390
					    SD_SCSI_ASC_NO_ADD_SENSE;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7391
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7392
				case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7393
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7394
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7395
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7396
					add_sense_code_qual = SCSI_COMPONENT_81;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7397
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7398
				case 2:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7399
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7400
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7401
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7402
					add_sense_code_qual = SCSI_COMPONENT_82;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7403
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7404
				case 3:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7405
					sense_key = KEY_ABORTED_COMMAND;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7406
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7407
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7408
					add_sense_code_qual = SCSI_COMPONENT_83;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7409
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7410
				case 4:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7411
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7412
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7413
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7414
					add_sense_code_qual = SCSI_COMPONENT_84;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7415
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7416
				case 5:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7417
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7418
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7419
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7420
					add_sense_code_qual = SCSI_COMPONENT_85;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7421
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7422
				case 6:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7423
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7424
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7425
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7426
					add_sense_code_qual = SCSI_COMPONENT_86;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7427
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7428
				case 7:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7429
					sense_key = KEY_MEDIUM_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7430
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7431
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7432
					add_sense_code_qual = SCSI_COMPONENT_87;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7433
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7434
				case 8:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7435
					sense_key = KEY_HARDWARE_ERROR;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7436
					add_sense_code =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7437
					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7438
					add_sense_code_qual = SCSI_COMPONENT_88;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7439
					break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7440
				}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7441
				code = 0;	/* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7442
				status |= (code << 4);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7443
				lpp->param_values[0] = status;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7444
				lpp->param_values[1] = 0; /* unspecified */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7445
				lpp->param_values[2] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7446
				    smart_selftest_log_timestamp[1];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7447
				lpp->param_values[3] = entry->
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7448
				    smart_selftest_log_timestamp[0];
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7449
				if (status != 0) {
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7450
					lpp->param_values[4] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7451
					lpp->param_values[5] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7452
					lpp->param_values[6] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7453
					lpp->param_values[7] = 0;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7454
					lpp->param_values[8] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7455
					    smart_selftest_log_failing_lba[3];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7456
					lpp->param_values[9] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7457
					    smart_selftest_log_failing_lba[2];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7458
					lpp->param_values[10] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7459
					    smart_selftest_log_failing_lba[1];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7460
					lpp->param_values[11] = entry->
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7461
					    smart_selftest_log_failing_lba[0];
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7462
				} else {	/* No block address */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7463
					lpp->param_values[4] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7464
					lpp->param_values[5] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7465
					lpp->param_values[6] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7466
					lpp->param_values[7] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7467
					lpp->param_values[8] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7468
					lpp->param_values[9] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7469
					lpp->param_values[10] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7470
					lpp->param_values[11] = 0xff;
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7471
				}
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7472
				lpp->param_values[12] = sense_key;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7473
				lpp->param_values[13] = add_sense_code;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7474
				lpp->param_values[14] = add_sense_code_qual;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7475
				lpp->param_values[15] = 0; /* undefined */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7476
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7477
				lpp = (struct log_parameter *)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7478
				    (((uint8_t *)lpp) +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7479
				    SCSI_LOG_PARAM_HDR_LEN +
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7480
				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7481
				--index;	/* back up to previous entry */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7482
				if (index < 0) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7483
					index =
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7484
					    NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7485
				}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7486
				entry = &selftest_log->
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
  7487
				    smart_selftest_log_entries[index];
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7488
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7489
		}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7490
done:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7491
		kmem_free(selftest_log, sizeof (struct smart_selftest_log));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7492
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7493
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7494
	return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7495
	    SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7496
}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7497
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7498
/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7499
 * sata_build_lsense_page_2f() is used to create the
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7500
 * SCSI LOG SENSE page 0x2f (informational exceptions)
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7501
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7502
 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7503
 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7504
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7505
 * Returns the number of bytes valid in the buffer.
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7506
 *
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7507
 * Because it invokes function(s) that send synchronously executed command
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
  7508
 * to the HBA, it cannot be called in the interrupt context.
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7509
 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7510
static	int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7511
sata_build_lsense_page_2f(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7512
	sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7513
	uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7514
	sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7515
{
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7516
	struct log_parameter *lpp = (struct log_parameter *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7517
	int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7518
	uint8_t *smart_data;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7519
	uint8_t temp;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7520
	sata_id_t *sata_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7521
#define	SMART_NO_TEMP	0xff
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7522
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7523
	lpp->param_code[0] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7524
	lpp->param_code[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7525
	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7526
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7527
	/* Now get the SMART status w.r.t. threshold exceeded */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7528
	rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7529
	switch (rval) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7530
	case 1:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7531
		lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7532
		lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7533
		break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7534
	case 0:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7535
	case -1:	/* failed to get data */
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7536
		lpp->param_values[0] = 0;	/* No failure predicted */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7537
		lpp->param_values[1] = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7538
		break;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7539
#if defined(SATA_DEBUG)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7540
	default:
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7541
		cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7542
		/* NOTREACHED */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7543
#endif
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7544
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7545
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7546
	sata_id = &sdinfo->satadrv_id;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7547
	if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7548
		temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7549
	else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7550
		/* Now get the temperature */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7551
		smart_data = kmem_zalloc(512, KM_SLEEP);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7552
		rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7553
		    SCT_STATUS_LOG_PAGE, 1);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7554
		if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7555
			temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7556
		else {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7557
			temp = smart_data[200];
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7558
			if (temp & 0x80) {
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7559
				if (temp & 0x7f)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7560
					temp = 0;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7561
				else
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7562
					temp = SMART_NO_TEMP;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7563
			}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7564
		}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7565
		kmem_free(smart_data, 512);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7566
	}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7567
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7568
	lpp->param_values[2] = temp;	/* most recent temperature */
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
  7569
	lpp->param_values[3] = 0;	/* required vendor specific byte */
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7570
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7571
	lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7572
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7573
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7574
	return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7575
}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7576
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7577
/*
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7578
 * sata_build_lsense_page_30() is used to create the
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7579
 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7580
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7581
 * Takes a sata_drive_info t * and the address of a buffer
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7582
 * in which to create the page information as well as a sata_hba_inst_t *.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7583
 *
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7584
 * Returns the number of bytes valid in the buffer.
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7585
 */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7586
static int
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7587
sata_build_lsense_page_30(
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7588
	sata_drive_info_t *sdinfo,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7589
	uint8_t *buf,
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7590
	sata_hba_inst_t *sata_hba_inst)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7591
{
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7592
	struct smart_data *smart_data = (struct smart_data *)buf;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7593
	int rval;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7594
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7595
	/* Now do the SMART READ DATA */
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7596
	rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7597
	if (rval == -1)
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7598
		return (0);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7599
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7600
	return (sizeof (struct smart_data));
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7601
}
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
  7602
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7603
/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7604
 * sata_build_lsense_page_0e() is used to create the
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7605
 * SCSI LOG SENSE page 0e (supported log pages)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7606
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7607
 * Date of Manufacture (0x0001)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7608
 *	YEAR = "0000"
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7609
 *	WEEK = "00"
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7610
 * Accounting Date (0x0002)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7611
 *	6 ASCII space character(20h)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7612
 * Specified cycle count over device lifetime
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7613
 *	VALUE - THRESH - the delta between max and min;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7614
 * Accumulated start-stop cycles
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7615
 *	VALUE - WORST - the accumulated cycles;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7616
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7617
 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7618
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7619
 * Takes a sata_drive_info t * and the address of a buffer
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7620
 * in which to create the page information as well as a sata_hba_inst_t *.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7621
 *
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7622
 * Returns the number of bytes valid in the buffer.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7623
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7624
static	int
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7625
sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7626
	sata_pkt_txlate_t *spx)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7627
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7628
	struct start_stop_cycle_counter_log *log_page;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7629
	int i, rval, index;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7630
	uint8_t smart_data[512], id, value, worst, thresh;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7631
	uint32_t max_count, cycles;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7632
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7633
	/* Now do the SMART READ DATA */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7634
	rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7635
	    (struct smart_data *)smart_data);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7636
	if (rval == -1)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7637
		return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7638
	for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7639
		index = (i * 12) + 2;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7640
		id = smart_data[index];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7641
		if (id != SMART_START_STOP_COUNT_ID)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7642
			continue;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7643
		else {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7644
			thresh = smart_data[index + 2];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7645
			value = smart_data[index + 3];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7646
			worst = smart_data[index + 4];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7647
			break;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7648
		}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7649
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7650
	if (id != SMART_START_STOP_COUNT_ID)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7651
		return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7652
	max_count = value - thresh;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7653
	cycles = value - worst;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7654
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7655
	log_page = (struct start_stop_cycle_counter_log *)buf;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7656
	bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7657
	log_page->code = 0x0e;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7658
	log_page->page_len_low = 0x24;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7659
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7660
	log_page->manufactor_date_low = 0x1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7661
	log_page->param_1.fmt_link = 0x1; /* 01b */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7662
	log_page->param_len_1 = 0x06;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7663
	for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7664
		log_page->year_manu[i] = 0x30;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7665
		if (i < 2)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7666
			log_page->week_manu[i] = 0x30;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7667
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7668
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7669
	log_page->account_date_low = 0x02;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7670
	log_page->param_2.fmt_link = 0x01; /* 01b */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7671
	log_page->param_len_2 = 0x06;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7672
	for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7673
		log_page->year_account[i] = 0x20;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7674
		if (i < 2)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7675
			log_page->week_account[i] = 0x20;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7676
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7677
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7678
	log_page->lifetime_code_low = 0x03;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7679
	log_page->param_3.fmt_link = 0x03; /* 11b */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7680
	log_page->param_len_3 = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7681
	/* VALUE - THRESH - the delta between max and min */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7682
	log_page->cycle_code_low = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7683
	log_page->param_4.fmt_link = 0x03; /* 11b */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7684
	log_page->param_len_4 = 0x04;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7685
	/* WORST - THRESH - the distance from 'now' to min */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7686
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7687
	for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7688
		log_page->cycle_lifetime[i] =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7689
		    (max_count >> (8 * (3 - i))) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7690
		log_page->cycle_accumulated[i] =
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7691
		    (cycles >> (8 * (3 - i))) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7692
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7693
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7694
	return (sizeof (struct start_stop_cycle_counter_log));
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7695
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7696
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7697
/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7698
 * This function was used for build a ATA read verify sector command
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7699
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7700
static void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7701
sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7702
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7703
	scmd->satacmd_cmd_reg = SATAC_RDVER;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7704
	scmd->satacmd_addr_type = ATA_ADDR_LBA28;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7705
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7706
	scmd->satacmd_sec_count_lsb = sec & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7707
	scmd->satacmd_lba_low_lsb = lba & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7708
	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7709
	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7710
	scmd->satacmd_device_reg = (SATA_ADH_LBA | (lba >> 24) & 0xf);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7711
	scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7712
	scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7713
	scmd->satacmd_error_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7714
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7715
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7716
/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7717
 * This function was used for building an ATA
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7718
 * command, and only command register need to
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7719
 * be defined, other register will be zero or na.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7720
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7721
static void
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7722
sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7723
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7724
	scmd->satacmd_addr_type = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7725
	scmd->satacmd_cmd_reg = cmd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7726
	scmd->satacmd_device_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7727
	scmd->satacmd_sec_count_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7728
	scmd->satacmd_lba_low_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7729
	scmd->satacmd_lba_mid_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7730
	scmd->satacmd_lba_high_lsb = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7731
	scmd->satacmd_features_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7732
	scmd->satacmd_status_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7733
	scmd->satacmd_error_reg = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7734
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7735
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7736
/*
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7737
 * This function was used for changing the standby
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7738
 * timer format from SCSI to ATA.
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7739
 */
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7740
static uint8_t
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7741
sata_get_standby_timer(uint8_t *timer)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7742
{
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7743
	uint32_t i = 0, count = 0;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7744
	uint8_t ata_count;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7745
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7746
	for (i = 0; i < 4; i++) {
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7747
		count = count << 8 | timer[i];
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7748
	}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7749
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7750
	if (count == 0)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7751
		return (0);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7752
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7753
	if (count >= 1 && count <= 12000)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7754
		ata_count = (count -1) / 50 + 1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7755
	else if (count > 12000 && count <= 12600)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7756
		ata_count = 0xfc;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7757
	else if (count > 12601 && count <= 12750)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7758
		ata_count = 0xff;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7759
	else if (count > 12750 && count <= 17999)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7760
		ata_count = 0xf1;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7761
	else if (count > 18000 && count <= 198000)
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7762
		ata_count = count / 18000 + 240;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7763
	else
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7764
		ata_count = 0xfd;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7765
	return (ata_count);
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7766
}
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  7767
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7768
/* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7769
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7770
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7771
 * Start command for ATAPI device.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7772
 * This function processes scsi_pkt requests.
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  7773
 * Now CD/DVD, tape and ATAPI disk devices are supported.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7774
 * Most commands are packet without any translation into Packet Command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7775
 * Some may be trapped and executed as SATA commands (not clear which one).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7776
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7777
 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7778
 * execution).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7779
 * Returns other TRAN_XXXX codes if command is not accepted or completed
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7780
 * (see return values for sata_hba_start()).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7781
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7782
 * Note:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7783
 * Inquiry cdb format differs between transport version 2 and 3.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7784
 * However, the transport version 3 devices that were checked did not adhere
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7785
 * to the specification (ignored MSB of the allocation length). Therefore,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7786
 * the transport version is not checked, but Inquiry allocation length is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7787
 * truncated to 255 bytes if the original allocation length set-up by the
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7788
 * target driver is greater than 255 bytes.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7789
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7790
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7791
sata_txlt_atapi(sata_pkt_txlate_t *spx)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7792
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7793
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7794
	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7795
	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7796
	sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7797
	sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7798
	    &spx->txlt_sata_pkt->satapkt_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7799
	int cport = SATA_TXLT_CPORT(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7800
	int cdblen;
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  7801
	int rval, reason;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7802
	int synch;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7803
	union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7804
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7805
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7806
6591
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  7807
	if (((rval = sata_txlt_generic_pkt_info(spx, &reason)) !=
75b7f3a8280a 6696291 system panic'd running 'format -e c6t4d0'
pawelw
parents: 6539
diff changeset
  7808
	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7809
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7810
		return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7811
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7812
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7813
	/*
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7814
	 * ATAPI device executes some ATA commands in addition to those
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7815
	 * commands sent via PACKET command. These ATA commands may be
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7816
	 * executed by the regular SATA translation functions. None needs
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7817
	 * to be captured now.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7818
	 *
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7819
	 * Commands sent via PACKET command include:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7820
	 *	MMC command set for ATAPI CD/DVD device
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7821
	 *	SSC command set for ATAPI TAPE device
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  7822
	 *	SBC command set for ATAPI disk device
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7823
	 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7824
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7825
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7826
	/* Check the size of cdb */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7827
	cdblen = scsi_cdb_size[GETGROUP(cdbp)];
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7828
	if (cdblen > sdinfo->satadrv_atapi_cdb_len) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7829
		sata_log(NULL, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7830
		    "sata: invalid ATAPI cdb length %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7831
		    scsipkt->pkt_cdblen);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7832
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7833
		return (TRAN_BADPKT);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7834
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7835
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7836
	SATAATAPITRACE(spx, cdblen);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7837
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7838
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7839
	 * For non-read/write commands we need to
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7840
	 * map buffer
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7841
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7842
	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7843
	case SCMD_READ:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7844
	case SCMD_READ_G1:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7845
	case SCMD_READ_G5:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7846
	case SCMD_READ_G4:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7847
	case SCMD_WRITE:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7848
	case SCMD_WRITE_G1:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7849
	case SCMD_WRITE_G5:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7850
	case SCMD_WRITE_G4:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7851
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7852
	default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7853
		if (bp != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7854
			if (bp->b_flags & (B_PHYS | B_PAGEIO))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7855
				bp_mapin(bp);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7856
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7857
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7858
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7859
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7860
	 * scmd->satacmd_flags.sata_data_direction default -
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7861
	 * SATA_DIR_NODATA_XFER - is set by
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7862
	 * sata_txlt_generic_pkt_info().
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7863
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7864
	if (scmd->satacmd_bp) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7865
		if (scmd->satacmd_bp->b_flags & B_READ) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7866
			scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7867
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7868
			scmd->satacmd_flags.sata_data_direction =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7869
			    SATA_DIR_WRITE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7870
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7871
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7872
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7873
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7874
	 * Set up ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7875
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7876
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7877
	sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7878
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7879
	/* Copy cdb into sata_cmd */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7880
	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7881
	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7882
	bcopy(cdbp, scmd->satacmd_acdb, cdblen);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7883
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7884
	/* See note in the command header */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7885
	if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7886
		if (scmd->satacmd_acdb[3] != 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7887
			scmd->satacmd_acdb[4] = 255;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7888
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7889
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7890
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7891
	if (sata_debug_flags & SATA_DBG_ATAPI) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7892
		uint8_t *p = scmd->satacmd_acdb;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7893
		char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7894
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7895
		(void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7896
		    "%02x %02x %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7897
		    "%2x %02x %02x %02x %02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7898
		    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7899
		    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7900
		buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7901
		cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7902
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7903
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7904
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7905
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7906
	 * Preset request sense data to NO SENSE.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7907
	 * If there is no way to get error information via Request Sense,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7908
	 * the packet request sense data would not have to be modified by HBA,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7909
	 * but it could be returned as is.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7910
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7911
	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7912
	sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7913
	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7914
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7915
	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7916
		/* Need callback function */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7917
		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7918
		synch = FALSE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7919
	} else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7920
		synch = TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7921
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7922
	/* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7923
	if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7924
		/* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7925
		mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7926
		return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7927
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7928
	mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7929
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7930
	 * If execution is non-synchronous,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7931
	 * a callback function will handle potential errors, translate
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7932
	 * the response and will do a callback to a target driver.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7933
	 * If it was synchronous, use the same framework callback to check
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7934
	 * an execution status.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7935
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7936
	if (synch) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7937
		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7938
		    "synchronous execution status %x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7939
		    spx->txlt_sata_pkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7940
		sata_txlt_atapi_completion(spx->txlt_sata_pkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7941
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7942
	return (TRAN_ACCEPT);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7943
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7944
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7945
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7946
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7947
 * ATAPI Packet command completion.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7948
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7949
 * Failure of the command passed via Packet command are considered device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7950
 * error. SATA HBA driver would have to retrieve error data (via Request
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7951
 * Sense command delivered via error retrieval sata packet) and copy it
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7952
 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7953
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7954
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7955
sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7956
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7957
	sata_pkt_txlate_t *spx =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7958
	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7959
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7960
	struct scsi_extended_sense *sense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7961
	struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7962
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7963
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7964
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7965
	uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7966
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7967
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7968
	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7969
	    STATE_SENT_CMD | STATE_GOT_STATUS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7970
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7971
	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7972
		/* Normal completion */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7973
		if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7974
			scsipkt->pkt_state |= STATE_XFERRED_DATA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7975
		scsipkt->pkt_reason = CMD_CMPLT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7976
		*scsipkt->pkt_scbp = STATUS_GOOD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7977
		if (spx->txlt_tmp_buf != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7978
			/* Temporary buffer was used */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7979
			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7980
			if (bp->b_flags & B_READ) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7981
				rval = ddi_dma_sync(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7982
				    spx->txlt_buf_dma_handle, 0, 0,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7983
				    DDI_DMA_SYNC_FORCPU);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7984
				ASSERT(rval == DDI_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7985
				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7986
				    bp->b_bcount);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7987
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7988
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7989
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7990
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7991
		 * Something went wrong - analyze return
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7992
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7993
		*scsipkt->pkt_scbp = STATUS_CHECK;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7994
		sense = sata_arq_sense(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7995
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  7996
		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7997
			/*
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7998
			 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  7999
			 * Under this condition ERR bit is set for ATA command,
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8000
			 * and CHK bit set for ATAPI command.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8001
			 *
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8002
			 * Please check st_intr & sdintr about how pkt_reason
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8003
			 * is used.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8004
			 */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8005
			scsipkt->pkt_reason = CMD_CMPLT;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  8006
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8007
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8008
			 * We may not have ARQ data if there was a double
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8009
			 * error. But sense data in sata packet was pre-set
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8010
			 * with NO SENSE so it is valid even if HBA could
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8011
			 * not retrieve a real sense data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8012
			 * Just copy this sense data into scsi pkt sense area.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8013
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8014
			bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8015
			    SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8016
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8017
			if (sata_debug_flags & SATA_DBG_SCSI_IF) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8018
				sata_log(spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8019
				    "sata_txlt_atapi_completion: %02x\n"
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8020
				    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8021
				    "          %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8022
				    "          %02x %02x %02x %02x %02x %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8023
				    scsipkt->pkt_reason,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8024
				    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8025
				    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8026
				    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8027
				    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8028
				    rqsp[16], rqsp[17]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8029
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8030
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8031
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8032
			switch (sata_pkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8033
			case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8034
				/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8035
				 * We have no device data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8036
				 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8037
				scsipkt->pkt_reason = CMD_INCOMPLETE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8038
				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8039
				    STATE_GOT_TARGET | STATE_SENT_CMD |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8040
				    STATE_GOT_STATUS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8041
				sense->es_key = KEY_HARDWARE_ERROR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8042
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8043
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8044
			case SATA_PKT_TIMEOUT:
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  8045
				scsipkt->pkt_reason = CMD_TIMEOUT;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  8046
				scsipkt->pkt_statistics |=
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  8047
				    STAT_TIMEOUT | STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8048
				/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8049
				 * Need to check if HARDWARE_ERROR/
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8050
				 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8051
				 * appropriate.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8052
				 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8053
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8054
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8055
			case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8056
				scsipkt->pkt_reason = CMD_ABORTED;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  8057
				scsipkt->pkt_statistics |= STAT_ABORTED;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8058
				/* Should we set key COMMAND_ABPRTED? */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8059
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8060
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8061
			case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8062
				scsipkt->pkt_reason = CMD_RESET;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
  8063
				scsipkt->pkt_statistics |= STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8064
				/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8065
				 * May be we should set Unit Attention /
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8066
				 * Reset. Perhaps the same should be
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8067
				 * returned for disks....
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8068
				 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8069
				sense->es_key = KEY_UNIT_ATTENTION;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8070
				sense->es_add_code = SD_SCSI_ASC_RESET;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8071
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8072
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8073
			default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8074
				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8075
				    "sata_txlt_atapi_completion: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8076
				    "invalid packet completion reason"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8077
				scsipkt->pkt_reason = CMD_TRAN_ERR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8078
				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8079
				    STATE_GOT_TARGET | STATE_SENT_CMD |
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8080
				    STATE_GOT_STATUS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8081
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8082
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8083
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8084
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8085
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8086
	SATAATAPITRACE(spx, 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8087
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8088
	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8089
	    scsipkt->pkt_comp != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8090
		/* scsi callback required */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8091
		(*scsipkt->pkt_comp)(scsipkt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8092
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8093
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8094
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8095
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8096
 * Set up error retrieval sata command for ATAPI Packet Command error data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8097
 * recovery.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8098
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8099
 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8100
 * returns SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8101
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8102
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8103
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8104
sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8105
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8106
	sata_pkt_t *spkt = spx->txlt_sata_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8107
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8108
	struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8109
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8110
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8111
	 * Allocate dma-able buffer error data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8112
	 * Buffer allocation will take care of buffer alignment and other DMA
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8113
	 * attributes.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8114
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8115
	bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8116
	if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8117
		SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8118
		    "sata_get_err_retrieval_pkt: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8119
		    "cannot allocate buffer for error data", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8120
		return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8121
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8122
	bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8123
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8124
	/* Operation modes are up to the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8125
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8126
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8127
	/* Synchronous mode, no callback - may be changed by the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8128
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8129
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8130
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8131
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8132
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8133
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8134
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8135
	sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8136
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8137
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8138
	 * Set-up acdb. Request Sense CDB (packet command content) is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8139
	 * not in DMA-able buffer. Its handling is HBA-specific (how
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8140
	 * it is transfered into packet FIS).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8141
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8142
	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8143
	bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8144
	/* Following zeroing of pad bytes may not be necessary */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8145
	bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8146
	    sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8147
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8148
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8149
	 * Set-up pointer to the buffer handle, so HBA can sync buffer
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8150
	 * before accessing it. Handle is in usual place in translate struct.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8151
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8152
	scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8153
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8154
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8155
	 * Preset request sense data to NO SENSE.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8156
	 * Here it is redundant, only for a symetry with scsi-originated
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8157
	 * packets. It should not be used for anything but debugging.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8158
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8159
	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8160
	sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8161
	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8162
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8163
	ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8164
	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8165
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8166
	return (SATA_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8167
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8168
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8169
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8170
 * Set-up ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8171
 * Data transfer direction has to be set-up in sata_cmd structure prior to
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8172
 * calling this function.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8173
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8174
 * Returns void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8175
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8176
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8177
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8178
sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8179
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8180
	scmd->satacmd_addr_type = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8181
	scmd->satacmd_sec_count_lsb = 0;	/* no tag */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8182
	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8183
	scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8184
	scmd->satacmd_lba_high_lsb =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8185
	    (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8186
	scmd->satacmd_cmd_reg = SATAC_PACKET;	/* Command */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8187
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8188
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8189
	 * We want all data to be transfered via DMA.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8190
	 * But specify it only if drive supports DMA and DMA mode is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8191
	 * selected - some drives are sensitive about it.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8192
	 * Hopefully it wil work for all drives....
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8193
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8194
	if (sdinfo->satadrv_settings & SATA_DEV_DMA)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8195
		scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8196
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8197
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8198
	 * Features register requires special care for devices that use
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8199
	 * Serial ATA bridge - they need an explicit specification of
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8200
	 * the data transfer direction for Packet DMA commands.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8201
	 * Setting this bit is harmless if DMA is not used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8202
	 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8203
	 * Many drives do not implement word 80, specifying what ATA/ATAPI
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8204
	 * spec they follow.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8205
	 * We are arbitrarily following the latest SerialATA 2.6 spec,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8206
	 * which uses ATA/ATAPI 6 specification for Identify Data, unless
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8207
	 * ATA/ATAPI-7 support is explicitly indicated.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8208
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8209
	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8210
	    sdinfo->satadrv_id.ai_majorversion != 0xffff &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8211
	    (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8212
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8213
		 * Specification of major version is valid and version 7
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8214
		 * is supported. It does automatically imply that all
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8215
		 * spec features are supported. For now, we assume that
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8216
		 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8217
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8218
		if ((sdinfo->satadrv_id.ai_dirdma &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8219
		    SATA_ATAPI_ID_DMADIR_REQ) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8220
			if (scmd->satacmd_flags.sata_data_direction ==
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8221
			    SATA_DIR_READ)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8222
			scmd->satacmd_features_reg |=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8223
			    SATA_ATAPI_F_DATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8224
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8225
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8226
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8227
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8228
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8229
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8230
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8231
/* Display 18 bytes of Inquiry data */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8232
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8233
sata_show_inqry_data(uint8_t *buf)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8234
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8235
	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8236
	uint8_t *p;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8237
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8238
	cmn_err(CE_NOTE, "Inquiry data:");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8239
	cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8240
	cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8241
	cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8242
	cmn_err(CE_NOTE, "ATAPI transport version %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8243
	    SATA_ATAPI_TRANS_VERSION(inq));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8244
	cmn_err(CE_NOTE, "response data format %d, aenc %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8245
	    inq->inq_rdf, inq->inq_aenc);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8246
	cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8247
	cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8248
	p = (uint8_t *)inq->inq_vid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8249
	cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8250
	    "%02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8251
	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8252
	p = (uint8_t *)inq->inq_vid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8253
	cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8254
	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8255
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8256
	p = (uint8_t *)inq->inq_pid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8257
	cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8258
	    "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8259
	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8260
	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8261
	p = (uint8_t *)inq->inq_pid;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8262
	cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8263
	    "%c %c %c %c %c %c %c %c",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8264
	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8265
	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8266
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8267
	p = (uint8_t *)inq->inq_revision;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8268
	cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8269
	    p[0], p[1], p[2], p[3]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8270
	p = (uint8_t *)inq->inq_revision;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8271
	cmn_err(CE_NOTE, "revision: %c %c %c %c",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8272
	    p[0], p[1], p[2], p[3]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8273
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8274
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8275
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8276
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8277
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8278
sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8279
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8280
	struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8281
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8282
	if (scsi_pkt == NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8283
		return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8284
	if (count != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8285
		/* saving cdb */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8286
		bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8287
		    SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8288
		bcopy(scsi_pkt->pkt_cdbp,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8289
		    sata_atapi_trace[sata_atapi_trace_index].acdb, count);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8290
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8291
		bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8292
		    sts_sensedata,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8293
		    sata_atapi_trace[sata_atapi_trace_index].arqs,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8294
		    SATA_ATAPI_MIN_RQSENSE_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8295
		sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8296
		    scsi_pkt->pkt_reason;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8297
		sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8298
		    spx->txlt_sata_pkt->satapkt_reason;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8299
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8300
		if (++sata_atapi_trace_index >= 64)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8301
			sata_atapi_trace_index = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8302
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8303
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8304
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8305
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8306
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8307
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8308
 * Fetch inquiry data from ATAPI device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8309
 * Returns SATA_SUCCESS if operation was successfull, SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8310
 *
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8311
 * Note:
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8312
 * inqb pointer does not point to a DMA-able buffer. It is a local buffer
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8313
 * where the caller expects to see the inquiry data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8314
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8315
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8316
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8317
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8318
sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8319
    sata_address_t *saddr, struct scsi_inquiry *inq)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8320
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8321
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8322
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8323
	struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8324
	sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8325
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8326
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8327
	uint8_t *rqsp;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8328
#ifdef SATA_DEBUG
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8329
	char msg_buf[MAXPATHLEN];
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8330
#endif
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8331
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8332
	ASSERT(sata_hba != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8333
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8334
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8335
	spx->txlt_sata_hba_inst = sata_hba;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8336
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8337
	spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8338
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8339
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8340
		return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8341
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8342
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8343
	spkt->satapkt_device.satadev_addr = *saddr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8344
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8345
	/* scsi_inquiry size buffer */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8346
	bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8347
	if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8348
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8349
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8350
		SATA_LOG_D((sata_hba, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8351
		    "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8352
		    "cannot allocate data buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8353
		return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8354
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8355
	bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8356
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8357
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8358
	ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8359
	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8360
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8361
	/* Use synchronous mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8362
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8363
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8364
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8365
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8366
	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8367
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8368
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8369
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8370
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8371
	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8372
	sdinfo = sata_get_device_info(sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8373
	    &spx->txlt_sata_pkt->satapkt_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8374
	if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8375
		/* we have to be carefull about the disapearing device */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8376
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8377
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8378
		goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8379
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8380
	sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8381
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8382
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8383
	 * Set-up acdb. This works for atapi transport version 2 and later.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8384
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8385
	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8386
	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8387
	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8388
	scmd->satacmd_acdb[1] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8389
	scmd->satacmd_acdb[2] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8390
	scmd->satacmd_acdb[3] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8391
	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8392
	scmd->satacmd_acdb[5] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8393
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8394
	sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8395
	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8396
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8397
	/* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8398
	if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8399
		/* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8400
		SATADBG1(SATA_DBG_ATAPI, sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8401
		    "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8402
		    "Packet not accepted for execution - ret: %02x", rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8403
		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8404
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8405
		goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8406
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8407
	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8408
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8409
	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8410
		SATADBG1(SATA_DBG_ATAPI, sata_hba,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8411
		    "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8412
		    "Packet completed successfully - ret: %02x", rval);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8413
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8414
			/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8415
			 * Sync buffer. Handle is in usual place in translate
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8416
			 * struct.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8417
			 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8418
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8419
			    DDI_DMA_SYNC_FORCPU);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8420
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8421
		}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8422
		/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8423
		 * Normal completion - copy data into caller's buffer
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8424
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8425
		bcopy(bp->b_un.b_addr, (uint8_t *)inq,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8426
		    sizeof (struct scsi_inquiry));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8427
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8428
		if (sata_debug_flags & SATA_DBG_ATAPI) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8429
			sata_show_inqry_data((uint8_t *)inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8430
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8431
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8432
		rval = SATA_SUCCESS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8433
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8434
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8435
		 * Something went wrong - analyze return - check rqsense data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8436
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8437
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8438
		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8439
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8440
			 * ARQ data hopefull show something other than NO SENSE
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8441
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8442
			rqsp = scmd->satacmd_rqsense;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8443
#ifdef SATA_DEBUG
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8444
			if (sata_debug_flags & SATA_DBG_ATAPI) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8445
				msg_buf[0] = '\0';
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8446
				(void) snprintf(msg_buf, MAXPATHLEN,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8447
				    "ATAPI packet completion reason: %02x\n"
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8448
				    "RQSENSE:  %02x %02x %02x %02x %02x %02x\n"
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8449
				    "          %02x %02x %02x %02x %02x %02x\n"
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8450
				    "          %02x %02x %02x %02x %02x %02x",
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8451
				    spkt->satapkt_reason,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8452
				    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8453
				    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8454
				    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8455
				    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8456
				    rqsp[16], rqsp[17]);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8457
				sata_log(spx->txlt_sata_hba_inst, CE_WARN,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8458
				    "%s", msg_buf);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8459
			}
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8460
#endif
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8461
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8462
			switch (spkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8463
			case SATA_PKT_PORT_ERROR:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8464
				SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8465
				    "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8466
				    "packet reason: port error", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8467
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8468
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8469
			case SATA_PKT_TIMEOUT:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8470
				SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8471
				    "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8472
				    "packet reason: timeout", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8473
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8474
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8475
			case SATA_PKT_ABORTED:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8476
				SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8477
				    "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8478
				    "packet reason: aborted", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8479
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8480
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8481
			case SATA_PKT_RESET:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8482
				SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8483
				    "sata_get_atapi_inquiry_data: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8484
				    "packet reason: reset\n", NULL);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8485
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8486
			default:
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8487
				SATADBG1(SATA_DBG_ATAPI, sata_hba,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8488
				    "sata_get_atapi_inquiry_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8489
				    "invalid packet reason: %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8490
				    spkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8491
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8492
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8493
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8494
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8495
cleanup:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8496
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8497
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8498
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8499
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8500
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8501
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8502
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8503
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8504
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8505
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8506
#if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8507
#ifdef SATA_DEBUG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8508
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8509
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8510
 * Test ATAPI packet command.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8511
 * Single threaded test: send packet command in synch mode, process completion
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8512
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8513
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8514
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8515
sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8516
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8517
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8518
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8519
	struct buf *bp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8520
	sata_device_t sata_device;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8521
	sata_drive_info_t *sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8522
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8523
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8524
	uint8_t *rqsp;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8525
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8526
	ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8527
	sata_device.satadev_addr.cport = cport;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8528
	sata_device.satadev_addr.pmport = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8529
	sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8530
	sata_device.satadev_rev = SATA_DEVICE_REV;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8531
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8532
	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8533
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8534
	if (sdinfo == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8535
		sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8536
		    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8537
		    "no device info for cport %d",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8538
		    sata_device.satadev_addr.cport);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8539
		return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8540
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8541
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8542
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8543
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8544
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8545
	spkt = sata_pkt_alloc(spx, NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8546
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8547
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8548
		return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8549
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8550
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8551
	spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8552
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8553
	/* 1024k buffer */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8554
	bp = sata_alloc_local_buffer(spx, 1024);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8555
	if (bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8556
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8557
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8558
		sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8559
		    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8560
		    "cannot allocate data buffer");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8561
		return;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8562
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8563
	bp_mapin(bp); /* make data buffer accessible */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8564
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8565
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8566
	ASSERT(scmd->satacmd_num_dma_cookies != 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8567
	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8568
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8569
	/* Use synchronous mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8570
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8571
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8572
	/* Synchronous mode, no callback - may be changed by the caller */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8573
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8574
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8575
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8576
	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8577
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8578
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8579
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8580
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8581
	sata_atapi_packet_cmd_setup(scmd, sdinfo);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8582
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8583
	/* Set-up acdb. */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8584
	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8585
	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8586
	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8587
	scmd->satacmd_acdb[1] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8588
	scmd->satacmd_acdb[2] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8589
	scmd->satacmd_acdb[3] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8590
	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8591
	scmd->satacmd_acdb[5] = 0x00;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8592
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8593
	sata_fixed_sense_data_preset(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8594
	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8595
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8596
	/* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8597
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8598
	if (sata_hba_start(spx, &rval) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8599
		/* Pkt not accepted for execution */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8600
		sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8601
		    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8602
		    "Packet not accepted for execution - ret: %02x", rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8603
		mutex_exit(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8604
		    &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8605
		goto cleanup;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8606
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8607
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8608
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8609
	if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8610
		/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8611
		 * Sync buffer. Handle is in usual place in translate struct.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8612
		 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8613
		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8614
		    DDI_DMA_SYNC_FORCPU);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8615
		ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
  8616
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8617
	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8618
		sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8619
		    "sata_test_atapi_packet_command: "
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
  8620
		    "Packet completed successfully");
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8621
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8622
		 * Normal completion - show inquiry data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8623
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8624
		sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8625
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8626
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8627
		 * Something went wrong - analyze return - check rqsense data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8628
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8629
		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8630
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8631
			 * ARQ data hopefull show something other than NO SENSE
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8632
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8633
			rqsp = scmd->satacmd_rqsense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8634
			sata_log(spx->txlt_sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8635
			    "ATAPI packet completion reason: %02x\n"
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8636
			    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8637
			    "          %02x %02x %02x %02x %02x %02x "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8638
			    "          %02x %02x %02x %02x %02x %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8639
			    spkt->satapkt_reason,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8640
			    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8641
			    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8642
			    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8643
			    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8644
			    rqsp[16], rqsp[17]);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8645
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8646
			switch (spkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8647
			case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8648
				sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8649
				    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8650
				    "packet reason: port error\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8651
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8652
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8653
			case SATA_PKT_TIMEOUT:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8654
				sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8655
				    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8656
				    "packet reason: timeout\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8657
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8658
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8659
			case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8660
				sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8661
				    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8662
				    "packet reason: aborted\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8663
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8664
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8665
			case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8666
				sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8667
				    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8668
				    "packet reason: reset\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8669
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8670
			default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8671
				sata_log(sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8672
				    "sata_test_atapi_packet_command: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8673
				    "invalid packet reason: %02x\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8674
				    spkt->satapkt_reason);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8675
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8676
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8677
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8678
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8679
cleanup:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8680
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8681
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8682
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8683
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8684
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8685
#endif /* SATA_DEBUG */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8686
#endif /* 1 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8687
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8688
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8689
/* ************************** LOCAL HELPER FUNCTIONS *********************** */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8691
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8692
 * Validate sata_tran info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8693
 * SATA_FAILURE returns if structure is inconsistent or structure revision
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8694
 * does not match one used by the framework.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8695
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8696
 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8697
 * required function pointers.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8698
 * Returns SATA_FAILURE otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8699
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8700
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8701
sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8702
{
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8703
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8704
	 * SATA_TRAN_HBA_REV is the current (highest) revision number
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8705
	 * of the SATA interface.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8706
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8707
	if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8708
		sata_log(NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8709
		    "sata: invalid sata_hba_tran version %d for driver %s",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8710
		    sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8711
		return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8712
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8713
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8714
	if (dip != sata_tran->sata_tran_hba_dip) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8715
		SATA_LOG_D((NULL, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8716
		    "sata: inconsistent sata_tran_hba_dip "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8717
		    "%p / %p", sata_tran->sata_tran_hba_dip, dip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8718
		return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8719
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8720
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8721
	if (sata_tran->sata_tran_probe_port == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8722
	    sata_tran->sata_tran_start == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8723
	    sata_tran->sata_tran_abort == NULL ||
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8724
	    sata_tran->sata_tran_reset_dport == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8725
	    sata_tran->sata_tran_hotplug_ops == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8726
	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8727
	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8728
	    NULL) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8729
		SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8730
		    "required functions"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8731
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8732
	return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8733
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8734
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8735
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8736
 * Remove HBA instance from sata_hba_list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8737
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8738
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8739
sata_remove_hba_instance(dev_info_t *dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8740
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8741
	sata_hba_inst_t	*sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8742
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8743
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8744
	for (sata_hba_inst = sata_hba_list;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8745
	    sata_hba_inst != (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8746
	    sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8747
		if (sata_hba_inst->satahba_dip == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8748
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8749
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8750
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8751
	if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8752
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8753
		cmn_err(CE_WARN, "sata_remove_hba_instance: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8754
		    "unknown HBA instance\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8755
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8756
		ASSERT(FALSE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8757
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8758
	if (sata_hba_inst == sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8759
		sata_hba_list = sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8760
		if (sata_hba_list) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8761
			sata_hba_list->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8762
			    (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8763
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8764
		if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8765
			sata_hba_list_tail = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8766
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8767
	} else if (sata_hba_inst == sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8768
		sata_hba_list_tail = sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8769
		if (sata_hba_list_tail) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8770
			sata_hba_list_tail->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8771
			    (struct sata_hba_inst *)NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8772
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8773
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8774
		sata_hba_inst->satahba_prev->satahba_next =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8775
		    sata_hba_inst->satahba_next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8776
		sata_hba_inst->satahba_next->satahba_prev =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8777
		    sata_hba_inst->satahba_prev;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8778
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8779
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8780
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8781
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8782
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8783
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8784
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8785
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8786
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8787
 * Probe all SATA ports of the specified HBA instance.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8788
 * The assumption is that there are no target and attachment point minor nodes
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8789
 * created by the boot subsystems, so we do not need to prune device tree.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8790
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8791
 * This function is called only from sata_hba_attach(). It does not have to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8792
 * be protected by controller mutex, because the hba_attached flag is not set
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  8793
 * yet and no one would be touching this HBA instance other than this thread.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8794
 * Determines if port is active and what type of the device is attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8795
 * (if any). Allocates necessary structures for each port.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8796
 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8797
 * An AP (Attachement Point) node is created for each SATA device port even
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8798
 * when there is no device attached.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8799
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8800
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8801
static 	void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8802
sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8803
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8804
	dev_info_t		*dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8805
	int			ncport, npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8806
	sata_cport_info_t 	*cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8807
	sata_drive_info_t	*drive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8808
	sata_pmult_info_t	*pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8809
	sata_pmport_info_t 	*pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8810
	sata_device_t		sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8811
	int			rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8812
	dev_t			minor_number;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8813
	char			name[16];
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8814
	clock_t			start_time, cur_time;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8816
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8817
	 * Probe controller ports first, to find port status and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8818
	 * any port multiplier attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8819
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8820
	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8821
		/* allocate cport structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8822
		cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8823
		ASSERT(cportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8824
		mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8825
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8826
		mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8827
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8828
		cportinfo->cport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8829
		cportinfo->cport_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8830
		cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8831
		cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8832
		cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8833
		SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8834
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8835
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8836
		 * Regardless if a port is usable or not, create
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8837
		 * an attachment point
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8838
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8839
		mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8840
		minor_number =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8841
		    SATA_MAKE_AP_MINOR(ddi_get_instance(dip), ncport, 0, 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8842
		(void) sprintf(name, "%d", ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8843
		if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8844
		    minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8845
		    DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8846
			sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  8847
			    "cannot create SATA attachment point for port %d",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8848
			    ncport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8849
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8850
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8851
		/* Probe port */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8852
		start_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8853
	reprobe_cport:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8854
		sata_device.satadev_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8855
		sata_device.satadev_addr.pmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8856
		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8857
		sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8858
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8859
		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8860
		    (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8861
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8862
		mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8863
		sata_update_port_scr(&cportinfo->cport_scr, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8864
		if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8865
			/* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8866
			cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8867
			mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8868
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8869
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8870
		cportinfo->cport_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8871
		cportinfo->cport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8872
		cportinfo->cport_dev_type = sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8873
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8874
		cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8875
		if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8876
			mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8877
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8878
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8879
		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8880
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8881
			 * There is some device attached.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8882
			 * Allocate device info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8883
			 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8884
			if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8885
				mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8886
				SATA_CPORTINFO_DRV_INFO(cportinfo) =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8887
				    kmem_zalloc(sizeof (sata_drive_info_t),
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8888
				    KM_SLEEP);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8889
				mutex_enter(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8890
			}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8891
			drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8892
			drive->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8893
			drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8894
			drive->satadrv_type = cportinfo->cport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8895
			drive->satadrv_state = SATA_STATE_UNKNOWN;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8896
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8897
			mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8898
			if (sata_add_device(dip, sata_hba_inst, ncport, 0) !=
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8899
			    SATA_SUCCESS) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8900
				/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8901
				 * Plugged device was not correctly identified.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8902
				 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8903
				 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8904
				cur_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8905
				if ((cur_time - start_time) <
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8906
				    drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8907
					/* sleep for a while */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8908
					delay(drv_usectohz(
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  8909
					    SATA_DEV_RETRY_DLY));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8910
					goto reprobe_cport;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8911
				}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8912
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8913
		} else {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8914
			mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8915
			ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8916
			pminfo = kmem_zalloc(sizeof (sata_pmult_info_t),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8917
			    KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8918
			mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8919
			ASSERT(pminfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8920
			SATA_CPORTINFO_PMULT_INFO(cportinfo) = pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8921
			pminfo->pmult_addr.cport = cportinfo->cport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8922
			pminfo->pmult_addr.pmport = SATA_PMULT_HOSTPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8923
			pminfo->pmult_addr.qual = SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8924
			pminfo->pmult_num_dev_ports =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8925
			    sata_device.satadev_add_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8926
			mutex_init(&pminfo->pmult_mutex, NULL, MUTEX_DRIVER,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8927
			    NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8928
			pminfo->pmult_state = SATA_STATE_PROBING;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8929
			mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8930
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8931
			/* Probe Port Multiplier ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8932
			for (npmport = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8933
			    npmport < pminfo->pmult_num_dev_ports;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8934
			    npmport++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8935
				pmportinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8936
				    sizeof (sata_pmport_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8937
				mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8938
				ASSERT(pmportinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8939
				pmportinfo->pmport_addr.cport = ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8940
				pmportinfo->pmport_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8941
				pmportinfo->pmport_addr.qual =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8942
				    SATA_ADDR_PMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8943
				pminfo->pmult_dev_port[npmport] = pmportinfo;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8944
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8945
				mutex_init(&pmportinfo->pmport_mutex, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8946
				    MUTEX_DRIVER, NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8947
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8948
				mutex_exit(&cportinfo->cport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8949
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8950
				/* Create an attachment point */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8951
				minor_number = SATA_MAKE_AP_MINOR(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8952
				    ddi_get_instance(dip), ncport, npmport, 1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8953
				(void) sprintf(name, "%d.%d", ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8954
				if (ddi_create_minor_node(dip, name, S_IFCHR,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8955
				    minor_number, DDI_NT_SATA_ATTACHMENT_POINT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8956
				    0) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8957
					sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8958
					    "sata_hba_attach: "
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  8959
					    "cannot create SATA attachment "
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8960
					    "point for port %d pmult port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8961
					    ncport, npmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8962
				}
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8963
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8964
				start_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8965
			reprobe_pmport:
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8966
				sata_device.satadev_addr.pmport = npmport;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8967
				sata_device.satadev_addr.qual =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8968
				    SATA_ADDR_PMPORT;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8969
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8970
				rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8971
				    (dip, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8972
				mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8973
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8974
				/* sata_update_port_info() */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8975
				sata_update_port_scr(&pmportinfo->pmport_scr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8976
				    &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8977
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8978
				if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8979
					pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8980
					    SATA_PSTATE_FAILED;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8981
					mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8982
					continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8983
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8984
				pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8985
				    ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8986
				pmportinfo->pmport_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8987
				pmportinfo->pmport_dev_type =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8988
				    sata_device.satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8989
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8990
				pmportinfo->pmport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8991
				if (pmportinfo->pmport_dev_type ==
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8992
				    SATA_DTYPE_NONE) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8993
					mutex_exit(&cportinfo->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8994
					continue;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  8995
				}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8996
				/* Port multipliers cannot be chained */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8997
				ASSERT(pmportinfo->pmport_dev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8998
				    SATA_DTYPE_PMULT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  8999
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9000
				 * There is something attached to Port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9001
				 * Multiplier device port
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9002
				 * Allocate device info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9003
				 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9004
				if (pmportinfo->pmport_sata_drive == NULL) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9005
					mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9006
					pmportinfo->pmport_sata_drive =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9007
					    kmem_zalloc(
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9008
					    sizeof (sata_drive_info_t),
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9009
					    KM_SLEEP);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9010
					mutex_enter(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9011
				}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9012
				drive = pmportinfo->pmport_sata_drive;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9013
				drive->satadrv_addr.cport =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9014
				    pmportinfo->pmport_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9015
				drive->satadrv_addr.pmport = npmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9016
				drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9017
				drive->satadrv_type = pmportinfo->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9018
				    pmport_dev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9019
				drive->satadrv_state = SATA_STATE_UNKNOWN;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9020
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9021
				mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9022
				if (sata_add_device(dip, sata_hba_inst, ncport,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9023
				    npmport) != SATA_SUCCESS) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9024
					/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9025
					 * Plugged device was not correctly
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9026
					 * identified. Retry, within the
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9027
					 * SATA_DEV_IDENTIFY_TIMEOUT
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9028
					 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9029
					cur_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9030
					if ((cur_time - start_time) <
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9031
					    drv_usectohz(
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9032
					    SATA_DEV_IDENTIFY_TIMEOUT)) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9033
						/* sleep for a while */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9034
						delay(drv_usectohz(
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9035
						    SATA_DEV_RETRY_DLY));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9036
						goto reprobe_pmport;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9037
					}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9038
				}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9039
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9040
			pmportinfo->pmport_state =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9041
			    SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9042
		}
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9043
	}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9044
}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9045
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9046
/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9047
 * Add SATA device for specified HBA instance & port (SCSI target
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9048
 * device nodes).
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9049
 * This function is called (indirectly) only from sata_hba_attach().
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9050
 * A target node is created when there is a supported type device attached,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9051
 * but may be removed if it cannot be put online.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9052
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9053
 * This function cannot be called from an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9054
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9055
 * ONLY DISK TARGET NODES ARE CREATED NOW
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9056
 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9057
 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9058
 * device identification failed - adding a device could be retried.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9059
 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9060
 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9061
static 	int
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9062
sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst, int cport,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9063
    int pmport)
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9064
{
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9065
	sata_cport_info_t 	*cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9066
	sata_pmult_info_t	*pminfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9067
	sata_pmport_info_t	*pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9068
	dev_info_t		*cdip;		/* child dip */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9069
	sata_device_t		sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9070
	int			rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9071
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9072
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9073
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9074
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9075
	ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9076
	mutex_enter(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9077
	/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9078
	 * Some device is attached to a controller port.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9079
	 * We rely on controllers distinquishing between no-device,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9080
	 * attached port multiplier and other kind of attached device.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9081
	 * We need to get Identify Device data and determine
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9082
	 * positively the dev type before trying to attach
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9083
	 * the target driver.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9084
	 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9085
	sata_device.satadev_rev = SATA_DEVICE_REV;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9086
	if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9087
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9088
		 * Not port multiplier.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9089
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9090
		sata_device.satadev_addr = cportinfo->cport_addr;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9091
		sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9092
		mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9093
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9094
		rval = sata_probe_device(sata_hba_inst, &sata_device);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9095
		if (rval != SATA_SUCCESS ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9096
		    sata_device.satadev_type == SATA_DTYPE_UNKNOWN)
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9097
			return (SATA_FAILURE);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9098
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9099
		mutex_enter(&cportinfo->cport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9100
		sata_show_drive_info(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9101
		    SATA_CPORTINFO_DRV_INFO(cportinfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9102
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9103
		if ((sata_device.satadev_type & SATA_VALID_DEV_TYPE) == 0) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9104
			/*
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9105
			 * Could not determine device type or
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9106
			 * a device is not supported.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9107
			 * Degrade this device to unknown.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9108
			 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9109
			cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9110
			mutex_exit(&cportinfo->cport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9111
			return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9112
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9113
		cportinfo->cport_dev_type = sata_device.satadev_type;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9114
		cportinfo->cport_tgtnode_clean = B_TRUE;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9115
		mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9116
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9117
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9118
		 * Initialize device to the desired state. Even if it
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9119
		 * fails, the device will still attach but syslog
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9120
		 * will show the warning.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9121
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9122
		if (sata_initialize_device(sata_hba_inst,
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9123
		    SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9124
			/* Retry */
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9125
			rval = sata_initialize_device(sata_hba_inst,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9126
			    SATA_CPORTINFO_DRV_INFO(cportinfo));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9127
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9128
			if (rval == SATA_RETRY)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9129
				sata_log(sata_hba_inst, CE_WARN,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9130
				    "SATA device at port %d - "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9131
				    "default device features could not be set."
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9132
				    " Device may not operate as expected.",
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9133
				    cportinfo->cport_addr.cport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9134
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9135
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9136
		cdip = sata_create_target_node(pdip, sata_hba_inst,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9137
		    &sata_device.satadev_addr);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9138
		mutex_enter(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9139
		if (cdip == NULL) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9140
			/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9141
			 * Attaching target node failed.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9142
			 * We retain sata_drive_info structure...
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9143
			 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9144
			mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9145
			return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9146
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9147
		(SATA_CPORTINFO_DRV_INFO(cportinfo))->
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9148
		    satadrv_state = SATA_STATE_READY;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9149
	} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9150
		/* This must be Port Multiplier type */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9151
		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9152
			SATA_LOG_D((sata_hba_inst, CE_WARN,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9153
			    "sata_add_device: "
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9154
			    "unrecognized dev type %x",
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9155
			    cportinfo->cport_dev_type));
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9156
			mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9157
			return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9158
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9159
		pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9160
		pmportinfo = pminfo->pmult_dev_port[pmport];
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9161
		sata_device.satadev_addr = pmportinfo->pmport_addr;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9162
		sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9163
		mutex_exit(&cportinfo->cport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9164
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9165
		rval = sata_probe_device(sata_hba_inst, &sata_device);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9166
		if (rval != SATA_SUCCESS ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9167
		    sata_device.satadev_type == SATA_DTYPE_UNKNOWN) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9168
			return (SATA_FAILURE);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9169
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9170
		mutex_enter(&cportinfo->cport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9171
		sata_show_drive_info(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9172
		    SATA_CPORTINFO_DRV_INFO(cportinfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9173
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9174
		if ((sata_device.satadev_type & SATA_VALID_DEV_TYPE) == 0) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9175
			/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9176
			 * Could not determine device type.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9177
			 * Degrade this device to unknown.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9178
			 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9179
			pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9180
			mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9181
			return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9182
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9183
		pmportinfo->pmport_dev_type = sata_device.satadev_type;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9184
		pmportinfo->pmport_tgtnode_clean = B_TRUE;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9185
		mutex_exit(&cportinfo->cport_mutex);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9186
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9187
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9188
		 * Initialize device to the desired state.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9189
		 * Even if it fails, the device will still
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9190
		 * attach but syslog will show the warning.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9191
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9192
		if (sata_initialize_device(sata_hba_inst,
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9193
		    pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9194
			/* Retry */
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9195
			rval = sata_initialize_device(sata_hba_inst,
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9196
			    pmportinfo->pmport_sata_drive);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9197
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9198
			if (rval == SATA_RETRY)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9199
				sata_log(sata_hba_inst, CE_WARN,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9200
				    "SATA device at port %d pmport %d - "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9201
				    "default device features could not be set."
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9202
				    " Device may not operate as expected.",
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9203
				    pmportinfo->pmport_addr.cport,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9204
				    pmportinfo->pmport_addr.pmport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9205
		}
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9206
		cdip = sata_create_target_node(pdip, sata_hba_inst,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9207
		    &sata_device.satadev_addr);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9208
		mutex_enter(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9209
		if (cdip == NULL) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9210
			/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9211
			 * Attaching target node failed.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9212
			 * We retain sata_drive_info structure...
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9213
			 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9214
			mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9215
			return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9216
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9217
		pmportinfo->pmport_sata_drive->satadrv_state |=
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9218
		    SATA_STATE_READY;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9219
	}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9220
	mutex_exit(&cportinfo->cport_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9221
	return (SATA_SUCCESS);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9222
}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9223
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9224
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9225
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9226
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9227
 * Create scsi target node for attached device, create node properties and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9228
 * attach the node.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9229
 * The node could be removed if the device onlining fails.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9230
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9231
 * A dev_info_t pointer is returned if operation is successful, NULL is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9232
 * returned otherwise.
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9233
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9234
 * No port multiplier support.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9235
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9236
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9237
static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9238
sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9239
			sata_address_t *sata_addr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9240
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9241
	dev_info_t *cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9242
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9243
	char *nname = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9244
	char **compatible = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9245
	int ncompatible;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9246
	struct scsi_inquiry inq;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9247
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9248
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9249
	int target;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9250
	int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9251
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9252
	sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9253
	sata_device.satadev_addr = *sata_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9254
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9255
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9256
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9257
	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9259
	target = SATA_TO_SCSI_TARGET(sata_addr->cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9260
	    sata_addr->pmport, sata_addr->qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9261
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9262
	if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9263
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9264
		    sata_addr->cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9265
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9266
		    "sata_create_target_node: no sdinfo for target %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9267
		    target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9268
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9269
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9270
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9271
	/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9272
	 * create or get scsi inquiry data, expected by
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9273
	 * scsi_hba_nodename_compatible_get()
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9274
	 * SATA hard disks get Identify Data translated into Inguiry Data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9275
	 * ATAPI devices respond directly to Inquiry request.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9276
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9277
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9278
		sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9279
		    (uint8_t *)&inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9280
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9281
		    sata_addr->cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9282
	} else { /* Assume supported ATAPI device */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9283
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9284
		    sata_addr->cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9285
		if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9286
		    &inq) == SATA_FAILURE)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9287
			return (NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9288
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9289
		 * Save supported ATAPI transport version
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9290
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9291
		sdinfo->satadrv_atapi_trans_ver =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9292
		    SATA_ATAPI_TRANS_VERSION(&inq);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9293
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9294
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9295
	/* determine the node name and compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9296
	scsi_hba_nodename_compatible_get(&inq, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9297
	    inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9298
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9299
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9300
	if (sata_debug_flags & SATA_DBG_NODES) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9301
		if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9302
			cmn_err(CE_NOTE, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9303
			    "cannot determine nodename for target %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9304
			    target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9305
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9306
			cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9307
			    "target %d nodename: %s\n", target, nname);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9308
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9309
		if (compatible == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9310
			cmn_err(CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9311
			    "sata_create_target_node: no compatible name\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9312
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9313
			for (i = 0; i < ncompatible; i++) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9314
				cmn_err(CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9315
				    "compatible name: %s\n", compatible[i]);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9316
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9317
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9318
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9319
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9320
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9321
	/* if nodename can't be determined, log error and exit */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9322
	if (nname == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9323
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9324
		    "sata_create_target_node: cannot determine nodename "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9325
		    "for target %d\n", target));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9326
		scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9327
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9328
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9329
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9330
	 * Create scsi target node
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9331
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9332
	ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9333
	rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9334
	    "device-type", "scsi");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9335
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9336
	if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9337
		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9338
		    "updating device_type prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9339
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9340
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9341
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9342
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9343
	 * Create target node properties: target & lun
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9344
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9345
	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9346
	if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9347
		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9348
		    "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9349
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9350
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9351
	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9352
	if (rval != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9353
		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9354
		    "updating target prop failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9355
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9356
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9357
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9358
	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9359
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9360
		 * Add "variant" property
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9361
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9362
		rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9363
		    "variant", "atapi");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9364
		if (rval != DDI_PROP_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9365
			SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9366
			    "sata_create_target_node: variant atapi "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9367
			    "property could not be created: %d", rval));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9368
			goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9369
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9370
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9371
	/* decorate the node with compatible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9372
	if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9373
	    compatible, ncompatible) != DDI_PROP_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9374
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9375
		    "sata_create_target_node: FAIL compatible props cdip 0x%p",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9376
		    (void *)cdip));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9377
		goto fail;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9378
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9379
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9380
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9381
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9382
	 * Now, try to attach the driver. If probing of the device fails,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9383
	 * the target node may be removed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9384
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9385
	rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9386
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9387
	scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9388
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9389
	if (rval == NDI_SUCCESS)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9390
		return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9391
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9392
	/* target node was removed - are we sure? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9393
	return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9394
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9395
fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9396
	scsi_hba_nodename_compatible_free(nname, compatible);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9397
	ddi_prop_remove_all(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9398
	rval = ndi_devi_free(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9399
	if (rval != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9400
		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9401
		    "node removal failed %d", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9402
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9403
	sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9404
	    "cannot create target node for SATA device at port %d",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9405
	    sata_addr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9406
	return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9407
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9408
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9409
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9410
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9411
/*
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9412
 * Re-probe sata port, check for a device and attach info
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9413
 * structures when necessary. Identify Device data is fetched, if possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9414
 * Assumption: sata address is already validated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9415
 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9416
 * the presence of a device and its type.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9417
 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9418
 * flag arg specifies that the function should try multiple times to identify
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9419
 * device type and to initialize it, or it should return immediately on failure.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9420
 * SATA_DEV_IDENTIFY_RETRY - retry
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9421
 * SATA_DEV_IDENTIFY_NORETRY - no retry
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9422
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9423
 * SATA_FAILURE is returned if one of the operations failed.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9424
 *
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9425
 * This function cannot be called in interrupt context - it may sleep.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9426
 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9427
 * NOte: Port multiplier is not supported yet, although there may be some
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9428
 * pieces of code referencing to it.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9429
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9430
static int
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9431
sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9432
    int flag)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9433
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9434
	sata_cport_info_t *cportinfo;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9435
	sata_drive_info_t *sdinfo, *osdinfo;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9436
	boolean_t init_device = B_FALSE;
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9437
	int prev_device_type = SATA_DTYPE_NONE;
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9438
	int prev_device_settings = 0;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9439
	int prev_device_state = 0;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9440
	clock_t start_time;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9441
	int retry = B_FALSE;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9442
	int rval_probe, rval_init;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9443
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9444
	/* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9445
	cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9446
	    sata_device->satadev_addr.cport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9447
	osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9448
	if (osdinfo != NULL) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9449
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9450
		 * We are re-probing port with a previously attached device.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9451
		 * Save previous device type and settings.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9452
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9453
		prev_device_type = cportinfo->cport_dev_type;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9454
		prev_device_settings = osdinfo->satadrv_settings;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9455
		prev_device_state = osdinfo->satadrv_state;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9456
	}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9457
	if (flag == SATA_DEV_IDENTIFY_RETRY) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9458
		start_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9459
		retry = B_TRUE;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9460
	}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9461
retry_probe:
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9462
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9463
	/* probe port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9464
	mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9465
	cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9466
	cportinfo->cport_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9467
	mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9468
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9469
	rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9470
	    (SATA_DIP(sata_hba_inst), sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9471
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9472
	mutex_enter(&cportinfo->cport_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9473
	if (rval_probe != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9474
		cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9475
		mutex_exit(&cportinfo->cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9476
		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9477
		    "SATA port %d probing failed",
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
  9478
		    cportinfo->cport_addr.cport));
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9479
		return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9480
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9481
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9482
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9483
	 * update sata port state and set device type
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9484
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9485
	sata_update_port_info(sata_hba_inst, sata_device);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9486
	cportinfo->cport_state &= ~SATA_STATE_PROBING;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9487
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9488
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9489
	 * Sanity check - Port is active? Is the link active?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9490
	 * Is there any device attached?
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9491
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9492
	if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9493
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9494
	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9495
	    SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9496
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9497
		 * Port in non-usable state or no link active/no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9498
		 * Free info structure if necessary (direct attached drive
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9499
		 * only, for now!
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9500
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9501
		sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9502
		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9503
		/* Add here differentiation for device attached or not */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9504
		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9505
		mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9506
		if (sdinfo != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9507
			kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9508
		return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9509
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9510
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9511
	cportinfo->cport_state |= SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9512
	cportinfo->cport_dev_type = sata_device->satadev_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9513
	sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9514
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9515
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9516
	 * If we are re-probing the port, there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9517
	 * sata_drive_info structure attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9518
	 * (or sata_pm_info, if PMult is supported).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9519
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9520
	if (sata_device->satadev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9521
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9522
		 * There is no device, so remove device info structure,
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9523
		 * if necessary.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9524
		 * Only direct attached drive is considered now, until
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9525
		 * port multiplier is supported. If the previously
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9526
		 * attached device was a port multiplier, we would need
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9527
		 * to take care of devices attached beyond the port
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9528
		 * multiplier.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9529
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9530
		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9531
		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9532
		if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9533
			kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9534
			sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9535
			    "SATA device detached "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9536
			    "from port %d", cportinfo->cport_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9537
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9538
		mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9539
		return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9540
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9541
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9542
	if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9543
		if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9544
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9545
			 * There is some device attached, but there is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9546
			 * no sata_drive_info structure - allocate one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9547
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9548
			mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9549
			sdinfo = kmem_zalloc(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9550
			    sizeof (sata_drive_info_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9551
			mutex_enter(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9552
			/*
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9553
			 * Recheck, that the port state did not change when we
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9554
			 * released mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9555
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9556
			if (cportinfo->cport_state & SATA_STATE_READY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9557
				SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9558
				sdinfo->satadrv_addr = cportinfo->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9559
				sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9560
				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9561
				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9562
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9563
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9564
				 * Port is not in ready state, we
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9565
				 * cannot attach a device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9566
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9567
				mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9568
				kmem_free(sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9569
				return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9570
			}
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9571
			/*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9572
			 * Since we are adding device, presumably new one,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9573
			 * indicate that it  should be initalized,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9574
			 * as well as some internal framework states).
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9575
			 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9576
			init_device = B_TRUE;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9577
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9578
		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9579
		sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9580
	} else {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9581
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9582
		 * The device is a port multiplier - not handled now.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9583
		 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9584
		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9585
		mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9586
		return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9587
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9588
	mutex_exit(&cportinfo->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9589
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9590
	 * Figure out what kind of device we are really
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9591
	 * dealing with. Failure of identifying device does not fail this
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9592
	 * function.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9593
	 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9594
	rval_probe = sata_probe_device(sata_hba_inst, sata_device);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9595
	rval_init = SATA_FAILURE;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9596
	mutex_enter(&cportinfo->cport_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9597
	if (rval_probe == SATA_SUCCESS) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9598
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9599
		 * If we are dealing with the same type of a device as before,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9600
		 * restore its settings flags.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9601
		 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9602
		if (osdinfo != NULL &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9603
		    sata_device->satadev_type == prev_device_type)
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9604
			sdinfo->satadrv_settings = prev_device_settings;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9605
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9606
		mutex_exit(&cportinfo->cport_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9607
		rval_init = SATA_SUCCESS;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9608
		/* Set initial device features, if necessary */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9609
		if (init_device == B_TRUE) {
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9610
			rval_init = sata_initialize_device(sata_hba_inst,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9611
			    sdinfo);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9612
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9613
		if (rval_init == SATA_SUCCESS)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9614
			return (rval_init);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9615
		/* else we will retry if retry was asked for */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9616
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9617
	} else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9618
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9619
		 * If there was some device info before we probe the device,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9620
		 * restore previous device setting, so we can retry from scratch
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9621
		 * later. Providing, of course, that device has not disapear
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9622
		 * during probing process.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9623
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9624
		if (sata_device->satadev_type != SATA_DTYPE_NONE) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9625
			if (osdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9626
				cportinfo->cport_dev_type = prev_device_type;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9627
				sdinfo->satadrv_type = prev_device_type;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9628
				sdinfo->satadrv_state = prev_device_state;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9629
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9630
		} else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9631
			/* device is gone */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9632
			kmem_free(sdinfo, sizeof (sata_drive_info_t));
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9633
			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9634
			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9635
			mutex_exit(&cportinfo->cport_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9636
			return (SATA_SUCCESS);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9637
		}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9638
		mutex_exit(&cportinfo->cport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9639
	}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9640
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9641
	if (retry) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9642
		clock_t cur_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9643
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9644
		 * A device was not successfully identified or initialized.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9645
		 * Track retry time for device identification.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9646
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9647
		if ((cur_time - start_time) <
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9648
		    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9649
			/* sleep for a while */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9650
			delay(drv_usectohz(SATA_DEV_RETRY_DLY));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9651
			goto retry_probe;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9652
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9653
		/* else no more retries */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9654
		mutex_enter(&cportinfo->cport_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9655
		if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9656
			if (rval_init == SATA_RETRY) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9657
				/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9658
				 * Setting drive features have failed, but
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9659
				 * because the drive is still accessible,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9660
				 * keep it and emit a warning message.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9661
				 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9662
				sata_log(sata_hba_inst, CE_WARN,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9663
				    "SATA device at port %d - desired "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9664
				    "drive features could not be set. "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9665
				    "Device may not operate as expected.",
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9666
				    cportinfo->cport_addr.cport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9667
			} else {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9668
				SATA_CPORTINFO_DRV_INFO(cportinfo)->
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9669
				    satadrv_state = SATA_DSTATE_FAILED;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9670
			}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9671
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9672
		mutex_exit(&cportinfo->cport_mutex);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9673
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
  9674
	return (SATA_SUCCESS);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9675
}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9676
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9677
/*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9678
 * Initialize device
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9679
 * Specified device is initialized to a default state.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9680
 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9681
 * Returns SATA_SUCCESS if all device features are set successfully,
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9682
 * SATA_RETRY if device is accessible but device features were not set
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
  9683
 * successfully, and SATA_FAILURE otherwise.
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9684
 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9685
static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9686
sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9687
    sata_drive_info_t *sdinfo)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9688
{
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9689
	int rval;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9690
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9691
	sata_save_drive_settings(sdinfo);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9692
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9693
	sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9694
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9695
	sata_init_write_cache_mode(sdinfo);
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9696
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9697
	rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9698
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9699
	/* Determine current data transfer mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9700
	if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9701
		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9702
	} else if ((sdinfo->satadrv_id.ai_validinfo &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9703
	    SATA_VALIDINFO_88) != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9704
	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9705
		sdinfo->satadrv_settings |= SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9706
	} else if ((sdinfo->satadrv_id.ai_dworddma &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9707
	    SATA_MDMA_SEL_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9708
		sdinfo->satadrv_settings |= SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9709
	} else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9710
		/* DMA supported, not no DMA transfer mode is selected !? */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9711
		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9712
10131
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  9713
	if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  9714
	    (sdinfo->satadrv_id.ai_features86 & 0x20))
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  9715
		sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
7fe254ca5fe8 PSARC/2009/310 Disk IO PM Enhancement
Jane Chu <Jane.Chu@Sun.COM>
parents: 10082
diff changeset
  9716
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9717
	return (rval);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9718
}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9719
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9720
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9721
/*
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9722
 * Initialize write cache mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9723
 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9724
 * The default write cache setting for SATA HDD is provided by sata_write_cache
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9725
 * static variable. ATAPI CD/DVDs devices have write cache default is
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9726
 * determined by sata_atapicdvd_write_cache static variable.
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9727
 * ATAPI tape devices have write cache default is determined by
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9728
 * sata_atapitape_write_cache static variable.
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9729
 * ATAPI disk devices have write cache default is determined by
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9730
 * sata_atapidisk_write_cache static variable.
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9731
 * 1 - enable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9732
 * 0 - disable
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9733
 * any other value - current drive setting
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9734
 *
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9735
 * Although there is not reason to disable write cache on CD/DVD devices,
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9736
 * tape devices and ATAPI disk devices, the default setting control is provided
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9737
 * for the maximun flexibility.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9738
 *
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9739
 * In the future, it may be overridden by the
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9740
 * disk-write-cache-enable property setting, if it is defined.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9741
 * Returns SATA_SUCCESS if all device features are set successfully,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9742
 * SATA_FAILURE otherwise.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9743
 */
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9744
static void
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9745
sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
  9746
{
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9747
	switch (sdinfo->satadrv_type) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9748
	case SATA_DTYPE_ATADISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9749
		if (sata_write_cache == 1)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9750
			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9751
		else if (sata_write_cache == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9752
			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9753
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9754
		 * When sata_write_cache value is not 0 or 1,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9755
		 * a current setting of the drive's write cache is used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9756
		 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9757
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9758
	case SATA_DTYPE_ATAPICD:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9759
		if (sata_atapicdvd_write_cache == 1)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9760
			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9761
		else if (sata_atapicdvd_write_cache == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9762
			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9763
		/*
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9764
		 * When sata_atapicdvd_write_cache value is not 0 or 1,
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9765
		 * a current setting of the drive's write cache is used.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9766
		 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9767
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9768
	case SATA_DTYPE_ATAPITAPE:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9769
		if (sata_atapitape_write_cache == 1)
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9770
			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9771
		else if (sata_atapitape_write_cache == 0)
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9772
			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9773
		/*
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9774
		 * When sata_atapitape_write_cache value is not 0 or 1,
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9775
		 * a current setting of the drive's write cache is used.
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9776
		 */
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9777
		break;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9778
	case SATA_DTYPE_ATAPIDISK:
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9779
		if (sata_atapidisk_write_cache == 1)
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9780
			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9781
		else if (sata_atapidisk_write_cache == 0)
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9782
			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9783
		/*
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
  9784
		 * When sata_atapidisk_write_cache value is not 0 or 1,
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9785
		 * a current setting of the drive's write cache is used.
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9786
		 */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
  9787
		break;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
  9788
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9789
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9790
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9791
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9792
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9793
 * Validate sata address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9794
 * Specified cport, pmport and qualifier has to match
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9795
 * passed sata_scsi configuration info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9796
 * The presence of an attached device is not verified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9797
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9798
 * Returns 0 when address is valid, -1 otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9799
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9800
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9801
sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9802
	int pmport, int qual)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9803
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9804
	if (qual == SATA_ADDR_DCPORT && pmport != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9805
		goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9806
	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9807
		goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9808
	if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9809
	    ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9810
	    (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9811
	    (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9812
		goto invalid_address;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9813
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9814
	return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9816
invalid_address:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9817
	return (-1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9818
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9819
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9820
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9821
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9822
 * Validate scsi address
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9823
 * SCSI target address is translated into SATA cport/pmport and compared
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9824
 * with a controller port/device configuration. LUN has to be 0.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9825
 * Returns 0 if a scsi target refers to an attached device,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9826
 * returns 1 if address is valid but device is not attached,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9827
 * returns -1 if bad address or device is of an unsupported type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9828
 * Upon return sata_device argument is set.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9829
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9830
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9831
sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9832
	struct scsi_address *ap, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9833
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9834
	int cport, pmport, qual, rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9835
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9836
	rval = -1;	/* Invalid address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9837
	if (ap->a_lun != 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9838
		goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9839
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9840
	qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9841
	cport = SCSI_TO_SATA_CPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9842
	pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9843
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9844
	if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9845
		goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9846
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9847
	if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9848
	    0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9849
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9850
		sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9851
		sata_pmult_info_t *pmultinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9852
		sata_drive_info_t *sdinfo = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9853
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9854
		rval = 1;	/* Valid sata address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9855
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9856
		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9857
		if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9858
			if (cportinfo == NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9859
			    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9860
				goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9861
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9862
			if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9863
			    (cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9864
			    SATA_VALID_DEV_TYPE) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9865
				rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9866
				goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9867
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9868
			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9869
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9870
		} else if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9871
			pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9872
			if (pmultinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9873
				rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9874
				goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9875
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9876
			if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9877
			    NULL ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9878
			    SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9879
			    pmport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9880
				goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9881
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9882
			sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9883
			    pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9884
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9885
			rval = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9886
			goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9887
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9888
		if ((sdinfo == NULL) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9889
		    (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9890
			goto out;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9891
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9892
		sata_device->satadev_type = sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9893
		sata_device->satadev_addr.qual = qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9894
		sata_device->satadev_addr.cport = cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9895
		sata_device->satadev_addr.pmport = pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9896
		sata_device->satadev_rev = SATA_DEVICE_REV_1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9897
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9898
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9899
out:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9900
	if (rval == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9901
		SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9902
		    "sata_validate_scsi_address: no valid target %x lun %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9903
		    ap->a_target, ap->a_lun);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9904
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9905
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9906
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9907
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9908
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9909
 * Find dip corresponding to passed device number
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9910
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9911
 * Returns NULL if invalid device number is passed or device cannot be found,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9912
 * Returns dip is device is found.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9913
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9914
static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9915
sata_devt_to_devinfo(dev_t dev)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9916
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9917
	dev_info_t *dip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9918
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9919
	struct devnames *dnp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9920
	major_t major = getmajor(dev);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9921
	int instance = SATA_MINOR2INSTANCE(getminor(dev));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9922
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9923
	if (major >= devcnt)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9924
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9925
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9926
	dnp = &devnamesp[major];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9927
	LOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9928
	dip = dnp->dn_head;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9929
	while (dip && (ddi_get_instance(dip) != instance)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9930
		dip = ddi_get_next(dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9931
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9932
	UNLOCK_DEV_OPS(&(dnp->dn_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9933
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9934
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9935
	return (dip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9936
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9937
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9938
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9939
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9940
 * Probe device.
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
  9941
 * This function issues Identify Device command and initializes local
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9942
 * sata_drive_info structure if the device can be identified.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9943
 * The device type is determined by examining Identify Device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9944
 * command response.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9945
 * If the sata_hba_inst has linked drive info structure for this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9946
 * device address, the Identify Device data is stored into sata_drive_info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9947
 * structure linked to the port info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9948
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9949
 * sata_device has to refer to the valid sata port(s) for HBA described
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9950
 * by sata_hba_inst structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9951
 *
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9952
 * Returns:
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9953
 *	SATA_SUCCESS if device type was successfully probed and port-linked
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9954
 *		drive info structure was updated;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9955
 * 	SATA_FAILURE if there is no device, or device was not probed
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9956
 *		successully;
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
  9957
 *	SATA_RETRY if device probe can be retried later.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9958
 * If a device cannot be identified, sata_device's dev_state and dev_type
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9959
 * fields are set to unknown.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9960
 * There are no retries in this function. Any retries should be managed by
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9961
 * the caller.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9962
 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9963
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9964
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9965
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9966
sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9967
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9968
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9969
	sata_drive_info_t new_sdinfo;	/* local drive info struct */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
  9970
	int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9971
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9972
	ASSERT((SATA_CPORT_STATE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9973
	    sata_device->satadev_addr.cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9974
	    (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9975
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9976
	sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9977
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9978
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9979
	    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9980
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9981
	/* Get pointer to port-linked sata device info structure */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9982
	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9983
	if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9984
		sdinfo->satadrv_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9985
		    ~(SATA_STATE_PROBED | SATA_STATE_READY);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9986
		sdinfo->satadrv_state |= SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9987
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9988
		/* No device to probe */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9989
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9990
		    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9991
		sata_device->satadev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9992
		sata_device->satadev_state = SATA_STATE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9993
		return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9994
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9995
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9996
	 * Need to issue both types of identify device command and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9997
	 * determine device type by examining retreived data/status.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9998
	 * First, ATA Identify Device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
  9999
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10000
	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10001
	new_sdinfo.satadrv_addr = sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10002
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10003
	    sata_device->satadev_addr.cport)));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10004
	new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10005
	rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10006
	if (rval == SATA_RETRY) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10007
		/* We may try to check for ATAPI device */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10008
		if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10009
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10010
			 * HBA supports ATAPI - try to issue Identify Packet
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10011
			 * Device command.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10012
			 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10013
			new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10014
			rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10015
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10016
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10017
	if (rval == SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10018
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10019
		 * Got something responding positively to ATA Identify Device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10020
		 * or to Identify Packet Device cmd.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10021
		 * Save last used device type.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10022
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10023
		sata_device->satadev_type = new_sdinfo.satadrv_type;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10024
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10025
		/* save device info, if possible */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10026
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10027
		    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10028
		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10029
		if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10030
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10031
			    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10032
			return (SATA_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10033
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10034
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10035
		 * Copy drive info into the port-linked drive info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10036
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10037
		*sdinfo = new_sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10038
		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10039
		sdinfo->satadrv_state |= SATA_STATE_PROBED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10040
		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10041
			SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10042
			    sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10043
			    sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10044
		else /* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10045
			SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10046
			    sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10047
			    sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10048
			    sdinfo->satadrv_type;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10049
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10050
		    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10051
		return (SATA_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10052
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10053
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10054
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10055
	 * It may be SATA_RETRY or SATA_FAILURE return.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10056
	 * Looks like we cannot determine the device type at this time.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10057
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10058
	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10059
	    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10060
	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10061
	if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10062
		sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10063
		sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10064
		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 10065
		sdinfo->satadrv_state |= SATA_STATE_PROBED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10066
		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10067
			SATA_CPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10068
			    sata_device->satadev_addr.cport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10069
			    SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10070
		else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10071
			/* SATA_ADDR_DPMPORT */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10072
			if ((SATA_PMULT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10073
			    sata_device->satadev_addr.cport) != NULL) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10074
			    (SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10075
			    sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10076
			    sata_device->satadev_addr.pmport) != NULL))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10077
				SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10078
				    sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10079
				    sata_device->satadev_addr.pmport) =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10080
				    SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10081
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10082
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10083
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10084
	    sata_device->satadev_addr.cport)));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10085
	return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10086
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10087
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10088
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10089
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10090
 * Get pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10091
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10092
 * The sata_device has to contain address (cport, pmport and qualifier) for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10093
 * specified sata_scsi structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10094
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10095
 * Returns NULL if device address is not valid for this HBA configuration.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10096
 * Otherwise, returns a pointer to sata_drive_info structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10097
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10098
 * This function should be called with a port mutex held.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10099
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10100
static sata_drive_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10101
sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10102
    sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10103
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10104
	uint8_t cport = sata_device->satadev_addr.cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10105
	uint8_t pmport = sata_device->satadev_addr.pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10106
	uint8_t qual = sata_device->satadev_addr.qual;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10107
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10108
	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10109
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10110
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10111
	if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10112
	    (SATA_STATE_PROBED | SATA_STATE_READY)))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10113
		/* Port not probed yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10114
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10115
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10116
	if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10117
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10118
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10119
	if (qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10120
		/* Request for a device on a controller port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10121
		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10122
		    SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10123
			/* Port multiplier attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10124
			return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10125
		return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10126
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10127
	if (qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10128
		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10129
		    SATA_DTYPE_PMULT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10130
			return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10131
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10132
		if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10133
			return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10134
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10135
		return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10136
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10137
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10138
	/* we should not get here */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10139
	return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10140
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10141
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10142
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10143
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10144
 * sata_identify_device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10145
 * Send Identify Device command to SATA HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10146
 * If command executes successfully, update sata_drive_info structure pointed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10147
 * to by sdinfo argument, including Identify Device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10148
 * If command fails, invalidate data in sata_drive_info.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10149
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10150
 * Cannot be called from interrupt level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10151
 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10152
 * Returns:
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10153
 * SATA_SUCCESS if the device was identified as a supported device,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10154
 * SATA_RETRY if the device was not identified but could be retried,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10155
 * SATA_FAILURE if the device was not identified and identify attempt
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10156
 *	should not be retried.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10157
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10158
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10159
sata_identify_device(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10160
    sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10161
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10162
	uint16_t cfg_word;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10163
	int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10164
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10165
	/* fetch device identify data */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10166
	if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10167
	    sdinfo)) != SATA_SUCCESS)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10168
		goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10169
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10170
	cfg_word = sdinfo->satadrv_id.ai_config;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10171
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10172
	/* Set the correct device type */
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10173
	if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10174
		sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
10006
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
 10175
	} else if (cfg_word == SATA_CFA_TYPE) {
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
 10176
		/* It's a Compact Flash media via CF-to-SATA HDD adapter */
54ed6e960d71 6727346 ahci driver should support Compact Flash connected through CF-to-SATA adapter
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9704
diff changeset
 10177
		sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10178
	} else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10179
		switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10180
		case SATA_ATAPI_CDROM_DEV:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10181
			sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10182
			break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10183
		case SATA_ATAPI_SQACC_DEV:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10184
			sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10185
			break;
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10186
		case SATA_ATAPI_DIRACC_DEV:
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10187
			sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10188
			break;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10189
		default:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10190
			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10191
		}
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10192
	} else {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10193
			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10194
	}
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10195
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10196
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10197
		if (sdinfo->satadrv_capacity == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10198
			/* Non-LBA disk. Too bad... */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10199
			sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10200
			    "SATA disk device at port %d does not support LBA",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10201
			    sdinfo->satadrv_addr.cport);
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10202
			rval = SATA_FAILURE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10203
			goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10204
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10205
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10206
#if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10207
	/* Left for historical reason */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10208
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10209
	 * Some initial version of SATA spec indicated that at least
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10210
	 * UDMA mode 4 has to be supported. It is not metioned in
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10211
	 * SerialATA 2.6, so this restriction is removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10212
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10213
	/* Check for Ultra DMA modes 6 through 0 being supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10214
	for (i = 6; i >= 0; --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10215
		if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10216
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10217
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10218
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10219
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10220
	 * At least UDMA 4 mode has to be supported. If mode 4 or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10221
	 * higher are not supported by the device, fail this
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10222
	 * device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10223
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10224
	if (i < 4) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10225
		/* No required Ultra DMA mode supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10226
		sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10227
		    "SATA disk device at port %d does not support UDMA "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10228
		    "mode 4 or higher", sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10229
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10230
		    "mode 4 or higher required, %d supported", i));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10231
		rval = SATA_FAILURE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10232
		goto fail_unknown;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10233
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10234
#endif
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10235
9305
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10236
	/*
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10237
	 * For Disk devices, if it doesn't support UDMA mode, we would
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10238
	 * like to return failure directly.
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10239
	 */
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10240
	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10241
	    !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10242
	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10243
		sata_log(sata_hba_inst, CE_WARN,
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10244
		    "SATA disk device at port %d does not support UDMA",
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10245
		    sdinfo->satadrv_addr.cport);
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10246
		rval = SATA_FAILURE;
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10247
		goto fail_unknown;
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10248
	}
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 10249
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 10250
	return (SATA_SUCCESS);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10251
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10252
fail_unknown:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10253
	/* Invalidate sata_drive_info ? */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10254
	sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10255
	sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 10256
	return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10257
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10259
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10260
 * Log/display device information
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10261
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10262
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10263
sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10264
    sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10265
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10266
	int valid_version;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10267
	char msg_buf[MAXPATHLEN];
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10268
	int i;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10269
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10270
	/* Show HBA path */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10271
	(void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10272
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10273
	cmn_err(CE_CONT, "?%s :\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10274
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10275
	switch (sdinfo->satadrv_type) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10276
	case SATA_DTYPE_ATADISK:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10277
		(void) sprintf(msg_buf, "SATA disk device at");
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10278
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10279
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10280
	case SATA_DTYPE_ATAPICD:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10281
		(void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10282
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10283
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10284
	case SATA_DTYPE_ATAPITAPE:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10285
		(void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10286
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10287
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10288
	case SATA_DTYPE_ATAPIDISK:
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10289
		(void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10290
		break;
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 10291
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10292
	case SATA_DTYPE_UNKNOWN:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10293
		(void) sprintf(msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10294
		    "Unsupported SATA device type (cfg 0x%x) at ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10295
		    sdinfo->satadrv_id.ai_config);
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10296
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10297
	}
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10298
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10299
	if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10300
		cmn_err(CE_CONT, "?\t%s port %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10301
		    msg_buf, sdinfo->satadrv_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10302
	else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10303
		cmn_err(CE_CONT, "?\t%s port %d pmport %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10304
		    msg_buf, sdinfo->satadrv_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10305
		    sdinfo->satadrv_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10306
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10307
	bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10308
	    sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10309
	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10310
	msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10311
	cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10312
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10313
	bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10314
	    sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10315
	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10316
	msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10317
	cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10318
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10319
	bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10320
	    sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10321
	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10322
	msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10323
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10324
		cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10325
	} else {
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10326
		/*
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10327
		 * Some drives do not implement serial number and may
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 10328
		 * violate the spec by providing spaces rather than zeros
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10329
		 * in serial number field. Scan the buffer to detect it.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10330
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10331
		for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10332
			if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10333
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10334
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10335
		if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10336
			cmn_err(CE_CONT, "?\tserial number - none\n");
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10337
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10338
			cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10339
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10340
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10341
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10342
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10343
	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10344
	    sdinfo->satadrv_id.ai_majorversion != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10345
		int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10346
		for (i = 14; i >= 2; i--) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10347
			if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10348
				valid_version = i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10349
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10350
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10351
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10352
		cmn_err(CE_CONT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10353
		    "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10354
		    valid_version,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10355
		    sdinfo->satadrv_id.ai_majorversion,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10356
		    sdinfo->satadrv_id.ai_minorversion);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10357
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10358
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10359
	/* Log some info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10360
	cmn_err(CE_CONT, "?\tsupported features:\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10361
	msg_buf[0] = '\0';
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10362
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10363
		if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10364
			(void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10365
		else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10366
			(void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10367
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10368
	if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10369
		(void) strlcat(msg_buf, "DMA", MAXPATHLEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10370
	if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10371
		(void) strlcat(msg_buf, ", Native Command Queueing",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10372
		    MAXPATHLEN);
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
 10373
	if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 10374
		(void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10375
	if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10376
	    (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10377
		(void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10378
	if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10379
	    (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 10380
		(void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10381
	cmn_err(CE_CONT, "?\t %s\n", msg_buf);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10382
	if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10383
		cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10384
	else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10385
		cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 10386
	if (sdinfo->satadrv_features_support &
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10387
	    (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10388
		msg_buf[0] = '\0';
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10389
		(void) snprintf(msg_buf, MAXPATHLEN,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10390
		    "Supported queue depth %d",
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10391
		    sdinfo->satadrv_queue_depth);
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10392
		if (!(sata_func_enable &
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10393
		    (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10394
			(void) strlcat(msg_buf,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10395
			    " - queueing disabled globally", MAXPATHLEN);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10396
		else if (sdinfo->satadrv_queue_depth >
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10397
		    sdinfo->satadrv_max_queue_depth) {
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10398
			(void) snprintf(&msg_buf[strlen(msg_buf)],
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10399
			    MAXPATHLEN - strlen(msg_buf), ", limited to %d",
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10400
			    (int)sdinfo->satadrv_max_queue_depth);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10401
		}
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 10402
		cmn_err(CE_CONT, "?\t%s\n", msg_buf);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10403
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10404
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10405
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10406
#ifdef __i386
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10407
		(void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10408
		    sdinfo->satadrv_capacity);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10409
#else
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10410
		(void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10411
		    sdinfo->satadrv_capacity);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10412
#endif
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10413
		cmn_err(CE_CONT, "?%s", msg_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10414
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10415
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10416
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10417
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10418
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10419
 * sata_save_drive_settings extracts current setting of the device and stores
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10420
 * it for future reference, in case the device setup would need to be restored
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10421
 * after the device reset.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10422
 *
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10423
 * For all devices read ahead and write cache settings are saved, if the
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10424
 * device supports these features at all.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10425
 * For ATAPI devices the Removable Media Status Notification setting is saved.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10426
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10427
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10428
sata_save_drive_settings(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10429
{
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 10430
	if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 10431
	    SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10432
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10433
		/* Current setting of Read Ahead (and Read Cache) */
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 10434
		if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10435
			sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10436
		else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10437
			sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10438
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10439
		/* Current setting of Write Cache */
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 10440
		if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10441
			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10442
		else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10443
			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10444
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10445
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10446
	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 10447
		if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10448
			sdinfo->satadrv_settings |= SATA_DEV_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10449
		else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10450
			sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10451
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10452
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10453
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10454
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10455
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10456
 * sata_check_capacity function determines a disk capacity
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10457
 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10458
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10459
 * NOTE: CHS mode is not supported! If a device does not support LBA,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10460
 * this function is not called.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10461
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10462
 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10463
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10464
static uint64_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10465
sata_check_capacity(sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10466
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10467
	uint64_t capacity = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10468
	int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10469
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10470
	if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10471
	    !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10472
		/* Capacity valid only for LBA-addressable disk devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10473
		return (0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10474
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10475
	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10476
	    (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10477
	    (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10478
		/* LBA48 mode supported and enabled */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10479
		sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10480
		    SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10481
		for (i = 3;  i >= 0;  --i) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10482
			capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10483
			capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10484
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10485
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10486
		capacity = sdinfo->satadrv_id.ai_addrsec[1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10487
		capacity <<= 16;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10488
		capacity += sdinfo->satadrv_id.ai_addrsec[0];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10489
		if (capacity >= 0x1000000)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10490
			/* LBA28 mode */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10491
			sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10492
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10493
	return (capacity);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10494
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10495
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10496
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10497
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10498
 * Allocate consistent buffer for DMA transfer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10499
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10500
 * Cannot be called from interrupt level or with mutex held - it may sleep.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10501
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10502
 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10503
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10504
static struct buf *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10505
sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10506
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10507
	struct scsi_address ap;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10508
	struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10509
	ddi_dma_attr_t	cur_dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10510
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10511
	ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10512
	ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10513
	ap.a_target = SATA_TO_SCSI_TARGET(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10514
	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10515
	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10516
	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10517
	ap.a_lun = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10518
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10519
	bp = scsi_alloc_consistent_buf(&ap, NULL, len,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10520
	    B_READ, SLEEP_FUNC, NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10521
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10522
	if (bp != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10523
		/* Allocate DMA resources for this buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10524
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10525
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10526
		 * We use a local version of the dma_attr, to account
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10527
		 * for a device addressing limitations.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10528
		 * sata_adjust_dma_attr() will handle sdinfo == NULL which
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10529
		 * will cause dma attributes to be adjusted to a lowest
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10530
		 * acceptable level.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10531
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10532
		sata_adjust_dma_attr(NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10533
		    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10534
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10535
		if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10536
		    SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10537
			scsi_free_consistent_buf(bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10538
			spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10539
			bp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10540
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10541
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10542
	return (bp);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10543
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10544
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10545
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10546
 * Release local buffer (consistent buffer for DMA transfer) allocated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10547
 * via sata_alloc_local_buffer().
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10548
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10549
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10550
sata_free_local_buffer(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10551
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10552
	ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10553
	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10554
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10555
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10556
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10557
9699
fb90a02808bd 6824084 sata: callout queue size allocated per registered controller is too small
Martin Faltesek <Martin.Faltesek@Sun.COM>
parents: 9305
diff changeset
 10558
	sata_common_free_dma_rsrcs(spx);
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 10559
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10560
	/* Free buffer */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10561
	scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10562
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10563
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10564
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10565
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10566
 * Allocate sata_pkt
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10567
 * Pkt structure version and embedded strcutures version are initialized.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10568
 * sata_pkt and sata_pkt_txlate structures are cross-linked.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10569
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10570
 * Since this may be called in interrupt context by sata_scsi_init_pkt,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10571
 * callback argument determines if it can sleep or not.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10572
 * Hence, it should not be called from interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10573
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10574
 * If successful, non-NULL pointer to a sata pkt is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10575
 * Upon failure, NULL pointer is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10576
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10577
static sata_pkt_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10578
sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10579
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10580
	sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10581
	int kmsflag;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10582
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10583
	kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10584
	spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10585
	if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10586
		SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10587
		    "sata_pkt_alloc: failed"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10588
		return (NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10589
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10590
	spkt->satapkt_rev = SATA_PKT_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10591
	spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10592
	spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10593
	spkt->satapkt_framework_private = spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10594
	spx->txlt_sata_pkt = spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10595
	return (spkt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10596
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10597
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10598
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10599
 * Free sata pkt allocated via sata_pkt_alloc()
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10600
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10601
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10602
sata_pkt_free(sata_pkt_txlate_t *spx)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10603
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10604
	ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10605
	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10606
	kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10607
	spx->txlt_sata_pkt = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10608
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10609
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10610
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10611
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10612
 * Adjust DMA attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10613
 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10614
 * from 8 bits to 16 bits, depending on a command being used.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10615
 * Limiting max block count arbitrarily to 256 for all read/write
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10616
 * commands may affects performance, so check both the device and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10617
 * controller capability before adjusting dma attributes.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10618
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10619
void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10620
sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10621
    ddi_dma_attr_t *adj_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10622
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10623
	uint32_t count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10624
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10625
	/* Copy original attributes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10626
	*adj_dma_attr = *dma_attr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10627
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10628
	 * Things to consider: device addressing capability,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10629
	 * "excessive" controller DMA capabilities.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10630
	 * If a device is being probed/initialized, there are
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10631
	 * no device info - use default limits then.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10632
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10633
	if (sdinfo == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10634
		count_max = dma_attr->dma_attr_granular * 0x100;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10635
		if (dma_attr->dma_attr_count_max > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10636
			adj_dma_attr->dma_attr_count_max = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10637
		if (dma_attr->dma_attr_maxxfer > count_max)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10638
			adj_dma_attr->dma_attr_maxxfer = count_max;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10639
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10640
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10641
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10642
	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10643
		if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10644
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10645
			 * 16-bit sector count may be used - we rely on
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10646
			 * the assumption that only read and write cmds
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10647
			 * will request more than 256 sectors worth of data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10648
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10649
			count_max = adj_dma_attr->dma_attr_granular * 0x10000;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10650
		} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10651
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10652
			 * 8-bit sector count will be used - default limits
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10653
			 * for dma attributes
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10654
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10655
			count_max = adj_dma_attr->dma_attr_granular * 0x100;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10656
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10657
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10658
		 * Adjust controler dma attributes, if necessary
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10659
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10660
		if (dma_attr->dma_attr_count_max > count_max)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10661
			adj_dma_attr->dma_attr_count_max = count_max;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10662
		if (dma_attr->dma_attr_maxxfer > count_max)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10663
			adj_dma_attr->dma_attr_maxxfer = count_max;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10664
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10665
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10666
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10667
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10668
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10669
 * Allocate DMA resources for the buffer
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10670
 * This function handles initial DMA resource allocation as well as
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10671
 * DMA window shift and may be called repeatedly for the same DMA window
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10672
 * until all DMA cookies in the DMA window are processed.
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10673
 * To guarantee that there is always a coherent set of cookies to process
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10674
 * by SATA HBA driver (observing alignment, device granularity, etc.),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10675
 * the number of slots for DMA cookies is equal to lesser of  a number of
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10676
 * cookies in a DMA window and a max number of scatter/gather entries.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10677
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10678
 * Returns DDI_SUCCESS upon successful operation.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10679
 * Return failure code of a failing command or DDI_FAILURE when
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10680
 * internal cleanup failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10681
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10682
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10683
sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10684
    int (*callback)(caddr_t), caddr_t arg,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10685
    ddi_dma_attr_t *cur_dma_attr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10686
{
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10687
	int	rval;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10688
	off_t	offset;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10689
	size_t	size;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10690
	int	max_sg_len, req_len, i;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10691
	uint_t	dma_flags;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10692
	struct buf	*bp;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10693
	uint64_t	cur_txfer_len;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10694
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10695
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10696
	ASSERT(spx->txlt_sata_pkt != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10697
	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10698
	ASSERT(bp != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10699
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 10700
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10701
	if (spx->txlt_buf_dma_handle == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10702
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10703
		 * No DMA resources allocated so far - this is a first call
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10704
		 * for this sata pkt.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10705
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10706
		rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10707
		    cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10708
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10709
		if (rval != DDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10710
			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10711
			    "sata_dma_buf_setup: no buf DMA resources %x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10712
			    rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10713
			return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10714
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10715
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10716
		if (bp->b_flags & B_READ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10717
			dma_flags = DDI_DMA_READ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10718
		else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10719
			dma_flags = DDI_DMA_WRITE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10720
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10721
		if (flags & PKT_CONSISTENT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10722
			dma_flags |= DDI_DMA_CONSISTENT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10723
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10724
		if (flags & PKT_DMA_PARTIAL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10725
			dma_flags |= DDI_DMA_PARTIAL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10726
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10727
		/*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10728
		 * Check buffer alignment and size against dma attributes
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10729
		 * Consider dma_attr_align only. There may be requests
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 10730
		 * with the size lower than device granularity, but they
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10731
		 * will not read/write from/to the device, so no adjustment
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10732
		 * is necessary. The dma_attr_minxfer theoretically should
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10733
		 * be considered, but no HBA driver is checking it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10734
		 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10735
		if (IS_P2ALIGNED(bp->b_un.b_addr,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10736
		    cur_dma_attr->dma_attr_align)) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10737
			rval = ddi_dma_buf_bind_handle(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10738
			    spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10739
			    bp, dma_flags, callback, arg,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10740
			    &spx->txlt_dma_cookie,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10741
			    &spx->txlt_curwin_num_dma_cookies);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10742
		} else { /* Buffer is not aligned */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10743
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10744
			int	(*ddicallback)(caddr_t);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10745
			size_t	bufsz;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10746
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10747
			/* Check id sleeping is allowed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10748
			ddicallback = (callback == NULL_FUNC) ?
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10749
			    DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10750
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10751
			SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10752
			    "mis-aligned buffer: addr=0x%p, cnt=%lu",
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10753
			    (void *)bp->b_un.b_addr, bp->b_bcount);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10754
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10755
			if (bp->b_flags & (B_PAGEIO|B_PHYS))
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10756
				/*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10757
				 * CPU will need to access data in the buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10758
				 * (for copying) so map it.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10759
				 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10760
				bp_mapin(bp);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10761
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10762
			ASSERT(spx->txlt_tmp_buf == NULL);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10763
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10764
			/* Buffer may be padded by ddi_dma_mem_alloc()! */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10765
			rval = ddi_dma_mem_alloc(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10766
			    spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10767
			    bp->b_bcount,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10768
			    &sata_acc_attr,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10769
			    DDI_DMA_STREAMING,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10770
			    ddicallback, NULL,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10771
			    &spx->txlt_tmp_buf,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10772
			    &bufsz,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10773
			    &spx->txlt_tmp_buf_handle);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10774
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10775
			if (rval != DDI_SUCCESS) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10776
				/* DMA mapping failed */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10777
				(void) ddi_dma_free_handle(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10778
				    &spx->txlt_buf_dma_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10779
				spx->txlt_buf_dma_handle = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10780
#ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10781
				mbuffail_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10782
#endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10783
				SATADBG1(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10784
				    spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10785
				    "sata_dma_buf_setup: "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10786
				    "buf dma mem alloc failed %x\n", rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10787
				return (rval);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10788
			}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10789
			ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10790
			    cur_dma_attr->dma_attr_align));
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10791
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10792
#ifdef SATA_DEBUG
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10793
			mbuf_count++;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10794
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10795
			if (bp->b_bcount != bufsz)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10796
				/*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10797
				 * This will require special handling, because
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10798
				 * DMA cookies will be based on the temporary
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10799
				 * buffer size, not the original buffer
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10800
				 * b_bcount, so the residue may have to
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10801
				 * be counted differently.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10802
				 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10803
				SATADBG2(SATA_DBG_DMA_SETUP,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10804
				    spx->txlt_sata_hba_inst,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10805
				    "sata_dma_buf_setup: bp size %x != "
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10806
				    "bufsz %x\n", bp->b_bcount, bufsz);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10807
#endif
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10808
			if (dma_flags & DDI_DMA_WRITE) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10809
				/*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10810
				 * Write operation - copy data into
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10811
				 * an aligned temporary buffer. Buffer will be
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10812
				 * synced for device by ddi_dma_addr_bind_handle
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10813
				 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10814
				bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10815
				    bp->b_bcount);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10816
			}
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10817
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10818
			rval = ddi_dma_addr_bind_handle(
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10819
			    spx->txlt_buf_dma_handle,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10820
			    NULL,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10821
			    spx->txlt_tmp_buf,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10822
			    bufsz, dma_flags, ddicallback, 0,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10823
			    &spx->txlt_dma_cookie,
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 10824
			    &spx->txlt_curwin_num_dma_cookies);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10825
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10826
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10827
		switch (rval) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10828
		case DDI_DMA_PARTIAL_MAP:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10829
			SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10830
			    "sata_dma_buf_setup: DMA Partial Map\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10831
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10832
			 * Partial DMA mapping.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10833
			 * Retrieve number of DMA windows for this request.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10834
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10835
			if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10836
			    &spx->txlt_num_dma_win) != DDI_SUCCESS) {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10837
				if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10838
					ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10839
					    &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10840
					spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10841
				}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10842
				(void) ddi_dma_unbind_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10843
				    spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10844
				(void) ddi_dma_free_handle(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10845
				    &spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10846
				spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10847
				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10848
				    "sata_dma_buf_setup: numwin failed\n"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10849
				return (DDI_FAILURE);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10850
			}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10851
			SATADBG2(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10852
			    spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10853
			    "sata_dma_buf_setup: windows: %d, cookies: %d\n",
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10854
			    spx->txlt_num_dma_win,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10855
			    spx->txlt_curwin_num_dma_cookies);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10856
			spx->txlt_cur_dma_win = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10857
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10858
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10859
		case DDI_DMA_MAPPED:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10860
			/* DMA fully mapped */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10861
			spx->txlt_num_dma_win = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10862
			spx->txlt_cur_dma_win = 0;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10863
			SATADBG1(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10864
			    spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10865
			    "sata_dma_buf_setup: windows: 1 "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10866
			    "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10867
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10868
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10869
		default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10870
			/* DMA mapping failed */
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10871
			if (spx->txlt_tmp_buf != NULL) {
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10872
				ddi_dma_mem_free(
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10873
				    &spx->txlt_tmp_buf_handle);
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10874
				spx->txlt_tmp_buf = NULL;
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 10875
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10876
			(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10877
			spx->txlt_buf_dma_handle = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10878
			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10879
			    "sata_dma_buf_setup: buf dma handle binding "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10880
			    "failed %x\n", rval));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10881
			return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10882
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10883
		spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10884
		spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10885
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10886
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10887
		 * DMA setup is reused. Check if we need to process more
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10888
		 * cookies in current window, or to get next window, if any.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10889
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10890
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10891
		ASSERT(spx->txlt_curwin_processed_dma_cookies <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10892
		    spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10893
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10894
		if (spx->txlt_curwin_processed_dma_cookies ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10895
		    spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10896
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10897
			 * All cookies from current DMA window were processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10898
			 * Get next DMA window.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10899
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10900
			spx->txlt_cur_dma_win++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10901
			if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10902
				(void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10903
				    spx->txlt_cur_dma_win, &offset, &size,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10904
				    &spx->txlt_dma_cookie,
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10905
				    &spx->txlt_curwin_num_dma_cookies);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10906
				spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10907
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10908
				/* No more windows! End of request! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10909
				/* What to do? - panic for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10910
				ASSERT(spx->txlt_cur_dma_win >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10911
				    spx->txlt_num_dma_win);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10912
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10913
				spx->txlt_curwin_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10914
				spx->txlt_curwin_processed_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10915
				spx->txlt_sata_pkt->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10916
				    satapkt_cmd.satacmd_num_dma_cookies = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10917
				return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10918
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10919
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10920
	}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10921
	/* There better be at least one DMA cookie outstanding */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10922
	ASSERT((spx->txlt_curwin_num_dma_cookies -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10923
	    spx->txlt_curwin_processed_dma_cookies) > 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10924
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10925
	if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10926
		/* The default cookie slot was used in previous run */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10927
		ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10928
		spx->txlt_dma_cookie_list = NULL;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10929
		spx->txlt_dma_cookie_list_len = 0;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10930
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10931
	if (spx->txlt_curwin_processed_dma_cookies == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10932
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10933
		 * Processing a new DMA window - set-up dma cookies list.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10934
		 * We may reuse previously allocated cookie array if it is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10935
		 * possible.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10936
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10937
		if (spx->txlt_dma_cookie_list != NULL &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10938
		    spx->txlt_dma_cookie_list_len <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10939
		    spx->txlt_curwin_num_dma_cookies) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10940
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10941
			 * New DMA window contains more cookies than
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10942
			 * the previous one. We need larger cookie list - free
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10943
			 * the old one.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10944
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10945
			(void) kmem_free(spx->txlt_dma_cookie_list,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10946
			    spx->txlt_dma_cookie_list_len *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10947
			    sizeof (ddi_dma_cookie_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10948
			spx->txlt_dma_cookie_list = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10949
			spx->txlt_dma_cookie_list_len = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10950
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 10951
		if (spx->txlt_dma_cookie_list == NULL) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10952
			/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10953
			 * Calculate lesser of number of cookies in this
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10954
			 * DMA window and number of s/g entries.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10955
			 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10956
			max_sg_len = cur_dma_attr->dma_attr_sgllen;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10957
			req_len = MIN(max_sg_len,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10958
			    spx->txlt_curwin_num_dma_cookies);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10959
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10960
			/* Allocate new dma cookie array if necessary */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10961
			if (req_len == 1) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10962
				/* Only one cookie - no need for a list */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10963
				spx->txlt_dma_cookie_list =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10964
				    &spx->txlt_dma_cookie;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10965
				spx->txlt_dma_cookie_list_len = 1;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10966
			} else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10967
				/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10968
				 * More than one cookie - try to allocate space.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10969
				 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10970
				spx->txlt_dma_cookie_list = kmem_zalloc(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10971
				    sizeof (ddi_dma_cookie_t) * req_len,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10972
				    callback == NULL_FUNC ? KM_NOSLEEP :
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10973
				    KM_SLEEP);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10974
				if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10975
					SATADBG1(SATA_DBG_DMA_SETUP,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10976
					    spx->txlt_sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10977
					    "sata_dma_buf_setup: cookie list "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10978
					    "allocation failed\n", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10979
					/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10980
					 * We could not allocate space for
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10981
					 * neccessary number of dma cookies in
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10982
					 * this window, so we fail this request.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10983
					 * Next invocation would try again to
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10984
					 * allocate space for cookie list.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10985
					 * Note:Packet residue was not modified.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10986
					 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10987
					return (DDI_DMA_NORESOURCES);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10988
				} else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10989
					spx->txlt_dma_cookie_list_len = req_len;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10990
				}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10991
			}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10992
		}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10993
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10994
		 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10995
		 * First cookie was already fetched.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10996
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10997
		*(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10998
		cur_txfer_len =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 10999
		    (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11000
		spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11001
		spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11002
		for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11003
		    (i < spx->txlt_curwin_num_dma_cookies); i++) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11004
			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 11005
			    &spx->txlt_dma_cookie_list[i]);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11006
			cur_txfer_len +=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11007
			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11008
			spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11009
			spx->txlt_sata_pkt->
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11010
			    satapkt_cmd.satacmd_num_dma_cookies += 1;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11011
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11012
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11013
		SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11014
		    "sata_dma_buf_setup: sliding within DMA window, "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11015
		    "cur cookie %d, total cookies %d\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11016
		    spx->txlt_curwin_processed_dma_cookies,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11017
		    spx->txlt_curwin_num_dma_cookies);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11018
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11019
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11020
		 * Not all cookies from the current dma window were used because
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11021
		 * of s/g limitation.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11022
		 * There is no need to re-size the list - it was set at
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11023
		 * optimal size, or only default entry is used (s/g = 1).
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11024
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11025
		if (spx->txlt_dma_cookie_list == NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11026
			spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11027
			spx->txlt_dma_cookie_list_len = 1;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11028
		}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11029
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11030
		 * Since we are processing remaining cookies in a DMA window,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11031
		 * there may be less of them than the number of entries in the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11032
		 * current dma cookie list.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11033
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11034
		req_len = MIN(spx->txlt_dma_cookie_list_len,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11035
		    (spx->txlt_curwin_num_dma_cookies -
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11036
		    spx->txlt_curwin_processed_dma_cookies));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11037
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11038
		/* Fetch the next batch of cookies */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11039
		for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11040
			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 11041
			    &spx->txlt_dma_cookie_list[i]);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11042
			cur_txfer_len +=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11043
			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11044
			spx->txlt_sata_pkt->
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11045
			    satapkt_cmd.satacmd_num_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11046
			spx->txlt_curwin_processed_dma_cookies++;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11047
		}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11048
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11049
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11050
	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11051
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11052
	/* Point sata_cmd to the cookie list */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11053
	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11054
	    &spx->txlt_dma_cookie_list[0];
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11055
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11056
	/* Remember number of DMA cookies passed in sata packet */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11057
	spx->txlt_num_dma_cookies =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11058
	    spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11059
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11060
	ASSERT(cur_txfer_len != 0);
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11061
	if (cur_txfer_len <= bp->b_bcount)
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11062
		spx->txlt_total_residue -= cur_txfer_len;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11063
	else {
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11064
		/*
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11065
		 * Temporary DMA buffer has been padded by
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11066
		 * ddi_dma_mem_alloc()!
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11067
		 * This requires special handling, because DMA cookies are
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11068
		 * based on the temporary buffer size, not the b_bcount,
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11069
		 * and we have extra bytes to transfer - but the packet
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11070
		 * residue has to stay correct because we will copy only
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11071
		 * the requested number of bytes.
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11072
		 */
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11073
		spx->txlt_total_residue -= bp->b_bcount;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11074
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11075
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11076
	return (DDI_SUCCESS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11077
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11078
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11079
/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11080
 * Common routine for releasing DMA resources
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11081
 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11082
static void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11083
sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11084
{
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11085
	if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11086
		if (spx->txlt_tmp_buf != NULL)  {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11087
			/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11088
			 * Intermediate DMA buffer was allocated.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11089
			 * Free allocated buffer and associated access handle.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11090
			 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11091
			ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11092
			spx->txlt_tmp_buf = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11093
		}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11094
		/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11095
		 * Free DMA resources - cookies and handles
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11096
		 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11097
		/* ASSERT(spx->txlt_dma_cookie_list != NULL); */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11098
		if (spx->txlt_dma_cookie_list != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11099
			if (spx->txlt_dma_cookie_list !=
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11100
			    &spx->txlt_dma_cookie) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11101
				(void) kmem_free(spx->txlt_dma_cookie_list,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11102
				    spx->txlt_dma_cookie_list_len *
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11103
				    sizeof (ddi_dma_cookie_t));
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11104
				spx->txlt_dma_cookie_list = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11105
			}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11106
		}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11107
		(void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11108
		(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11109
		spx->txlt_buf_dma_handle = NULL;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11110
	}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11111
}
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11112
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11113
/*
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11114
 * Free DMA resources
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11115
 * Used by the HBA driver to release DMA resources that it does not use.
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11116
 *
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11117
 * Returns Void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11118
 */
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11119
void
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11120
sata_free_dma_resources(sata_pkt_t *sata_pkt)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11121
{
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11122
	sata_pkt_txlate_t *spx;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11123
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11124
	if (sata_pkt == NULL)
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11125
		return;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11126
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11127
	spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11128
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11129
	sata_common_free_dma_rsrcs(spx);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11130
}
2539
2a06303a9684 6430355 sata framework needs to handle misaligned data buffers
pawelw
parents: 2177
diff changeset
 11131
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11132
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11133
 * Fetch Device Identify data.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11134
 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11135
 * command to a device and get the device identify data.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11136
 * The device_info structure has to be set to device type (for selecting proper
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11137
 * device identify command).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11138
 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11139
 * Returns:
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11140
 * SATA_SUCCESS if cmd succeeded
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11141
 * SATA_RETRY if cmd was rejected and could be retried,
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11142
 * SATA_FAILURE if cmd failed and should not be retried (port error)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11143
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11144
 * Cannot be called in an interrupt context.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11145
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11146
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11147
static int
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11148
sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11149
    sata_drive_info_t *sdinfo)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11150
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11151
	struct buf *bp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11152
	sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11153
	sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11154
	sata_pkt_txlate_t *spx;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11155
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11156
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11157
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11158
	spx->txlt_sata_hba_inst = sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11159
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11160
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11161
	if (spkt == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11162
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11163
		return (SATA_RETRY); /* may retry later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11164
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11165
	/* address is needed now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11166
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11167
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11168
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11169
	 * Allocate buffer for Identify Data return data
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11170
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11171
	bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11172
	if (bp == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11173
		sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11174
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11175
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11176
		    "sata_fetch_device_identify_data: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11177
		    "cannot allocate buffer for ID"));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11178
		return (SATA_RETRY); /* may retry later */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11179
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11180
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11181
	/* Fill sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11182
	sdinfo->satadrv_state = SATA_STATE_PROBING;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11183
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11184
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11185
	/* Synchronous mode, no callback */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11186
	spkt->satapkt_comp = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11187
	/* Timeout 30s */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11188
	spkt->satapkt_time = sata_default_pkt_time;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11189
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11190
	scmd = &spkt->satapkt_cmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11191
	scmd->satacmd_bp = bp;
1612
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 11192
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
f22bd5bc2aff 6369698 sata framework needs to support SCSI LOG SENSE command
ls24207
parents: 1529
diff changeset
 11193
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11194
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11195
	/* Build Identify Device cmd in the sata_pkt */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11196
	scmd->satacmd_addr_type = 0;		/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11197
	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11198
	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11199
	scmd->satacmd_lba_mid_lsb = 0;		/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11200
	scmd->satacmd_lba_high_lsb = 0;		/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11201
	scmd->satacmd_features_reg = 0;		/* N/A */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11202
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 11203
	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11204
		/* Identify Packet Device cmd */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11205
		scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11206
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11207
		/* Identify Device cmd - mandatory for all other devices */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11208
		scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11209
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11210
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11211
	/* Send pkt to SATA HBA driver */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11212
	rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 11213
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 11214
#ifdef SATA_INJECT_FAULTS
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11215
	sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 11216
#endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 11217
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11218
	if (rval == SATA_TRAN_ACCEPTED &&
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11219
	    spkt->satapkt_reason == SATA_PKT_COMPLETED) {
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11220
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11221
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11222
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11223
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 11224
		}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11225
		if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11226
		    SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11227
			SATA_LOG_D((sata_hba_inst, CE_WARN,
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
 11228
			    "SATA disk device at port %d - "
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
 11229
			    "partial Identify Data",
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 11230
			    sdinfo->satadrv_addr.cport));
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11231
			rval = SATA_RETRY; /* may retry later */
2734
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
 11232
			goto fail;
1a2f23099c2a 6428449 sata disks have read cache disabled after being hot-plugged
pawelw
parents: 2593
diff changeset
 11233
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11234
		/* Update sata_drive_info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11235
		bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11236
		    sizeof (sata_id_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11237
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11238
		sdinfo->satadrv_features_support = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11239
		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11240
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11241
			 * Retrieve capacity (disks only) and addressing mode
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11242
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11243
			sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11244
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11245
			/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11246
			 * For ATAPI devices one would have to issue
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11247
			 * Get Capacity cmd for media capacity. Not here.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11248
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11249
			sdinfo->satadrv_capacity = 0;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11250
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11251
			 * Check what cdb length is supported
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11252
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11253
			if ((sdinfo->satadrv_id.ai_config &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11254
			    SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11255
				sdinfo->satadrv_atapi_cdb_len = 16;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11256
			else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11257
				sdinfo->satadrv_atapi_cdb_len = 12;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11258
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11259
		/* Setup supported features flags */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11260
		if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11261
			sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11262
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11263
		/* Check for SATA GEN and NCQ support */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11264
		if (sdinfo->satadrv_id.ai_satacap != 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11265
		    sdinfo->satadrv_id.ai_satacap != 0xffff) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11266
			/* SATA compliance */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11267
			if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11268
				sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11269
				    SATA_DEV_F_NCQ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11270
			if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11271
			    (SATA_1_SPEED | SATA_2_SPEED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11272
				if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11273
				    SATA_2_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11274
					sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11275
					    SATA_DEV_F_SATA2;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11276
				if (sdinfo->satadrv_id.ai_satacap &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11277
				    SATA_1_SPEED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11278
					sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11279
					    SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11280
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11281
				sdinfo->satadrv_features_support |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11282
				    SATA_DEV_F_SATA1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11283
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11284
		}
1940
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
 11285
		if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
 11286
		    (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
c302ad4d1aa7 6404894 Informational exceptions log parameter should be 4 bytes
ls24207
parents: 1781
diff changeset
 11287
			sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11288
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 11289
		sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 11290
		if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11291
		    (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
2553
624f674f2ad8 6430966 SATA NCQ support is needed in SATA framework and hba drivers
ls24207
parents: 2539
diff changeset
 11292
			++sdinfo->satadrv_queue_depth;
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11293
			/* Adjust according to controller capabilities */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11294
			sdinfo->satadrv_max_queue_depth = MIN(
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11295
			    sdinfo->satadrv_queue_depth,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11296
			    SATA_QDEPTH(sata_hba_inst));
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11297
			/* Adjust according to global queue depth limit */
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11298
			sdinfo->satadrv_max_queue_depth = MIN(
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11299
			    sdinfo->satadrv_max_queue_depth,
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11300
			    sata_current_max_qdepth);
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11301
			if (sdinfo->satadrv_max_queue_depth == 0)
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11302
				sdinfo->satadrv_max_queue_depth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11303
		} else
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11304
			sdinfo->satadrv_max_queue_depth = 1;
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 11305
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11306
		rval = SATA_SUCCESS;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11307
	} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11308
		/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11309
		 * Woops, no Identify Data.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11310
		 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11311
		if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 11312
			rval = SATA_RETRY; /* may retry later */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11313
		} else if (rval == SATA_TRAN_ACCEPTED) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11314
			if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11315
			    spkt->satapkt_reason == SATA_PKT_ABORTED ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11316
			    spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11317
			    spkt->satapkt_reason == SATA_PKT_RESET)
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11318
				rval = SATA_RETRY; /* may retry later */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11319
			else
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11320
				rval = SATA_FAILURE;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11321
		} else {
4014
360fee62f0eb 6539787 marvell88sx driver needs to support multiple block PIO commands
ls24207
parents: 4013
diff changeset
 11322
			rval = SATA_FAILURE;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 11323
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11324
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11325
fail:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11326
	/* Free allocated resources */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11327
	sata_free_local_buffer(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11328
	sata_pkt_free(spx);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11329
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11330
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11331
	return (rval);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11332
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11333
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11334
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11335
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11336
 * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11337
 * UDMA mode is checked first, followed by MWDMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11338
 * set correctly, so this function is setting it to the highest supported level.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11339
 * Older SATA spec required that the device supports at least DMA 4 mode and
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11340
 * UDMA mode is selected.  It is not mentioned in SerialATA 2.6, so this
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11341
 * restriction has been removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11342
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11343
 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11344
 * Returns SATA_FAILURE if proper DMA mode could not be selected.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11345
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11346
 * NOTE: This function should be called only if DMA mode is supported.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11347
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11348
static int
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11349
sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11350
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11351
	sata_pkt_t *spkt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11352
	sata_cmd_t *scmd;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11353
	sata_pkt_txlate_t *spx;
9305
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11354
	int mode;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11355
	uint8_t subcmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11356
	int rval = SATA_SUCCESS;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11358
	ASSERT(sdinfo != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11359
	ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11360
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11361
	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11362
	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11363
		/* Find highest Ultra DMA mode supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11364
		for (mode = 6; mode >= 0; --mode) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11365
			if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11366
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11367
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11368
#if 0
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11369
		/* Left for historical reasons */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11370
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11371
		 * Some initial version of SATA spec indicated that at least
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11372
		 * UDMA mode 4 has to be supported. It is not mentioned in
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11373
		 * SerialATA 2.6, so this restriction is removed.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11374
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11375
		if (mode < 4)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11376
			return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11377
#endif
9305
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11378
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11379
		/*
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11380
		 * We're still going to set DMA mode whatever is selected
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11381
		 * by default
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11382
		 *
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11383
		 * We saw an old maxtor sata drive will select Ultra DMA and
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11384
		 * Multi-Word DMA simultaneouly by default, which is going
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11385
		 * to cause DMA command timed out, so we need to select DMA
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11386
		 * mode even when it's already done by default
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11387
		 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11388
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11389
		subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11390
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11391
	} else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11392
		/* Find highest MultiWord DMA mode supported */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11393
		for (mode = 2; mode >= 0; --mode) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11394
			if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11395
				break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11396
		}
9305
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11397
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11398
		/*
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11399
		 * We're still going to set DMA mode whatever is selected
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11400
		 * by default
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11401
		 *
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11402
		 * We saw an old maxtor sata drive will select Ultra DMA and
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11403
		 * Multi-Word DMA simultaneouly by default, which is going
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11404
		 * to cause DMA command timed out, so we need to select DMA
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11405
		 * mode even when it's already done by default
7d93ad6ed659 6819043 attaching an old maxtor sata disk prevents opensolaris from booting with SB600 AHCI controller
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 9106
diff changeset
 11406
		 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11407
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11408
		subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11409
	} else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11410
		return (SATA_SUCCESS);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11411
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11412
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11413
	 * Set DMA mode via SET FEATURES COMMAND.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11414
	 * Prepare packet for SET FEATURES COMMAND.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11415
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11416
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11417
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11418
	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11419
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11420
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11421
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11422
		    "sata_set_dma_mode: could not set DMA mode %", mode));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11423
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11424
		goto done;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11425
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11426
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11427
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11428
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11429
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11430
	/* Synchronous mode, no callback, interrupts */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11431
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11432
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11433
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11434
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11435
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11436
	scmd->satacmd_addr_type = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11437
	scmd->satacmd_device_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11438
	scmd->satacmd_status_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11439
	scmd->satacmd_error_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11440
	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11441
	scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11442
	scmd->satacmd_sec_count_lsb = subcmd | mode;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11443
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11444
	/* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11445
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11446
	    spkt) != SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11447
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11448
		/* Pkt execution failed */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11449
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11450
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11451
done:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11452
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11453
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11454
	if (spkt != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11455
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11456
	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11457
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11458
	return (rval);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11459
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11460
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11461
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11462
/*
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11463
 * Set device caching mode.
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11464
 * One of the following operations should be specified:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11465
 * SATAC_SF_ENABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11466
 * SATAC_SF_DISABLE_READ_AHEAD
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11467
 * SATAC_SF_ENABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11468
 * SATAC_SF_DISABLE_WRITE_CACHE
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11469
 *
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11470
 * If operation fails, system log messgage is emitted.
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11471
 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11472
 * command was sent but did not succeed, and SATA_FAILURE otherwise.
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11473
 */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11474
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11475
static int
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11476
sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11477
    int cache_op)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11478
{
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11479
	sata_pkt_t *spkt;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11480
	sata_cmd_t *scmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11481
	sata_pkt_txlate_t *spx;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11482
	int rval = SATA_SUCCESS;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11483
	int hba_rval;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11484
	char *infop;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11485
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11486
	ASSERT(sdinfo != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11487
	ASSERT(sata_hba_inst != NULL);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11488
	ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11489
	    cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11490
	    cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11491
	    cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11492
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11493
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11494
	/* Prepare packet for SET FEATURES COMMAND */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11495
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11496
	spx->txlt_sata_hba_inst = sata_hba_inst;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11497
	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11498
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11499
	if (spkt == NULL) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11500
		rval = SATA_FAILURE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11501
		goto failure;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11502
	}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11503
	/* Fill sata_pkt */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11504
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11505
	/* Timeout 30s */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11506
	spkt->satapkt_time = sata_default_pkt_time;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11507
	/* Synchronous mode, no callback, interrupts */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11508
	spkt->satapkt_op_mode =
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11509
	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11510
	spkt->satapkt_comp = NULL;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11511
	scmd = &spkt->satapkt_cmd;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11512
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11513
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11514
	scmd->satacmd_addr_type = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11515
	scmd->satacmd_device_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11516
	scmd->satacmd_status_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11517
	scmd->satacmd_error_reg = 0;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11518
	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11519
	scmd->satacmd_features_reg = cache_op;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11520
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11521
	/* Transfer command to HBA */
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11522
	hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11523
	    SATA_DIP(sata_hba_inst), spkt);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11524
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11525
#ifdef SATA_INJECT_FAULTS
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11526
	sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11527
#endif
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11528
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11529
	if ((hba_rval != SATA_TRAN_ACCEPTED) ||
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11530
	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11531
		/* Pkt execution failed */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11532
		switch (cache_op) {
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11533
		case SATAC_SF_ENABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11534
			infop = "enabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11535
			break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11536
		case SATAC_SF_DISABLE_READ_AHEAD:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11537
			infop = "disabling read ahead failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11538
			break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11539
		case SATAC_SF_ENABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11540
			infop = "enabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11541
			break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11542
		case SATAC_SF_DISABLE_WRITE_CACHE:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11543
			infop = "disabling write cache failed";
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11544
			break;
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11545
		}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11546
		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 11547
		rval = SATA_RETRY;
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11548
	}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11549
failure:
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11550
	/* Free allocated resources */
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11551
	if (spkt != NULL)
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11552
		sata_pkt_free(spx);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11553
	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11554
	return (rval);
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11555
}
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11556
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11557
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11558
 * Set Removable Media Status Notification (enable/disable)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11559
 * state == 0 , disable
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11560
 * state != 0 , enable
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11561
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11562
 * If operation fails, system log messgage is emitted.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11563
 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11564
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11565
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11566
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11567
sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11568
    int state)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11569
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11570
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11571
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11572
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11573
	int rval = SATA_SUCCESS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11574
	char *infop;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11575
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11576
	ASSERT(sdinfo != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11577
	ASSERT(sata_hba_inst != NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11578
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11579
	/* Prepare packet for SET FEATURES COMMAND */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11580
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11581
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11582
	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11583
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11584
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11585
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11586
		goto failure;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11587
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11588
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11589
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11590
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11591
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11592
	/* Synchronous mode, no callback, interrupts */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11593
	spkt->satapkt_op_mode =
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11594
	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11595
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11596
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11597
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11598
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11599
	scmd->satacmd_addr_type = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11600
	scmd->satacmd_device_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11601
	scmd->satacmd_status_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11602
	scmd->satacmd_error_reg = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11603
	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11604
	if (state == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11605
		scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11606
	else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11607
		scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11608
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11609
	/* Transfer command to HBA */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11610
	if (((*SATA_START_FUNC(sata_hba_inst))(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11611
	    SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11612
	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11613
		/* Pkt execution failed */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11614
		if (state == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11615
			infop = "disabling Removable Media Status "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11616
			    "Notification failed";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11617
		else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11618
			infop = "enabling Removable Media Status "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11619
			    "Notification failed";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11620
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11621
		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11622
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11623
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11624
failure:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11625
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11626
	if (spkt != NULL)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11627
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11628
	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11629
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 11630
}
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11631
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11632
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 11633
/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11634
 * Update port SCR block
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11635
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11636
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11637
sata_update_port_scr(sata_port_scr_t *port_scr, sata_device_t *device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11638
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11639
	port_scr->sstatus = device->satadev_scr.sstatus;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11640
	port_scr->serror = device->satadev_scr.serror;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11641
	port_scr->scontrol = device->satadev_scr.scontrol;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11642
	port_scr->sactive = device->satadev_scr.sactive;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11643
	port_scr->snotific = device->satadev_scr.snotific;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11644
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11645
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11646
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11647
 * Update state and copy port ss* values from passed sata_device structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11648
 * sata_address is validated - if not valid, nothing is changed in sata_scsi
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11649
 * configuration struct.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11650
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11651
 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11652
 * regardless of the state in device argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11653
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11654
 * Port mutex should be held while calling this function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11655
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11656
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11657
sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11658
	sata_device_t *sata_device)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11659
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11660
	ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11661
	    sata_device->satadev_addr.cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11662
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11663
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11664
	    sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11665
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11666
		sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11667
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11668
		if (SATA_NUM_CPORTS(sata_hba_inst) <=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11669
		    sata_device->satadev_addr.cport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11670
			return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11671
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11672
		cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11673
		    sata_device->satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11674
		sata_update_port_scr(&cportinfo->cport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11675
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11676
		/* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11677
		cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11678
		    SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11679
		cportinfo->cport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11680
		    sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11681
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11682
		sata_pmport_info_t *pmportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11683
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11684
		if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11685
		    (sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11686
		    SATA_NUM_PMPORTS(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11687
		    sata_device->satadev_addr.cport) <
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11688
		    sata_device->satadev_addr.pmport)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11689
			return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11690
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11691
		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11692
		    sata_device->satadev_addr.cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11693
		    sata_device->satadev_addr.pmport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11694
		sata_update_port_scr(&pmportinfo->pmport_scr, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11695
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11696
		/* Preserve SATA_PSTATE_SHUTDOWN flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11697
		pmportinfo->pmport_state &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11698
		    ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11699
		    SATA_PSTATE_FAILED);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11700
		pmportinfo->pmport_state |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11701
		    sata_device->satadev_state & SATA_PSTATE_VALID;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11702
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11703
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11704
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11705
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11706
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11707
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11708
 * Extract SATA port specification from an IOCTL argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11709
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11710
 * This function return the port the user land send us as is, unless it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11711
 * cannot retrieve port spec, then -1 is returned.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11712
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11713
 * Note: Only cport  - no port multiplier port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11714
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11715
static int32_t
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11716
sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11717
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11718
	int32_t port;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11719
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11720
	/* Extract port number from nvpair in dca structure  */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11721
	if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11722
		SATA_LOG_D((sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11723
		    "sata_get_port_num: invalid port spec 0x%x in ioctl",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11724
		    port));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11725
		port = -1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11726
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11727
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11728
	return (port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11729
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11730
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11731
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11732
 * Get dev_info_t pointer to the device node pointed to by port argument.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11733
 * NOTE: target argument is a value used in ioctls to identify
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11734
 * the AP - it is not a sata_address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11735
 * It is a combination of cport, pmport and address qualifier, encodded same
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11736
 * way as a scsi target number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11737
 * At this moment it carries only cport number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11738
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11739
 * No PMult hotplug support.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11740
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11741
 * Returns dev_info_t pointer if target device was found, NULL otherwise.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11742
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11743
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11744
static dev_info_t *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11745
sata_get_target_dip(dev_info_t *dip, int32_t port)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11746
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11747
	dev_info_t	*cdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11748
	int		target, tgt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11749
	int		ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11750
	int 		circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11751
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11752
	ncport = port & SATA_CFGA_CPORT_MASK;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11753
	target = SATA_TO_SCSI_TARGET(ncport, 0, SATA_ADDR_DCPORT);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11755
	ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11756
	for (cdip = ddi_get_child(dip); cdip != NULL; ) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11757
		dev_info_t *next = ddi_get_next_sibling(cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11758
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11759
		tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11760
		    DDI_PROP_DONTPASS, "target", -1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11761
		if (tgt == -1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11762
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11763
			 * This is actually an error condition, but not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11764
			 * a fatal one. Just continue the search.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11765
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11766
			cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11767
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11768
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11769
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11770
		if (tgt == target)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11771
			break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11772
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11773
		cdip = next;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11774
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11775
	ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11776
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11777
	return (cdip);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11778
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 11779
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11780
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11781
 * Get dev_info_t pointer to the device node pointed to by port argument.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11782
 * NOTE: target argument is a value used in ioctls to identify
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11783
 * the AP - it is not a sata_address.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11784
 * It is a combination of cport, pmport and address qualifier, encoded same
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11785
 * way as a scsi target number.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11786
 * At this moment it carries only cport number.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11787
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11788
 * No PMult hotplug support.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11789
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11790
 * Returns dev_info_t pointer if target device was found, NULL otherwise.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11791
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11792
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11793
static dev_info_t *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11794
sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11795
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11796
	dev_info_t	*cdip = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11797
	int		target, tgt;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11798
	int 		circ;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11799
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11800
	target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11801
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11802
	ndi_devi_enter(dip, &circ);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11803
	for (cdip = ddi_get_child(dip); cdip != NULL; ) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11804
		dev_info_t *next = ddi_get_next_sibling(cdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11805
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11806
		tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11807
		    DDI_PROP_DONTPASS, "target", -1);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11808
		if (tgt == -1) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11809
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11810
			 * This is actually an error condition, but not
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11811
			 * a fatal one. Just continue the search.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11812
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11813
			cdip = next;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11814
			continue;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11815
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11816
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11817
		if (tgt == target)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11818
			break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11819
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11820
		cdip = next;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11821
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11822
	ndi_devi_exit(dip, circ);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11823
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11824
	return (cdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11825
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11826
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11827
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11828
 * Process sata port disconnect request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11829
 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11830
 * before this request. Nevertheless, if a device is still configured,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11831
 * we need to attempt to offline and unconfigure device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11832
 * Regardless of the unconfigure operation results the port is marked as
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11833
 * deactivated and no access to the attached device is possible.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11834
 * If the target node remains because unconfigure operation failed, its state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11835
 * will be set to DEVICE_REMOVED, preventing it to be used again when a device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11836
 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11837
 * the device and remove old target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11838
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11839
 * This function invokes sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11840
 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11841
 * If successful, the device structure (if any) attached to the specified port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11842
 * is removed and state of the port marked appropriately.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11843
 * Failure of the port_deactivate may keep port in the physically active state,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11844
 * or may fail the port.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11845
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11846
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11847
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11848
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11849
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11850
sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11851
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11852
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11853
	sata_drive_info_t *sdinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11854
	sata_cport_info_t *cportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11855
	sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11856
	sata_pmult_info_t *pmultinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11857
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11858
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11859
	int rval = SATA_SUCCESS;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11860
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11861
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11862
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11863
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11864
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11865
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11866
	ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11867
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11868
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11869
	 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11870
	 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11871
	 * Do the sanity check.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11872
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11873
	if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11874
		/* No physical port deactivation supported. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11875
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11876
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11877
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11878
	/* Check the current state of the port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11879
	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11880
	    (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11881
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11882
	sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11883
	if (rval != SATA_SUCCESS ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11884
	    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11885
		/* Device port status is unknown or it is in failed state */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11886
		if (qual == SATA_ADDR_PMPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11887
			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11888
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11889
			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11890
			    "sata_hba_ioctl: connect: failed to deactivate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11891
			    "SATA port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11892
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11893
			SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11894
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11895
			SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11896
			    "sata_hba_ioctl: connect: failed to deactivate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11897
			    "SATA port %d:%d", cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11898
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11899
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11900
		    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11901
		return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11902
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11903
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11904
	 * Set port's dev_state to not ready - this will disable
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11905
	 * an access to a potentially attached device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11906
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11907
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11908
	if (qual == SATA_ADDR_PMPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11909
		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11910
		if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11911
			sdinfo = pmportinfo->pmport_sata_drive;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11912
			ASSERT(sdinfo != NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11913
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11914
		pmportinfo->pmport_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11915
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11916
		/* Assuming cport */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11917
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11918
		if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11919
			if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11920
				pmultinfo =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11921
				    cportinfo->cport_devp.cport_sata_pmult;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11922
				ASSERT(pmultinfo != NULL);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 11923
			} else {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11924
				sdinfo = cportinfo->cport_devp.cport_sata_drive;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11925
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11926
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11927
		cportinfo->cport_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11928
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11929
	if (sdinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11930
		if ((sdinfo->satadrv_type & (SATA_VALID_DEV_TYPE)) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11931
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11932
			 * If a target node exists, try to offline
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11933
			 * a device and remove target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11934
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11935
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11936
			    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11937
			/* We are addressing attached device, not a port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11938
			sata_device->satadev_addr.qual =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11939
			    sdinfo->satadrv_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11940
			tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11941
			    &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11942
			if (tdip != NULL && ndi_devi_offline(tdip,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11943
			    NDI_DEVI_REMOVE) != NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11944
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11945
				 * Problem
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11946
				 * The target node remained attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11947
				 * This happens when the device file was open
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11948
				 * or a node was waiting for resources.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11949
				 * Cannot do anything about it.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11950
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11951
				if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11952
					SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11953
					    "sata_hba_ioctl: disconnect: could "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11954
					    "not unconfigure device before "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11955
					    "disconnecting the SATA port %d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11956
					    cport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11957
				} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11958
					SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11959
					    "sata_hba_ioctl: disconnect: could "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11960
					    "not unconfigure device before "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11961
					    "disconnecting the SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11962
					    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11963
				}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11964
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11965
				 * Set DEVICE REMOVED state in the target
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11966
				 * node. It will prevent access to the device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11967
				 * even when a new device is attached, until
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11968
				 * the old target node is released, removed and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11969
				 * recreated for a new  device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11970
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11971
				sata_set_device_removed(tdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11972
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11973
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11974
				 * Instruct event daemon to try the target
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11975
				 * node cleanup later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11976
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11977
				sata_set_target_node_cleanup(
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11978
				    sata_hba_inst, &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11979
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11980
			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11981
			    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11982
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11983
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11984
		/* Remove and release sata_drive info structure. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11985
		if (pmportinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11986
			SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11987
			    NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11988
			pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11989
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11990
			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11991
			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11992
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11993
		(void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11994
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11995
#if 0
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11996
	else if (pmultinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11997
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11998
		 * Port Multiplier itself needs special handling.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 11999
		 * All device ports need to be processed here!
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12000
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12001
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12002
#endif
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12003
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12004
	/* Just ask HBA driver to deactivate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12005
	/*	sata_device->satadev_addr.qual = SATA_ADDR_DCPORT; */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12006
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12007
	rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12008
	    (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12009
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12010
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12011
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12012
	 * without the hint (to force listener to investivate the state).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12013
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12014
	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12015
	    SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12016
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12017
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12018
	sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12019
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12020
	if (rval != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12021
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12022
		 * Port deactivation failure - do not
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12023
		 * change port state unless the state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12024
		 * returned by HBA indicates a port failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12025
		 * NOTE: device structures were released, so devices now are
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12026
		 * invisible! Port reset is needed to re-enumerate devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12027
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12028
		if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12029
			if (pmportinfo != NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12030
				pmportinfo->pmport_state = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12031
			else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12032
				cportinfo->cport_state = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12033
			rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12034
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12035
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12036
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12037
		 * Deactivation succeded. From now on the sata framework
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12038
		 * will not care what is happening to the device, until
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12039
		 * the port is activated again.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12040
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12041
		cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12042
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12043
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12044
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12045
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12046
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12047
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12048
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12049
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12050
 * Process sata port connect request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12051
 * The sata cfgadm pluging will invoke this operation only if port was found
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12052
 * in the disconnect state (failed state is also treated as the disconnected
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12053
 * state).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12054
 * DEVCTL_AP_CONNECT would invoke  sata_hba_inst->satahba_tran->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12055
 * sata_tran_hotplug_ops->sata_tran_port_activate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12056
 * If successful and a device is found attached to the port,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12057
 * the initialization sequence is executed to attach a device structure to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12058
 * a port structure. The state of the port and a device would be set
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12059
 * appropriately.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12060
 * The device is not set in configured state (system-wise) by this operation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12061
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12062
 * Note, that activating the port may generate link events,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12063
 * so it is important that following processing and the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12064
 * event processing does not interfere with each other!
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12065
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12066
 * This operation may remove port failed state and will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12067
 * try to make port active and in good standing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12068
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12069
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12070
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12071
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12072
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12073
sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12074
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12075
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12076
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12077
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12078
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12079
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12080
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12081
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12082
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12083
	ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12084
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12085
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12086
	 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12087
	 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12088
	 * Perform sanity check now.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12089
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12090
	if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12091
		/* No physical port activation supported. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12092
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12093
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12094
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12095
	/* Just ask HBA driver to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12096
	if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12097
	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12098
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12099
		 * Port activation failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12100
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12101
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12102
		    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12103
		sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12104
		if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12105
			if (qual == SATA_ADDR_DCPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12106
				SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12107
				    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12108
				SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12109
				    "sata_hba_ioctl: connect: failed to "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12110
				    "activate SATA port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12111
			} else { /* port multiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12112
				SATA_PMPORT_STATE(sata_hba_inst, cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12113
				    pmport) = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12114
				SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12115
				    "sata_hba_ioctl: connect: failed to "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12116
				    "activate SATA port %d:%d", cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12117
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12118
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12119
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12120
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12121
		    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12122
		SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12123
		    "sata_hba_ioctl: connect: failed to activate SATA "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12124
		    "port %d:%d", cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12125
		return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12126
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12127
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12128
	/* Virgin port state - will be updated by the port re-probe. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12129
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12130
	if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12131
		SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12132
	else /* port multiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12133
		SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12134
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12135
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12136
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12137
	 * Probe the port to find its state and attached device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12138
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12139
	if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12140
	    SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12141
		rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12142
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12143
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12144
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12145
	 * without the hint
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12146
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12147
	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12148
	    SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12149
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12150
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12151
	 * If there is a device attached to the port, emit
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12152
	 * a message.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12153
	 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12154
	if (sata_device->satadev_type != SATA_DTYPE_NONE) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12155
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12156
		if (qual == SATA_ADDR_CPORT) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12157
			sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12158
			    "SATA device detected at port %d", cport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12159
			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12160
				/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12161
				 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12162
				 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12163
				sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12164
				    "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12165
				    "device at port %d", cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12166
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12167
		} else { /* port multiplier device port */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12168
			sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12169
			    "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12170
			    cport, pmport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12171
			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12172
				/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12173
				 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12174
				 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12175
				sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12176
				    "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12177
				    "device at port %d:%d", cport, pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12178
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12179
		}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12180
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12181
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12182
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12183
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12184
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12185
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12186
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12187
 * Process sata device unconfigure request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12188
 * The unconfigure operation uses generic nexus operation to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12189
 * offline a device. It leaves a target device node attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12190
 * and obviously sata_drive_info attached as well, because
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12191
 * from the hardware point of view nothing has changed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12192
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12193
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12194
sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12195
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12196
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12197
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12198
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12199
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12200
	/* We are addressing attached device, not a port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12201
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12202
		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12203
	else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12204
		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12205
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12206
	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12207
	    &sata_device->satadev_addr)) != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12208
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12209
		if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12210
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12211
			    "sata_hba_ioctl: unconfigure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12212
			    "failed to unconfigure device at SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12213
			    sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12214
			    sata_device->satadev_addr.pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12215
			rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12216
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12217
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12218
		 * The target node devi_state should be marked with
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12219
		 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12220
		 * This would be the indication for cfgadm that
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12221
		 * the AP node occupant state is 'unconfigured'.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12222
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12223
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12224
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12225
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12226
		 * This would indicate a failure on the part of cfgadm
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12227
		 * to detect correct state of the node prior to this
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12228
		 * call - one cannot unconfigure non-existing device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12229
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12230
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12231
		    "sata_hba_ioctl: unconfigure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12232
		    "attempt to unconfigure non-existing device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12233
		    "at SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12234
		    sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12235
		    sata_device->satadev_addr.pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12236
		rv = ENXIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12237
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12238
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12239
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12240
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12241
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12242
 * Process sata device configure request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12243
 * If port is in a failed state, operation is aborted - one has to use
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12244
 * an explicit connect or port activate request to try to get a port into
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12245
 * non-failed mode. Port reset wil also work in such situation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12246
 * If the port is in disconnected (shutdown) state, the connect operation is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12247
 * attempted prior to any other action.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12248
 * When port is in the active state, there is a device attached and the target
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12249
 * node exists, a device was most likely offlined.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12250
 * If target node does not exist, a new target node is created. In both cases
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12251
 * an attempt is made to online (configure) the device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12252
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12253
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12254
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12255
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12256
sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12257
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12258
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12259
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12260
	int rval;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12261
	boolean_t target = TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12262
	sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12263
	sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12264
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12265
	sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12266
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12267
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12268
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12269
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12270
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12271
	/* Get current port state */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12272
	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12273
	    (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12274
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12275
	sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12276
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12277
	if (rval != SATA_SUCCESS ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12278
	    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12279
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12280
		 * Obviously, device on a failed port is not visible
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12281
		 */
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12282
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12283
		return (ENXIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12284
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12285
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12286
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12287
	if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12288
		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12289
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12290
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12291
	if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12292
		/* need to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12293
		target = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12294
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12295
		/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12296
		if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12297
			return (ENXIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12298
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12299
		/* Just let HBA driver to activate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12300
		if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12301
		    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12302
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12303
			 * Port activation failure - do not change port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12304
			 * unless the state returned by HBA indicates a port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12305
			 * failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12306
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12307
			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12308
			    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12309
			sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12310
			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12311
				if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12312
					pmportinfo->pmport_state =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12313
					    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12314
				else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12315
					cportinfo->cport_state =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12316
					    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12317
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12318
			mutex_exit(&SATA_CPORT_INFO(
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12319
			    sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12320
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12321
			    "sata_hba_ioctl: configure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12322
			    "failed to activate SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12323
			    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12324
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12325
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12326
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12327
		 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12328
		 * without the hint.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12329
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12330
		sata_gen_sysevent(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12331
		    &sata_device->satadev_addr, SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12332
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12333
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12334
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12335
		/* Virgin port state */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12336
		if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12337
			pmportinfo->pmport_state = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12338
		else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12339
			cportinfo->cport_state = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12340
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12341
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12342
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12343
	 * Always reprobe port, to get current device info.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12344
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12345
	if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12346
	    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12347
		return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12348
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12349
	if (sata_device->satadev_type != SATA_DTYPE_NONE && target == FALSE) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12350
		if (qual == SATA_ADDR_PMPORT) {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12351
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12352
			 * That's the transition from "inactive" port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12353
			 * to active one with device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12354
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12355
			sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12356
			    "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12357
			    cport, pmport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12358
		} else {
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12359
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12360
			 * When PM is attached to the cport and cport is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12361
			 * activated, every PM device port needs to be reprobed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12362
			 * We need to emit message for all devices detected
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12363
			 * at port multiplier's device ports.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12364
			 * Add such code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12365
			 * For now, just inform about device attached to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12366
			 * cport.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12367
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12368
			sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12369
			    "SATA device detected at port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12370
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12371
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12372
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12373
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12374
	 * This is where real configuration operation starts.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12375
	 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12376
	 * When PM is attached to the cport and cport is activated,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12377
	 * devices attached PM device ports may have to be configured
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12378
	 * explicitly. This may change when port multiplier is supported.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12379
	 * For now, configure only disks and other valid target devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12380
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12381
	if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12382
		if (qual == SATA_ADDR_CPORT) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12383
			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12384
				/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12385
				 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12386
				 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12387
				sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12388
				    "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12389
				    "device at port %d", cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12390
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12391
		} else { /* port multiplier device port */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12392
			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12393
				/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12394
				 * A device was not successfully identified
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12395
				 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12396
				sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12397
				    "Could not identify SATA "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12398
				    "device at port %d:%d", cport, pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12399
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12400
		}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12401
		return (ENXIO);		/* No device to configure */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12402
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12403
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12404
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12405
	 * Here we may have a device in reset condition,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12406
	 * but because we are just configuring it, there is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12407
	 * no need to process the reset other than just
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12408
	 * to clear device reset condition in the HBA driver.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12409
	 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12410
	 * cause a first command sent the HBA driver with the request
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12411
	 * to clear device reset condition.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12412
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12413
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12414
	if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12415
		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12416
	else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12417
		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12418
	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12419
	if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12420
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12421
		return (ENXIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12422
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12423
	if (sdinfo->satadrv_event_flags &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12424
	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12425
		sdinfo->satadrv_event_flags = 0;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12426
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12427
	sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12428
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12429
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12430
	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12431
	    &sata_device->satadev_addr)) != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12432
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12433
		 * Target node exists. Verify, that it belongs
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12434
		 * to existing, attached device and not to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12435
		 * a removed device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12436
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12437
		if (sata_check_device_removed(tdip) == B_TRUE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12438
			if (qual == SATA_ADDR_DPMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12439
				sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12440
				    "SATA device at port %d cannot be "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12441
				    "configured. "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12442
				    "Application(s) accessing "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12443
				    "previously attached device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12444
				    "have to release it before newly "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12445
				    "inserted device can be made accessible.",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12446
				    cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12447
			else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12448
				sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12449
				    "SATA device at port %d:%d cannot be"
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12450
				    "configured. "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12451
				    "Application(s) accessing "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12452
				    "previously attached device "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12453
				    "have to release it before newly "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12454
				    "inserted device can be made accessible.",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12455
				    cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12456
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12457
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12458
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12459
		 * Device was not removed and re-inserted.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12460
		 * Try to online it.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12461
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12462
		if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12463
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12464
			    "sata_hba_ioctl: configure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12465
			    "onlining device at SATA port "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12466
			    "%d:%d failed", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12467
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12468
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12469
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12470
		    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12471
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12472
		if (qual == SATA_ADDR_DPMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12473
			pmportinfo->pmport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12474
		else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12475
			cportinfo-> cport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12476
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12477
		mutex_exit(&SATA_CPORT_INFO(
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12478
		    sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12479
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12480
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12481
		 * No target node - need to create a new target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12482
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12483
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12484
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12485
		if (qual == SATA_ADDR_DPMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12486
			pmportinfo->pmport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12487
		else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12488
			cportinfo-> cport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12489
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12490
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12491
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12492
		tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12493
		    sata_hba_inst, &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12494
		if (tdip == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12495
			/* Configure operation failed */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12496
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12497
			    "sata_hba_ioctl: configure: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12498
			    "configuring SATA device at port %d:%d "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12499
			    "failed", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12500
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12501
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12502
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12503
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12504
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12505
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12506
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12507
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12508
 * Process ioctl deactivate port request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12509
 * Arbitrarily unconfigure attached device, if any.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12510
 * Even if the unconfigure fails, proceed with the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12511
 * port deactivation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12512
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12513
 * NOTE: Port Multiplier code is not completed and tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12514
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12515
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12516
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12517
sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12518
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12519
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12520
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12521
	int rval, rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12522
	sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12523
	sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12524
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12525
	sata_drive_info_t *sdinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12526
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12527
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12528
	if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12529
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12530
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12531
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12532
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12533
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12534
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12535
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12536
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12537
	if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12538
		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12539
		if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12540
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12541
			 * For now, assume that port multiplier is not
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12542
			 * supported, i.e. deal only with valid devices
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12543
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12544
			if ((cportinfo->cport_dev_type &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12545
			    SATA_VALID_DEV_TYPE) != 0)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12546
				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12547
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12548
			 * If attached device is a port multiplier, we will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12549
			 * have to unconfigure all devices attached to the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12550
			 * port multiplier. Add this code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12551
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12552
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12553
		cportinfo->cport_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12554
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12555
		/* Port multiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12556
		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12557
		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12558
		if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12559
		    (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12560
			sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12561
		pmportinfo->pmport_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12562
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12563
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12564
	if (sdinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12565
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12566
		 * If a target node exists, try to offline a device and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12567
		 * to remove a target node.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12568
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12569
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12570
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12571
		tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12572
		    &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12573
		if (tdip != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12574
			/* target node exist */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12575
			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12576
			    "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12577
			    "target node exists.", NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12578
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12579
			if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12580
			    NDI_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12581
				SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12582
				    "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12583
				    "failed to unconfigure device at port "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12584
				    "%d:%d before deactivating the port",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12585
				    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12586
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12587
				 * Set DEVICE REMOVED state in the target
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12588
				 * node. It will prevent an access to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12589
				 * the device even when a new device is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12590
				 * attached, until the old target node is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12591
				 * released, removed and recreated for a new
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12592
				 * device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12593
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12594
				sata_set_device_removed(tdip);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12595
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12596
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12597
				 * Instruct the event daemon to try the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12598
				 * target node cleanup later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12599
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12600
				sata_set_target_node_cleanup(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12601
				    &sata_device->satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12602
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12603
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12604
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12605
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12606
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12607
		 * In any case, remove and release sata_drive_info
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12608
		 * structure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12609
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12610
		if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12611
			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12612
			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12613
		} else { /* port multiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12614
			SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12615
			pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12616
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12617
		(void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12618
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12619
	if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12620
		cportinfo->cport_state &= ~(SATA_STATE_PROBED |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12621
		    SATA_STATE_PROBING);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12622
	} else { /* port multiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12623
		pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12624
		    SATA_STATE_PROBING);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12625
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12626
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12627
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12628
	/* Just let HBA driver to deactivate port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12629
	sata_device->satadev_addr.qual = qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12630
	rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12631
	    (SATA_DIP(sata_hba_inst), sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12632
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12633
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12634
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12635
	 * without the hint
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12636
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12637
	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12638
	    SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12639
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12640
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12641
	sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12642
	if (qual == SATA_ADDR_CPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12643
		if (rval != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12644
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12645
			 * Port deactivation failure - do not change port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12646
			 * unless the state returned by HBA indicates a port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12647
			 * failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12648
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12649
			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12650
				SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12651
				    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12652
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12653
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12654
			    "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12655
			    "cannot deactivate SATA port %d", cport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12656
			rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12657
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12658
			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12659
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12660
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12661
		if (rval != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12662
			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12663
				SATA_PMPORT_STATE(sata_hba_inst, cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12664
				    pmport) = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12665
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12666
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12667
			    "sata_hba_ioctl: port deactivate: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12668
			    "cannot deactivate SATA port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12669
			    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12670
			rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12671
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12672
			pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12673
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12674
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12675
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12676
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12677
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12678
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12679
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12680
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12681
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12682
 * Process ioctl port activate request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12683
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12684
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12685
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12686
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12687
sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12688
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12689
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12690
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12691
	sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12692
	sata_pmport_info_t *pmportinfo = NULL;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12693
	boolean_t dev_existed = TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12694
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12695
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12696
	if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12697
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12698
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12699
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12700
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12701
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12702
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12703
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12704
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12705
	if (qual == SATA_ADDR_PMPORT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12706
		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12707
		if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12708
		    pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12709
			dev_existed = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12710
	} else { /* cport */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12711
		if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12712
		    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12713
			dev_existed = FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12714
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12715
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12716
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12717
	/* Just let HBA driver to activate port, if necessary */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12718
	if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12719
	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12720
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12721
		 * Port activation failure - do not change port state unless
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12722
		 * the state returned by HBA indicates a port failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12723
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12724
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12725
		    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12726
		sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12727
		if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12728
			if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12729
				pmportinfo->pmport_state = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12730
			else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12731
				cportinfo->cport_state = SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12732
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12733
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12734
			    cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12735
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12736
			    "sata_hba_ioctl: port activate: cannot activate "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12737
			    "SATA port %d:%d", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12738
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12739
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12740
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12741
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12742
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12743
	if (qual == SATA_ADDR_PMPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12744
		pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12745
	else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12746
		cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12747
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12748
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12749
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12750
	 * Re-probe port to find its current state and possibly attached device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12751
	 * Port re-probing may change the cportinfo device type if device is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12752
	 * found attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12753
	 * If port probing failed, the device type would be set to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12754
	 * SATA_DTYPE_NONE.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12755
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12756
	(void) sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12757
	    SATA_DEV_IDENTIFY_RETRY);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12758
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12759
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12760
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12761
	 * without the hint.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12762
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12763
	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12764
	    SE_NO_HINT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12765
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12766
	if (dev_existed == FALSE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12767
		if (qual == SATA_ADDR_PMPORT &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12768
		    pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12769
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12770
			 * That's the transition from the "inactive" port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12771
			 * or the active port without a device attached to the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12772
			 * active port state with a device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12773
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12774
			sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12775
			    "SATA device detected at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12776
			    cport, pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12777
		} else if (qual == SATA_ADDR_CPORT &&
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12778
		    cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12779
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12780
			 * That's the transition from the "inactive" port state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12781
			 * or the active port without a device attached to the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12782
			 * active port state with a device attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12783
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12784
			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12785
				sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12786
				    "SATA device detected at port %d", cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12787
			} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12788
				sata_log(sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12789
				    "SATA port multiplier detected at port %d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12790
				    cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12791
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12792
				 * Because the detected device is a port
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12793
				 * multiplier, we need to reprobe every device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12794
				 * port on the port multiplier and show every
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12795
				 * device found attached.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12796
				 * Add this code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12797
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12798
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12799
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12800
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12801
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12802
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12803
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12804
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12805
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12806
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12807
 * Process ioctl reset port request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12808
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12809
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12810
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12811
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12812
sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12813
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12814
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12815
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12816
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12817
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12818
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12819
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12820
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12821
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12822
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12823
	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12824
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12825
		    "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12826
		    "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12827
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12828
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12829
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12830
	/* Ask HBA to reset port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12831
	if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12832
	    sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12833
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12834
		    "sata_hba_ioctl: reset port: failed %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12835
		    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12836
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12837
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12838
		sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12839
		if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12840
			SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12841
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12842
		else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12843
			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12844
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12845
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12846
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12847
		rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12848
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12849
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12850
	 * Beacuse the port was reset, it should be probed and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12851
	 * attached device reinitialized. At this point the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12852
	 * port state is unknown - it's state is HBA-specific.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12853
	 * Re-probe port to get its state.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12854
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12855
	if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12856
	    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12857
		rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12858
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12859
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12860
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12861
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12862
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12863
 * Process ioctl reset device request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12864
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12865
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12866
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12867
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12868
sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12869
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12870
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12871
	sata_drive_info_t *sdinfo;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12872
	int cport, pmport;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12873
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12874
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12875
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12876
	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12877
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12878
		    "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12879
		    "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12880
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12881
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12882
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12883
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12884
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12885
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12886
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12887
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12888
		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12889
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12890
		    sata_device->satadev_addr.cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12891
	} else { /* port multiplier */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12892
		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12893
		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12894
		    sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12895
		    sata_device->satadev_addr.pmport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12896
	}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12897
	if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12898
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12899
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12900
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12901
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12902
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12903
	/* Ask HBA to reset device */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12904
	if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12905
	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12906
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12907
		    "sata_hba_ioctl: reset device: failed at port %d:%d",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12908
		    cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12909
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12910
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12911
		sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12912
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12913
		 * Device info structure remains attached. Another device reset
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12914
		 * or port disconnect/connect and re-probing is
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12915
		 * needed to change it's state
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12916
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12917
		sdinfo->satadrv_state &= ~SATA_STATE_READY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12918
		sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12919
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12920
		rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12921
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12922
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12923
	 * If attached device was a port multiplier, some extra processing
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12924
	 * may be needed, to bring it back (if port re-probing did not handle
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12925
	 * it). Add such code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12926
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12927
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12928
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12929
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12930
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12931
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12932
 * Process ioctl reset all request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12933
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12934
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12935
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12936
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12937
sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12938
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12939
	sata_device_t sata_device;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12940
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12941
	int tcport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12942
	int tpmport = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12943
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12944
	sata_device.satadev_rev = SATA_DEVICE_REV;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12945
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12946
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12947
	 * There is no protection here for configured devices.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12948
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12949
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12950
	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12951
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12952
		    "sata_hba_ioctl: sata_hba_tran missing required "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12953
		    "function sata_tran_reset_dport"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12954
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12955
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12956
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12957
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12958
	 * Need to lock all ports, not just one.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12959
	 * If any port is locked by event processing, fail the whole operation.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12960
	 * One port is already locked, but for simplicity lock it again.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12961
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12962
	for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12963
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12964
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12965
		if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12966
		    cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12967
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12968
			    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12969
			rv = EBUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12970
			break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12971
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12972
			SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12973
			    cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12974
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12975
			 * If there is a port multiplier attached, we may need
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12976
			 * to lock its port as well. If so, add such code here.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12977
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12978
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12979
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12980
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12981
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12982
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12983
	if (rv == 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12984
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12985
		 * All cports were successfully locked.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12986
		 * Reset main SATA controller only for now - no PMult.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12987
		 * Set the device address to port 0, to have a valid device
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12988
		 * address.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12989
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12990
		sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12991
		sata_device.satadev_addr.cport = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 12992
		sata_device.satadev_addr.pmport = 0;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12993
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12994
		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12995
		    (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12996
			SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12997
			    "sata_hba_ioctl: reset controller failed"));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12998
			return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 12999
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13000
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13001
		 * Because ports were reset, port states are unknown.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13002
		 * They should be re-probed to get their state and
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13003
		 * attached devices should be reinitialized.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13004
		 * Add code here to re-probe port multiplier device ports.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13005
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13006
		for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13007
		    tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13008
			sata_device.satadev_addr.cport = tcport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13009
			sata_device.satadev_addr.pmport = tpmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13010
			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13011
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13012
			if (sata_reprobe_port(sata_hba_inst, &sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13013
			    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13014
				rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13015
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13016
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13017
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13018
	 * Unlock all ports
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13019
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13020
	for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13021
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13022
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13023
		SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13024
		    cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13025
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13026
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13027
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13028
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13029
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13030
	 * This operation returns EFAULT if either reset
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13031
	 * controller failed or a re-probing of any port failed.
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13032
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13033
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13034
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13035
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13036
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13037
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13038
 * Process ioctl port self test request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13039
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13040
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13041
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13042
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13043
sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13044
    sata_device_t *sata_device)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13045
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13046
	int cport, pmport, qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13047
	int rv = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13048
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13049
	/* Sanity check */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13050
	if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13051
		return (ENOTSUP);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13052
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13053
	cport = sata_device->satadev_addr.cport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13054
	pmport = sata_device->satadev_addr.pmport;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13055
	qual = sata_device->satadev_addr.qual;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13056
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13057
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13058
	 * There is no protection here for a configured
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13059
	 * device attached to this port.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13060
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13061
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13062
	if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13063
	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13064
		SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13065
		    "sata_hba_ioctl: port selftest: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13066
		    "failed port %d:%d", cport, pmport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13067
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13068
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13069
		sata_update_port_info(sata_hba_inst, sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13070
		if (qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13071
			SATA_CPORT_STATE(sata_hba_inst, cport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13072
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13073
		else /* port ultiplier device port */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13074
			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13075
			    SATA_PSTATE_FAILED;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13076
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13077
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13078
		    cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13079
		return (EIO);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13080
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13081
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13082
	 * Beacuse the port was reset in the course of testing, it should be
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13083
	 * re-probed and attached device state should be restored. At this
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13084
	 * point the port state is unknown - it's state is HBA-specific.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13085
	 * Force port re-probing to get it into a known state.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13086
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13087
	if (sata_reprobe_port(sata_hba_inst, sata_device,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13088
	    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13089
		rv = EIO;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13090
	return (rv);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13091
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13092
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13093
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13094
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13095
 * sata_cfgadm_state:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13096
 * Use the sata port state and state of the target node to figure out
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13097
 * the cfgadm_state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13098
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13099
 * The port argument is a value with encoded cport,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13100
 * pmport and address qualifier, in the same manner as a scsi target number.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13101
 * SCSI_TO_SATA_CPORT macro extracts cport number,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13102
 * SCSI_TO_SATA_PMPORT extracts pmport number and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13103
 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13104
 *
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13105
 * For now, support is for cports only - no port multiplier device ports.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13106
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13107
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13108
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13109
sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13110
    devctl_ap_state_t *ap_state)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13111
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13112
	uint16_t	cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13113
	int		port_state;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13114
	sata_drive_info_t *sdinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13115
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13116
	/* Cport only */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13117
	cport = SCSI_TO_SATA_CPORT(port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13118
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13119
	port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13120
	if (port_state & SATA_PSTATE_SHUTDOWN ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13121
	    port_state & SATA_PSTATE_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13122
		ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13123
		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13124
		if (port_state & SATA_PSTATE_FAILED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13125
			ap_state->ap_condition = AP_COND_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13126
		else
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13127
			ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13128
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13129
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13130
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13131
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13132
	/* Need to check pmult device port here as well, when supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13133
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13134
	/* Port is enabled and ready */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13135
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13136
	switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13137
	case SATA_DTYPE_NONE:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13138
	{
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13139
		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13140
		ap_state->ap_condition = AP_COND_OK;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13141
		/* No device attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13142
		ap_state->ap_rstate = AP_RSTATE_EMPTY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13143
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13144
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13145
	case SATA_DTYPE_UNKNOWN:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13146
	case SATA_DTYPE_PMULT:	/* Until PMult is supported */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13147
	case SATA_DTYPE_ATADISK:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13148
	case SATA_DTYPE_ATAPICD:
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13149
	case SATA_DTYPE_ATAPITAPE:
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 13150
	case SATA_DTYPE_ATAPIDISK:
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13151
	{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13152
		dev_info_t *tdip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13153
		dev_info_t *dip = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13154
		int circ;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13155
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13156
		dip = SATA_DIP(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13157
		tdip = sata_get_target_dip(dip, port);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13158
		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13159
		if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13160
			ndi_devi_enter(dip, &circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13161
			mutex_enter(&(DEVI(tdip)->devi_lock));
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13162
			if (DEVI_IS_DEVICE_REMOVED(tdip)) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13163
				/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13164
				 * There could be the case where previously
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13165
				 * configured and opened device was removed
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13166
				 * and unknown device was plugged.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13167
				 * In such case we want to show a device, and
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13168
				 * its configured or unconfigured state but
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13169
				 * indicate unusable condition untill the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13170
				 * old target node is released and removed.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13171
				 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13172
				ap_state->ap_condition = AP_COND_UNUSABLE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13173
			} else {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13174
				mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13175
				    cport));
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13176
				sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13177
				    cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13178
				if (sdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13179
					if ((sdinfo->satadrv_state &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13180
					    SATA_DSTATE_FAILED) != 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13181
						ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13182
						    AP_COND_FAILED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13183
					else
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13184
						ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13185
						    AP_COND_OK;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13186
				} else {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13187
					ap_state->ap_condition =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13188
					    AP_COND_UNKNOWN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13189
				}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13190
				mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13191
				    cport));
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13192
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13193
			if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13194
			    (DEVI_IS_DEVICE_DOWN(tdip))) {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13195
				ap_state->ap_ostate =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13196
				    AP_OSTATE_UNCONFIGURED;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13197
			} else {
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13198
				ap_state->ap_ostate =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13199
				    AP_OSTATE_CONFIGURED;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13200
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13201
			mutex_exit(&(DEVI(tdip)->devi_lock));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13202
			ndi_devi_exit(dip, circ);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13203
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13204
			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13205
			ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13206
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13207
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13208
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13209
	default:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13210
		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13211
		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13212
		ap_state->ap_condition = AP_COND_UNKNOWN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13213
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13214
		 * This is actually internal error condition (non fatal),
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 13215
		 * because we have already checked all defined device types.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13216
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13217
		SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13218
		    "sata_cfgadm_state: Internal error: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13219
		    "unknown device type"));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13220
		break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13221
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13222
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 13223
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13224
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13225
/*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13226
 * Process ioctl get device path request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13227
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13228
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13229
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13230
static int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13231
sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13232
    sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13233
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13234
	char path[MAXPATHLEN];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13235
	uint32_t size;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13236
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13237
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13238
	(void) strcpy(path, "/devices");
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13239
	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13240
	    &sata_device->satadev_addr)) == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13241
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13242
		 * No such device. If this is a request for a size, do not
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13243
		 * return EINVAL for non-existing target, because cfgadm
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13244
		 * will then indicate a meaningless ioctl failure.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13245
		 * If this is a request for a path, indicate invalid
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13246
		 * argument.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13247
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13248
		if (ioc->get_size == 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13249
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13250
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13251
		(void) ddi_pathname(tdip, path + strlen(path));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13252
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13253
	size = strlen(path) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13254
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13255
	if (ioc->get_size != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13256
		if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13257
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13258
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13259
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13260
		if (ioc->bufsiz != size)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13261
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13262
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13263
		else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13264
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13265
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13266
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13267
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13268
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13269
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13270
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13271
 * Process ioctl get attachment point type request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13272
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13273
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13274
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13275
static	int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13276
sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13277
    sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13278
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13279
	uint32_t	type_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13280
	const char	*ap_type;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13281
	int		dev_type;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13282
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13283
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13284
		dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13285
		    sata_device->satadev_addr.cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13286
	else /* pmport */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13287
		dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13288
		    sata_device->satadev_addr.cport,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13289
		    sata_device->satadev_addr.pmport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13290
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13291
	switch (dev_type) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13292
	case SATA_DTYPE_NONE:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13293
		ap_type = "port";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13294
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13295
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13296
	case SATA_DTYPE_ATADISK:
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 13297
	case SATA_DTYPE_ATAPIDISK:
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13298
		ap_type = "disk";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13299
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13300
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13301
	case SATA_DTYPE_ATAPICD:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13302
		ap_type = "cd/dvd";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13303
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13304
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13305
	case SATA_DTYPE_ATAPITAPE:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13306
		ap_type = "tape";
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13307
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13308
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13309
	case SATA_DTYPE_PMULT:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13310
		ap_type = "pmult";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13311
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13312
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13313
	case SATA_DTYPE_UNKNOWN:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13314
		ap_type = "unknown";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13315
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13316
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13317
	default:
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13318
		ap_type = "unsupported";
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13319
		break;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13320
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13321
	} /* end of dev_type switch */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13322
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13323
	type_len = strlen(ap_type) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13324
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13325
	if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13326
		if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13327
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13328
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13329
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13330
		if (ioc->bufsiz != type_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13331
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13332
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13333
		if (ddi_copyout((void *)ap_type, ioc->buf,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13334
		    ioc->bufsiz, mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13335
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13336
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13337
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13338
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13339
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13340
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13341
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13342
 * Process ioctl get device model info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13343
 * This operation should return to cfgadm the device model
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13344
 * information string
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13345
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13346
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13347
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13348
static	int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13349
sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13350
    sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13351
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13352
	sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13353
	uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13354
	char ap_info[SATA_ID_MODEL_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13355
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13356
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13357
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13358
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13359
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13360
		    sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13361
	else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13362
		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13363
		    sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13364
		    sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13365
	if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13366
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13367
		    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13368
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13369
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13370
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13371
#ifdef	_LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13372
	swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13373
#else	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13374
	bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13375
#endif	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13376
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13377
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13378
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13379
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13380
	ap_info[SATA_ID_MODEL_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13381
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13382
	info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13383
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13384
	if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13385
		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13386
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13387
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13388
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13389
		if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13390
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13391
		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13392
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13393
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13394
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13395
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13396
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13397
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13398
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13399
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13400
 * Process ioctl get device firmware revision info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13401
 * This operation should return to cfgadm the device firmware revision
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13402
 * information string
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13403
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13404
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13405
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13406
static	int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13407
sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13408
    sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13409
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13410
	sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13411
	uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13412
	char ap_info[SATA_ID_FW_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13413
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13414
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13415
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13416
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13417
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13418
		    sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13419
	else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13420
		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13421
		    sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13422
		    sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13423
	if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13424
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13425
		    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13426
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13427
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13428
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13429
#ifdef	_LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13430
	swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13431
#else	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13432
	bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13433
#endif	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13434
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13435
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13436
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13437
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13438
	ap_info[SATA_ID_FW_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13439
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13440
	info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13441
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13442
	if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13443
		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13444
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13445
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13446
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13447
		if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13448
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13449
		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13450
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13451
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13452
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13453
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13454
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13455
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13456
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13457
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13458
 * Process ioctl get device serial number info request.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13459
 * This operation should return to cfgadm the device serial number string.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13460
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13461
 * NOTE: Port multiplier code is not completed nor tested.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13462
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13463
static	int
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13464
sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13465
    sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13466
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13467
	sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13468
	uint32_t info_len;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13469
	char ap_info[SATA_ID_SERIAL_LEN + 1];
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13470
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13471
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13472
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13473
	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13474
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13475
		    sata_device->satadev_addr.cport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13476
	else /* port multiplier */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13477
		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13478
		    sata_device->satadev_addr.cport,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13479
		    sata_device->satadev_addr.pmport);
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13480
	if (sdinfo == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13481
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13482
		    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13483
		return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13484
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13485
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13486
#ifdef	_LITTLE_ENDIAN
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13487
	swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13488
#else	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13489
	bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13490
#endif	/* _LITTLE_ENDIAN */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13491
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13492
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13493
	    sata_device->satadev_addr.cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13494
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13495
	ap_info[SATA_ID_SERIAL_LEN] = '\0';
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13496
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13497
	info_len = strlen(ap_info) + 1;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13498
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13499
	if (ioc->get_size) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13500
		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13501
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13502
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13503
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13504
		if (ioc->bufsiz < info_len)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13505
			return (EINVAL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13506
		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13507
		    mode) != 0)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13508
			return (EFAULT);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13509
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13510
	return (0);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13511
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13512
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13513
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 13514
/*
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13515
 * Preset scsi extended sense data (to NO SENSE)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13516
 * First 18 bytes of the sense data are preset to current valid sense
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13517
 * with a key NO SENSE data.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13518
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13519
 * Returns void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13520
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13521
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13522
sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13523
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13524
	sense->es_valid = 1;		/* Valid sense */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13525
	sense->es_class = CLASS_EXTENDED_SENSE;	/* 0x70 - current err */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13526
	sense->es_key = KEY_NO_SENSE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13527
	sense->es_info_1 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13528
	sense->es_info_2 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13529
	sense->es_info_3 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13530
	sense->es_info_4 = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13531
	sense->es_add_len = 10;	/* Additional length - replace with a def */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13532
	sense->es_cmd_info[0] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13533
	sense->es_cmd_info[1] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13534
	sense->es_cmd_info[2] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13535
	sense->es_cmd_info[3] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13536
	sense->es_add_code = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13537
	sense->es_qual_code = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13538
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13539
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13540
/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13541
 * Register a legacy cmdk-style devid for the target (disk) device.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13542
 *
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13543
 * Note: This function is called only when the HBA devinfo node has the
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13544
 * property "use-cmdk-devid-format" set. This property indicates that
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13545
 * devid compatible with old cmdk (target) driver is to be generated
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13546
 * for any target device attached to this controller. This will take
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13547
 * precedence over the devid generated by sd (target) driver.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13548
 * This function is derived from cmdk_devid_setup() function in cmdk.c.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13549
 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13550
static void
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13551
sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13552
{
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13553
	char	*hwid;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13554
	int	modlen;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13555
	int	serlen;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13556
	int	rval;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13557
	ddi_devid_t	devid;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13558
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13559
	/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13560
	 * device ID is a concatanation of model number, "=", serial number.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13561
	 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13562
	hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13563
	bcopy(&sdinfo->satadrv_id.ai_model, hwid,
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13564
	    sizeof (sdinfo->satadrv_id.ai_model));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13565
	swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13566
	modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13567
	if (modlen == 0)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13568
		goto err;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13569
	hwid[modlen++] = '=';
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13570
	bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13571
	    sizeof (sdinfo->satadrv_id.ai_drvser));
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13572
	swab(&hwid[modlen], &hwid[modlen],
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 13573
	    sizeof (sdinfo->satadrv_id.ai_drvser));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13574
	serlen = sata_check_modser(&hwid[modlen],
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 13575
	    sizeof (sdinfo->satadrv_id.ai_drvser));
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13576
	if (serlen == 0)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13577
		goto err;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13578
	hwid[modlen + serlen] = 0; /* terminate the hwid string */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13579
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13580
	/* initialize/register devid */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13581
	if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
9704
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13582
	    (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13583
		rval = ddi_devid_register(dip, devid);
9704
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13584
		/*
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13585
		 * Free up the allocated devid buffer.
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13586
		 * NOTE: This doesn't mean unregistering devid.
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13587
		 */
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13588
		ddi_devid_free(devid);
691bf4370bc1 6826775 devid_str_decode_id leaks
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 9699
diff changeset
 13589
	}
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13590
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13591
	if (rval != DDI_SUCCESS)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13592
		cmn_err(CE_WARN, "sata: failed to create devid for the disk"
5014
25415d843402 6495271 SATA module should inform HBA the drive's queue depth
pawelw
parents: 4876
diff changeset
 13593
		    " on port %d", sdinfo->satadrv_addr.cport);
4876
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13594
err:
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13595
	kmem_free(hwid, LEGACY_HWID_LEN);
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13596
}
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13597
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13598
/*
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13599
 * valid model/serial string must contain a non-zero non-space characters.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13600
 * trim trailing spaces/NULLs.
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13601
 */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13602
static int
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13603
sata_check_modser(char *buf, int buf_len)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13604
{
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13605
	boolean_t ret;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13606
	char *s;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13607
	int i;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13608
	int tb;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13609
	char ch;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13610
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13611
	ret = B_FALSE;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13612
	s = buf;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13613
	for (i = 0; i < buf_len; i++) {
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13614
		ch = *s++;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13615
		if (ch != ' ' && ch != '\0')
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13616
			tb = i + 1;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13617
		if (ch != ' ' && ch != '\0' && ch != '0')
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13618
			ret = B_TRUE;
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13619
	}
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13620
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13621
	if (ret == B_FALSE)
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13622
		return (0); /* invalid string */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13623
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13624
	return (tb); /* return length */
ecd69ba0713a PSARC/2006/501 Nvidia ck804/mcp55 SATA HBA driver
mlf
parents: 4862
diff changeset
 13625
}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13626
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13627
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13628
 * sata_set_drive_features function compares current device features setting
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13629
 * with the saved device features settings and, if there is a difference,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13630
 * it restores device features setting to the previously saved state.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13631
 * It also arbitrarily tries to select the highest supported DMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13632
 * Device Identify or Identify Packet Device data has to be current.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13633
 * At the moment read ahead and write cache are considered for all devices.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13634
 * For atapi devices, Removable Media Status Notification is set in addition
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13635
 * to common features.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13636
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13637
 * This function cannot be called in the interrupt context (it may sleep).
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13638
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13639
 * The input argument sdinfo should point to the drive info structure
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13640
 * to be updated after features are set. Note, that only
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13641
 * device (packet) identify data is updated, not the flags indicating the
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13642
 * supported features.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13643
 *
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13644
 * Returns SATA_SUCCESS if successful or there was nothing to do.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13645
 * Device Identify data in the drive info structure pointed to by the sdinfo
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13646
 * arguments is updated even when no features were set or changed.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13647
 *
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13648
 * Returns SATA_FAILURE if device features could not be set or DMA mode
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13649
 * for a disk cannot be set and device identify data cannot be fetched.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13650
 *
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13651
 * Returns SATA_RETRY if device features could not be set (other than disk
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13652
 * DMA mode) but the device identify data was fetched successfully.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13653
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13654
 * Note: This function may fail the port, making it inaccessible.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13655
 * In such case the explicit port disconnect/connect or physical device
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13656
 * detach/attach is required to re-evaluate port state again.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13657
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13658
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13659
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13660
sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13661
    sata_drive_info_t *sdinfo, int restore)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13662
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13663
	int rval = SATA_SUCCESS;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13664
	int rval_set;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13665
	sata_drive_info_t new_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13666
	char *finfo = "sata_set_drive_features: cannot";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13667
	char *finfox;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13668
	int cache_op;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13669
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13670
	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13671
	new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13672
	new_sdinfo.satadrv_type = sdinfo->satadrv_type;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13673
	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13674
		/*
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13675
		 * Cannot get device identification - caller may retry later
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13676
		 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13677
		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 13678
		    "%s fetch device identify data\n", finfo);
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13679
		return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13680
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13681
	finfox = (restore != 0) ? " restore device features" :
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13682
	    " initialize device features\n";
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13683
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13684
	switch (sdinfo->satadrv_type) {
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13685
	case SATA_DTYPE_ATADISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13686
		/* Arbitrarily set UDMA mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13687
		if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13688
		    SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13689
			SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13690
			    "%s set UDMA mode\n", finfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13691
			return (SATA_FAILURE);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13692
		}
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13693
		break;
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13694
	case SATA_DTYPE_ATAPICD:
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13695
	case SATA_DTYPE_ATAPITAPE:
8317
249d7b80428e 6767262 ahci driver should support Dell PowerVault RD1000 backup device
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8168
diff changeset
 13696
	case SATA_DTYPE_ATAPIDISK:
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13697
		/*  Set Removable Media Status Notification, if necessary */
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13698
		if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13699
		    restore != 0) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13700
			if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13701
			    (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13702
			    ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13703
			    SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13704
				/* Current setting does not match saved one */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13705
				if (sata_set_rmsn(sata_hba_inst, sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13706
				    sdinfo->satadrv_settings &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13707
				    SATA_DEV_RMSN) != SATA_SUCCESS)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13708
					rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13709
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13710
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13711
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13712
		 * We have to set Multiword DMA or UDMA, if it is supported, as
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13713
		 * we want to use DMA transfer mode whenever possible.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13714
		 * Some devices require explicit setting of the DMA mode.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13715
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13716
		if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13717
			/* Set highest supported DMA mode */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13718
			if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13719
			    SATA_SUCCESS) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13720
				SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13721
				    "%s set UDMA mode\n", finfo));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13722
				rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13723
			}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13724
		}
8010
95c42a8a213e 6703522 ahci driver needs to support SATA tape
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 7954
diff changeset
 13725
		break;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13726
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13727
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13728
	if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13729
	    !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13730
		/*
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13731
		 * neither READ AHEAD nor WRITE CACHE is supported
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13732
		 * - do nothing
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13733
		 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13734
		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13735
		    "settable features not supported\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13736
		goto update_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13737
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13738
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13739
	if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13740
	    (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13741
	    (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13742
	    (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13743
		/*
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13744
		 * both READ AHEAD and WRITE CACHE are enabled
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13745
		 * - Nothing to do
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13746
		 */
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13747
		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13748
		    "no device features to set\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13749
		goto update_sdinfo;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13750
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13751
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13752
	cache_op = 0;
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13753
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13754
	if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13755
		if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13756
		    !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13757
			/* Enable read ahead / read cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13758
			cache_op = SATAC_SF_ENABLE_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13759
			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13760
			    "enabling read cache\n", NULL);
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13761
		} else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13762
		    SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13763
			/* Disable read ahead  / read cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13764
			cache_op = SATAC_SF_DISABLE_READ_AHEAD;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13765
			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13766
			    "disabling read cache\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13767
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13768
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13769
		if (cache_op != 0) {
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13770
			/* Try to set read cache mode */
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13771
			rval_set = sata_set_cache_mode(sata_hba_inst,
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13772
			    &new_sdinfo, cache_op);
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13773
			if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13774
				rval = rval_set;
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13775
		}
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13776
	}
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13777
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13778
	cache_op = 0;
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13779
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13780
	if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13781
		if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13782
		    !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13783
			/* Enable write cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13784
			cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13785
			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13786
			    "enabling write cache\n", NULL);
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13787
		} else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13788
		    SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13789
			/* Disable write cache */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13790
			cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13791
			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13792
			    "disabling write cache\n", NULL);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13793
		}
9058
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13794
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13795
		if (cache_op != 0) {
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13796
			/* Try to set write cache mode */
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13797
			rval_set = sata_set_cache_mode(sata_hba_inst,
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13798
			    &new_sdinfo, cache_op);
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13799
			if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13800
				rval = rval_set;
a7b4d0b3fd3d 6803930 ahci task file errors on new development box
ying tian - Beijing China <Ying.Tian@Sun.COM>
parents: 8317
diff changeset
 13801
		}
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13802
	}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13803
	if (rval != SATA_SUCCESS)
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13804
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13805
		    "%s %s", finfo, finfox));
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 13806
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13807
update_sdinfo:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13808
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13809
	 * We need to fetch Device Identify data again
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13810
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13811
	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13812
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13813
		 * Cannot get device identification - retry later
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13814
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13815
		SATA_LOG_D((sata_hba_inst, CE_WARN,
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 13816
		    "%s re-fetch device identify data\n", finfo));
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13817
		rval = SATA_FAILURE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13818
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13819
	/* Copy device sata info. */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13820
	sdinfo->satadrv_id = new_sdinfo.satadrv_id;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13821
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13822
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13823
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13824
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13825
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13826
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13827
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13828
 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13829
 * unable to determine.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13830
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13831
 * Cannot be called in an interrupt context.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13832
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13833
 * Called by sata_build_lsense_page_2f()
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13834
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13835
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13836
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13837
sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13838
    sata_drive_info_t *sdinfo)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13839
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13840
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13841
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13842
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13843
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13844
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13845
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13846
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13847
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13848
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13849
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13850
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13851
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13852
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13853
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13854
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13855
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13856
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13857
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13858
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13859
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13860
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13861
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13862
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13863
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13864
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13865
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13866
	scmd->satacmd_flags.sata_special_regs = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13867
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13868
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13869
	/* Set up which registers need to be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13870
	scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13871
	scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13872
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13873
	/* Build SMART_RETURN_STATUS cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13874
	scmd->satacmd_addr_type = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13875
	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13876
	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13877
	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13878
	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13879
	scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13880
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13881
	scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13882
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13883
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13884
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13885
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13886
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13887
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13888
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13889
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13890
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13891
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13892
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13893
		 * Whoops, no SMART RETURN STATUS
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13894
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13895
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13896
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13897
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13898
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13899
		if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13900
			rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13901
			goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13902
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13903
		if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13904
			rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13905
			goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13906
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13907
		if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13908
		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13909
			rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13910
		else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13911
		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13912
			rval = 1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13913
		else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13914
			rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13915
			goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13916
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13917
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13918
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13919
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13920
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13921
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13922
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13923
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13924
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13925
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13926
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13927
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13928
 * Returns 0 if succeeded, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13929
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13930
 * Cannot be called in an interrupt context.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13931
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13932
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13933
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13934
sata_fetch_smart_data(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13935
	sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13936
	sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13937
	struct smart_data *smart_data)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13938
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13939
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13940
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13941
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13942
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13943
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13944
#if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13945
	ASSERT(sizeof (struct smart_data) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13946
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13947
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13948
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13949
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13950
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13951
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13952
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13953
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13954
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13955
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13956
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13957
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13958
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13959
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13960
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13961
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13962
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13963
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13964
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13965
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13966
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13967
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13968
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13969
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13970
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13971
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13972
	 * Allocate buffer for SMART data
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13973
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13974
	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13975
	    sizeof (struct smart_data));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13976
	if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13977
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13978
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13979
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13980
		    "sata_fetch_smart_data: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13981
		    "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13982
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13983
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13984
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13985
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13986
	/* Build SMART_READ_DATA cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13987
	scmd->satacmd_addr_type = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13988
	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13989
	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13990
	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13991
	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13992
	scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13993
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13994
	scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13995
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13996
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13997
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13998
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 13999
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14000
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14001
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14002
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14003
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14004
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14005
		 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14006
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14007
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14008
		goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14009
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14010
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14011
		    sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14012
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14013
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14014
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14015
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14016
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14017
		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14018
		    sizeof (struct smart_data));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14019
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14020
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14021
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14022
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14023
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14024
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14025
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14026
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14027
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14028
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14029
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14030
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14031
 * Used by LOG SENSE page 0x10
7510
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
 14032
 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
4f7a974ca062 6681317 sata module should reject scsi packets that may be executed synchronously in the interrupt context
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7246
diff changeset
 14033
 * Note: cannot be called in the interrupt context.
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14034
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14035
 * return 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14036
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14037
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14038
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14039
sata_ext_smart_selftest_read_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14040
	sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14041
	sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14042
	struct smart_ext_selftest_log *ext_selftest_log,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14043
	uint16_t block_num)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14044
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14045
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14046
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14047
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14048
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14049
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14050
#if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14051
	ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14052
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14053
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14054
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14055
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14056
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14057
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14058
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14059
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14060
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14061
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14062
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14063
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14064
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14065
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14066
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14067
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14068
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14069
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14070
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14071
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14072
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14073
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14074
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14075
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14076
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14077
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14078
	 * Allocate buffer for SMART extended self-test log
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14079
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14080
	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14081
	    sizeof (struct smart_ext_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14082
	if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14083
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14084
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14085
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14086
		    "sata_ext_smart_selftest_log: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14087
		    "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14088
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14089
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14090
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14091
	/* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14092
	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14093
	scmd->satacmd_sec_count_lsb = 1;	/* One sector of selftest log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14094
	scmd->satacmd_sec_count_msb = 0;	/* One sector of selftest log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14095
	scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14096
	scmd->satacmd_lba_low_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14097
	scmd->satacmd_lba_mid_lsb = block_num & 0xff;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14098
	scmd->satacmd_lba_mid_msb = block_num >> 8;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14099
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14100
	scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14101
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14102
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14103
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14104
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14105
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14106
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14107
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14108
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14109
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14110
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14111
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14112
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14113
		 * Whoops, no SMART selftest log info available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14114
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14115
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14116
		goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14117
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14118
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14119
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14120
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14121
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14122
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14123
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14124
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14125
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14126
		bcopy(scmd->satacmd_bp->b_un.b_addr,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14127
		    (uint8_t *)ext_selftest_log,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14128
		    sizeof (struct smart_ext_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14129
		rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14130
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14131
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14132
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14133
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14134
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14135
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14136
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14137
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14138
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14139
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14140
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14141
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14142
 * Returns 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14143
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14144
 * SMART self-test log data is returned in buffer pointed to by selftest_log
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14145
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14146
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14147
sata_smart_selftest_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14148
	sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14149
	sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14150
	struct smart_selftest_log *selftest_log)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14151
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14152
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14153
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14154
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14155
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14156
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14157
#if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14158
	ASSERT(sizeof (struct smart_selftest_log) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14159
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14160
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14161
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14162
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14163
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14164
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14165
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14166
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14167
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14168
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14169
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14170
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14171
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14172
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14173
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14174
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14175
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14176
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14177
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14178
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14179
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14180
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14181
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14182
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14183
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14184
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14185
	 * Allocate buffer for SMART SELFTEST LOG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14186
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14187
	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14188
	    sizeof (struct smart_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14189
	if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14190
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14191
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14192
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14193
		    "sata_smart_selftest_log: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14194
		    "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14195
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14196
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14197
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14198
	/* Build SMART_READ_LOG cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14199
	scmd->satacmd_addr_type = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14200
	scmd->satacmd_sec_count_lsb = 1;	/* One sector of SMART log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14201
	scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14202
	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14203
	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14204
	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14205
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14206
	scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14207
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14208
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14209
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14210
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14211
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14212
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14213
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14214
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14215
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14216
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14217
		 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14218
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14219
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14220
		goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14221
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14222
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14223
		    sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14224
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14225
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14226
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14227
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14228
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14229
		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14230
		    sizeof (struct smart_selftest_log));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14231
		rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14232
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14233
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14234
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14235
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14236
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14237
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14238
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14239
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14240
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14241
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14242
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14243
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14244
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14245
 * Returns 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14246
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14247
 * SMART READ LOG data is returned in buffer pointed to by smart_log
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14248
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14249
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14250
sata_smart_read_log(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14251
	sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14252
	sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14253
	uint8_t *smart_log,		/* where the data should be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14254
	uint8_t which_log,		/* which log should be returned */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14255
	uint8_t log_size)		/* # of 512 bytes in log */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14256
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14257
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14258
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14259
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14260
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14261
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14262
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14263
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14264
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14265
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14266
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14267
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14268
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14269
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14270
	/* address is needed now */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14271
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14272
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14273
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14274
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14275
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14276
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14277
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14278
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14279
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14280
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14281
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14282
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14283
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14284
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14285
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14286
	 * Allocate buffer for SMART READ LOG
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14287
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14288
	scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14289
	if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14290
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14291
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14292
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14293
		    "sata_smart_read_log: " "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14294
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14295
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14296
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14297
	/* Build SMART_READ_LOG cmd in the sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14298
	scmd->satacmd_addr_type = 0;		/* N/A */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14299
	scmd->satacmd_sec_count_lsb = log_size;	/* what the caller asked for */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14300
	scmd->satacmd_lba_low_lsb = which_log;	/* which log page */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14301
	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14302
	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14303
	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14304
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14305
	scmd->satacmd_cmd_reg = SATAC_SMART;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14306
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14307
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14308
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14309
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14310
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14311
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14312
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14313
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14314
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14315
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14316
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14317
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14318
		 * Whoops, no SMART DATA available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14319
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14320
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14321
		goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14322
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14323
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14324
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14325
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14326
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14327
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14328
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14329
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14330
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14331
		bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14332
		rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14333
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14334
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14335
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14336
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14337
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14338
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14339
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14340
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14341
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14342
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14343
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14344
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14345
 * Used by LOG SENSE page 0x10
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14346
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14347
 * return 0 for success, -1 otherwise
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14348
 *
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14349
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14350
static int
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14351
sata_read_log_ext_directory(
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14352
	sata_hba_inst_t *sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14353
	sata_drive_info_t *sdinfo,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14354
	struct read_log_ext_directory *logdir)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14355
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14356
	sata_pkt_txlate_t *spx;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14357
	sata_pkt_t *spkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14358
	sata_cmd_t *scmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14359
	int rval;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14360
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14361
#if ! defined(lint)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14362
	ASSERT(sizeof (struct read_log_ext_directory) == 512);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14363
#endif
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14364
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14365
	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14366
	spx->txlt_sata_hba_inst = sata_hba_inst;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14367
	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14368
	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14369
	if (spkt == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14370
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14371
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14372
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14373
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14374
	/* Fill sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14375
	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14376
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14377
	/* Synchronous mode, no callback */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14378
	spkt->satapkt_comp = NULL;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14379
	/* Timeout 30s */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14380
	spkt->satapkt_time = sata_default_pkt_time;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14381
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14382
	scmd = &spkt->satapkt_cmd;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14383
	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14384
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14385
	/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14386
	 * Allocate buffer for SMART READ LOG EXTENDED command
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14387
	 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14388
	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14389
	    sizeof (struct read_log_ext_directory));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14390
	if (scmd->satacmd_bp == NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14391
		sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14392
		kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14393
		SATA_LOG_D((sata_hba_inst, CE_WARN,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14394
		    "sata_read_log_ext_directory: "
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14395
		    "cannot allocate buffer"));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14396
		return (-1);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14397
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14398
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14399
	/* Build READ LOG EXT w/ log directory cmd in the  sata_pkt */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14400
	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14401
	scmd->satacmd_sec_count_lsb = 1;	/* One sector of directory */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14402
	scmd->satacmd_sec_count_msb = 0;	/* One sector of directory */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14403
	scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14404
	scmd->satacmd_lba_low_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14405
	scmd->satacmd_lba_mid_lsb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14406
	scmd->satacmd_lba_mid_msb = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14407
	scmd->satacmd_device_reg = 0;		/* Always device 0 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14408
	scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14409
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14410
	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14411
	    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14412
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14413
	/* Send pkt to SATA HBA driver */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14414
	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14415
	    SATA_TRAN_ACCEPTED ||
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14416
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14417
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14418
		    sdinfo->satadrv_addr.cport)));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14419
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14420
		 * Whoops, no SMART selftest log info available
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14421
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14422
		rval = -1;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14423
		goto fail;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14424
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14425
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14426
		    sdinfo->satadrv_addr.cport)));
7152
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14427
		if (spx->txlt_buf_dma_handle != NULL) {
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14428
			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14429
			    DDI_DMA_SYNC_FORKERNEL);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14430
			ASSERT(rval == DDI_SUCCESS);
4575049c1ae7 PSARC/2008/448 SATA Framework Interface Addition
ap25164
parents: 6777
diff changeset
 14431
		}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14432
		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14433
		    sizeof (struct read_log_ext_directory));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14434
		rval = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14435
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14436
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14437
fail:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14438
	/* Free allocated resources */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14439
	sata_free_local_buffer(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14440
	sata_pkt_free(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14441
	kmem_free(spx, sizeof (sata_pkt_txlate_t));
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14442
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14443
	return (rval);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14444
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14445
5225
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14446
/*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14447
 * Set up error retrieval sata command for NCQ command error data
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14448
 * recovery.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14449
 *
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14450
 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14451
 * returns SATA_FAILURE otherwise.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14452
 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14453
static int
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14454
sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14455
{
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14456
#ifndef __lock_lint
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14457
	_NOTE(ARGUNUSED(sdinfo))
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14458
#endif
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14459
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14460
	sata_pkt_t *spkt = spx->txlt_sata_pkt;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14461
	sata_cmd_t *scmd;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14462
	struct buf *bp;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14463
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14464
	/* Operation modes are up to the caller */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14465
	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14466
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14467
	/* Synchronous mode, no callback - may be changed by the caller */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14468
	spkt->satapkt_comp = NULL;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14469
	spkt->satapkt_time = sata_default_pkt_time;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14470
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14471
	scmd = &spkt->satapkt_cmd;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14472
	bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14473
	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14474
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14475
	/*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14476
	 * Allocate dma_able buffer error data.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14477
	 * Buffer allocation will take care of buffer alignment and other DMA
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14478
	 * attributes.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14479
	 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14480
	bp = sata_alloc_local_buffer(spx,
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14481
	    sizeof (struct sata_ncq_error_recovery_page));
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14482
	if (bp == NULL)
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14483
		return (SATA_FAILURE);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14484
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14485
	bp_mapin(bp); /* make data buffer accessible */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14486
	scmd->satacmd_bp = bp;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14487
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14488
	/*
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14489
	 * Set-up pointer to the buffer handle, so HBA can sync buffer
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14490
	 * before accessing it. Handle is in usual place in translate struct.
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14491
	 */
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14492
	scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14493
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14494
	ASSERT(scmd->satacmd_num_dma_cookies != 0);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14495
	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14496
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14497
	return (SATA_SUCCESS);
92c1b014785f 6508467 ahci driver should use the common definitions defined in sata_defs.h
yt160523
parents: 5014
diff changeset
 14498
}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14499
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14500
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14501
 * sata_xlate_errors() is used to translate (S)ATA error
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14502
 * information to SCSI information returned in the SCSI
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14503
 * packet.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14504
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14505
static void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14506
sata_xlate_errors(sata_pkt_txlate_t *spx)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14507
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14508
	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14509
	struct scsi_extended_sense *sense;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14510
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14511
	scsipkt->pkt_reason = CMD_INCOMPLETE;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14512
	*scsipkt->pkt_scbp = STATUS_CHECK;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14513
	sense = sata_arq_sense(spx);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14514
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14515
	switch (spx->txlt_sata_pkt->satapkt_reason) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14516
	case SATA_PKT_PORT_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14517
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14518
		 * We have no device data. Assume no data transfered.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14519
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14520
		sense->es_key = KEY_HARDWARE_ERROR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14521
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14522
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14523
	case SATA_PKT_DEV_ERROR:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14524
		if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14525
		    SATA_STATUS_ERR) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14526
			/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14527
			 * determine dev error reason from error
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14528
			 * reg content
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14529
			 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14530
			sata_decode_device_error(spx, sense);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14531
			break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14532
		}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14533
		/* No extended sense key - no info available */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14534
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14535
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14536
	case SATA_PKT_TIMEOUT:
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14537
		scsipkt->pkt_reason = CMD_TIMEOUT;
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14538
		scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14539
		/* No extended sense key */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14540
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14541
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14542
	case SATA_PKT_ABORTED:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14543
		scsipkt->pkt_reason = CMD_ABORTED;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14544
		scsipkt->pkt_statistics |= STAT_ABORTED;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14545
		/* No extended sense key */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14546
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14547
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14548
	case SATA_PKT_RESET:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14549
		/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14550
		 * pkt aborted either by an explicit reset request from
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14551
		 * a host, or due to error recovery
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14552
		 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14553
		scsipkt->pkt_reason = CMD_RESET;
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14554
		scsipkt->pkt_statistics |= STAT_DEV_RESET;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14555
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14556
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14557
	default:
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14558
		scsipkt->pkt_reason = CMD_TRAN_ERR;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14559
		break;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14560
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14561
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14562
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14563
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14564
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14565
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14566
/*
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14567
 * Log sata message
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14568
 * dev pathname msg line preceeds the logged message.
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14569
 */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14570
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14571
static	void
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14572
sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14573
{
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14574
	char pathname[128];
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 14575
	dev_info_t *dip = NULL;
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14576
	va_list ap;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14577
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14578
	mutex_enter(&sata_log_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14579
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14580
	va_start(ap, fmt);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14581
	(void) vsprintf(sata_log_buf, fmt, ap);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14582
	va_end(ap);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14583
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14584
	if (sata_hba_inst != NULL) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14585
		dip = SATA_DIP(sata_hba_inst);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14586
		(void) ddi_pathname(dip, pathname);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14587
	} else {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14588
		pathname[0] = 0;
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14589
	}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14590
	if (level == CE_CONT) {
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14591
		if (sata_debug_flags == 0)
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14592
			cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14593
		else
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14594
			cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
5996
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14595
	} else {
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14596
		if (level != CE_NOTE) {
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14597
			cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14598
		} else if (sata_msg) {
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14599
			cmn_err(level, "%s:\n %s", pathname,
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14600
			    sata_log_buf);
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14601
		}
46361481707a 6630713 x4500: Multiple (sdxx), "Error for Command", and "Error Block" errors seen in messages file.
ls24207
parents: 5832
diff changeset
 14602
	}
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14603
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 14604
	/* sata trace debug */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 14605
	sata_trace_debug(dip, sata_log_buf);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 14606
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14607
	mutex_exit(&sata_log_mutex);
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14608
}
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14609
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14610
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14611
/* ******** Asynchronous HBA events handling & hotplugging support ******** */
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 14612
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14613
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14614
 * Start or terminate the thread, depending on flag arg and current state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14615
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14616
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14617
sata_event_thread_control(int startstop)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14618
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14619
	static 	int sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14620
	static 	int sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14621
	int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14622
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14623
	mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14624
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14625
	if (startstop == 0 && (sata_event_thread_starting == 1 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14626
	    sata_event_thread_terminating == 1)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14627
		mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14628
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14629
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14630
	if (startstop == 1 && sata_event_thread_starting == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14631
		mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14632
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14633
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14634
	if (startstop == 1 && sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14635
		sata_event_thread_starting = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14636
		/* wait til terminate operation completes */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14637
		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14638
		while (sata_event_thread_terminating == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14639
			if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14640
				sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14641
				mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14642
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14643
				cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14644
				    "timeout waiting for thread to terminate");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14645
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14646
				return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14647
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14648
			mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14649
			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14650
			mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14651
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14652
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14653
	if (startstop == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14654
		if (sata_event_thread == NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14655
			sata_event_thread = thread_create(NULL, 0,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14656
			    (void (*)())sata_event_daemon,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14657
			    &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14658
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14659
		sata_event_thread_starting = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14660
		mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14661
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14662
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14663
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14664
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14665
	 * If we got here, thread may need to be terminated
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14666
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14667
	if (sata_event_thread != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14668
		int i;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14669
		/* Signal event thread to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14670
		sata_event_thread_terminating = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14671
		sata_event_thread_terminate = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14672
		cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14673
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14674
		 * Wait til daemon terminates.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14675
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14676
		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14677
		while (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14678
			mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14679
			if (i-- <= 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14680
				/* Daemon did not go away !!! */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14681
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14682
				cmn_err(CE_WARN, "sata_event_thread_control: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14683
				    "cannot terminate event daemon thread");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14684
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14685
				mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14686
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14687
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14688
			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14689
			mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14690
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14691
		sata_event_thread_terminating = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14692
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14693
	ASSERT(sata_event_thread_terminating == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14694
	ASSERT(sata_event_thread_starting == 0);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14695
	mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14696
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14697
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14698
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14699
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14700
 * SATA HBA event notification function.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14701
 * Events reported by SATA HBA drivers per HBA instance relate to a change in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14702
 * a port and/or device state or a controller itself.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14703
 * Events for different addresses/addr types cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14704
 * A warning message is generated for each event type.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14705
 * Events are not processed by this function, so only the
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14706
 * event flag(s)is set for an affected entity and the event thread is
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14707
 * waken up. Event daemon thread processes all events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14708
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14709
 * NOTE: Since more than one event may be reported at the same time, one
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14710
 * cannot determine a sequence of events when opposite event are reported, eg.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14711
 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14712
 * is taking precedence over reported events, i.e. may cause ignoring some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14713
 * events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14714
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14715
#define	SATA_EVENT_MAX_MSG_LENGTH	79
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14716
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14717
void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14718
sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14719
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14720
	sata_hba_inst_t *sata_hba_inst = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14721
	sata_address_t *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14722
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14723
	sata_port_stats_t *pstats;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14724
	sata_cport_info_t *cportinfo;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14725
	sata_pmport_info_t *pmportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14726
	int cport, pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14727
	char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14728
	char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14729
	char *lcp;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14730
	static char *err_msg_evnt_1 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14731
	    "sata_hba_event_notify: invalid port event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14732
	static char *err_msg_evnt_2 =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14733
	    "sata_hba_event_notify: invalid device event 0x%x ";
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14734
	int linkevent;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14735
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14736
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14737
	 * There is a possibility that an event will be generated on HBA
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14738
	 * that has not completed attachment or is detaching. We still want
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14739
	 * to process events until HBA is detached.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14740
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14741
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14742
	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14743
	    sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14744
		if (SATA_DIP(sata_hba_inst) == dip)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14745
			if (sata_hba_inst->satahba_attached == 1)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14746
				break;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14747
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14748
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14749
	if (sata_hba_inst == NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14750
		/* HBA not attached */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14751
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14752
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14753
	ASSERT(sata_device != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14754
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14755
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14756
	 * Validate address before - do not proceed with invalid address.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14757
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14758
	saddr = &sata_device->satadev_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14759
	if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14760
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14761
	if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14762
	    saddr->qual == SATA_ADDR_DPMPORT)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14763
		/* Port Multiplier not supported yet */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14764
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14765
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14766
	cport = saddr->cport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14767
	pmport = saddr->pmport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14768
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14769
	buf1[0] = buf2[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14770
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14771
	/*
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14772
	 * If event relates to port or device, check port state.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14773
	 * Port has to be initialized, or we cannot accept an event.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14774
	 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14775
	if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14776
	    SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) != 0) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14777
		if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_DCPORT)) != 0) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14778
			mutex_enter(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14779
			cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14780
			mutex_exit(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14781
			if (cportinfo == NULL || cportinfo->cport_state == 0)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14782
				return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14783
		} else {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14784
			mutex_enter(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14785
			pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14786
			    cport, pmport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14787
			mutex_exit(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14788
			if (pmportinfo == NULL || pmportinfo->pmport_state == 0)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14789
				return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14790
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14791
	}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14792
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 14793
	/*
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14794
	 * Events refer to devices, ports and controllers - each has
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14795
	 * unique address. Events for different addresses cannot be combined.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14796
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14797
	if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14798
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14799
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14800
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14801
		/* qualify this event(s) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14802
		if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14803
			/* Invalid event for the device port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14804
			(void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14805
			    event & SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14806
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14807
			goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14808
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14809
		if (saddr->qual == SATA_ADDR_CPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14810
			/* Controller's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14811
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14812
			(SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14813
			    cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14814
			    event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14815
			pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14816
			    &(SATA_CPORT_INFO(sata_hba_inst, cport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14817
			    cport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14818
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14819
			/* Port multiplier's device port event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14820
			(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14821
			    pmport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14822
			    event & SATA_EVNT_PORT_EVENTS;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14823
			pstats =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14824
			    &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14825
			    pmport_stats;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14826
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14827
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14828
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14829
		 * Add to statistics and log the message. We have to do it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14830
		 * here rather than in the event daemon, because there may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14831
		 * multiple events occuring before they are processed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14832
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14833
		linkevent = event &
4582
da3c7347dfa5 PSARC 2007/329 SCSI inquiry property enhancement
cth
parents: 4014
diff changeset
 14834
		    (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14835
		if (linkevent) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14836
			if (linkevent == (SATA_EVNT_LINK_LOST |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14837
			    SATA_EVNT_LINK_ESTABLISHED)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14838
				/* This is likely event combination */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14839
				(void) strlcat(buf1, "link lost/established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14840
				    SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14841
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14842
				if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14843
					pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14844
				if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14845
				    0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14846
					pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14847
				linkevent = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14848
			} else if (linkevent & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14849
				(void) strlcat(buf1, "link lost, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14850
				    SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14851
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14852
				if (pstats->link_lost < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14853
					pstats->link_lost++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14854
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14855
				(void) strlcat(buf1, "link established, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14856
				    SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14857
				if (pstats->link_established <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14858
				    0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14859
					pstats->link_established++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14860
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14861
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14862
		if (event & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14863
			(void) strlcat(buf1, "device attached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14864
			    SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14865
			if (pstats->device_attached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14866
				pstats->device_attached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14867
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14868
		if (event & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14869
			(void) strlcat(buf1, "device detached, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14870
			    SATA_EVENT_MAX_MSG_LENGTH);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14871
			if (pstats->device_detached < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14872
				pstats->device_detached++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14873
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14874
		if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14875
			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14876
			    "port %d power level changed", cport);
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14877
			if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14878
				pstats->port_pwr_changed++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14879
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14880
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14881
		if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14882
			/* There should be no other events for this address */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14883
			(void) sprintf(buf2, err_msg_evnt_1,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14884
			    event & ~SATA_EVNT_PORT_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14885
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14886
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14887
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14888
	} else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14889
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14890
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14891
		/* qualify this event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14892
		if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14893
			/* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14894
			(void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14895
			    event & SATA_EVNT_DEVICE_RESET);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14896
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14897
			goto event_info;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14898
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14899
		/* drive event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14900
		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14901
		if (sdinfo != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14902
			if (event & SATA_EVNT_DEVICE_RESET) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14903
				(void) strlcat(buf1, "device reset, ",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14904
				    SATA_EVENT_MAX_MSG_LENGTH);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14905
				if (sdinfo->satadrv_stats.drive_reset <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14906
				    0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14907
					sdinfo->satadrv_stats.drive_reset++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14908
				sdinfo->satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14909
				    SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14910
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14911
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14912
		if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14913
			/* Invalid event for a device */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14914
			(void) sprintf(buf2, err_msg_evnt_2,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14915
			    event & ~SATA_EVNT_DRIVE_EVENTS);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14916
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14917
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14918
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14919
		if (saddr->qual != SATA_ADDR_NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14920
			/* Wrong address qualifier */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14921
			SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14922
			    "sata_hba_event_notify: invalid address 0x%x",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14923
			    *(uint32_t *)saddr));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14924
			return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14925
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14926
		if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14927
		    (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14928
			/* Invalid event for the controller */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14929
			SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14930
			    "sata_hba_event_notify: invalid event 0x%x for "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14931
			    "controller",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14932
			    event & SATA_EVNT_CONTROLLER_EVENTS));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14933
			return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14934
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14935
		buf1[0] = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14936
		/* This may be a frequent and not interesting event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14937
		SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14938
		    "controller power level changed\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14939
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14940
		mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14941
		if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
1781
1005b1d56b1c 6397649 hotplugging sata disk may disable write and read cache
pawelw
parents: 1675
diff changeset
 14942
		    0xffffffffffffffffULL)
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14943
			sata_hba_inst->satahba_stats.ctrl_pwr_change++;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14944
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14945
		sata_hba_inst->satahba_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14946
		    SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14947
		mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14948
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14949
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14950
	 * If we got here, there is something to do with this HBA
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14951
	 * instance.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14952
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14953
	mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14954
	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14955
	mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14956
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14957
	sata_event_pending |= SATA_EVNT_MAIN;	/* global event indicator */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14958
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14959
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14960
	/* Tickle event thread */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14961
	mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14962
	if (sata_event_thread_active == 0)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14963
		cv_signal(&sata_event_cv);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14964
	mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14965
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14966
event_info:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14967
	if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14968
		lcp = strrchr(buf1, ',');
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14969
		if (lcp != NULL)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14970
			*lcp = '\0';
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14971
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14972
	if (saddr->qual == SATA_ADDR_CPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14973
	    saddr->qual == SATA_ADDR_DCPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14974
		if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14975
			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14976
			    cport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14977
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14978
		if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14979
			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14980
			    cport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14981
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14982
	} else if (saddr->qual == SATA_ADDR_PMPORT ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14983
	    saddr->qual == SATA_ADDR_DPMPORT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14984
		if (buf1[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14985
			sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14986
			    "port %d pmport %d: %s\n", cport, pmport, buf1);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14987
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14988
		if (buf2[0] != '\0') {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14989
			sata_log(sata_hba_inst, CE_NOTE,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14990
			    "port %d pmport %d: %s\n", cport, pmport, buf2);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14991
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14992
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14993
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14994
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14995
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14996
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14997
 * Event processing thread.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14998
 * Arg is a pointer to the sata_hba_list pointer.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 14999
 * It is not really needed, because sata_hba_list is global and static
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15000
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15001
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15002
sata_event_daemon(void *arg)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15003
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15004
#ifndef __lock_lint
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15005
	_NOTE(ARGUNUSED(arg))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15006
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15007
	sata_hba_inst_t *sata_hba_inst;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15008
	clock_t lbolt;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15009
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15010
	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15011
	    "SATA event daemon started\n", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15012
loop:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15013
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15014
	 * Process events here. Walk through all registered HBAs
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15015
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15016
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15017
	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15018
	    sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15019
		ASSERT(sata_hba_inst != NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15020
		mutex_enter(&sata_hba_inst->satahba_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15021
		if (sata_hba_inst->satahba_attached == 0 ||
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15022
		    (sata_hba_inst->satahba_event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15023
		    SATA_EVNT_SKIP) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15024
			mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15025
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15026
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15027
		if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15028
			sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15029
			mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15030
			mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15031
			/* Got the controller with pending event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15032
			sata_process_controller_events(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15033
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15034
			 * Since global mutex was released, there is a
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15035
			 * possibility that HBA list has changed, so start
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15036
			 * over from the top. Just processed controller
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15037
			 * will be passed-over because of the SKIP flag.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15038
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15039
			goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15040
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15041
		mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15042
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15043
	/* Clear SKIP flag in all controllers */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15044
	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15045
	    sata_hba_inst = sata_hba_inst->satahba_next) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15046
		mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15047
		sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15048
		mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15049
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15050
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15051
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15052
	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15053
	    "SATA EVENT DAEMON suspending itself", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15054
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15055
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15056
	if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15057
		sata_log(sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15058
		    "SATA EVENTS PROCESSING DISABLED\n");
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15059
		thread_exit(); /* Daemon will not run again */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15060
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15061
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15062
	mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15063
	sata_event_thread_active = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15064
	mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15065
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15066
	 * Go to sleep/suspend itself and wake up either because new event or
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15067
	 * wait timeout. Exit if there is a termination request (driver
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15068
	 * unload).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15069
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15070
	do {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15071
		lbolt = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15072
		lbolt += drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15073
		mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15074
		(void) cv_timedwait(&sata_event_cv, &sata_event_mutex, lbolt);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15075
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15076
		if (sata_event_thread_active != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15077
			mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15078
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15079
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15080
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15081
		/* Check if it is time to go away */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15082
		if (sata_event_thread_terminate == 1) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15083
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15084
			 * It is up to the thread setting above flag to make
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15085
			 * sure that this thread is not killed prematurely.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15086
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15087
			sata_event_thread_terminate = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15088
			sata_event_thread = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15089
			mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15090
			SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15091
			    "SATA_EVENT_DAEMON_TERMINATING", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15092
			thread_exit();  { _NOTE(NOT_REACHED) }
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15093
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15094
		mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15095
	} while (!(sata_event_pending & SATA_EVNT_MAIN));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15096
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15097
	mutex_enter(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15098
	sata_event_thread_active = 1;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15099
	mutex_exit(&sata_event_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15100
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15101
	mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15102
	sata_event_pending &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15103
	mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15104
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15105
	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15106
	    "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15107
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15108
	goto loop;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15109
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15110
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15111
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15112
 * Specific HBA instance event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15113
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15114
 * NOTE: At the moment, device event processing is limited to hard disks
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15115
 * only.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15116
 * cports only are supported - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15117
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15118
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15119
sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15120
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15121
	int ncport;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15122
	uint32_t event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15123
	sata_address_t *saddr;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15124
	sata_cport_info_t *cportinfo;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15125
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15126
	SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15127
	    "Processing controller %d event(s)",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15128
	    ddi_get_instance(SATA_DIP(sata_hba_inst)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15129
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15130
	mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15131
	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15132
	event_flags = sata_hba_inst->satahba_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15133
	mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15134
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15135
	 * Process controller power change first
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15136
	 * HERE
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15137
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15138
	if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15139
		sata_process_cntrl_pwr_level_change(sata_hba_inst);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15140
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15141
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15142
	 * Search through ports/devices to identify affected port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15143
	 * We may have to process events for more than one port/device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15144
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15145
	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15146
		/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15147
		 * Not all ports may be processed in attach by the time we
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15148
		 * get an event. Check if port info is initialized.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15149
		 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15150
		mutex_enter(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15151
		cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15152
		mutex_exit(&sata_hba_inst->satahba_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15153
		if (cportinfo == NULL || cportinfo->cport_state == NULL)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15154
			continue;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15155
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15156
		/* We have initialized controller port info */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15157
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15158
		event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15159
		    cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15160
		/* Check if port was locked by IOCTL processing */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15161
		if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15162
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15163
			 * We ignore port events because port is busy
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15164
			 * with AP control processing. Set again
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15165
			 * controller and main event flag, so that
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15166
			 * events may be processed by the next daemon
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15167
			 * run.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15168
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15169
			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15170
			mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15171
			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15172
			mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15173
			mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15174
			sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15175
			mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15176
			SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15177
			    "Event processing postponed until "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15178
			    "AP control processing completes",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15179
			    NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15180
			/* Check other ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15181
			continue;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15182
		} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15183
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15184
			 * Set BSY flag so that AP control would not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15185
			 * interfere with events processing for
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15186
			 * this port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15187
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15188
			(SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15189
			    cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15190
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15191
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15192
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15193
		saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15194
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15195
		if ((event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15196
		    (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15197
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15198
			 * Got port event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15199
			 * We need some hierarchy of event processing as they
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15200
			 * are affecting each other:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15201
			 * 1. port failed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15202
			 * 2. device detached/attached
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15203
			 * 3. link events - link events may trigger device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15204
			 *    detached or device attached events in some
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15205
			 *    circumstances.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15206
			 * 4. port power level changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15207
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15208
			if (event_flags & SATA_EVNT_PORT_FAILED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15209
				sata_process_port_failed_event(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15210
				    saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15211
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15212
			if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15213
				sata_process_device_detached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15214
				    saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15215
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15216
			if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15217
				sata_process_device_attached(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15218
				    saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15219
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15220
			if (event_flags &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15221
			    (SATA_EVNT_LINK_ESTABLISHED |
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15222
			    SATA_EVNT_LINK_LOST)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15223
				sata_process_port_link_events(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15224
				    saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15225
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15226
			if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15227
				sata_process_port_pwr_change(sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15228
				    saddr);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15229
			}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15230
			if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15231
				sata_process_target_node_cleanup(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15232
				    sata_hba_inst, saddr);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15233
			}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 15234
			if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 15235
				sata_process_device_autoonline(
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 15236
				    sata_hba_inst, saddr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 15237
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15238
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15239
		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15240
		if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15241
		    SATA_DTYPE_NONE) &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15242
		    (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15243
			if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15244
			    satadrv_event_flags &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15245
			    (SATA_EVNT_DEVICE_RESET |
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15246
			    SATA_EVNT_INPROC_DEVICE_RESET)) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15247
				/* Have device event */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15248
				sata_process_device_reset(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15249
				    saddr);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15250
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15251
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15252
		/* Release PORT_BUSY flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15253
		(SATA_CPORT_INFO(sata_hba_inst, ncport))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15254
		    cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15255
		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15256
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15257
	} /* End of loop through the controller SATA ports */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15258
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15259
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15260
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15261
 * Process HBA power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15262
 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15263
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15264
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15265
sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15266
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15267
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15268
	    "Processing controller power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15269
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15270
	/* Ignoring it for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15271
	mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15272
	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15273
	mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15274
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15275
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15276
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15277
 * Process port power level change reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15278
 * Not implemented at this time - event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15279
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15280
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15281
sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15282
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15283
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15284
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15285
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15286
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15287
	    "Processing port power level change", NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15288
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15289
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15290
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15291
	/* Reset event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15292
	cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15293
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15294
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15295
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15296
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15297
 * Process port failure reported by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15298
 * cports support only - no pmports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15299
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15300
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15301
sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15302
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15303
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15304
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15305
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15306
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15307
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15308
	/* Reset event flag first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15309
	cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15310
	/* If the port is in SHUTDOWN or FAILED state, ignore this event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15311
	if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15312
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15313
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15314
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15315
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15316
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15317
	/* Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15318
	cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15319
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15320
	sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15321
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15322
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15323
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15324
 * Device Reset Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15325
 * The seqeunce is managed by 3 stage flags:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15326
 * - reset event reported,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15327
 * - reset event being processed,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15328
 * - request to clear device reset state.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15329
 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15330
 * NOTE: This function has to be entered with cport mutex held. It exits with
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15331
 * mutex held as well, but can release mutex during the processing.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15332
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15333
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15334
sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15335
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15336
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15337
	sata_drive_info_t old_sdinfo; /* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15338
	sata_drive_info_t *sdinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15339
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15340
	sata_device_t sata_device;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15341
	int rval_probe, rval_set;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15342
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15343
	/* We only care about host sata cport for now */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15344
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15345
	sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15346
	/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15347
	 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15348
	 * state, ignore reset event.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15349
	 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15350
	if (((cportinfo->cport_state &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15351
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15352
	    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15353
		sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15354
		    ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15355
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15356
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15357
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15358
	if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15359
	    SATA_VALID_DEV_TYPE) == 0) {
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15360
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15361
		 * This should not happen - coding error.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15362
		 * But we can recover, so do not panic, just clean up
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15363
		 * and if in debug mode, log the message.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15364
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15365
#ifdef SATA_DEBUG
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15366
		sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15367
		    "sata_process_device_reset: "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15368
		    "Invalid device type with sdinfo!", NULL);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15369
#endif
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15370
		sdinfo->satadrv_event_flags = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15371
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15372
	}
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15373
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15374
#ifdef SATA_DEBUG
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15375
	if ((sdinfo->satadrv_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15376
	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15377
		/* Nothing to do */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15378
		/* Something is weird - why we are processing dev reset? */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15379
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15380
		    "No device reset event!!!!", NULL);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15381
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15382
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15383
	}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15384
	if ((sdinfo->satadrv_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15385
	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15386
	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15387
		/* Something is weird - new device reset event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15388
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15389
		    "Overlapping device reset events!", NULL);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15390
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15391
#endif
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15392
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15393
	    "Processing port %d device reset", saddr->cport);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15394
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15395
	/* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15396
	sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15397
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15398
	/* It seems that we always need to check the port state first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15399
	sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15400
	sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15401
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15402
	 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15403
	 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15404
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15405
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15406
	rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15407
	    (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15408
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15409
	sata_update_port_info(sata_hba_inst, &sata_device);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15410
	if (rval_probe != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15411
		/* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15412
		cportinfo->cport_state = SATA_PSTATE_FAILED;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15413
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15414
		if (sdinfo != NULL)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15415
			sdinfo->satadrv_event_flags = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15416
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15417
		    cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15418
		SATA_LOG_D((sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15419
		    "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15420
		    saddr->cport));
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15421
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15422
		    saddr->cport)->cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15423
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15424
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15425
	if ((sata_device.satadev_scr.sstatus  &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15426
	    SATA_PORT_DEVLINK_UP_MASK) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15427
	    SATA_PORT_DEVLINK_UP ||
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15428
	    sata_device.satadev_type == SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15429
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15430
		 * No device to process, anymore. Some other event processing
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15431
		 * would or have already performed port info cleanup.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15432
		 * To be safe (HBA may need it), request clearing device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15433
		 * reset condition.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15434
		 */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15435
		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15436
		if (sdinfo != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15437
			sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15438
			    ~SATA_EVNT_INPROC_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15439
			sdinfo->satadrv_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15440
			    SATA_EVNT_CLEAR_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15441
		}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15442
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15443
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15444
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15445
	sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15446
	if (sdinfo == NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15447
		return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15448
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15449
	if ((sdinfo->satadrv_event_flags &
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15450
	    SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15451
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15452
		 * Start tracking time for device feature restoration and
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15453
		 * identification. Save current time (lbolt value).
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15454
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15455
		sdinfo->satadrv_reset_time = ddi_get_lbolt();
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15456
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15457
	/* Mark device reset processing as active */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15458
	sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15459
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15460
	old_sdinfo = *sdinfo;	/* local copy of the drive info */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15461
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15462
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15463
	rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15464
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15465
	if (rval_set  != SATA_SUCCESS) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15466
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15467
		 * Restoring drive setting failed.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15468
		 * Probe the port first, to check if the port state has changed
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15469
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15470
		sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15471
		sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15472
		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15473
		/* probe port */
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15474
		rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15475
		    (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15476
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15477
		    cport_mutex);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15478
		if (rval_probe == SATA_SUCCESS &&
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15479
		    (sata_device.satadev_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15480
		    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15481
		    (sata_device.satadev_scr.sstatus  &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15482
		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 15483
		    sata_device.satadev_type != SATA_DTYPE_NONE) {
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15484
			/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15485
			 * We may retry this a bit later - in-process reset
4862
35f6b7bbbbff PSARC/2007/274 SATA Framework Interface Revision
Unknown
parents: 4837
diff changeset
 15486
			 * condition should be already set.
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15487
			 * Track retry time for device identification.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15488
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15489
			if ((cportinfo->cport_dev_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15490
			    SATA_VALID_DEV_TYPE) != 0 &&
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15491
			    SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15492
			    sdinfo->satadrv_reset_time != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15493
				clock_t cur_time = ddi_get_lbolt();
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15494
				/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15495
				 * If the retry time limit was not
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15496
				 * exceeded, retry.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15497
				 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15498
				if ((cur_time - sdinfo->satadrv_reset_time) <
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15499
				    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15500
					mutex_enter(
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15501
					    &sata_hba_inst->satahba_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15502
					sata_hba_inst->satahba_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15503
					    SATA_EVNT_MAIN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15504
					mutex_exit(
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15505
					    &sata_hba_inst->satahba_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15506
					mutex_enter(&sata_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15507
					sata_event_pending |= SATA_EVNT_MAIN;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15508
					mutex_exit(&sata_mutex);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15509
					return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15510
				}
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15511
				if (rval_set == SATA_RETRY) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15512
					/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15513
					 * Setting drive features failed, but
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15514
					 * the drive is still accessible,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15515
					 * so emit a warning message before
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15516
					 * return.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15517
					 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15518
					mutex_exit(&SATA_CPORT_INFO(
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15519
					    sata_hba_inst,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15520
					    saddr->cport)->cport_mutex);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15521
					goto done;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15522
				}
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15523
			}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15524
			/* Fail the drive */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15525
			sdinfo->satadrv_state = SATA_DSTATE_FAILED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15526
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15527
			sata_log(sata_hba_inst, CE_WARN,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15528
			    "SATA device at port %d - device failed",
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15529
			    saddr->cport);
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15530
		}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15531
		/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15532
		 * No point of retrying - device failed or some other event
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15533
		 * processing or already did or will do port info cleanup.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15534
		 * To be safe (HBA may need it),
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15535
		 * request clearing device reset condition.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15536
		 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15537
		sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15538
		sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15539
		sdinfo->satadrv_reset_time = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15540
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15541
	}
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15542
done:
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15543
	/*
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15544
	 * If setting of drive features failed, but the drive is still
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15545
	 * accessible, emit a warning message.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15546
	 */
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15547
	if (rval_set == SATA_RETRY) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15548
		sata_log(sata_hba_inst, CE_WARN,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15549
		    "SATA device at port %d - desired setting could not be "
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15550
		    "restored after reset. Device may not operate as expected.",
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15551
		    saddr->cport);
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 15552
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15553
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15554
	 * Raise the flag indicating that the next sata command could
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15555
	 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15556
	 * reset is reported.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15557
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15558
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15559
	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15560
		sdinfo->satadrv_reset_time = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15561
		if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15562
			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15563
			sdinfo->satadrv_event_flags &=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15564
			    ~SATA_EVNT_INPROC_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15565
			sdinfo->satadrv_event_flags |=
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15566
			    SATA_EVNT_CLEAR_DEVICE_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15567
		}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 15568
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15569
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15570
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15571
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15572
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15573
 * Port Link Events processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15574
 * Every link established event may involve device reset (due to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15575
 * COMRESET signal, equivalent of the hard reset) so arbitrarily
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15576
 * set device reset event for an attached device (if any).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15577
 * If the port is in SHUTDOWN or FAILED state, ignore link events.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15578
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15579
 * The link established event processing varies, depending on the state
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15580
 * of the target node, HBA hotplugging capabilities, state of the port.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15581
 * If the link is not active, the link established event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15582
 * If HBA cannot detect device attachment and there is no target node,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15583
 * the link established event triggers device attach event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15584
 * Else, link established event triggers device reset event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15585
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15586
 * The link lost event processing varies, depending on a HBA hotplugging
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15587
 * capability and the state of the port (link active or not active).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15588
 * If the link is active, the lost link event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15589
 * If HBA cannot detect device removal, the lost link event triggers
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15590
 * device detached event processing after link lost timeout.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15591
 * Else, the event is ignored.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15592
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15593
 * NOTE: Only cports are processed for now, i.e. no port multiplier ports
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15594
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15595
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15596
sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15597
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15598
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15599
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15600
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15601
	sata_drive_info_t *sdinfo;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15602
	uint32_t event_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15603
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15604
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15605
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15606
	    "Processing port %d link event(s)", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15607
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15608
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15609
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15610
	event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15611
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15612
	/* Reset event flags first */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15613
	cportinfo->cport_event_flags &=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15614
	    ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15615
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15616
	/* If the port is in SHUTDOWN or FAILED state, ignore link events. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15617
	if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15618
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15619
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15620
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15621
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15622
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15623
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15624
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15625
	 * For the sanity sake get current port state.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15626
	 * Set device address only. Other sata_device fields should be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15627
	 * set by HBA driver.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15628
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15629
	sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15630
	sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15631
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15632
	 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15633
	 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15634
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15635
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15636
	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15637
	    (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15638
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15639
	sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15640
	if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15641
		/* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15642
		cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15643
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15644
		    cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15645
		SATA_LOG_D((sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15646
		    "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15647
		    saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15648
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15649
		 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15650
		 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15651
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15652
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15653
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15654
		/* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15655
		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15656
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15657
	if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15658
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15659
		if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15660
		    SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15661
			/* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15662
			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15663
			    "Ignoring port %d link established event - "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15664
			    "link down",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15665
			    saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15666
			goto linklost;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15667
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15668
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15669
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15670
		    "Processing port %d link established event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15671
		    saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15672
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15673
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15674
		 * For the sanity sake check if a device is attached - check
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15675
		 * return state of a port probing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15676
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15677
		if (sata_device.satadev_type != SATA_DTYPE_NONE &&
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15678
		    sata_device.satadev_type != SATA_DTYPE_PMULT) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15679
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15680
			 * HBA port probe indicated that there is a device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15681
			 * attached. Check if the framework had device info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15682
			 * structure attached for this device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15683
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15684
			if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15685
				ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15686
				    NULL);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15687
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15688
				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15689
				if ((sdinfo->satadrv_type &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15690
				    SATA_VALID_DEV_TYPE) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15691
					/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15692
					 * Dev info structure is present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15693
					 * If dev_type is set to known type in
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15694
					 * the framework's drive info struct
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15695
					 * then the device existed before and
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15696
					 * the link was probably lost
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15697
					 * momentarily - in such case
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15698
					 * we may want to check device
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15699
					 * identity.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15700
					 * Identity check is not supported now.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15701
					 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15702
					 * Link established event
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15703
					 * triggers device reset event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15704
					 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15705
					(SATA_CPORTINFO_DRV_INFO(cportinfo))->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15706
					    satadrv_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15707
					    SATA_EVNT_DEVICE_RESET;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15708
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15709
			} else if (cportinfo->cport_dev_type ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15710
			    SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15711
				/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15712
				 * We got new device attached! If HBA does not
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15713
				 * generate device attached events, trigger it
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15714
				 * here.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15715
				 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15716
				if (!(SATA_FEATURES(sata_hba_inst) &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15717
				    SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15718
					cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15719
					    SATA_EVNT_DEVICE_ATTACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15720
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15721
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15722
			/* Reset link lost timeout */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15723
			cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15724
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15725
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15726
linklost:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15727
	if (event_flags & SATA_EVNT_LINK_LOST) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15728
		if ((sata_device.satadev_scr.sstatus &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15729
		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15730
			/* Ignore event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15731
			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15732
			    "Ignoring port %d link lost event - link is up",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15733
			    saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15734
			goto done;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15735
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15736
#ifdef SATA_DEBUG
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15737
		if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15738
			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15739
			    "Processing port %d link lost event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15740
			    saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15741
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15742
#endif
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15743
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15744
		 * When HBA cannot generate device attached/detached events,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15745
		 * we need to track link lost time and eventually generate
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15746
		 * device detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15747
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15748
		if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15749
			/* We are tracking link lost time */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15750
			if (cportinfo->cport_link_lost_time == 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15751
				/* save current time (lbolt value) */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15752
				cportinfo->cport_link_lost_time =
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15753
				    ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15754
				/* just keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15755
				cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15756
				    SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15757
			} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15758
				clock_t cur_time = ddi_get_lbolt();
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15759
				if ((cur_time -
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15760
				    cportinfo->cport_link_lost_time) >=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15761
				    drv_usectohz(
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15762
				    SATA_EVNT_LINK_LOST_TIMEOUT)) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15763
					/* trigger device detach event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15764
					cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15765
					    SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15766
					cportinfo->cport_link_lost_time = 0;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15767
					SATADBG1(SATA_DBG_EVENTS,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15768
					    sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15769
					    "Triggering port %d "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15770
					    "device detached event",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15771
					    saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15772
				} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15773
					/* keep link lost event */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15774
					cportinfo->cport_event_flags |=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15775
					    SATA_EVNT_LINK_LOST;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15776
				}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15777
			}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15778
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15779
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15780
		 * We could change port state to disable/delay access to
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15781
		 * the attached device until the link is recovered.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15782
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15783
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15784
done:
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15785
	event_flags = cportinfo->cport_event_flags;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15786
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15787
	if (event_flags != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15788
		mutex_enter(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15789
		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15790
		mutex_exit(&sata_hba_inst->satahba_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15791
		mutex_enter(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15792
		sata_event_pending |= SATA_EVNT_MAIN;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15793
		mutex_exit(&sata_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15794
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15795
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15796
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15797
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15798
 * Device Detached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15799
 * Port is probed to find if a device is really gone. If so,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15800
 * the device info structure is detached from the SATA port info structure
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15801
 * and released.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15802
 * Port status is updated.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15803
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15804
 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15805
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15806
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15807
sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15808
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15809
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15810
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15811
	sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15812
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15813
	dev_info_t *tdip;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15814
	int rval;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15815
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15816
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15817
	    "Processing port %d device detached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15818
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15819
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15820
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15821
	/* Clear event flag */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15822
	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15823
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15824
	/* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15825
	if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15826
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15827
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15828
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15829
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15830
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15831
	/* For sanity, re-probe the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15832
	sata_device.satadev_rev = SATA_DEVICE_REV;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15833
	sata_device.satadev_addr = *saddr;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15834
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15835
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15836
	 * We have to exit mutex, because the HBA probe port function may
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15837
	 * block on its own mutex.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15838
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15839
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15840
	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15841
	    (SATA_DIP(sata_hba_inst), &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15842
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15843
	sata_update_port_info(sata_hba_inst, &sata_device);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15844
	if (rval != SATA_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15845
		/* Something went wrong? Fail the port */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15846
		cportinfo->cport_state = SATA_PSTATE_FAILED;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15847
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15848
		    cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15849
		SATA_LOG_D((sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15850
		    "SATA port %d probing failed",
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15851
		    saddr->cport));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15852
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15853
		 * We may want to release device info structure, but
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15854
		 * it is not necessary.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15855
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15856
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15857
	} else {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15858
		/* port probed successfully */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15859
		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15860
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15861
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15862
	 * Check if a device is still attached. For sanity, check also
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15863
	 * link status - if no link, there is no device.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15864
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15865
	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15866
	    SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15867
	    SATA_DTYPE_NONE) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15868
		/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15869
		 * Device is still attached - ignore detach event.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15870
		 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15871
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15872
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15873
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15874
		    "Ignoring detach - device still attached to port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15875
		    sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15876
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15877
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15878
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15879
	 * We need to detach and release device info structure here
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15880
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15881
	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15882
		sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15883
		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15884
		(void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15885
		    sizeof (sata_drive_info_t));
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15886
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15887
	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15888
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15889
	 * Device cannot be reached anymore, even if the target node may be
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15890
	 * still present.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15891
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15892
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15893
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15894
	sata_log(sata_hba_inst, CE_WARN, "SATA device detached at port %d",
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15895
	    sata_device.satadev_addr.cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15896
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15897
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15898
	 * Try to offline a device and remove target node if it still exists
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15899
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15900
	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15901
	if (tdip != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15902
		/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15903
		 * Target node exists.  Unconfigure device then remove
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15904
		 * the target node (one ndi operation).
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15905
		 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15906
		if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15907
			/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15908
			 * PROBLEM - no device, but target node remained
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15909
			 * This happens when the file was open or node was
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15910
			 * waiting for resources.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15911
			 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15912
			SATA_LOG_D((sata_hba_inst, CE_WARN,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15913
			    "sata_process_device_detached: "
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15914
			    "Failed to remove target node for "
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15915
			    "detached SATA device."));
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15916
			/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15917
			 * Set target node state to DEVI_DEVICE_REMOVED.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15918
			 * But re-check first that the node still exists.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15919
			 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15920
			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15921
			    saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15922
			if (tdip != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15923
				sata_set_device_removed(tdip);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15924
				/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15925
				 * Instruct event daemon to retry the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15926
				 * cleanup later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15927
				 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15928
				sata_set_target_node_cleanup(sata_hba_inst,
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 15929
				    &sata_device.satadev_addr);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15930
			}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15931
		}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15932
	}
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15933
	/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15934
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15935
	 * with the hint: SE_HINT_REMOVE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15936
	 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15937
	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15938
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15939
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15940
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15941
/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15942
 * Device Attached Event processing.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15943
 * Port state is checked to verify that a device is really attached. If so,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15944
 * the device info structure is created and attached to the SATA port info
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15945
 * structure.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15946
 *
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15947
 * If attached device cannot be identified or set-up, the retry for the
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15948
 * attach processing is set-up. Subsequent daemon run would try again to
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15949
 * identify the device, until the time limit is reached
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15950
 * (SATA_DEV_IDENTIFY_TIMEOUT).
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15951
 *
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15952
 * This function cannot be called in interrupt context (it may sleep).
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15953
 *
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15954
 * NOTE: Process cports event only, no port multiplier ports.
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15955
 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15956
static void
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15957
sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15958
    sata_address_t *saddr)
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15959
{
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15960
	sata_cport_info_t *cportinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15961
	sata_drive_info_t *sdevinfo;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15962
	sata_device_t sata_device;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15963
	dev_info_t *tdip;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15964
	uint32_t event_flags;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 15965
	int rval;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15966
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15967
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15968
	    "Processing port %d device attached", saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15969
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15970
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15971
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15972
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15973
	/* Clear attach event flag first */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15974
	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15975
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15976
	/* If the port is in SHUTDOWN or FAILED state, ignore event. */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15977
	if ((cportinfo->cport_state &
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15978
	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15979
		cportinfo->cport_dev_attach_time = 0;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15980
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15981
		    cport_mutex);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15982
		return;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15983
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15984
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15985
	/*
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15986
	 * If the sata_drive_info structure is found attached to the port info,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15987
	 * despite the fact the device was removed and now it is re-attached,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15988
	 * the old drive info structure was not removed.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 15989
	 * Arbitrarily release device info structure.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15990
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15991
	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15992
		sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15993
		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15994
		(void) kmem_free((void *)sdevinfo,
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15995
		    sizeof (sata_drive_info_t));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15996
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 15997
		    "Arbitrarily detaching old device info.", NULL);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15998
	}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 15999
	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16000
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16001
	/* For sanity, re-probe the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16002
	sata_device.satadev_rev = SATA_DEVICE_REV;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16003
	sata_device.satadev_addr = *saddr;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16004
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16005
	/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16006
	 * We have to exit mutex, because the HBA probe port function may
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16007
	 * block on its own mutex.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16008
	 */
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16009
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16010
	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16011
	    (SATA_DIP(sata_hba_inst), &sata_device);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16012
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16013
	sata_update_port_info(sata_hba_inst, &sata_device);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16014
	if (rval != SATA_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16015
		/* Something went wrong? Fail the port */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16016
		cportinfo->cport_state = SATA_PSTATE_FAILED;
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16017
		cportinfo->cport_dev_attach_time = 0;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16018
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16019
		    cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16020
		SATA_LOG_D((sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16021
		    "SATA port %d probing failed",
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16022
		    saddr->cport));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16023
		return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16024
	} else {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16025
		/* port probed successfully */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16026
		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16027
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16028
	/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16029
	 * Check if a device is still attached. For sanity, check also
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16030
	 * link status - if no link, there is no device.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16031
	 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16032
	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16033
	    SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16034
	    SATA_DTYPE_NONE) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16035
		/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16036
		 * No device - ignore attach event.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16037
		 */
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16038
		cportinfo->cport_dev_attach_time = 0;
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16039
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16040
		    cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16041
		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16042
		    "Ignoring attach - no device connected to port %d",
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16043
		    sata_device.satadev_addr.cport);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16044
		return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16045
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16046
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16047
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16048
	/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16049
	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16050
	 * with the hint: SE_HINT_INSERT
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16051
	 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16052
	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16053
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16054
	/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16055
	 * Port reprobing will take care of the creation of the device
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16056
	 * info structure and determination of the device type.
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16057
	 */
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16058
	sata_device.satadev_addr = *saddr;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16059
	(void) sata_reprobe_port(sata_hba_inst, &sata_device,
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16060
	    SATA_DEV_IDENTIFY_NORETRY);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16061
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16062
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16063
	    cport_mutex);
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16064
	if ((cportinfo->cport_state & SATA_STATE_READY) &&
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16065
	    (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16066
		/* Some device is attached to the port */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16067
		if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16068
			/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16069
			 * A device was not successfully attached.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16070
			 * Track retry time for device identification.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16071
			 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16072
			if (cportinfo->cport_dev_attach_time != 0) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16073
				clock_t cur_time = ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16074
				/*
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16075
				 * If the retry time limit was not exceeded,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16076
				 * reinstate attach event.
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16077
				 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16078
				if ((cur_time -
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16079
				    cportinfo->cport_dev_attach_time) <
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16080
				    drv_usectohz(
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16081
				    SATA_DEV_IDENTIFY_TIMEOUT)) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16082
					/* OK, restore attach event */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16083
					cportinfo->cport_event_flags |=
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16084
					    SATA_EVNT_DEVICE_ATTACHED;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16085
				} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16086
					/* Timeout - cannot identify device */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16087
					cportinfo->cport_dev_attach_time = 0;
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16088
					sata_log(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16089
					    CE_WARN,
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16090
					    "Could not identify SATA device "
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16091
					    "at port %d",
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16092
					    saddr->cport);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16093
				}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16094
			} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16095
				/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16096
				 * Start tracking time for device
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16097
				 * identification.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16098
				 * Save current time (lbolt value).
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16099
				 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16100
				cportinfo->cport_dev_attach_time =
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16101
				    ddi_get_lbolt();
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16102
				/* Restore attach event */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16103
				cportinfo->cport_event_flags |=
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16104
				    SATA_EVNT_DEVICE_ATTACHED;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16105
			}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16106
		} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16107
			/*
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16108
			 * If device was successfully attached, the subsequent
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16109
			 * action depends on a state of the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16110
			 * sata_auto_online variable. If it is set to zero.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16111
			 * an explicit 'configure' command will be needed to
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16112
			 * configure it. If its value is non-zero, we will
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16113
			 * attempt to online (configure) the device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16114
			 * First, log the message indicating that a device
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16115
			 * was attached.
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16116
			 */
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16117
			cportinfo->cport_dev_attach_time = 0;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16118
			sata_log(sata_hba_inst, CE_WARN,
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16119
			    "SATA device detected at port %d", saddr->cport);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16120
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16121
			if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16122
				sata_drive_info_t new_sdinfo;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16123
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16124
				/* Log device info data */
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16125
				new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16126
				    cportinfo));
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16127
				sata_show_drive_info(sata_hba_inst,
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16128
				    &new_sdinfo);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16129
			}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16130
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16131
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16132
			    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16133
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16134
			/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16135
			 * Make sure that there is no target node for that
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16136
			 * device. If so, release it. It should not happen,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16137
			 * unless we had problem removing the node when
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16138
			 * device was detached.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16139
			 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16140
			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16141
			    saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16142
			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16143
			    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16144
			if (tdip != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16145
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16146
#ifdef SATA_DEBUG
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16147
				if ((cportinfo->cport_event_flags &
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16148
				    SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16149
					sata_log(sata_hba_inst, CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16150
					    "sata_process_device_attached: "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16151
					    "old device target node exists!");
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16152
#endif
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16153
				/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16154
				 * target node exists - try to unconfigure
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16155
				 * device and remove the node.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16156
				 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16157
				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16158
				    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16159
				rval = ndi_devi_offline(tdip,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16160
				    NDI_DEVI_REMOVE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16161
				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16162
				    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16163
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16164
				if (rval == NDI_SUCCESS) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16165
					cportinfo->cport_event_flags &=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16166
					    ~SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16167
					cportinfo->cport_tgtnode_clean = B_TRUE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16168
				} else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16169
					/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16170
					 * PROBLEM - the target node remained
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16171
					 * and it belongs to a previously
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16172
					 * attached device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16173
					 * This happens when the file was open
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16174
					 * or the node was waiting for
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16175
					 * resources at the time the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16176
					 * associated device was removed.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16177
					 * Instruct event daemon to retry the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16178
					 * cleanup later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16179
					 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16180
					sata_log(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16181
					    CE_WARN,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16182
					    "Application(s) accessing "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16183
					    "previously attached SATA "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16184
					    "device have to release "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16185
					    "it before newly inserted "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16186
					    "device can be made accessible.",
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16187
					    saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16188
					cportinfo->cport_event_flags |=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16189
					    SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16190
					cportinfo->cport_tgtnode_clean =
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16191
					    B_FALSE;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16192
				}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16193
			}
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16194
			if (sata_auto_online != 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16195
				cportinfo->cport_event_flags |=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16196
				    SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16197
			}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16198
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16199
		}
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16200
	} else {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16201
		cportinfo->cport_dev_attach_time = 0;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16202
	}
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16203
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16204
	event_flags = cportinfo->cport_event_flags;
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16205
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
2960
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16206
	if (event_flags != 0) {
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16207
		mutex_enter(&sata_hba_inst->satahba_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16208
		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16209
		mutex_exit(&sata_hba_inst->satahba_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16210
		mutex_enter(&sata_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16211
		sata_event_pending |= SATA_EVNT_MAIN;
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16212
		mutex_exit(&sata_mutex);
0a0e45155fbd 6469980 sata module should retry identify device up to 60 sec after the device is hotplugged
pawelw
parents: 2734
diff changeset
 16213
	}
1258
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16214
}
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16215
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16216
9961d7d3ec8c PSARC/2004/779 SATA HBA Framework Support
mlf
parents:
diff changeset
 16217
/*
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16218
 * Device Target Node Cleanup Event processing.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16219
 * If the target node associated with a sata port device is in
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16220
 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16221
 * If the target node cannot be removed, the event flag is left intact,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16222
 * so that event daemon may re-run this function later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16223
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16224
 * This function cannot be called in interrupt context (it may sleep).
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16225
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16226
 * NOTE: Processes cport events only, not port multiplier ports.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16227
 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16228
static void
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16229
sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16230
    sata_address_t *saddr)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16231
{
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16232
	sata_cport_info_t *cportinfo;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16233
	dev_info_t *tdip;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16234
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16235
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16236
	    "Processing port %d device target node cleanup", saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16237
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16238
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16239
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16240
	/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16241
	 * Check if there is target node for that device and it is in the
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16242
	 * DEVI_DEVICE_REMOVED state. If so, release it.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16243
	 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16244
	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16245
	if (tdip != NULL) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16246
		/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16247
		 * target node exists - check if it is target node of
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16248
		 * a removed device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16249
		 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16250
		if (sata_check_device_removed(tdip) == B_TRUE) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16251
			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16252
			    "sata_process_target_node_cleanup: "
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16253
			    "old device target node exists!", NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16254
			/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16255
			 * Unconfigure and remove the target node
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16256
			 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16257
			if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16258
			    NDI_SUCCESS) {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16259
				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16260
				    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16261
				cportinfo->cport_event_flags &=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16262
				    ~SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16263
				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16264
				    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16265
				return;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16266
			}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16267
			/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16268
			 * Event daemon will retry the cleanup later.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16269
			 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16270
			mutex_enter(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16271
			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16272
			mutex_exit(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16273
			mutex_enter(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16274
			sata_event_pending |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16275
			mutex_exit(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16276
		}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16277
	} else {
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16278
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16279
		    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16280
		cportinfo->cport_event_flags &=
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16281
		    ~SATA_EVNT_TARGET_NODE_CLEANUP;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16282
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16283
		    saddr->cport)->cport_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16284
	}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16285
}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16286
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16287
/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16288
 * Device AutoOnline Event processing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16289
 * If attached device is to be onlined, an attempt is made to online this
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16290
 * device, but only if there is no lingering (old) target node present.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16291
 * If the device cannot be onlined, the event flag is left intact,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16292
 * so that event daemon may re-run this function later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16293
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16294
 * This function cannot be called in interrupt context (it may sleep).
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16295
 *
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16296
 * NOTE: Processes cport events only, not port multiplier ports.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16297
 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16298
static void
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16299
sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16300
    sata_address_t *saddr)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16301
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16302
	sata_cport_info_t *cportinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16303
	sata_drive_info_t *sdinfo;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16304
	sata_device_t sata_device;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16305
	dev_info_t *tdip;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16306
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16307
	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16308
	    "Processing port %d attached device auto-onlining", saddr->cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16309
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16310
	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16311
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16312
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16313
	 * Check if device is present and recognized. If not, reset event.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16314
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16315
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16316
	if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16317
		/* Nothing to online */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16318
		cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16319
		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16320
		    saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16321
		return;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16322
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16323
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16324
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16325
	/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16326
	 * Check if there is target node for this device and if it is in the
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16327
	 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16328
	 * the event for later processing.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16329
	 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16330
	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16331
	if (tdip != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16332
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16333
		 * target node exists - check if it is target node of
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16334
		 * a removed device.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16335
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16336
		if (sata_check_device_removed(tdip) == B_TRUE) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16337
			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16338
			    "sata_process_device_autoonline: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16339
			    "old device target node exists!", NULL);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16340
			/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16341
			 * Event daemon will retry device onlining later.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16342
			 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16343
			mutex_enter(&sata_hba_inst->satahba_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16344
			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16345
			mutex_exit(&sata_hba_inst->satahba_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16346
			mutex_enter(&sata_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16347
			sata_event_pending |= SATA_EVNT_MAIN;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16348
			mutex_exit(&sata_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16349
			return;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16350
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16351
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16352
		 * If the target node is not in the 'removed" state, assume
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16353
		 * that it belongs to this device. There is nothing more to do,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16354
		 * but reset the event.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16355
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16356
	} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16357
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16358
		/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16359
		 * Try to online the device
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16360
		 * If there is any reset-related event, remove it. We are
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16361
		 * configuring the device and no state restoring is needed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16362
		 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16363
		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16364
		    saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16365
		sata_device.satadev_addr = *saddr;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16366
		if (saddr->qual == SATA_ADDR_CPORT)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16367
			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16368
		else
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16369
			sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16370
		sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16371
		if (sdinfo != NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16372
			if (sdinfo->satadrv_event_flags &
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16373
			    (SATA_EVNT_DEVICE_RESET |
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16374
			    SATA_EVNT_INPROC_DEVICE_RESET))
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16375
				sdinfo->satadrv_event_flags = 0;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16376
			sdinfo->satadrv_event_flags |=
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16377
			    SATA_EVNT_CLEAR_DEVICE_RESET;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16378
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16379
			/* Need to create a new target node. */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16380
			cportinfo->cport_tgtnode_clean = B_TRUE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16381
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16382
			    saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16383
			tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16384
			    sata_hba_inst, &sata_device.satadev_addr);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16385
			if (tdip == NULL) {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16386
				/*
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16387
				 * Configure (onlining) failed.
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16388
				 * We will NOT retry
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16389
				 */
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16390
				SATA_LOG_D((sata_hba_inst, CE_WARN,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16391
				    "sata_process_device_autoonline: "
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16392
				    "configuring SATA device at port %d failed",
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16393
				    saddr->cport));
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16394
			}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16395
		} else {
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16396
			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16397
			    saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16398
		}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16399
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16400
	}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16401
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16402
	cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16403
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16404
	    saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16405
}
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16406
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16407
1529
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16408
static void
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16409
sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16410
    int hint)
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16411
{
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16412
	char ap[MAXPATHLEN];
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16413
	nvlist_t *ev_attr_list = NULL;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16414
	int err;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16415
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16416
	/* Allocate and build sysevent attribute list */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16417
	err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16418
	if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16419
		SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16420
		    "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16421
		    "cannot allocate memory for sysevent attributes\n"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16422
		return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16423
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16424
	/* Add hint attribute */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16425
	err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16426
	if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16427
		SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16428
		    "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16429
		    "failed to add DR_HINT attr for sysevent"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16430
		nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16431
		return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16432
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16433
	/*
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16434
	 * Add AP attribute.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16435
	 * Get controller pathname and convert it into AP pathname by adding
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16436
	 * a target number.
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16437
	 */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16438
	(void) snprintf(ap, MAXPATHLEN, "/devices");
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16439
	(void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16440
	(void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16441
	    SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16442
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16443
	err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16444
	if (err != 0) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16445
		SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16446
		    "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16447
		    "failed to add DR_AP_ID attr for sysevent"));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16448
		nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16449
		return;
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16450
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16451
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16452
	/* Generate/log sysevent */
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16453
	err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16454
	    ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16455
	if (err != DDI_SUCCESS) {
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16456
		SATA_LOG_D((sata_hba_inst, CE_WARN,
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16457
		    "sata_gen_sysevent: "
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16458
		    "cannot log sysevent, err code %x\n", err));
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16459
	}
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16460
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16461
	nvlist_free(ev_attr_list);
4fa3374f2b9d 6386938 sata framework should generate sysevent when device is plugged or unplugged
pawelw
parents: 1258
diff changeset
 16462
}
1675
5791e75682d0 6397847 sata framework has to support Informational Exception Control page
ls24207
parents: 1612
diff changeset
 16463
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16464
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16465
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16466
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16467
/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16468
 * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16469
 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16470
static void
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16471
sata_set_device_removed(dev_info_t *tdip)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16472
{
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16473
	int circ;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16474
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16475
	ASSERT(tdip != NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16476
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16477
	ndi_devi_enter(tdip, &circ);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16478
	mutex_enter(&DEVI(tdip)->devi_lock);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16479
	DEVI_SET_DEVICE_REMOVED(tdip);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16480
	mutex_exit(&DEVI(tdip)->devi_lock);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16481
	ndi_devi_exit(tdip, circ);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16482
}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16483
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16484
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16485
/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16486
 * Set internal event instructing event daemon to try
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16487
 * to perform the target node cleanup.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16488
 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16489
static void
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16490
sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16491
    sata_address_t *saddr)
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16492
{
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16493
	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16494
	SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16495
	    SATA_EVNT_TARGET_NODE_CLEANUP;
5832
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16496
	SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_tgtnode_clean =
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16497
	    B_FALSE;
e738a29fda5a 6644999 need to automatically configure SATA drives
pawelw
parents: 5225
diff changeset
 16498
	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
3935
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16499
	mutex_enter(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16500
	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16501
	mutex_exit(&sata_hba_inst->satahba_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16502
	mutex_enter(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16503
	sata_event_pending |= SATA_EVNT_MAIN;
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16504
	mutex_exit(&sata_mutex);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16505
}
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16506
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16507
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16508
/*
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16509
 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16510
 * i.e. check if the target node state indicates that it belongs to a removed
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16511
 * device.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16512
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16513
 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16514
 * B_FALSE otherwise.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16515
 *
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16516
 * NOTE: No port multiplier support.
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16517
 */
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16518
static boolean_t
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16519
sata_check_device_removed(dev_info_t *tdip)
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16520
{
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16521
	ASSERT(tdip != NULL);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16522
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16523
	if (DEVI_IS_DEVICE_REMOVED(tdip))
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16524
		return (B_TRUE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16525
	else
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16526
		return (B_FALSE);
0767d871beb3 6502757 sata: deadlock possible when device reset occurs during cfgadm operations
pawelw
parents: 3821
diff changeset
 16527
}
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16528
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16529
/* ************************ FAULT INJECTTION **************************** */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16530
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16531
#ifdef SATA_INJECT_FAULTS
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16532
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16533
static	uint32_t sata_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16534
static	uint32_t sata_fault_suspend_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16535
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16536
/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16537
 * Inject sata pkt fault
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16538
 * It modifies returned values of the sata packet.
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16539
 * It returns immediately if:
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16540
 * pkt fault injection is not enabled (via sata_inject_fault,
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16541
 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16542
 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16543
 * pkt is not directed to specified fault controller/device
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16544
 * (sata_fault_ctrl_dev and sata_fault_device).
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16545
 * If fault controller is not specified, fault injection applies to all
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16546
 * controllers and devices.
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16547
 *
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16548
 * First argument is the pointer to the executed sata packet.
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16549
 * Second argument is a pointer to a value returned by the HBA tran_start
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16550
 * function.
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16551
 * Third argument specifies injected error. Injected sata packet faults
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16552
 * are the satapkt_reason values.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16553
 * SATA_PKT_BUSY		-1	Not completed, busy
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16554
 * SATA_PKT_DEV_ERROR		1	Device reported error
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16555
 * SATA_PKT_QUEUE_FULL		2	Not accepted, queue full
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16556
 * SATA_PKT_PORT_ERROR		3	Not completed, port error
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16557
 * SATA_PKT_CMD_UNSUPPORTED	4	Cmd unsupported
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16558
 * SATA_PKT_ABORTED		5	Aborted by request
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16559
 * SATA_PKT_TIMEOUT		6	Operation timeut
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16560
 * SATA_PKT_RESET		7	Aborted by reset request
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16561
 *
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16562
 * Additional global variables affecting the execution:
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16563
 *
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16564
 * sata_inject_fault_count variable specifies number of times in row the
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16565
 * error is injected. Value of -1 specifies permanent fault, ie. every time
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16566
 * the fault injection point is reached, the fault is injected and a pause
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16567
 * between fault injection specified by sata_inject_fault_pause_count is
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16568
 * ignored). Fault injection routine decrements sata_inject_fault_count
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16569
 * (if greater than zero) until it reaches 0. No fault is injected when
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16570
 * sata_inject_fault_count is 0 (zero).
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16571
 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16572
 * sata_inject_fault_pause_count variable specifies number of times a fault
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16573
 * injection is bypassed (pause between fault injections).
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16574
 * If set to 0, a fault is injected only a number of times specified by
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16575
 * sata_inject_fault_count.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16576
 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16577
 * The fault counts are static, so for periodic errors they have to be manually
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16578
 * reset to start repetition sequence from scratch.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16579
 * If the original value returned by the HBA tran_start function is not
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16580
 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16581
 * is injected (to avoid masking real problems);
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16582
 *
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16583
 * NOTE: In its current incarnation, this function should be invoked only for
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16584
 * commands executed in SYNCHRONOUS mode.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16585
 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16586
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16587
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16588
static void
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16589
sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16590
{
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16591
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16592
	if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16593
		return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16594
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16595
	if (sata_inject_fault_count == 0)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16596
		return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16597
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16598
	if (fault == 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16599
		return;
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16600
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16601
	if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16602
		return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16603
7954
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16604
	if (sata_fault_ctrl != NULL) {
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16605
		sata_pkt_txlate_t *spx =
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16606
		    (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16607
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16608
		if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16609
		    spx->txlt_sata_hba_inst->satahba_dip)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16610
			return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16611
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16612
		if (sata_fault_device.satadev_addr.cport !=
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16613
		    spkt->satapkt_device.satadev_addr.cport ||
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16614
		    sata_fault_device.satadev_addr.pmport !=
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16615
		    spkt->satapkt_device.satadev_addr.pmport ||
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16616
		    sata_fault_device.satadev_addr.qual !=
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16617
		    spkt->satapkt_device.satadev_addr.qual)
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16618
			return;
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16619
	}
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16620
5ba90e3ffc24 6746305 Faulty disk with marvell driver fails silently and prevents system booting
Pawel Wojcik <Pawel.Wojcik@Sun.COM>
parents: 7580
diff changeset
 16621
	/* Modify pkt return parameters */
6539
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16622
	if (*rval != SATA_TRAN_ACCEPTED ||
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16623
	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16624
		sata_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16625
		sata_fault_suspend_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16626
		return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16627
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16628
	if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16629
		/* Pause in the injection */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16630
		sata_fault_suspend_count -= 1;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16631
		return;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16632
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16633
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16634
	if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16635
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16636
		 * Init inject fault cycle. If fault count is set to -1,
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16637
		 * it is a permanent fault.
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16638
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16639
		if (sata_inject_fault_count != -1) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16640
			sata_fault_count = sata_inject_fault_count;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16641
			sata_fault_suspend_count =
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16642
			    sata_inject_fault_pause_count;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16643
			if (sata_fault_suspend_count == 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16644
				sata_inject_fault_count = 0;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16645
		}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16646
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16647
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16648
	if (sata_fault_count != 0)
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16649
		sata_fault_count -= 1;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16650
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16651
	switch (fault) {
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16652
	case SATA_PKT_BUSY:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16653
		*rval = SATA_TRAN_BUSY;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16654
		spkt->satapkt_reason = SATA_PKT_BUSY;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16655
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16656
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16657
	case SATA_PKT_QUEUE_FULL:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16658
		*rval = SATA_TRAN_QUEUE_FULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16659
		spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16660
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16661
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16662
	case SATA_PKT_CMD_UNSUPPORTED:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16663
		*rval = SATA_TRAN_CMD_UNSUPPORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16664
		spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16665
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16666
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16667
	case SATA_PKT_PORT_ERROR:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16668
		/* This is "rejected" command */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16669
		*rval = SATA_TRAN_PORT_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16670
		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16671
		/* Additional error setup could be done here - port state */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16672
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16673
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16674
	case SATA_PKT_DEV_ERROR:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16675
		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16676
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16677
		 * Additional error setup could be done here
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16678
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16679
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16680
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16681
	case SATA_PKT_ABORTED:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16682
		spkt->satapkt_reason = SATA_PKT_ABORTED;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16683
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16684
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16685
	case SATA_PKT_TIMEOUT:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16686
		spkt->satapkt_reason = SATA_PKT_TIMEOUT;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16687
		/* Additional error setup could be done here */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16688
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16689
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16690
	case SATA_PKT_RESET:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16691
		spkt->satapkt_reason = SATA_PKT_RESET;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16692
		/*
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16693
		 * Additional error setup could be done here - device reset
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16694
		 */
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16695
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16696
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16697
	default:
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16698
		break;
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16699
	}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16700
}
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16701
bd91313a1d3d 6669134 sata module will endlessly retry in sata_process_device_reset
pawelw
parents: 6190
diff changeset
 16702
#endif
10082
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16703
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16704
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16705
 * SATA Trace Ring Buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16706
 * ----------------------
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16707
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16708
 * Overview
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16709
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16710
 * The SATA trace ring buffer is a ring buffer created and managed by
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16711
 * the SATA framework module that can be used by any module or driver
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16712
 * within the SATA framework to store debug messages.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16713
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16714
 * Ring Buffer Interfaces:
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16715
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16716
 *	sata_vtrace_debug()	<-- Adds debug message to ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16717
 *	sata_trace_debug()	<-- Wraps varargs into sata_vtrace_debug()
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16718
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16719
 *	Note that the sata_trace_debug() interface was created to give
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16720
 *	consumers the flexibilty of sending debug messages to ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16721
 *	as variable arguments.  Consumers can send type va_list debug
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16722
 *	messages directly to sata_vtrace_debug(). The sata_trace_debug()
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16723
 *	and sata_vtrace_debug() relationship is similar to that of
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16724
 *	cmn_err(9F) and vcmn_err(9F).
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16725
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16726
 * Below is a diagram of the SATA trace ring buffer interfaces and
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16727
 * sample consumers:
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16728
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16729
 * +---------------------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16730
 * |    o  o  SATA Framework Module  |
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16731
 * | o  SATA  o     +------------------+      +------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16732
 * |o   Trace  o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16733
 * |o   R-Buf  o    |sata_trace_debug  |<--+  +------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16734
 * | o        o     +------------------+   |  +------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16735
 * |    o  o                ^        |     +--|SATA HBA Driver #2|
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16736
 * |                        |        |        +------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16737
 * |           +------------------+  |
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16738
 * |           |SATA Debug Message|  |
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16739
 * |           +------------------+  |
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16740
 * +---------------------------------+
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16741
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16742
 * Supporting Routines:
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16743
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16744
 *	sata_trace_rbuf_alloc()	<-- Initializes ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16745
 *	sata_trace_rbuf_free()	<-- Destroys ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16746
 *	sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16747
 *	sata_trace_dmsg_free()	<-- Destroys content of ring buffer
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16748
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16749
 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16750
 * The ring buffer size can be adjusted by setting dmsg_ring_size in
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16751
 * /etc/system to desired size in unit of bytes.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16752
 *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16753
 * The individual debug message size in the ring buffer is restricted
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16754
 * to DMSG_BUF_SIZE.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16755
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16756
void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16757
sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16758
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16759
	sata_trace_dmsg_t *dmsg;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16760
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16761
	if (sata_debug_rbuf == NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16762
		return;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16763
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16764
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16765
	/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16766
	 * If max size of ring buffer is smaller than size
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16767
	 * required for one debug message then just return
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16768
	 * since we have no room for the debug message.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16769
	 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16770
	if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16771
		return;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16772
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16773
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16774
	mutex_enter(&sata_debug_rbuf->lock);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16775
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16776
	/* alloc or reuse on ring buffer */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16777
	dmsg = sata_trace_dmsg_alloc();
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16778
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16779
	if (dmsg == NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16780
		/* resource allocation failed */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16781
		mutex_exit(&sata_debug_rbuf->lock);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16782
		return;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16783
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16784
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16785
	dmsg->dip = dip;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16786
	gethrestime(&dmsg->timestamp);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16787
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16788
	(void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16789
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16790
	mutex_exit(&sata_debug_rbuf->lock);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16791
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16792
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16793
void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16794
sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16795
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16796
	va_list ap;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16797
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16798
	va_start(ap, fmt);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16799
	sata_vtrace_debug(dip, fmt, ap);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16800
	va_end(ap);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16801
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16802
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16803
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16804
 * This routine is used to manage debug messages
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16805
 * on ring buffer.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16806
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16807
static sata_trace_dmsg_t *
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16808
sata_trace_dmsg_alloc(void)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16809
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16810
	sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16811
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16812
	if (sata_debug_rbuf->looped == TRUE) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16813
		sata_debug_rbuf->dmsgp = dmsg->next;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16814
		return (sata_debug_rbuf->dmsgp);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16815
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16816
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16817
	/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16818
	 * If we're looping for the first time,
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16819
	 * connect the ring.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16820
	 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16821
	if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16822
	    sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16823
		dmsg->next = sata_debug_rbuf->dmsgh;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16824
		sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16825
		sata_debug_rbuf->looped = TRUE;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16826
		return (sata_debug_rbuf->dmsgp);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16827
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16828
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16829
	/* If we've gotten this far then memory allocation is needed */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16830
	dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16831
	if (dmsg_alloc == NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16832
		sata_debug_rbuf->allocfailed++;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16833
		return (dmsg_alloc);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16834
	} else {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16835
		sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16836
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16837
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16838
	if (sata_debug_rbuf->dmsgp != NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16839
		dmsg->next = dmsg_alloc;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16840
		sata_debug_rbuf->dmsgp = dmsg->next;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16841
		return (sata_debug_rbuf->dmsgp);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16842
	} else {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16843
		/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16844
		 * We should only be here if we're initializing
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16845
		 * the ring buffer.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16846
		 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16847
		if (sata_debug_rbuf->dmsgh == NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16848
			sata_debug_rbuf->dmsgh = dmsg_alloc;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16849
		} else {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16850
			/* Something is wrong */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16851
			kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16852
			return (NULL);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16853
		}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16854
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16855
		sata_debug_rbuf->dmsgp = dmsg_alloc;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16856
		return (sata_debug_rbuf->dmsgp);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16857
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16858
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16859
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16860
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16861
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16862
 * Free all messages on debug ring buffer.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16863
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16864
static void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16865
sata_trace_dmsg_free(void)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16866
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16867
	sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16868
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16869
	while (dmsg != NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16870
		dmsg_next = dmsg->next;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16871
		kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16872
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16873
		/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16874
		 * If we've looped around the ring than we're done.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16875
		 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16876
		if (dmsg_next == sata_debug_rbuf->dmsgh) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16877
			break;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16878
		} else {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16879
			dmsg = dmsg_next;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16880
		}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16881
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16882
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16883
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16884
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16885
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16886
 * This function can block
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16887
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16888
static void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16889
sata_trace_rbuf_alloc(void)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16890
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16891
	sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16892
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16893
	mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16894
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16895
	if (dmsg_ring_size > 0) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16896
		sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16897
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16898
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16899
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16900
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16901
static void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16902
sata_trace_rbuf_free(void)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16903
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16904
	sata_trace_dmsg_free();
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16905
	mutex_destroy(&sata_debug_rbuf->lock);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16906
	kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16907
}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16908
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16909
/*
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16910
 * If SATA_DEBUG is not defined then this routine is called instead
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16911
 * of sata_log() via the SATA_LOG_D macro.
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16912
 */
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16913
static void
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16914
sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level,
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16915
    const char *fmt, ...)
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16916
{
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16917
#ifndef __lock_lint
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16918
	_NOTE(ARGUNUSED(level))
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16919
#endif
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16920
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16921
	dev_info_t *dip = NULL;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16922
	va_list ap;
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16923
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16924
	if (sata_hba_inst != NULL) {
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16925
		dip = SATA_DIP(sata_hba_inst);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16926
	}
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16927
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16928
	va_start(ap, fmt);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16929
	sata_vtrace_debug(dip, fmt, ap);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16930
	va_end(ap);
435eef142c62 6713021 sata: provide a ring buffer for storing sata status messages to aid in debugging analysis
Fred Herard <Fred.Herard@Sun.COM>
parents: 10006
diff changeset
 16931
}